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(const char *name, const char *title)
76 :AliTRDrecoTask(name, title)
90 // Default constructor
93 fReconstructor = new AliTRDReconstructor();
94 fReconstructor->SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
95 memset(fdEdx, 0, 10*sizeof(Float_t));
96 memset(fPID, 0, AliPID::kSPECIES*sizeof(Float_t));
98 DefineInput(1, TObjArray::Class());
99 DefineInput(2, TObjArray::Class());
100 DefineOutput(1, TTree::Class());
104 //________________________________________________________________________
105 AliTRDpidRefMaker::~AliTRDpidRefMaker()
107 if(fPIDdataArray) delete fPIDdataArray;
108 if(fReconstructor) delete fReconstructor;
111 //________________________________________________________________________
112 Bool_t AliTRDpidRefMaker::CheckQuality(AliTRDseedV1* /*trklt*/)
114 // Place holder for checking tracklet quality for PID.
119 //________________________________________________________________________
120 Float_t* AliTRDpidRefMaker::CookdEdx(AliTRDseedV1 *trklt)
122 trklt->CookdEdx(AliTRDpidUtil::kNNslices);
123 memcpy(fdEdx, trklt->GetdEdx(), AliTRDpidUtil::kNNslices*sizeof(Float_t));
128 //________________________________________________________________________
129 void AliTRDpidRefMaker::ConnectInputData(Option_t *opt)
131 AliTRDrecoTask::ConnectInputData(opt);
132 fV0s = dynamic_cast<TObjArray*>(GetInputData(1));
133 fInfo = dynamic_cast<TObjArray*>(GetInputData(2));
136 //________________________________________________________________________
137 void AliTRDpidRefMaker::CreateOutputObjects()
142 OpenFile(0, "RECREATE");
143 fContainer = new TObjArray();
144 fContainer->SetName(Form("Moni%s", GetName()));
146 TH2 *h2 = new TH2I("hPDG","Particle abundance", AliPID::kSPECIES, -0.5, 4.5, AliTRDCalPID::kNMom, -0.5, AliTRDCalPID::kNMom-0.5);
147 TAxis *ax = h2->GetXaxis();
148 ax->SetNdivisions(505);
149 ax->SetTitle("Particle species");
150 for(Int_t is=AliPID::kSPECIES; is--;) ax->SetBinLabel(is+1, AliPID::ParticleShortName(is));
151 h2->GetYaxis()->SetTitle("P bins");
152 h2->GetYaxis()->SetNdivisions(511);
154 fContainer->AddAt(h2, 0);
156 fData = new TTree(GetName(), Form("Reference data for %s", GetName()));
157 fData->Branch("s", &fPIDbin, "s/b");
158 fData->Branch("data", &fPIDdataArray);
161 //________________________________________________________________________
162 void AliTRDpidRefMaker::Exec(Option_t *)
165 // Called for each event
167 AliTRDtrackInfo *track = NULL;
168 AliTRDtrackV1 *trackTRD = NULL;
169 AliTrackReference *ref = NULL;
170 const AliTRDtrackInfo::AliESDinfo *infoESD = NULL;
171 for(Int_t itrk=0; itrk<fTracks->GetEntriesFast(); itrk++){
172 track = (AliTRDtrackInfo*)fTracks->UncheckedAt(itrk);
173 if(!track->HasESDtrack()) continue;
174 trackTRD = track->GetTrack();
175 infoESD = track->GetESDinfo();
176 Double32_t *infoPID = infoESD->GetSliceIter();
177 Int_t n = infoESD->GetNSlices() - AliTRDgeometry::kNlayer;
178 Double32_t *p = &infoPID[n];
179 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]));
181 ULong_t status = track->GetStatus();
182 if(!(status&AliESDtrack::kTPCout)) continue;
184 // fill the pid information
185 SetRefPID(fRefPID, track, fPID);
187 // prepare PID data array
189 fPIDdataArray = new AliTRDpidRefDataArray();
190 } else fPIDdataArray->Reset();
192 // fill PID information
193 for(Int_t ily = 0; ily < AliTRDgeometry::kNlayer; ily++){
195 // fill P & dE/dx information
196 if(HasFriends()){ // from TRD track
197 if(!trackTRD) continue;
198 AliTRDseedV1 *trackletTRD(NULL);
199 trackTRD -> SetReconstructor(fReconstructor);
200 if(!(trackletTRD = trackTRD -> GetTracklet(ily))) continue;
201 if(!CheckQuality(trackletTRD)) continue;
202 if(!CookdEdx(trackletTRD)) continue;
204 // fill momentum information
208 if(!(ref = track->GetTrackRef(trackletTRD))) continue;
212 fP = trackletTRD->GetMomentum();
216 } else { // from ESD track
217 // fill momentum information
220 if(!(ref = track->GetTrackRef(ily))) continue;
228 Double32_t *it = &infoPID[ily*AliTRDCalPID::kNSlicesNN];
229 for(Int_t is=AliTRDCalPID::kNSlicesNN; is--; it++) fdEdx[is] = (*it);
232 // momentum threshold
233 if(fP < fPthreshold) continue;
236 fPIDdataArray->PushBack(ily, AliTRDpidUtil::GetMomentumBin(fP), fdEdx);
242 PostData(0, fContainer);
247 //________________________________________________________________________
248 void AliTRDpidRefMaker::Fill()
252 if(!fPIDdataArray->fNtracklets) return;
253 fPIDbin = TMath::LocMax(AliPID::kSPECIES, fPID); // get particle type
259 for(Int_t ily=fPIDdataArray->fNtracklets; ily--;){
260 Int_t pBin = fPIDdataArray->fData[ily].fPLbin & 0xf;
261 ((TH2*)fContainer->At(0))->Fill(fPIDbin, pBin);
265 //________________________________________________________________________
266 void AliTRDpidRefMaker::LinkPIDdata()
268 // Link data tree to data members
269 fData->SetBranchAddress("s", &fPIDbin);
270 fData->SetBranchAddress("data", &fPIDdataArray);
273 //________________________________________________________________________
274 void AliTRDpidRefMaker::SetRefPID(ETRDpidRefMakerSource select, void *source, Float_t *pid)
276 // Fill the reference PID values "pid" from "source" object
277 // according to the option "select". Possible options are
278 // - kV0 - v0 based PID
279 // - kMC - MC truth [default]
280 // - kRec - outside detectors
283 memset(fPID, 0, AliPID::kSPECIES*sizeof(Float_t));
287 AliTRDtrackInfo *track = static_cast<AliTRDtrackInfo*>(source);
289 AliError("No trackInfo found");
293 //Get V0 PID decisions from the AliTRDv0Info for all particle species (implemented so far : electrons from conversions, pions from K0s and protons from Lambdas) :
295 for(Int_t is=AliPID::kSPECIES; is--;) fPID[is] = v0.GetV0PID(is, track);
300 AliError("Could not retrive reference PID from MC");
304 AliTRDtrackInfo *track = static_cast<AliTRDtrackInfo*>(source);
305 switch(track->GetPDG()){
308 fPID[AliPID::kElectron] = 1.;
312 fPID[AliPID::kMuon] = 1.;
316 fPID[AliPID::kPion] = 1.;
320 fPID[AliPID::kKaon] = 1.;
324 fPID[AliPID::kProton] = 1.;
331 AliTRDtrackInfo *track = static_cast<AliTRDtrackInfo*>(source);
332 AliTRDtrackV1 *trackTRD = track->GetTrack();
333 trackTRD -> SetReconstructor(fReconstructor);
334 //fReconstructor -> SetOption("nn");
335 trackTRD -> CookPID();
336 for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
337 pid[iPart] = trackTRD -> GetPID(iPart);
338 AliDebug(4, Form("PDG is (in V0info) %d %f", iPart, pid[iPart]));
343 AliWarning("PID reference source not implemented");
346 AliDebug(4, Form("Ref PID [%] : %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f]"
347 ,AliPID::ParticleShortName(0), 1.e2*fPID[0]
348 ,AliPID::ParticleShortName(1), 1.e2*fPID[1]
349 ,AliPID::ParticleShortName(2), 1.e2*fPID[2]
350 ,AliPID::ParticleShortName(3), 1.e2*fPID[3]
351 ,AliPID::ParticleShortName(4), 1.e2*fPID[4]
355 //________________________________________________________________________
356 void AliTRDpidRefMaker::SetAbundance(Float_t train)
358 // Split data sample between trainning and testing
360 if(train<0. || train >1.){
361 AliWarning("The input data should be in the interval [0, 1]");