]>
Commit | Line | Data |
---|---|---|
2fbc0b17 | 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 | // Author : R. Vernet, Consorzio Cometa - Catania (it) | |
18 | //----------------------------------------------------------------------- | |
19 | ||
20 | ||
2fbc0b17 | 21 | #include "AliCFRsnTask.h" |
22 | #include "TCanvas.h" | |
23 | #include "AliStack.h" | |
24 | #include "TParticle.h" | |
25 | #include "TH1I.h" | |
26 | #include "TChain.h" | |
2fbc0b17 | 27 | #include "AliMCEvent.h" |
2fbc0b17 | 28 | #include "AliESDEvent.h" |
29 | #include "AliCFManager.h" | |
30 | #include "AliCFCutBase.h" | |
31 | #include "AliCFContainer.h" | |
2fbc0b17 | 32 | #include "AliESDtrack.h" |
33 | #include "AliLog.h" | |
34 | #include "AliRsnDaughter.h" | |
35 | #include "AliCFPair.h" | |
318a0e1f | 36 | #include "AliRsnParticle.h" |
2fbc0b17 | 37 | |
38 | //__________________________________________________________________________ | |
39 | AliCFRsnTask::AliCFRsnTask() : | |
318a0e1f | 40 | AliAnalysisTaskSE(), |
d81da0bf | 41 | fRsnPDG(0), |
2fbc0b17 | 42 | fCFManager(0x0), |
43 | fHistEventsProcessed(0x0) | |
44 | { | |
318a0e1f | 45 | // |
46 | //Default ctor | |
47 | // | |
2fbc0b17 | 48 | } |
49 | //___________________________________________________________________________ | |
50 | AliCFRsnTask::AliCFRsnTask(const Char_t* name) : | |
318a0e1f | 51 | AliAnalysisTaskSE(name), |
d81da0bf | 52 | fRsnPDG(0), |
2fbc0b17 | 53 | fCFManager(0x0), |
54 | fHistEventsProcessed(0x0) | |
55 | { | |
56 | // | |
57 | // Constructor. Initialization of Inputs and Outputs | |
58 | // | |
59 | Info("AliCFRsnTask","Calling Constructor"); | |
318a0e1f | 60 | /* |
61 | DefineInput(0) and DefineOutput(0) | |
62 | are taken care of by AliAnalysisTaskSE constructor | |
63 | */ | |
64 | DefineOutput(1,TH1I::Class()); | |
65 | DefineOutput(2,AliCFContainer::Class()); | |
66 | // DefineOutput(3,TList::Class()); | |
2fbc0b17 | 67 | } |
68 | ||
69 | //___________________________________________________________________________ | |
70 | AliCFRsnTask& AliCFRsnTask::operator=(const AliCFRsnTask& c) | |
71 | { | |
72 | // | |
73 | // Assignment operator | |
74 | // | |
75 | if (this!=&c) { | |
318a0e1f | 76 | AliAnalysisTaskSE::operator=(c) ; |
2fbc0b17 | 77 | fRsnPDG = c.fRsnPDG; |
2fbc0b17 | 78 | fCFManager = c.fCFManager; |
79 | fHistEventsProcessed = c.fHistEventsProcessed; | |
80 | } | |
81 | return *this; | |
82 | } | |
83 | ||
84 | //___________________________________________________________________________ | |
85 | AliCFRsnTask::AliCFRsnTask(const AliCFRsnTask& c) : | |
318a0e1f | 86 | AliAnalysisTaskSE(c), |
2fbc0b17 | 87 | fRsnPDG(c.fRsnPDG), |
2fbc0b17 | 88 | fCFManager(c.fCFManager), |
89 | fHistEventsProcessed(c.fHistEventsProcessed) | |
90 | { | |
91 | // | |
92 | // Copy Constructor | |
93 | // | |
94 | } | |
95 | ||
96 | //___________________________________________________________________________ | |
97 | AliCFRsnTask::~AliCFRsnTask() { | |
98 | // | |
99 | //destructor | |
100 | // | |
101 | Info("~AliCFRsnTask","Calling Destructor"); | |
2fbc0b17 | 102 | if (fCFManager) delete fCFManager ; |
103 | if (fHistEventsProcessed) delete fHistEventsProcessed ; | |
104 | } | |
105 | ||
2fbc0b17 | 106 | //_________________________________________________ |
318a0e1f | 107 | void AliCFRsnTask::UserExec(Option_t *) |
2fbc0b17 | 108 | { |
109 | // | |
110 | // Main loop function | |
111 | // | |
318a0e1f | 112 | Info("UserExec","") ; |
2fbc0b17 | 113 | |
318a0e1f | 114 | AliESDEvent* fESD = dynamic_cast<AliESDEvent*>(fInputEvent); |
115 | if (!fESD) { | |
116 | Error("UserExec","NO ESD FOUND!"); | |
117 | return; | |
118 | } | |
2fbc0b17 | 119 | |
318a0e1f | 120 | if (!fMCEvent) Error("UserExec","NO MC INFO FOUND!"); |
121 | fCFManager->SetEventInfo(fMCEvent); | |
2fbc0b17 | 122 | |
318a0e1f | 123 | AliStack* stack = fMCEvent->Stack(); |
2fbc0b17 | 124 | |
125 | // MC-event selection | |
126 | Double_t containerInput[2] ; | |
127 | ||
128 | //loop on the MC event | |
318a0e1f | 129 | Info("UserExec","Looping on MC event"); |
2fbc0b17 | 130 | for (Int_t ipart=0; ipart<stack->GetNprimary(); ipart++) { |
318a0e1f | 131 | AliMCParticle *mcPart = fMCEvent->GetTrack(ipart); |
2fbc0b17 | 132 | |
133 | //check the MC-level cuts | |
134 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartGenCuts,mcPart)) continue; | |
135 | containerInput[0] = mcPart->Pt(); | |
1d519a00 | 136 | containerInput[1] = mcPart->Y() ; |
2fbc0b17 | 137 | //fill the container for Gen-level selection |
138 | fCFManager->GetParticleContainer()->Fill(containerInput,kStepGenerated); | |
139 | ||
140 | //check the Acceptance-level cuts | |
141 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartAccCuts,mcPart)) continue; | |
142 | //fill the container for Acceptance-level selection | |
143 | fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructible); | |
144 | } | |
145 | ||
146 | ||
147 | //Now go to rec level | |
318a0e1f | 148 | Info("UserExec","Looping on ESD event"); |
2fbc0b17 | 149 | |
150 | //SET THE ESD AS EVENT INFO IN RECONSTRUCTION CUTS | |
151 | TObjArray* fCutsReco = fCFManager->GetParticleCutsList(AliCFManager::kPartRecCuts); | |
152 | TObjArray* fCutsPID = fCFManager->GetParticleCutsList(AliCFManager::kPartSelCuts); | |
153 | TObjArrayIter iter1(fCutsReco); | |
154 | TObjArrayIter iter2(fCutsPID); | |
155 | AliCFCutBase *cut = 0; | |
156 | while ( (cut = (AliCFCutBase*)iter1.Next()) ) { | |
157 | cut->SetEvtInfo(fESD); | |
158 | } | |
159 | while ( (cut = (AliCFCutBase*)iter2.Next()) ) { | |
160 | cut->SetEvtInfo(fESD); | |
161 | } | |
318a0e1f | 162 | |
d81da0bf | 163 | // Loop on negative tracks |
2fbc0b17 | 164 | for (Int_t iTrack1 = 0; iTrack1<fESD->GetNumberOfTracks(); iTrack1++) { |
165 | AliESDtrack* esdTrack1 = fESD->GetTrack(iTrack1); | |
166 | //track1 is negative | |
167 | if (esdTrack1->Charge()>=0) continue; | |
168 | Int_t esdLabel1 = esdTrack1->GetLabel(); | |
169 | if (esdLabel1<0) continue; | |
170 | ||
d81da0bf | 171 | //Loop on positive tracks |
2fbc0b17 | 172 | for (Int_t iTrack2 = 0; iTrack2<fESD->GetNumberOfTracks(); iTrack2++) { |
173 | AliESDtrack* esdTrack2 = fESD->GetTrack(iTrack2); | |
174 | //track2 is positive | |
175 | if (esdTrack2->Charge()<=0) continue; | |
176 | Int_t esdLabel2 = esdTrack2->GetLabel(); | |
177 | if (esdLabel2<0) continue; | |
178 | ||
d81da0bf | 179 | //Create Resonance daughter objects |
318a0e1f | 180 | AliRsnDaughter* tmp1 = new AliRsnDaughter(esdTrack1); |
181 | AliRsnDaughter* tmp2 = new AliRsnDaughter(esdTrack2); | |
2fbc0b17 | 182 | AliRsnDaughter track1(*tmp1); |
183 | AliRsnDaughter track2(*tmp2); | |
184 | delete tmp1; | |
185 | delete tmp2; | |
186 | ||
d81da0bf | 187 | //Set MC information to resonance daughters |
2fbc0b17 | 188 | TParticle *part1 = stack->Particle(esdLabel1); |
318a0e1f | 189 | track1.InitParticle(part1); |
190 | track1.GetParticle()->SetPDG(part1->GetPdgCode()); | |
191 | ||
2fbc0b17 | 192 | Int_t mother1 = part1->GetFirstMother(); |
318a0e1f | 193 | track1.GetParticle()->SetMother(mother1); |
2fbc0b17 | 194 | if (mother1 >= 0) { |
195 | TParticle *mum = stack->Particle(mother1); | |
318a0e1f | 196 | track1.GetParticle()->SetMotherPDG(mum->GetPdgCode()); |
2fbc0b17 | 197 | } |
198 | ||
199 | TParticle *part2 = stack->Particle(esdLabel2); | |
318a0e1f | 200 | track2.InitParticle(part2); |
201 | track2.GetParticle()->SetPDG(part2->GetPdgCode()); | |
202 | ||
2fbc0b17 | 203 | Int_t mother2 = part2->GetFirstMother(); |
318a0e1f | 204 | track2.GetParticle()->SetMother(mother2); |
2fbc0b17 | 205 | if (mother2 >= 0) { |
206 | TParticle *mum = stack->Particle(mother2); | |
318a0e1f | 207 | track2.GetParticle()->SetMotherPDG(mum->GetPdgCode()); |
2fbc0b17 | 208 | } |
209 | ||
210 | //make a mother resonance from the 2 candidate daughters | |
211 | AliRsnDaughter rsn = AliRsnDaughter::Sum(track1,track2) ; | |
d81da0bf | 212 | AliCFPair pair(esdTrack1,esdTrack2); // This object is used for cuts (to be replaced) |
2fbc0b17 | 213 | |
214 | //check if true resonance | |
d81da0bf | 215 | if (rsn.GetParticle()->PDG() != fRsnPDG) continue; |
2fbc0b17 | 216 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartRecCuts,&pair)) continue; |
217 | ||
218 | //check if associated MC resonance passes the cuts | |
318a0e1f | 219 | Int_t motherLabel=rsn.Label(); |
2fbc0b17 | 220 | if (motherLabel<0) continue ; |
318a0e1f | 221 | AliMCParticle* mcRsn = fMCEvent->GetTrack(motherLabel); |
2fbc0b17 | 222 | if (!mcRsn) continue; |
223 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartGenCuts,mcRsn)) continue; | |
d81da0bf | 224 | |
2fbc0b17 | 225 | //fill the container |
318a0e1f | 226 | containerInput[0] = rsn.Pt() ; |
227 | containerInput[1] = GetRapidity(rsn.E(),rsn.Pz()); | |
2fbc0b17 | 228 | fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed) ; |
229 | ||
230 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartSelCuts,&pair)) continue ; | |
231 | fCFManager->GetParticleContainer()->Fill(containerInput,kStepSelected); | |
232 | } | |
233 | } | |
234 | ||
235 | fHistEventsProcessed->Fill(0); | |
318a0e1f | 236 | /* PostData(0) is taken care of by AliAnalysisTaskSE */ |
237 | PostData(1,fHistEventsProcessed) ; | |
238 | PostData(2,fCFManager->GetParticleContainer()) ; | |
2fbc0b17 | 239 | |
240 | // TList * list = new TList(); | |
241 | // fCFManager->AddQAHistosToList(list); | |
242 | // PostData(2,list) ; | |
243 | } | |
244 | ||
245 | ||
246 | //___________________________________________________________________________ | |
247 | void AliCFRsnTask::Terminate(Option_t*) | |
248 | { | |
249 | // The Terminate() function is the last function to be called during | |
250 | // a query. It always runs on the client, it can be used to present | |
251 | // the results graphically or save the results to file. | |
252 | ||
253 | Info("Terminate",""); | |
2fbc0b17 | 254 | |
255 | Double_t max1 = fCFManager->GetParticleContainer()->ShowProjection(0,0)->GetMaximum(); | |
256 | Double_t max2 = fCFManager->GetParticleContainer()->ShowProjection(1,0)->GetMaximum(); | |
257 | ||
258 | fCFManager->GetParticleContainer()->ShowProjection(0,0)->GetYaxis()->SetRangeUser(0,max1*1.2); | |
259 | fCFManager->GetParticleContainer()->ShowProjection(0,1)->GetYaxis()->SetRangeUser(0,max1*1.2); | |
260 | fCFManager->GetParticleContainer()->ShowProjection(0,2)->GetYaxis()->SetRangeUser(0,max1*1.2); | |
261 | fCFManager->GetParticleContainer()->ShowProjection(0,3)->GetYaxis()->SetRangeUser(0,max1*1.2); | |
262 | ||
263 | fCFManager->GetParticleContainer()->ShowProjection(1,0)->GetYaxis()->SetRangeUser(0,max2*1.2); | |
264 | fCFManager->GetParticleContainer()->ShowProjection(1,1)->GetYaxis()->SetRangeUser(0,max2*1.2); | |
265 | fCFManager->GetParticleContainer()->ShowProjection(1,2)->GetYaxis()->SetRangeUser(0,max2*1.2); | |
266 | fCFManager->GetParticleContainer()->ShowProjection(1,3)->GetYaxis()->SetRangeUser(0,max2*1.2); | |
267 | ||
268 | fCFManager->GetParticleContainer()->ShowProjection(0,0)->SetMarkerStyle(23) ; | |
269 | fCFManager->GetParticleContainer()->ShowProjection(0,1)->SetMarkerStyle(24) ; | |
270 | fCFManager->GetParticleContainer()->ShowProjection(0,2)->SetMarkerStyle(25) ; | |
271 | fCFManager->GetParticleContainer()->ShowProjection(0,3)->SetMarkerStyle(26) ; | |
272 | ||
273 | fCFManager->GetParticleContainer()->ShowProjection(1,0)->SetMarkerStyle(23) ; | |
274 | fCFManager->GetParticleContainer()->ShowProjection(1,1)->SetMarkerStyle(24) ; | |
275 | fCFManager->GetParticleContainer()->ShowProjection(1,2)->SetMarkerStyle(25) ; | |
276 | fCFManager->GetParticleContainer()->ShowProjection(1,3)->SetMarkerStyle(26) ; | |
277 | ||
278 | TCanvas * c =new TCanvas("c","",1400,800); | |
279 | c->Divide(4,2); | |
280 | ||
281 | c->cd(1); | |
282 | fCFManager->GetParticleContainer()->ShowProjection(0,0)->Draw("p"); | |
283 | c->cd(2); | |
284 | fCFManager->GetParticleContainer()->ShowProjection(0,1)->Draw("p"); | |
285 | c->cd(3); | |
286 | fCFManager->GetParticleContainer()->ShowProjection(0,2)->Draw("p"); | |
287 | c->cd(4); | |
288 | fCFManager->GetParticleContainer()->ShowProjection(0,3)->Draw("p"); | |
289 | c->cd(5); | |
290 | fCFManager->GetParticleContainer()->ShowProjection(1,0)->Draw("p"); | |
291 | c->cd(6); | |
292 | fCFManager->GetParticleContainer()->ShowProjection(1,1)->Draw("p"); | |
293 | c->cd(7); | |
294 | fCFManager->GetParticleContainer()->ShowProjection(1,2)->Draw("p"); | |
295 | c->cd(8); | |
296 | fCFManager->GetParticleContainer()->ShowProjection(1,3)->Draw("p"); | |
297 | ||
298 | c->SaveAs("plots.eps"); | |
299 | ||
300 | delete fHistEventsProcessed ; | |
301 | } | |
302 | ||
303 | //___________________________________________________________________________ | |
318a0e1f | 304 | void AliCFRsnTask::UserCreateOutputObjects() { |
2fbc0b17 | 305 | //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED |
306 | //TO BE SET BEFORE THE EXECUTION OF THE TASK | |
307 | // | |
318a0e1f | 308 | Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName()); |
2fbc0b17 | 309 | |
318a0e1f | 310 | //slot #1 |
311 | OpenFile(1); | |
2fbc0b17 | 312 | fHistEventsProcessed = new TH1I("fHistEventsProcessed","",1,0,1) ; |
313 | } | |
314 | ||
315 | //___________________________________________________________________________ | |
316 | Double_t AliCFRsnTask::GetRapidity(Double_t energy, Double_t pz) { | |
317 | if (energy == pz || energy == -pz) { | |
318 | printf("GetRapidity : ERROR : rapidity for 4-vector with E = Pz -- infinite result"); | |
319 | return 999; | |
320 | } | |
321 | if (energy < pz) { | |
322 | printf("GetRapidity : ERROR : rapidity for 4-vector with E = Pz -- infinite result"); | |
323 | return 999; | |
324 | } | |
325 | Double_t y = 0.5 * log((energy + pz) / (energy - pz)); | |
326 | return y; | |
327 | } | |
328 | ||
329 |