2 // Implementation file for implementation of data analysis aft 900 GeV
4 // Author: A. Pulvirenti
12 #include "TParticle.h"
14 #include "TLorentzVector.h"
17 #include "AliESDpid.h"
18 #include "AliESDEvent.h"
19 #include "AliESDVertex.h"
20 #include "AliESDtrack.h"
22 #include "AliMCEvent.h"
23 #include "AliTOFT0maker.h"
24 #include "AliTOFcalib.h"
25 #include "AliCDBManager.h"
26 #include "AliITSPIDResponse.h"
27 #include "AliRsnMonitorTrack.h"
28 #include "AliRsnDaughter.h"
29 #include "AliRsnEvent.h"
31 #include "AliRsnAnalysisMonitorTask.h"
33 ClassImp(AliRsnAnalysisMonitorTask)
35 //__________________________________________________________________________________________________
36 AliRsnAnalysisMonitorTask::AliRsnAnalysisMonitorTask(const char *name) :
37 AliAnalysisTaskSE(name),
43 fTOFcalibrateESD(kFALSE),
44 fTOFcorrectTExp(kFALSE),
48 fEventCuts("eventCuts", AliRsnCut::kEvent),
49 fTrackCuts("trackCuts", AliRsnCut::kDaughter)
56 DefineOutput(1, TTree::Class());
59 //__________________________________________________________________________________________________
60 AliRsnAnalysisMonitorTask::AliRsnAnalysisMonitorTask(const AliRsnAnalysisMonitorTask& copy) :
61 AliAnalysisTaskSE(copy),
67 fTOFcalibrateESD(kFALSE),
68 fTOFcorrectTExp(kFALSE),
72 fEventCuts(copy.fEventCuts),
73 fTrackCuts(copy.fTrackCuts)
80 //__________________________________________________________________________________________________
81 AliRsnAnalysisMonitorTask& AliRsnAnalysisMonitorTask::operator=(const AliRsnAnalysisMonitorTask& copy)
84 // Assignment operator
87 fTOFcalibrateESD = copy.fTOFcalibrateESD;
88 fTOFcorrectTExp = copy.fTOFcorrectTExp;
89 fTOFuseT0 = copy.fTOFuseT0;
90 fTOFtuneMC = copy.fTOFtuneMC;
91 fTOFresolution = copy.fTOFresolution;
96 //__________________________________________________________________________________________________
97 AliRsnAnalysisMonitorTask::~AliRsnAnalysisMonitorTask()
103 if (fOut) delete fOut;
104 if (fESDpid) delete fESDpid;
105 if (fTrack) delete fTrack;
108 //__________________________________________________________________________________________________
109 void AliRsnAnalysisMonitorTask::UserCreateOutputObjects()
112 // Create the output data container
115 // setup TPC response
116 fESDpid = new AliESDpid;
117 fESDpid->GetTPCResponse().SetBetheBlochParameters(fTPCpar[0], fTPCpar[1], fTPCpar[2], fTPCpar[3], fTPCpar[4]);
119 // setup TOF maker & calibration
120 fTOFcalib = new AliTOFcalib;
121 fTOFmaker = new AliTOFT0maker(fESDpid, fTOFcalib);
122 fTOFmaker->SetTimeResolution(fTOFresolution);
124 // create output branch object
125 fTrack = new AliRsnMonitorTrack;
127 // create output tree
129 fOut = new TTree("rsnMonitor", "Informations on single tracks for cut checking");
130 fOut->Branch("tracks", "AliRsnMonitorTrack", &fTrack);
133 //__________________________________________________________________________________________________
134 void AliRsnAnalysisMonitorTask::UserExec(Option_t *)
137 // Main execution function.
138 // Fills the fHEvents data member with the following legenda:
139 // 0 -- event OK, prim vertex with tracks
140 // 1 -- event OK, prim vertex with SPD
141 // 2 -- event OK but vz large
145 // retrieve ESD event and related stack (if available)
146 AliESDEvent *esd = dynamic_cast<AliESDEvent*>(fInputEvent);
147 AliStack *stack = 0x0;
151 if (fMCEvent) stack = fMCEvent->Stack();
153 // create interface objects to AliRsnEvent to check event cuts
155 event.SetRef(esd, fMCEvent);
156 if (!fEventCuts.IsSelected(&event)) return;
159 Int_t type = EventEval(esd);
161 // if processable, then process it
162 if (type == 0) ProcessESD(esd, esd->GetPrimaryVertexTracks(), stack);
163 else if (type == 1) ProcessESD(esd, esd->GetPrimaryVertexSPD() , stack);
166 // update histogram container
170 //__________________________________________________________________________________________________
171 void AliRsnAnalysisMonitorTask::Terminate(Option_t *)
178 //__________________________________________________________________________________________________
179 Int_t AliRsnAnalysisMonitorTask::EventEval(AliESDEvent *esd)
182 // Checks if the event is good for analysis.
184 // ---> 0 if a good primary vertex with tracks was found,
185 // ---> 1 if a good SPD primary vertex was found
186 // ---> 2 otherwise (event to be rejected)
187 // In any case, adds an entry to the TTree, to keep trace of all events.
190 // get the best primary vertex:
191 // first try that with tracks, then the SPD one
192 const AliESDVertex *vTrk = esd->GetPrimaryVertexTracks();
193 const AliESDVertex *vSPD = esd->GetPrimaryVertexSPD();
194 if(vTrk->GetNContributors() > 0)
198 else if (vSPD->GetNContributors() > 0)
208 //__________________________________________________________________________________________________
209 void AliRsnAnalysisMonitorTask::ProcessESD
210 (AliESDEvent *esd, const AliESDVertex *v, AliStack *stack)
213 // Process the ESD container, to read all tracks and copy their useful values.
214 // All info are stored into an AliRsnMonitorTrack object and saved into the
215 // TClonesArray which is one of the branches of the output TTree.
218 // create interfacr objects
220 AliRsnDaughter daughter;
221 event.SetRef(esd, fMCEvent);
224 // create the response function and initialize it to MC or not
225 // depending if the AliStack object is there or not
226 Bool_t isMC = (stack != 0x0);
227 AliITSPIDResponse itsrsp(isMC);
229 // TOF stuff #1: init OCDB
230 Int_t run = esd->GetRunNumber();
231 AliCDBManager *cdb = AliCDBManager::Instance();
232 cdb->SetDefaultStorage("raw://");
234 // TOF stuff #2: init calibration
235 fTOFcalib->SetCorrectTExp(fTOFcorrectTExp);
237 // TOF stuff #3: calibrate
238 if (fTOFcalibrateESD) fTOFcalib->CalibrateESD(esd);
239 if (fTOFtuneMC) fTOFmaker->TuneForMC(esd);
242 fTOFmaker->ComputeT0TOF(esd);
243 fTOFmaker->ApplyT0TOF(esd);
244 fESDpid->MakePID(esd, kFALSE, 0.);
247 // loop on all tracks
248 Int_t i, k, nITS, ntracks = esd->GetNumberOfTracks();;
249 Bool_t isTPC, isITSSA, isTOF;
250 Float_t b[2], bCov[3];
253 for (i = 0; i < ntracks; i++)
255 AliESDtrack *track = esd->GetTrack(i);
256 event.SetDaughter(daughter, i, AliRsnDaughter::kTrack);
258 // reset the output object
259 // 'usable' flag will need to be set to 'ok'
263 fTrack->CutsPassed() = fTrackCuts.IsSelected(&daughter);
265 // skip NULL pointers, kink daughters and tracks which
266 // cannot be propagated to primary vertex
267 if (!track) continue;
268 if ((Int_t)track->GetKinkIndex(0) > 0) continue;
269 if (!track->RelateToVertex(v, esd->GetMagneticField(), kVeryBig)) continue;
271 // get MC info if possible
272 if (stack) fTrack->AdoptMC(TMath::Abs(track->GetLabel()), stack);
275 fTrack->Status() = (UInt_t)track->GetStatus();
276 fTrack->Length() = (Double_t)track->GetIntegratedLength();
277 fTrack->Charge() = (Int_t)track->Charge();
278 fTrack->PrecX() = (Double_t)track->Px();
279 fTrack->PrecY() = (Double_t)track->Py();
280 fTrack->PrecZ() = (Double_t)track->Pz();
282 // evaluate some flags from the status to decide what to do next in some points
283 isTPC = ((fTrack->Status() & AliESDtrack::kTPCin) != 0);
284 isITSSA = ((fTrack->Status() & AliESDtrack::kTPCin) == 0 && (fTrack->Status() & AliESDtrack::kITSrefit) != 0 && (fTrack->Status() & AliESDtrack::kITSpureSA) == 0 && (fTrack->Status() & AliESDtrack::kITSpid) != 0);
285 isTOF = ((fTrack->Status() & AliESDtrack::kTOFout) != 0 && (fTrack->Status() & AliESDtrack::kTIME) != 0);
287 // accept only tracks which are TPC+ITS or ITS standalone
290 fTrack->ITSsa() = kTRUE;
291 fTrack->TOFok() = kFALSE;
295 fTrack->ITSsa() = kFALSE;
296 fTrack->TOFok() = isTOF;
301 // get DCA to primary vertex
302 track->GetImpactParameters(b, bCov);
303 fTrack->DCAr() = (Double_t)b[0];
304 fTrack->DCAz() = (Double_t)b[1];
307 for (k = 0; k < 6; k++)
309 fTrack->ITSmap(k) = track->HasPointOnITSLayer(k);
313 fTrack->ITSchi2() = track->GetITSchi2();
314 fTrack->ITSsignal() = track->GetITSsignal();
315 nITS = fTrack->SSDcount() + fTrack->SDDcount();
316 for (k = 0; k < AliPID::kSPECIES; k++)
318 fTrack->ITSnsigma(k) = itsrsp.GetNumberOfSigmas(fTrack->Prec(), fTrack->ITSsignal(), (AliPID::EParticleType)k, nITS, kTRUE);
325 fTrack->TPCcount() = (Int_t)track->GetTPCclusters(0);
326 fTrack->TPCchi2() = (Double_t)track->GetTPCchi2();
327 fTrack->TPCsignal() = (Double_t)track->GetTPCsignal();
328 fTrack->PtpcX() = fTrack->PtpcY() = fTrack->PtpcZ() = 1E10;
329 if (track->GetInnerParam())
331 fTrack->PtpcX() = track->GetInnerParam()->Px();
332 fTrack->PtpcY() = track->GetInnerParam()->Py();
333 fTrack->PtpcZ() = track->GetInnerParam()->Pz();
334 for (k = 0; k < AliPID::kSPECIES; k++)
336 fTrack->TPCnsigma(k) = fESDpid->NumberOfSigmasTPC(track, (AliPID::EParticleType)k);
344 track->GetIntegratedTimes(time);
345 fTrack->TOFsignal() = (Double_t)track->GetTOFsignal();
346 for (k = 0; k < AliPID::kSPECIES; k++)
348 fTrack->TOFref(k) = time[k];
349 fTrack->TOFsigma(k) = (Double_t)fTOFmaker->GetExpectedSigma(fTrack->Prec(), time[k], AliPID::ParticleMass(k));
353 // add entry to TTree