]>
Commit | Line | Data |
---|---|---|
563113d0 | 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 on AliEn (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 : R. Vernet, Consorzio Cometa - Catania (it) | |
24 | //----------------------------------------------------------------------- | |
25 | ||
26 | ||
27 | #ifndef ALICFSINGLETRACKTASK_CXX | |
28 | #define ALICFSINGLETRACKTASK_CXX | |
29 | #include <TROOT.h> | |
30 | #include <TInterpreter.h> | |
31 | ||
32 | #include "AliCFSingleTrackTask.h" | |
33 | #include "TCanvas.h" | |
34 | #include "AliStack.h" | |
35 | #include "TParticle.h" | |
36 | #include "TH1I.h" | |
37 | #include "TChain.h" | |
38 | #include "AliMCEventHandler.h" | |
39 | #include "AliMCEvent.h" | |
40 | #include "AliAnalysisManager.h" | |
41 | #include "AliESDEvent.h" | |
42 | #include "AliCFManager.h" | |
43 | #include "AliCFCutBase.h" | |
44 | #include "AliCFContainer.h" | |
45 | #include "TChain.h" | |
46 | #include "AliESDtrack.h" | |
47 | #include "AliLog.h" | |
48 | ClassImp(AliCFSingleTrackTask) | |
49 | //__________________________________________________________________________ | |
50 | AliCFSingleTrackTask::AliCFSingleTrackTask() : | |
51 | fChain(0x0), | |
52 | fESD(0x0), | |
53 | fCFManager(0x0), | |
54 | fQAHistList(0x0), | |
55 | fHistEventsProcessed(0x0) | |
56 | { | |
57 | //Defual ctor | |
58 | } | |
59 | //___________________________________________________________________________ | |
60 | AliCFSingleTrackTask::AliCFSingleTrackTask(const Char_t* name) : | |
61 | AliAnalysisTask(name,"AliCFSingleTrackTask"), | |
62 | fChain(0x0), | |
63 | fESD(0x0), | |
64 | fCFManager(0x0), | |
65 | fQAHistList(0x0), | |
66 | fHistEventsProcessed(0x0) | |
67 | { | |
68 | // | |
69 | // Constructor. Initialization of Inputs and Outputs | |
70 | // | |
71 | Info("AliCFSingleTrackTask","Calling Constructor"); | |
72 | DefineInput (0,TChain::Class()); | |
73 | DefineOutput(0,TH1I::Class()); | |
74 | DefineOutput(1,AliCFContainer::Class()); | |
75 | DefineOutput(2,TList::Class()); | |
76 | } | |
77 | ||
78 | //___________________________________________________________________________ | |
79 | AliCFSingleTrackTask& AliCFSingleTrackTask::operator=(const AliCFSingleTrackTask& c) | |
80 | { | |
81 | // | |
82 | // Assignment operator | |
83 | // | |
84 | if (this!=&c) { | |
85 | AliAnalysisTask::operator=(c) ; | |
86 | fChain = c.fChain; | |
87 | fESD = c.fESD; | |
88 | fCFManager = c.fCFManager; | |
89 | fQAHistList = c.fQAHistList ; | |
90 | fHistEventsProcessed = c.fHistEventsProcessed; | |
91 | } | |
92 | return *this; | |
93 | } | |
94 | ||
95 | //___________________________________________________________________________ | |
96 | AliCFSingleTrackTask::AliCFSingleTrackTask(const AliCFSingleTrackTask& c) : | |
97 | AliAnalysisTask(c), | |
98 | fChain(c.fChain), | |
99 | fESD(c.fESD), | |
100 | fCFManager(c.fCFManager), | |
101 | fQAHistList(c.fQAHistList), | |
102 | fHistEventsProcessed(c.fHistEventsProcessed) | |
103 | { | |
104 | // | |
105 | // Copy Constructor | |
106 | // | |
107 | } | |
108 | ||
109 | //___________________________________________________________________________ | |
110 | AliCFSingleTrackTask::~AliCFSingleTrackTask() { | |
111 | // | |
112 | //destructor | |
113 | // | |
114 | Info("~AliCFSingleTrackTask","Calling Destructor"); | |
115 | if (fChain) delete fChain ; | |
116 | if (fESD) delete fESD ; | |
117 | if (fCFManager) delete fCFManager ; | |
118 | if (fHistEventsProcessed) delete fHistEventsProcessed ; | |
119 | if (fQAHistList) {fQAHistList->Clear(); delete fQAHistList;} | |
120 | } | |
121 | ||
122 | //___________________________________________________________________________ | |
123 | ||
124 | void AliCFSingleTrackTask::Init() | |
125 | { | |
126 | ||
127 | } | |
128 | //_________________________________________________ | |
129 | void AliCFSingleTrackTask::Exec(Option_t *) | |
130 | { | |
131 | // | |
132 | // Main loop function | |
133 | // | |
134 | Info("Exec","") ; | |
135 | // Get the mc truth | |
136 | AliMCEventHandler* mcTruth = (AliMCEventHandler*)((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler()); | |
137 | ||
138 | if (!mcTruth) Error("Exec","NO MC INFO FOUND... EXITING\n"); | |
139 | ||
140 | // transform possible old AliESD into AliESDEvent | |
141 | ||
142 | if (fESD->GetAliESDOld()) fESD->CopyFromOldESD(); //transition to new ESD format | |
143 | ||
144 | //pass the MC evt handler to the cuts that need it | |
145 | ||
146 | fCFManager->SetEventInfo(mcTruth); | |
147 | ||
148 | // Get the MC event | |
149 | AliMCEvent* mcEvent = mcTruth->MCEvent(); | |
150 | ||
151 | // MC-event selection | |
1e9dad92 | 152 | Double_t containerInput[2] ; |
563113d0 | 153 | |
154 | //loop on the MC event | |
155 | for (Int_t ipart=0; ipart<mcEvent->GetNumberOfTracks(); ipart++) { | |
156 | AliMCParticle *mcPart = mcEvent->GetTrack(ipart); | |
157 | ||
158 | //check the MC-level cuts | |
159 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartGenCuts,mcPart)) continue; | |
160 | ||
161 | containerInput[0] = (Float_t)mcPart->Pt(); | |
162 | containerInput[1] = mcPart->Eta() ; | |
163 | //fill the container for Gen-level selection | |
164 | fCFManager->GetParticleContainer()->Fill(containerInput,kStepGenerated); | |
165 | ||
166 | //check the Acceptance-level cuts | |
167 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartAccCuts,mcPart)) continue; | |
168 | //fill the container for Acceptance-level selection | |
169 | fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructible); | |
170 | } | |
171 | ||
172 | //Now go to rec level | |
173 | for (Int_t iTrack = 0; iTrack<fESD->GetNumberOfTracks(); iTrack++) { | |
174 | ||
175 | AliESDtrack* track = fESD->GetTrack(iTrack); | |
176 | ||
177 | fCFManager->FillQABeforeParticleCuts(AliCFManager::kPartRecCuts,track); | |
178 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartRecCuts,track)) continue; | |
179 | fCFManager->FillQAAfterParticleCuts(AliCFManager::kPartRecCuts,track); | |
180 | ||
181 | // is track associated to particle ? | |
182 | if (track->GetLabel()<0) continue; | |
183 | AliMCParticle *mcPart = mcEvent->GetTrack(track->GetLabel()); | |
184 | ||
185 | // check if this track was part of the signal | |
186 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartGenCuts,mcPart)) continue; | |
187 | ||
188 | //fill the container | |
189 | Double_t mom[3]; | |
190 | track->GetPxPyPz(mom); | |
191 | Double_t pt=TMath::Sqrt(mom[0]*mom[0]+mom[1]*mom[1]); | |
192 | containerInput[0] = pt ; | |
193 | containerInput[1] = track->Eta(); | |
194 | fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed) ; | |
195 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartSelCuts,track)) continue ; | |
196 | fCFManager->GetParticleContainer()->Fill(containerInput,kStepSelected); | |
197 | } | |
198 | ||
199 | fHistEventsProcessed->Fill(0); | |
200 | PostData(0,fHistEventsProcessed) ; | |
201 | PostData(1,fCFManager->GetParticleContainer()) ; | |
202 | PostData(2,fQAHistList) ; | |
203 | } | |
204 | ||
205 | ||
206 | //___________________________________________________________________________ | |
207 | void AliCFSingleTrackTask::Terminate(Option_t*) | |
208 | { | |
209 | // The Terminate() function is the last function to be called during | |
210 | // a query. It always runs on the client, it can be used to present | |
211 | // the results graphically or save the results to file. | |
212 | ||
213 | Info("Terminate",""); | |
214 | AliAnalysisTask::Terminate(); | |
215 | ||
216 | ||
217 | Double_t max1 = fCFManager->GetParticleContainer()->ShowProjection(0,0)->GetMaximum(); | |
218 | Double_t max2 = fCFManager->GetParticleContainer()->ShowProjection(1,0)->GetMaximum(); | |
219 | ||
220 | fCFManager->GetParticleContainer()->ShowProjection(0,0)->GetYaxis()->SetRangeUser(0,max1*1.2); | |
221 | fCFManager->GetParticleContainer()->ShowProjection(0,1)->GetYaxis()->SetRangeUser(0,max1*1.2); | |
222 | fCFManager->GetParticleContainer()->ShowProjection(0,2)->GetYaxis()->SetRangeUser(0,max1*1.2); | |
223 | fCFManager->GetParticleContainer()->ShowProjection(0,3)->GetYaxis()->SetRangeUser(0,max1*1.2); | |
224 | ||
225 | fCFManager->GetParticleContainer()->ShowProjection(1,0)->GetYaxis()->SetRangeUser(0,max2*1.2); | |
226 | fCFManager->GetParticleContainer()->ShowProjection(1,1)->GetYaxis()->SetRangeUser(0,max2*1.2); | |
227 | fCFManager->GetParticleContainer()->ShowProjection(1,2)->GetYaxis()->SetRangeUser(0,max2*1.2); | |
228 | fCFManager->GetParticleContainer()->ShowProjection(1,3)->GetYaxis()->SetRangeUser(0,max2*1.2); | |
229 | ||
230 | fCFManager->GetParticleContainer()->ShowProjection(0,0)->SetMarkerStyle(23) ; | |
231 | fCFManager->GetParticleContainer()->ShowProjection(0,1)->SetMarkerStyle(24) ; | |
232 | fCFManager->GetParticleContainer()->ShowProjection(0,2)->SetMarkerStyle(25) ; | |
233 | fCFManager->GetParticleContainer()->ShowProjection(0,3)->SetMarkerStyle(26) ; | |
234 | ||
235 | fCFManager->GetParticleContainer()->ShowProjection(1,0)->SetMarkerStyle(23) ; | |
236 | fCFManager->GetParticleContainer()->ShowProjection(1,1)->SetMarkerStyle(24) ; | |
237 | fCFManager->GetParticleContainer()->ShowProjection(1,2)->SetMarkerStyle(25) ; | |
238 | fCFManager->GetParticleContainer()->ShowProjection(1,3)->SetMarkerStyle(26) ; | |
239 | ||
240 | TCanvas * c =new TCanvas("c","",1400,800); | |
241 | c->Divide(4,2); | |
242 | ||
243 | // TCanvas * c1 =new TCanvas("c1","",600,400); | |
244 | c->cd(1); | |
245 | fCFManager->GetParticleContainer()->ShowProjection(0,0)->Draw("p"); | |
246 | c->cd(2); | |
247 | fCFManager->GetParticleContainer()->ShowProjection(0,1)->Draw("p"); | |
248 | c->cd(3); | |
249 | fCFManager->GetParticleContainer()->ShowProjection(0,2)->Draw("p"); | |
250 | c->cd(4); | |
251 | fCFManager->GetParticleContainer()->ShowProjection(0,3)->Draw("p"); | |
252 | ||
253 | // TCanvas * c2 =new TCanvas("c2","",600,400); | |
254 | c->cd(5); | |
255 | fCFManager->GetParticleContainer()->ShowProjection(1,0)->Draw("p"); | |
256 | c->cd(6); | |
257 | fCFManager->GetParticleContainer()->ShowProjection(1,1)->Draw("p"); | |
258 | c->cd(7); | |
259 | fCFManager->GetParticleContainer()->ShowProjection(1,2)->Draw("p"); | |
260 | c->cd(8); | |
261 | fCFManager->GetParticleContainer()->ShowProjection(1,3)->Draw("p"); | |
262 | ||
263 | c->SaveAs("plots.eps"); | |
264 | ||
265 | delete fHistEventsProcessed ; | |
266 | } | |
267 | ||
268 | //___________________________________________________________________________ | |
269 | void AliCFSingleTrackTask::ConnectInputData(Option_t *) { | |
270 | // | |
271 | // Initialize branches. | |
272 | // | |
273 | Info("ConnectInputData","ConnectInputData of task %s\n",GetName()); | |
274 | ||
275 | fChain = (TChain*)GetInputData(0); | |
276 | fChain->SetBranchStatus("*FMD*",0); | |
277 | fChain->SetBranchStatus("*CaloClusters*",0); | |
278 | fESD = new AliESDEvent(); | |
279 | fESD->ReadFromTree(fChain); | |
280 | } | |
281 | ||
282 | //___________________________________________________________________________ | |
283 | void AliCFSingleTrackTask::CreateOutputObjects() { | |
284 | //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED | |
285 | //TO BE SET BEFORE THE EXECUTION OF THE TASK | |
286 | // | |
287 | Info("CreateOutputObjects","CreateOutputObjects of task %s\n", GetName()); | |
288 | ||
289 | //slot #0 | |
290 | fHistEventsProcessed = new TH1I("fHistEventsProcessed","",1,0,1) ; | |
291 | ||
292 | //slot #2 | |
293 | fQAHistList = new TList(); | |
294 | fCFManager->InitQAHistos(); | |
295 | fCFManager->AddQAHistosToList(fQAHistList); | |
296 | } | |
297 | ||
298 | #endif |