4 #include "TEventList.h"
9 #include "AliESDtrack.h"
10 #include "AliTrackReference.h"
11 #include "AliAnalysisManager.h"
13 #include "AliTRDReconstructor.h"
14 #include "AliTRDtrackV1.h"
15 #include "AliTRDseedV1.h"
16 #include "AliTRDpidRefMaker.h"
17 #include "AliTRDinfoGen.h"
18 #include "info/AliTRDeventInfo.h"
19 #include "info/AliTRDv0Info.h"
20 #include "info/AliTRDpidInfo.h"
23 // Defines and implements basic functionality for building reference data for TRD PID.
25 // Here is the list of functionality provided by this class
30 // Alex Bercuci <A.Bercuci@gsi.de>
31 // Alex Wilk <wilka@uni-muenster.de>
32 // Markus Fasel <mfasel@gsi.de>
33 // Markus Heide <mheide@uni-muenster.de>
36 ClassImp(AliTRDpidRefMaker)
38 //________________________________________________________________________
39 AliTRDpidRefMaker::AliTRDpidRefMaker()
52 // Default constructor
54 SetNameTitle("PIDrefMaker", "PID Reference Maker");
57 //________________________________________________________________________
58 AliTRDpidRefMaker::AliTRDpidRefMaker(const char *name, const char *title)
59 :AliTRDrecoTask(name, title)
71 // Default constructor
74 memset(fdEdx, 0, AliTRDpidUtil::kNNslices*sizeof(Float_t));
75 memset(fPID, 0, AliPID::kSPECIES*sizeof(Float_t));
77 DefineInput(3, TObjArray::Class()); // v0 list
78 DefineInput(4, TObjArray::Class()); // pid info list
79 DefineOutput(2, TTree::Class());
83 //________________________________________________________________________
84 AliTRDpidRefMaker::~AliTRDpidRefMaker()
86 if(fPIDdataArray) delete fPIDdataArray;
89 //________________________________________________________________________
90 Bool_t AliTRDpidRefMaker::CheckQuality(AliTRDseedV1* /*trklt*/)
92 // Place holder for checking tracklet quality for PID.
97 //________________________________________________________________________
98 Float_t* AliTRDpidRefMaker::CookdEdx(AliTRDseedV1 *trklt)
100 trklt->CookdEdx(AliTRDpidUtil::kNNslices);
101 memcpy(fdEdx, trklt->GetdEdx(), AliTRDpidUtil::kNNslices*sizeof(Float_t));
106 //________________________________________________________________________
107 void AliTRDpidRefMaker::UserCreateOutputObjects()
112 fContainer = new TObjArray();
113 fContainer->SetName(Form("Moni%s", GetName()));
115 TH2 *h2 = new TH2I("hPDG","Particle abundance", AliPID::kSPECIES, -0.5, 4.5, AliTRDCalPID::kNMom, -0.5, AliTRDCalPID::kNMom-0.5);
116 TAxis *ax = h2->GetXaxis();
117 ax->SetNdivisions(505);
118 ax->SetTitle("Particle species");
119 for(Int_t is=AliPID::kSPECIES; is--;) ax->SetBinLabel(is+1, AliPID::ParticleShortName(is));
120 h2->GetYaxis()->SetTitle("P bins");
121 h2->GetYaxis()->SetNdivisions(511);
122 fContainer->AddAt(h2, 0);
123 PostData(1, fContainer);
126 fData = new TTree("RefPID", "Reference data for PID");
127 fData->Branch("data", &fPIDdataArray);
131 //________________________________________________________________________
132 void AliTRDpidRefMaker::UserExec(Option_t *)
135 // Called for each event
136 Int_t ev((Int_t)AliAnalysisManager::GetAnalysisManager()->GetCurrentEntry());
137 if(!(fTracks = dynamic_cast<TObjArray*>(GetInputData(1)))){
138 AliDebug(3, Form("Missing tracks container in ev %d", ev));
141 if(!(fEvent = dynamic_cast<AliTRDeventInfo*>(GetInputData(2)))){
142 AliDebug(3, Form("Missing Event Info container in ev %d", ev));
145 if(!(fV0s = dynamic_cast<TObjArray*>(GetInputData(3)))){
146 AliDebug(3, Form("Missing v0 container in ev %d", ev));
149 if(!(fInfo = dynamic_cast<TObjArray*>(GetInputData(4)))){
150 AliDebug(3, Form("Missing pid info container in ev %d", ev));
154 AliDebug(1, Form("Entries: Ev[%d] Tracks[%d] V0[%d] PID[%d]", ev, fTracks->GetEntriesFast(), fV0s->GetEntriesFast(), fInfo->GetEntriesFast()));
155 AliTRDtrackInfo *track = NULL;
156 //AliTRDtrackV1 *trackTRD = NULL;
157 AliTrackReference *ref = NULL;
158 const AliTRDtrackInfo::AliESDinfo *infoESD = NULL;
159 for(Int_t itrk=0; itrk<fTracks->GetEntriesFast(); itrk++){
160 track = (AliTRDtrackInfo*)fTracks->UncheckedAt(itrk);
161 if(!track->HasESDtrack()) continue;
162 //trackTRD = track->GetTrack();
163 infoESD = track->GetESDinfo();
164 Double32_t *infoPID = infoESD->GetSliceIter();
165 Int_t n = infoESD->GetNSlices() - AliTRDgeometry::kNlayer;
167 AliWarning(Form("dEdx info missing in ESD track %d", itrk));
170 Double32_t *p = &infoPID[n];
171 AliDebug(4, Form("n[%d] p[GeV/c]{%6.2f %6.2f %6.2f %6.2f %6.2f %6.2f}", n, p[0], p[1], p[2], p[3], p[4], p[5]));
173 ULong_t status = track->GetStatus();
174 if(!(status&AliESDtrack::kTRDpid)) continue;
176 // fill the pid information
177 SetRefPID(fRefPID, track, infoESD, fPID);
179 Int_t idx(TMath::Max(Long64_t(0), TMath::LocMax(AliPID::kSPECIES, fPID)));
180 if(fPID[idx]<1.e-5) continue;
182 // prepare PID data array
184 fPIDdataArray = new AliTRDpidInfo();
185 } else fPIDdataArray->Reset();
186 fPIDdataArray->SetPID(idx);
188 // fill PID information
189 for(Int_t ily = 0; ily < AliTRDgeometry::kNlayer; ily++){
191 // fill P & dE/dx information
194 if(!(ref = track->GetTrackRef(ily))) continue;
203 Double32_t *it = &infoPID[ily*AliTRDCalPID::kNSlicesNN];
204 for(Int_t is=AliTRDCalPID::kNSlicesNN; is--; it++) fdEdx[is] = (*it);
206 // momentum threshold
207 if(fP < fPthreshold) continue;
210 fPIDdataArray->PushBack(ily, AliTRDpidUtil::GetMomentumBin(fP), fdEdx);
218 //________________________________________________________________________
219 void AliTRDpidRefMaker::Fill()
223 if(!fPIDdataArray->GetNtracklets()) return;
229 for(Int_t itrklt=fPIDdataArray->GetNtracklets(); itrklt--;){
230 Int_t pBin = fPIDdataArray->GetData(itrklt)->Momentum();
231 ((TH2*)fContainer->At(0))->Fill(fPIDdataArray->GetPID(), pBin);
235 //________________________________________________________________________
236 void AliTRDpidRefMaker::LinkPIDdata()
238 // Link data tree to data members
239 fData->SetBranchAddress("data", &fPIDdataArray);
242 //________________________________________________________________________
243 void AliTRDpidRefMaker::SetRefPID(ETRDpidRefMakerSource select, AliTRDtrackInfo *track, const AliTRDtrackInfo::AliESDinfo *infoESD, Float_t *pid)
245 // Fill the reference PID values "pid" from "source" object
246 // according to the option "select". Possible options are
247 // - kV0 - v0 based PID
248 // - kMC - MC truth [default]
249 // - kRec - outside detectors
252 AliError("No trackInfo found");
255 memset(pid, 0, AliPID::kSPECIES*sizeof(Float_t));
259 //Get V0 PID decisions for all particle species (implemented so far : electrons from conversions, pions from K0s and protons from Lambdas) :
260 if(!infoESD->HasV0()) return;
261 const Int_t *v0pid=infoESD->GetV0pid();
262 for(Int_t is=AliPID::kSPECIES; is--;){ pid[is] = (Float_t)v0pid[is];}
267 AliError("Could not retrive reference PID from MC");
270 switch(track->GetPDG()){
273 pid[AliPID::kElectron] = 1.;
277 pid[AliPID::kMuon] = 1.;
281 pid[AliPID::kPion] = 1.;
285 pid[AliPID::kKaon] = 1.;
289 pid[AliPID::kProton] = 1.;
295 AliTRDtrackV1 *trackTRD = track->GetTrack();
296 trackTRD -> SetReconstructor(AliTRDinfoGen::Reconstructor());
297 //fReconstructor -> SetOption("nn");
298 trackTRD -> CookPID();
299 for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
300 pid[iPart] = trackTRD -> GetPID(iPart);
301 AliDebug(4, Form("PDG is (in V0info) %d %f", iPart, pid[iPart]));
306 AliWarning("PID reference source not implemented");
309 AliDebug(4, Form("Ref PID : %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f]"
310 ,AliPID::ParticleShortName(0), 1.e2*pid[0]
311 ,AliPID::ParticleShortName(1), 1.e2*pid[1]
312 ,AliPID::ParticleShortName(2), 1.e2*pid[2]
313 ,AliPID::ParticleShortName(3), 1.e2*pid[3]
314 ,AliPID::ParticleShortName(4), 1.e2*pid[4]
318 //________________________________________________________________________
319 void AliTRDpidRefMaker::SetAbundance(Float_t train)
321 // Split data sample between trainning and testing
323 if(train<0. || train >1.){
324 AliWarning("The input data should be in the interval [0, 1]");