]>
Commit | Line | Data |
---|---|---|
fdceab34 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | //----------------------------------------------------------------------- | |
17 | // Example of task (running locally, on AliEn and CAF), | |
18 | // which provides standard way of calculating acceptance and efficiency | |
19 | // between different steps of the procedure. | |
20 | // The ouptut of the task is a AliCFContainer from which the efficiencies | |
21 | // can be calculated | |
22 | //----------------------------------------------------------------------- | |
23 | // Author : Marta Verweij - UU | |
24 | //----------------------------------------------------------------------- | |
25 | ||
26 | ||
67ebd013 | 27 | #ifndef ALIPWG4HIGHPTSPECTRA_CXX |
28 | #define ALIPWG4HIGHPTSPECTRA_CXX | |
fdceab34 | 29 | |
30 | #include "AliPWG4HighPtSpectra.h" | |
31 | ||
67ebd013 | 32 | #include "TVector3.h" |
33 | #include <iostream> | |
34 | #include "TH1.h" | |
35 | #include "TH2.h" | |
36 | #include "TH3.h" | |
37 | #include "TList.h" | |
38 | #include "TChain.h" | |
67ebd013 | 39 | |
40 | #include "AliAnalysisManager.h" | |
41 | #include "AliESDInputHandler.h" | |
42 | #include "AliESDtrack.h" | |
43 | #include "AliESDtrackCuts.h" | |
44 | #include "AliExternalTrackParam.h" | |
65e8ecdd | 45 | |
67ebd013 | 46 | #include "AliLog.h" |
47 | ||
fdceab34 | 48 | #include "AliStack.h" |
49 | #include "TParticle.h" | |
fdceab34 | 50 | #include "AliMCEvent.h" |
51 | #include "AliMCEventHandler.h" | |
fdceab34 | 52 | #include "AliCFContainer.h" |
fdceab34 | 53 | |
67ebd013 | 54 | //#include "$ALICE_ROOT/PWG4/JetTasks/AliAnalysisHelperJetTasks.h" |
55 | ||
56 | //#include <iostream> | |
fdceab34 | 57 | using namespace std; //required for resolving the 'cout' symbol |
58 | ||
59 | ClassImp(AliPWG4HighPtSpectra) | |
60 | ||
61 | //__________________________________________________________________________ | |
62 | AliPWG4HighPtSpectra::AliPWG4HighPtSpectra() : AliAnalysisTask("AliPWG4HighPtSpectra", ""), | |
63 | fReadAODData(0), | |
67ebd013 | 64 | fCFManagerPos(0x0), |
65 | fCFManagerNeg(0x0), | |
fdceab34 | 66 | fESD(0), |
67 | fTrackCuts(0), | |
1f329128 | 68 | fTrackCutsTPConly(0), |
fdceab34 | 69 | fHistList(0), |
b5cc0c6d | 70 | fNEventAll(0), |
71 | fNEventSel(0) | |
fdceab34 | 72 | { |
73 | // | |
74 | //Default ctor | |
75 | // | |
76 | } | |
77 | //___________________________________________________________________________ | |
78 | AliPWG4HighPtSpectra::AliPWG4HighPtSpectra(const Char_t* name) : | |
79 | AliAnalysisTask(name,""), | |
80 | fReadAODData(0), | |
67ebd013 | 81 | fCFManagerPos(0x0), |
82 | fCFManagerNeg(0x0), | |
fdceab34 | 83 | fESD(0), |
67ebd013 | 84 | fTrackCuts(), |
1f329128 | 85 | fTrackCutsTPConly(0), |
fdceab34 | 86 | fHistList(0), |
b5cc0c6d | 87 | fNEventAll(0), |
88 | fNEventSel(0) | |
fdceab34 | 89 | { |
90 | // | |
91 | // Constructor. Initialization of Inputs and Outputs | |
92 | // | |
f51451be | 93 | AliDebug(2,Form("AliPWG4HighPtSpectra Calling Constructor")); |
fdceab34 | 94 | // Input slot #0 works with a TChain ESD |
95 | DefineInput(0, TChain::Class()); | |
e5abcde9 | 96 | // Output slot #0 writes into a TList |
fdceab34 | 97 | DefineOutput(0,TList::Class()); |
e5abcde9 | 98 | // Output slot #1, #2 writes into a AliCFContainer |
fdceab34 | 99 | DefineOutput(1,AliCFContainer::Class()); |
67ebd013 | 100 | DefineOutput(2,AliCFContainer::Class()); |
e5abcde9 | 101 | // Output slot #3 writes into a AliESDtrackCuts |
102 | DefineOutput(3, AliESDtrackCuts::Class()); | |
1f329128 | 103 | DefineOutput(4, AliESDtrackCuts::Class()); |
e5abcde9 | 104 | } |
105 | ||
106 | //________________________________________________________________________ | |
107 | void AliPWG4HighPtSpectra::LocalInit() | |
108 | { | |
109 | // | |
110 | // Only called once at beginning | |
111 | // | |
112 | PostData(3,fTrackCuts); | |
1f329128 | 113 | PostData(4,fTrackCutsTPConly); |
fdceab34 | 114 | } |
115 | ||
fdceab34 | 116 | //________________________________________________________________________ |
117 | void AliPWG4HighPtSpectra::ConnectInputData(Option_t *) | |
118 | { | |
119 | // Connect ESD here | |
120 | // Called once | |
df943115 | 121 | AliDebug(2,Form(">> AliPWG4HighPtSpectra::ConnectInputData \n")); |
67ebd013 | 122 | // cout << "cout >> AliPWG4HighPtSpectra::ConnectInputData" << endl; |
123 | printf(">> AliPWG4HighPtSpectra::ConnectInputData \n"); | |
fdceab34 | 124 | |
125 | TTree* tree = dynamic_cast<TTree*> (GetInputData(0)); | |
126 | if (!tree) { | |
df943115 | 127 | AliDebug(2,Form("ERROR: Could not read chain from input slot 0")); |
fdceab34 | 128 | } else { |
129 | ||
130 | AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); | |
131 | ||
132 | if (!esdH) { | |
df943115 | 133 | AliDebug(2,Form("ERROR: Could not get ESDInputHandler")); |
67ebd013 | 134 | } else { |
fdceab34 | 135 | fESD = esdH->GetEvent(); |
67ebd013 | 136 | } |
fdceab34 | 137 | } |
67ebd013 | 138 | |
fdceab34 | 139 | } |
140 | //_________________________________________________ | |
67ebd013 | 141 | void AliPWG4HighPtSpectra::Exec(Option_t *) |
fdceab34 | 142 | { |
143 | // | |
144 | // Main loop function | |
145 | // | |
df943115 | 146 | AliDebug(2,Form(">> AliPWG4HighPtSpectra::Exec \n")); |
fdceab34 | 147 | |
b5cc0c6d | 148 | // All events without selection |
149 | fNEventAll->Fill(0.); | |
150 | ||
fdceab34 | 151 | if (!fESD) { |
df943115 | 152 | AliDebug(2,Form("ERROR: fESD not available")); |
67ebd013 | 153 | PostData(0,fHistList); |
154 | PostData(1,fCFManagerPos->GetParticleContainer()); | |
155 | PostData(2,fCFManagerNeg->GetParticleContainer()); | |
fdceab34 | 156 | return; |
157 | } | |
158 | ||
bfd58011 | 159 | UInt_t isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected(); |
160 | if(!(isSelected&AliVEvent::kMB)) { //Select collison candidates | |
b5cc0c6d | 161 | AliDebug(2,Form(" Trigger Selection: event REJECTED ... ")); |
cd9a6fa2 | 162 | PostData(0,fHistList); |
67ebd013 | 163 | PostData(1,fCFManagerPos->GetParticleContainer()); |
164 | PostData(2,fCFManagerNeg->GetParticleContainer()); | |
b5cc0c6d | 165 | return; |
67ebd013 | 166 | } |
b5cc0c6d | 167 | |
fdceab34 | 168 | // Process MC truth, therefore we receive the AliAnalysisManager and ask it for the AliMCEventHandler |
169 | // This handler can return the current MC event | |
67ebd013 | 170 | |
171 | AliMCEventHandler *eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()); | |
67ebd013 | 172 | |
0cc50ca6 | 173 | AliStack* stack = 0x0; |
174 | AliMCEvent* mcEvent = 0x0; | |
67ebd013 | 175 | |
0cc50ca6 | 176 | if(eventHandler) { |
177 | mcEvent = eventHandler->MCEvent(); | |
178 | if (!mcEvent) { | |
179 | AliDebug(2,Form("ERROR: Could not retrieve MC event")); | |
67ebd013 | 180 | PostData(0,fHistList); |
181 | PostData(1,fCFManagerPos->GetParticleContainer()); | |
75946d5d | 182 | PostData(2,fCFManagerNeg->GetParticleContainer()); |
b1cd0099 | 183 | return; |
0cc50ca6 | 184 | } |
185 | ||
186 | AliDebug(2,Form("MC particles: %d", mcEvent->GetNumberOfTracks())); | |
187 | ||
188 | stack = mcEvent->Stack(); //Particles Stack | |
189 | ||
190 | AliDebug(2,Form("MC particles stack: %d", stack->GetNtrack())); | |
fdceab34 | 191 | } |
0cc50ca6 | 192 | |
fdceab34 | 193 | const AliESDVertex *vtx = fESD->GetPrimaryVertex(); |
67ebd013 | 194 | AliDebug(2,Form("Vertex title %s, status %d, nCont %d\n",vtx->GetTitle(), vtx->GetStatus(), vtx->GetNContributors())); |
fdceab34 | 195 | // Need vertex cut |
75946d5d | 196 | TString vtxName(vtx->GetName()); |
197 | if(vtx->GetNContributors() < 2 || (vtxName.Contains("TPCVertex")) ) { | |
198 | // SPD vertex | |
199 | vtx = fESD->GetPrimaryVertexSPD(); | |
200 | if(vtx->GetNContributors()<2) { | |
201 | vtx = 0x0; | |
202 | // Post output data | |
203 | PostData(0,fHistList); | |
204 | PostData(1,fCFManagerPos->GetParticleContainer()); | |
205 | PostData(2,fCFManagerNeg->GetParticleContainer()); | |
206 | return; | |
207 | } | |
cd9a6fa2 | 208 | } |
67ebd013 | 209 | |
b5cc0c6d | 210 | double primVtx[3]; |
211 | vtx->GetXYZ(primVtx); | |
67ebd013 | 212 | if(TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2]>10.)){ |
cd9a6fa2 | 213 | PostData(0,fHistList); |
67ebd013 | 214 | PostData(1,fCFManagerPos->GetParticleContainer()); |
215 | PostData(2,fCFManagerNeg->GetParticleContainer()); | |
216 | return; | |
217 | } | |
218 | ||
219 | if(!fESD->GetNumberOfTracks() || fESD->GetNumberOfTracks()<2){ | |
220 | // Post output data | |
221 | PostData(0,fHistList); | |
222 | PostData(1,fCFManagerPos->GetParticleContainer()); | |
223 | PostData(2,fCFManagerNeg->GetParticleContainer()); | |
cd9a6fa2 | 224 | return; |
225 | } | |
fdceab34 | 226 | Int_t nTracks = fESD->GetNumberOfTracks(); |
227 | AliDebug(2,Form("nTracks %d", nTracks)); | |
fdceab34 | 228 | |
67ebd013 | 229 | if(!fTrackCuts) { |
230 | // Post output data | |
231 | PostData(0,fHistList); | |
232 | PostData(1,fCFManagerPos->GetParticleContainer()); | |
233 | PostData(2,fCFManagerNeg->GetParticleContainer()); | |
234 | return; | |
235 | } | |
236 | ||
b5cc0c6d | 237 | // Selected events for analysis |
238 | fNEventSel->Fill(0.); | |
67ebd013 | 239 | |
240 | ||
241 | Double_t containerInputRec[5] ; | |
242 | Double_t containerInputTPConly[5]; | |
243 | Double_t containerInputMC[5]; | |
fdceab34 | 244 | //Now go to rec level |
245 | for (Int_t iTrack = 0; iTrack<nTracks; iTrack++) | |
246 | { | |
247 | if(!fESD->GetTrack(iTrack) ) continue; | |
248 | AliESDtrack* track = fESD->GetTrack(iTrack); | |
249 | if(!(AliExternalTrackParam *)track->GetTPCInnerParam()) continue; | |
250 | AliExternalTrackParam *trackTPC = (AliExternalTrackParam *)track->GetTPCInnerParam(); | |
251 | if(!track || !trackTPC) continue; | |
252 | ||
67ebd013 | 253 | Float_t dca2D, dcaZ; |
254 | track->GetImpactParameters(dca2D,dcaZ); | |
255 | Float_t dca2DTPC, dcaZTPC; | |
256 | track->GetImpactParametersTPC(dca2DTPC,dcaZTPC); | |
257 | Float_t chi2PerClusterTPC = -1.; | |
258 | Float_t nClustersTPC = track->GetTPCNcls();//track->GetTPCclusters(0); | |
38ecb6a5 | 259 | if(nClustersTPC>0.) chi2PerClusterTPC = track->GetTPCchi2()/(2.*nClustersTPC-5.); |
260 | Float_t chi2PerClusterTPCIter1 = -1.; | |
261 | Float_t nClustersTPCIter1 = track->GetTPCNclsIter1(); | |
262 | if(nClustersTPCIter1>0.) chi2PerClusterTPCIter1 = track->GetTPCchi2Iter1()/(2.*nClustersTPCIter1-5.); | |
67ebd013 | 263 | |
fdceab34 | 264 | //fill the container |
265 | containerInputRec[0] = track->Pt(); | |
67ebd013 | 266 | containerInputRec[1] = track->Phi(); |
267 | containerInputRec[2] = track->Eta(); | |
268 | containerInputRec[3] = dca2D; | |
269 | containerInputRec[4] = chi2PerClusterTPC; | |
270 | ||
1f329128 | 271 | //Store TPC Inner Params for TPConly tracks |
fdceab34 | 272 | containerInputTPConly[0] = trackTPC->Pt(); |
67ebd013 | 273 | containerInputTPConly[1] = trackTPC->Phi(); |
274 | containerInputTPConly[2] = trackTPC->Eta(); | |
add06ceb | 275 | containerInputTPConly[3] = dca2DTPC/10.; //Divide by 10 in order to store in same container. Should be corrected back when looking at output. |
38ecb6a5 | 276 | containerInputTPConly[4] = chi2PerClusterTPCIter1;//TPC; |
0cc50ca6 | 277 | |
1f329128 | 278 | AliESDtrack* trackTPCESD = fTrackCutsTPConly->GetTPCOnlyTrack(fESD, iTrack); |
279 | if(trackTPCESD) { | |
280 | if (fTrackCutsTPConly->AcceptTrack(trackTPCESD)) { | |
281 | if(trackTPC->GetSign()>0.) fCFManagerPos->GetParticleContainer()->Fill(containerInputTPConly,kStepReconstructedTPCOnly); | |
282 | if(trackTPC->GetSign()<0.) fCFManagerNeg->GetParticleContainer()->Fill(containerInputTPConly,kStepReconstructedTPCOnly); | |
67ebd013 | 283 | } |
1f329128 | 284 | } |
285 | ||
286 | if (fTrackCuts->AcceptTrack(track)) { | |
287 | if(track->GetSign()>0.) fCFManagerPos->GetParticleContainer()->Fill(containerInputRec,kStepReconstructed); | |
288 | if(track->GetSign()<0.) fCFManagerNeg->GetParticleContainer()->Fill(containerInputRec,kStepReconstructed); | |
289 | ||
67ebd013 | 290 | |
1f329128 | 291 | //Only fill the MC containers if MC information is available |
0cc50ca6 | 292 | if(eventHandler) { |
293 | Int_t label = TMath::Abs(track->GetLabel()); | |
294 | TParticle *particle = stack->Particle(label) ; | |
295 | if(!particle) continue; | |
65e8ecdd | 296 | |
0cc50ca6 | 297 | containerInputMC[0] = particle->Pt(); |
67ebd013 | 298 | containerInputMC[1] = particle->Phi(); |
299 | containerInputMC[2] = particle->Eta(); | |
300 | containerInputMC[3] = 0.0; | |
301 | containerInputMC[4] = 0.0; | |
302 | ||
1f329128 | 303 | //Container with primaries |
304 | if(stack->IsPhysicalPrimary(label)) { | |
305 | if(particle->GetPDG()->Charge()>0.) { | |
306 | fCFManagerPos->GetParticleContainer()->Fill(containerInputMC,kStepReconstructedMC); | |
307 | } | |
308 | if(particle->GetPDG()->Charge()<0.) { | |
309 | fCFManagerNeg->GetParticleContainer()->Fill(containerInputMC,kStepReconstructedMC); | |
310 | } | |
67ebd013 | 311 | } |
312 | ||
1f329128 | 313 | //Container with secondaries |
0cc50ca6 | 314 | if (!stack->IsPhysicalPrimary(label) ) { |
67ebd013 | 315 | if(particle->GetPDG()->Charge()>0.) { |
316 | fCFManagerPos->GetParticleContainer()->Fill(containerInputRec,kStepSecondaries); | |
317 | } | |
318 | if(particle->GetPDG()->Charge()<0.) { | |
319 | fCFManagerNeg->GetParticleContainer()->Fill(containerInputRec,kStepSecondaries); | |
320 | } | |
0cc50ca6 | 321 | } |
322 | } | |
67ebd013 | 323 | |
1f329128 | 324 | }//trackCuts |
60829498 | 325 | |
326 | delete trackTPCESD; | |
1f329128 | 327 | }//track loop |
67ebd013 | 328 | |
fdceab34 | 329 | |
65e8ecdd | 330 | //Fill MC containters if particles are findable |
0cc50ca6 | 331 | if(eventHandler) { |
1f329128 | 332 | for(int iPart = 1; iPart<(mcEvent->GetNumberOfPrimaries()); iPart++)//stack->GetNprimary(); |
0cc50ca6 | 333 | { |
334 | AliMCParticle *mcPart = (AliMCParticle*)mcEvent->GetTrack(iPart); | |
335 | if(!mcPart) continue; | |
0cc50ca6 | 336 | //fill the container |
337 | containerInputMC[0] = mcPart->Pt(); | |
67ebd013 | 338 | containerInputMC[1] = mcPart->Phi(); |
339 | containerInputMC[2] = mcPart->Eta(); | |
340 | containerInputMC[3] = 0.0; | |
341 | containerInputMC[4] = 0.0; | |
342 | ||
1f329128 | 343 | if(stack->IsPhysicalPrimary(iPart)) { |
9b58297c | 344 | if(mcPart->Charge()>0. && fCFManagerPos->CheckParticleCuts(kStepMCAcceptance,mcPart)) fCFManagerPos->GetParticleContainer()->Fill(containerInputMC,kStepMCAcceptance); |
345 | if(mcPart->Charge()<0. && fCFManagerNeg->CheckParticleCuts(kStepMCAcceptance,mcPart)) fCFManagerNeg->GetParticleContainer()->Fill(containerInputMC,kStepMCAcceptance); | |
67ebd013 | 346 | } |
0cc50ca6 | 347 | } |
348 | } | |
67ebd013 | 349 | |
67ebd013 | 350 | PostData(0,fHistList); |
351 | PostData(1,fCFManagerPos->GetParticleContainer()); | |
352 | PostData(2,fCFManagerNeg->GetParticleContainer()); | |
353 | ||
fdceab34 | 354 | } |
355 | ||
356 | ||
357 | //___________________________________________________________________________ | |
358 | void AliPWG4HighPtSpectra::Terminate(Option_t*) | |
359 | { | |
360 | // The Terminate() function is the last function to be called during | |
361 | // a query. It always runs on the client, it can be used to present | |
362 | // the results graphically or save the results to file. | |
9b58297c | 363 | |
fdceab34 | 364 | } |
365 | ||
fdceab34 | 366 | //___________________________________________________________________________ |
367 | void AliPWG4HighPtSpectra::CreateOutputObjects() { | |
368 | //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED | |
369 | //TO BE SET BEFORE THE EXECUTION OF THE TASK | |
370 | // | |
f51451be | 371 | AliDebug(2,Form("CreateOutputObjects CreateOutputObjects of task %s", GetName())); |
df943115 | 372 | |
67ebd013 | 373 | Bool_t oldStatus = TH1::AddDirectoryStatus(); |
374 | TH1::AddDirectory(kFALSE); | |
375 | ||
fdceab34 | 376 | //slot #1 |
b5cc0c6d | 377 | OpenFile(0); |
378 | fHistList = new TList(); | |
379 | fNEventAll = new TH1F("fNEventAll","NEventAll",1,-0.5,0.5); | |
380 | fHistList->Add(fNEventAll); | |
381 | fNEventSel = new TH1F("fNEventSel","NEvent Selected for analysis",1,-0.5,0.5); | |
382 | fHistList->Add(fNEventSel); | |
fdceab34 | 383 | |
67ebd013 | 384 | TH1::AddDirectory(oldStatus); |
385 | ||
fdceab34 | 386 | } |
387 | ||
388 | #endif |