4 #include "TEventList.h"
9 #include "AliESDtrack.h"
10 #include "AliTrackReference.h"
12 #include "AliTRDReconstructor.h"
13 #include "AliTRDtrackV1.h"
14 #include "AliTRDseedV1.h"
15 #include "AliTRDpidRefMaker.h"
16 #include "info/AliTRDv0Info.h"
19 // Defines and implements basic functionality for building reference data for TRD PID.
21 // Here is the list of functionality provided by this class
26 // Alex Bercuci <A.Bercuci@gsi.de>
27 // Alex Wilk <wilka@uni-muenster.de>
28 // Markus Fasel <mfasel@gsi.de>
29 // Markus Heide <mheide@uni-muenster.de>
32 ClassImp(AliTRDpidRefMaker)
33 ClassImp(AliTRDpidRefMaker::AliTRDpidRefData)
34 ClassImp(AliTRDpidRefMaker::AliTRDpidRefDataArray)
36 //________________________________________________________________________
37 AliTRDpidRefMaker::AliTRDpidRefDataArray::AliTRDpidRefDataArray() :
41 // Constructor of data array
42 fData = new AliTRDpidRefData[AliTRDgeometry::kNlayer];
45 //________________________________________________________________________
46 AliTRDpidRefMaker::AliTRDpidRefDataArray::~AliTRDpidRefDataArray()
52 //________________________________________________________________________
53 void AliTRDpidRefMaker::AliTRDpidRefDataArray::PushBack(Int_t ly, Int_t p, Float_t *dedx)
55 // Add PID data to the end of the array
56 fData[fNtracklets].fPLbin= (ly<<4) | (p&0xf);
57 memcpy(fData[fNtracklets].fdEdx, dedx, 8*sizeof(Float_t));
61 //________________________________________________________________________
62 void AliTRDpidRefMaker::AliTRDpidRefDataArray::Reset()
66 if(!fNtracklets) return;
68 fData[fNtracklets].fPLbin = 0xff;
69 memset(fData[fNtracklets].fdEdx, 0, 8*sizeof(Float_t));
74 //________________________________________________________________________
75 AliTRDpidRefMaker::AliTRDpidRefMaker()
90 // Default constructor
92 SetNameTitle("PIDrefMaker", "PID Reference Maker");
95 //________________________________________________________________________
96 AliTRDpidRefMaker::AliTRDpidRefMaker(const char *name, const char *title)
97 :AliTRDrecoTask(name, title)
111 // Default constructor
114 fReconstructor = new AliTRDReconstructor();
115 fReconstructor->SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
116 memset(fdEdx, 0, 10*sizeof(Float_t));
117 memset(fPID, 0, AliPID::kSPECIES*sizeof(Float_t));
119 DefineInput(2, TObjArray::Class()); // v0 list
120 DefineInput(3, TObjArray::Class()); // pid info list
121 DefineOutput(2, TTree::Class());
125 //________________________________________________________________________
126 AliTRDpidRefMaker::~AliTRDpidRefMaker()
128 if(fPIDdataArray) delete fPIDdataArray;
129 if(fReconstructor) delete fReconstructor;
132 //________________________________________________________________________
133 Bool_t AliTRDpidRefMaker::CheckQuality(AliTRDseedV1* /*trklt*/)
135 // Place holder for checking tracklet quality for PID.
140 //________________________________________________________________________
141 Float_t* AliTRDpidRefMaker::CookdEdx(AliTRDseedV1 *trklt)
143 trklt->CookdEdx(AliTRDpidUtil::kNNslices);
144 memcpy(fdEdx, trklt->GetdEdx(), AliTRDpidUtil::kNNslices*sizeof(Float_t));
149 //________________________________________________________________________
150 void AliTRDpidRefMaker::ConnectInputData(Option_t *opt)
152 AliTRDrecoTask::ConnectInputData(opt);
153 fV0s = dynamic_cast<TObjArray*>(GetInputData(2));
154 fInfo = dynamic_cast<TObjArray*>(GetInputData(3));
157 //________________________________________________________________________
158 void AliTRDpidRefMaker::UserCreateOutputObjects()
163 OpenFile(1, "RECREATE");
164 fContainer = new TObjArray();
165 fContainer->SetName(Form("Moni%s", GetName()));
167 TH2 *h2 = new TH2I("hPDG","Particle abundance", AliPID::kSPECIES, -0.5, 4.5, AliTRDCalPID::kNMom, -0.5, AliTRDCalPID::kNMom-0.5);
168 TAxis *ax = h2->GetXaxis();
169 ax->SetNdivisions(505);
170 ax->SetTitle("Particle species");
171 for(Int_t is=AliPID::kSPECIES; is--;) ax->SetBinLabel(is+1, AliPID::ParticleShortName(is));
172 h2->GetYaxis()->SetTitle("P bins");
173 h2->GetYaxis()->SetNdivisions(511);
175 fContainer->AddAt(h2, 0);
177 fData = new TTree(GetName(), Form("Reference data for %s", GetName()));
178 fData->Branch("s", &fPIDbin, "s/b");
179 fData->Branch("data", &fPIDdataArray);
182 //________________________________________________________________________
183 void AliTRDpidRefMaker::UserExec(Option_t *)
186 // Called for each event
188 AliInfo(Form("Analyse N[%d] tracks", fTracks->GetEntriesFast()));
190 AliTRDtrackInfo *track = NULL;
191 AliTRDtrackV1 *trackTRD = NULL;
192 AliTrackReference *ref = NULL;
193 const AliTRDtrackInfo::AliESDinfo *infoESD = NULL;
194 for(Int_t itrk=0; itrk<fTracks->GetEntriesFast(); itrk++){
195 track = (AliTRDtrackInfo*)fTracks->UncheckedAt(itrk);
196 if(!track->HasESDtrack()) continue;
197 trackTRD = track->GetTrack();
198 infoESD = track->GetESDinfo();
199 Double32_t *infoPID = infoESD->GetSliceIter();
200 Int_t n = infoESD->GetNSlices() - AliTRDgeometry::kNlayer;
202 AliWarning(Form("dEdx info missing in ESD track %d", itrk));
205 Double32_t *p = &infoPID[n];
206 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]));
208 ULong_t status = track->GetStatus();
209 if(!(status&AliESDtrack::kTPCout)) continue;
211 // fill the pid information
212 SetRefPID(fRefPID, track, fPID);
214 // prepare PID data array
216 fPIDdataArray = new AliTRDpidRefDataArray();
217 } else fPIDdataArray->Reset();
219 // fill PID information
220 for(Int_t ily = 0; ily < AliTRDgeometry::kNlayer; ily++){
222 // fill P & dE/dx information
223 if(HasFriends()){ // from TRD track
224 if(!trackTRD) continue;
225 AliTRDseedV1 *trackletTRD(NULL);
226 trackTRD -> SetReconstructor(fReconstructor);
227 if(!(trackletTRD = trackTRD -> GetTracklet(ily))) continue;
228 if(!CheckQuality(trackletTRD)) continue;
229 if(!CookdEdx(trackletTRD)) continue;
231 // fill momentum information
235 if(!(ref = track->GetTrackRef(trackletTRD))) continue;
239 fP = trackletTRD->GetMomentum();
243 } else { // from ESD track
244 // fill momentum information
247 if(!(ref = track->GetTrackRef(ily))) continue;
255 Double32_t *it = &infoPID[ily*AliTRDCalPID::kNSlicesNN];
256 for(Int_t is=AliTRDCalPID::kNSlicesNN; is--; it++) fdEdx[is] = (*it);
259 // momentum threshold
260 if(fP < fPthreshold) continue;
263 fPIDdataArray->PushBack(ily, AliTRDpidUtil::GetMomentumBin(fP), fdEdx);
269 PostData(1, fContainer);
274 //________________________________________________________________________
275 void AliTRDpidRefMaker::Fill()
279 if(!fPIDdataArray->fNtracklets) return;
280 fPIDbin = TMath::LocMax(AliPID::kSPECIES, fPID); // get particle type
282 AliInfo(Form("fData[%p]", (void*)fData));
287 for(Int_t ily=fPIDdataArray->fNtracklets; ily--;){
288 Int_t pBin = fPIDdataArray->fData[ily].fPLbin & 0xf;
289 ((TH2*)fContainer->At(0))->Fill(fPIDbin, pBin);
293 //________________________________________________________________________
294 void AliTRDpidRefMaker::LinkPIDdata()
296 // Link data tree to data members
297 fData->SetBranchAddress("s", &fPIDbin);
298 fData->SetBranchAddress("data", &fPIDdataArray);
301 //________________________________________________________________________
302 void AliTRDpidRefMaker::SetRefPID(ETRDpidRefMakerSource select, void *source, Float_t *pid)
304 // Fill the reference PID values "pid" from "source" object
305 // according to the option "select". Possible options are
306 // - kV0 - v0 based PID
307 // - kMC - MC truth [default]
308 // - kRec - outside detectors
311 memset(fPID, 0, AliPID::kSPECIES*sizeof(Float_t));
315 AliTRDtrackInfo *track = static_cast<AliTRDtrackInfo*>(source);
317 AliError("No trackInfo found");
321 //Get V0 PID decisions from the AliTRDv0Info for all particle species (implemented so far : electrons from conversions, pions from K0s and protons from Lambdas) :
323 for(Int_t is=AliPID::kSPECIES; is--;) fPID[is] = v0.GetV0PID(is, track);
328 AliError("Could not retrive reference PID from MC");
332 AliTRDtrackInfo *track = static_cast<AliTRDtrackInfo*>(source);
333 switch(track->GetPDG()){
336 fPID[AliPID::kElectron] = 1.;
340 fPID[AliPID::kMuon] = 1.;
344 fPID[AliPID::kPion] = 1.;
348 fPID[AliPID::kKaon] = 1.;
352 fPID[AliPID::kProton] = 1.;
359 AliTRDtrackInfo *track = static_cast<AliTRDtrackInfo*>(source);
360 AliTRDtrackV1 *trackTRD = track->GetTrack();
361 trackTRD -> SetReconstructor(fReconstructor);
362 //fReconstructor -> SetOption("nn");
363 trackTRD -> CookPID();
364 for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
365 pid[iPart] = trackTRD -> GetPID(iPart);
366 AliDebug(4, Form("PDG is (in V0info) %d %f", iPart, pid[iPart]));
371 AliWarning("PID reference source not implemented");
374 AliDebug(4, Form("Ref PID [%] : %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f]"
375 ,AliPID::ParticleShortName(0), 1.e2*fPID[0]
376 ,AliPID::ParticleShortName(1), 1.e2*fPID[1]
377 ,AliPID::ParticleShortName(2), 1.e2*fPID[2]
378 ,AliPID::ParticleShortName(3), 1.e2*fPID[3]
379 ,AliPID::ParticleShortName(4), 1.e2*fPID[4]
383 //________________________________________________________________________
384 void AliTRDpidRefMaker::SetAbundance(Float_t train)
386 // Split data sample between trainning and testing
388 if(train<0. || train >1.){
389 AliWarning("The input data should be in the interval [0, 1]");