]>
Commit | Line | Data |
---|---|---|
3633478d | 1 | /* $Id$ */ |
2 | ||
3 | #include "AliTestESDtrackCutsSelector.h" | |
4 | ||
5 | #include <TStyle.h> | |
6 | #include <TSystem.h> | |
7 | #include <TCanvas.h> | |
8 | #include <TParticle.h> | |
9 | #include <TParticlePDG.h> | |
10 | #include <TVector3.h> | |
11 | #include <TChain.h> | |
12 | #include <TFile.h> | |
13 | #include <TH1F.h> | |
70d782ef | 14 | #include <TH3F.h> |
3633478d | 15 | |
16 | #include <TSelector.h> | |
17 | #include <TFile.h> | |
18 | ||
19 | #include <AliLog.h> | |
20 | #include <AliESD.h> | |
21 | #include <AliRunLoader.h> | |
22 | #include <AliStack.h> | |
23 | ||
24 | #include "esdTrackCuts/AliESDtrackCuts.h" | |
25 | #include "AliPWG0Helper.h" | |
26 | ||
27 | ||
28 | ClassImp(AliTestESDtrackCutsSelector) | |
29 | ||
30 | AliTestESDtrackCutsSelector::AliTestESDtrackCutsSelector() : | |
31 | AliSelectorRL(), | |
32 | fEsdTrackCutsAll(0), | |
70d782ef | 33 | fEsdTrackCutsNoVtx(0), |
3633478d | 34 | fEsdTrackCutsPri(0), |
3c4b53f0 | 35 | fEsdTrackCutsSec(0), |
36 | fEsdTrackCutsPlusZ(0), | |
37 | fEsdTrackCutsMinusZ(0), | |
38 | fEsdTrackCutsPos(0), | |
70d782ef | 39 | fEsdTrackCutsNeg(0), |
40 | fPIDAfterCutNoVtx(0), | |
41 | fPIDAfterCutAll(0), | |
42 | fVertex(0) | |
3633478d | 43 | { |
44 | // | |
45 | // Constructor. Initialization of pointers | |
46 | // | |
47 | } | |
48 | ||
49 | AliTestESDtrackCutsSelector::~AliTestESDtrackCutsSelector() | |
50 | { | |
51 | // | |
52 | // Destructor | |
53 | // | |
54 | ||
55 | // histograms are in the output list and deleted when the output | |
56 | // list is deleted by the TSelector dtor | |
57 | } | |
58 | ||
59 | void AliTestESDtrackCutsSelector::Begin(TTree* tree) | |
60 | { | |
61 | // Begin function | |
62 | ||
63 | AliSelectorRL::Begin(tree); | |
64 | ||
65 | ReadUserObjects(tree); | |
66 | } | |
67 | ||
68 | void AliTestESDtrackCutsSelector::ReadUserObjects(TTree* tree) | |
69 | { | |
70 | // read the user objects, called from slavebegin and begin | |
71 | ||
3c4b53f0 | 72 | // only do it once |
73 | if (fEsdTrackCutsAll) | |
74 | return; | |
75 | ||
3633478d | 76 | if (!fEsdTrackCutsAll && fInput) |
0b8a2421 | 77 | fEsdTrackCutsAll = dynamic_cast<AliESDtrackCuts*> (fInput->FindObject("esdTrackCutsAll")->Clone()); |
3633478d | 78 | |
79 | if (!fEsdTrackCutsAll && tree) | |
80 | fEsdTrackCutsAll = dynamic_cast<AliESDtrackCuts*> (tree->GetUserInfo()->FindObject("esdTrackCutsAll")); | |
3633478d | 81 | |
3c4b53f0 | 82 | if (!fEsdTrackCutsAll) |
83 | AliDebug(AliLog::kError, "ERROR: Could not read fEsdTrackCutsAll from input list."); | |
84 | ||
70d782ef | 85 | fEsdTrackCutsNoVtx = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsNoVtx")); |
86 | fEsdTrackCutsNoVtx->SetRequireSigmaToVertex(kFALSE); | |
87 | ||
3c4b53f0 | 88 | fEsdTrackCutsPri = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsPri")); |
89 | fEsdTrackCutsSec = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsSec")); | |
90 | fEsdTrackCutsPlusZ = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsPlusZ")); | |
91 | fEsdTrackCutsMinusZ = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsMinusZ")); | |
92 | fEsdTrackCutsPos = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsPos")); | |
93 | fEsdTrackCutsNeg = dynamic_cast<AliESDtrackCuts*> (fEsdTrackCutsAll->Clone("fEsdTrackCutsNeg")); | |
3633478d | 94 | } |
95 | ||
96 | void AliTestESDtrackCutsSelector::SlaveBegin(TTree* tree) | |
97 | { | |
98 | // The SlaveBegin() function is called after the Begin() function. | |
99 | // When running with PROOF SlaveBegin() is called on each slave server. | |
100 | // The tree argument is deprecated (on PROOF 0 is passed). | |
101 | ||
102 | AliSelectorRL::SlaveBegin(tree); | |
103 | ||
104 | ReadUserObjects(tree); | |
70d782ef | 105 | |
106 | fPIDAfterCutNoVtx = new TH1F("fPIDAfterCutNoVtx", "fPIDAfterCutNoVtx", 5001, -2500.5, 2500.5); | |
107 | fPIDAfterCutAll = new TH1F("fPIDAfterCutAll", "fPIDAfterCutAll", 5001, -2500.5, 2500.5); | |
108 | ||
109 | fVertex = new TH3F("fVertex", "fVertex", 100, -10, 10, 100, -10, 10, 100, -10, 10); | |
3633478d | 110 | } |
111 | ||
3c4b53f0 | 112 | void AliTestESDtrackCutsSelector::Init(TTree* tree) |
113 | { | |
114 | // read the user objects | |
115 | ||
116 | AliSelectorRL::Init(tree); | |
117 | ||
118 | // Enable only the needed branches | |
119 | if (tree) | |
120 | { | |
121 | tree->SetBranchStatus("*", 0); | |
122 | tree->SetBranchStatus("fTriggerMask", 1); | |
123 | tree->SetBranchStatus("fSPDVertex*", 1); | |
124 | tree->SetBranchStatus("fTracks.fLabel", 1); | |
125 | ||
126 | AliESDtrackCuts::EnableNeededBranches(tree); | |
127 | } | |
128 | } | |
129 | ||
3633478d | 130 | Bool_t AliTestESDtrackCutsSelector::Process(Long64_t entry) |
131 | { | |
132 | // The Process() function is called for each entry in the tree (or possibly | |
133 | // keyed object in the case of PROOF) to be processed. The entry argument | |
134 | // specifies which entry in the currently loaded tree is to be processed. | |
135 | // It can be passed to either TTree::GetEntry() or TBranch::GetEntry() | |
136 | // to read either all or the required parts of the data. When processing | |
137 | // keyed objects with PROOF, the object is already loaded and is available | |
138 | // via the fObject pointer. | |
139 | // | |
140 | // This function should contain the "body" of the analysis. It can contain | |
141 | // simple or elaborate selection criteria, run algorithms on the data | |
142 | // of the event and typically fill histograms. | |
143 | ||
144 | // WARNING when a selector is used with a TChain, you must use | |
145 | // the pointer to the current TTree to call GetEntry(entry). | |
146 | // The entry is always the local entry number in the current tree. | |
147 | // Assuming that fTree is the pointer to the TChain being processed, | |
148 | // use fTree->GetTree()->GetEntry(entry). | |
149 | ||
150 | if (AliSelectorRL::Process(entry) == kFALSE) | |
151 | return kFALSE; | |
152 | ||
153 | // Check prerequisites | |
154 | if (!fESD) { | |
155 | AliDebug(AliLog::kError, "ESD branch not available"); | |
156 | return kFALSE; | |
3c4b53f0 | 157 | } |
3633478d | 158 | |
159 | if (!AliPWG0Helper::IsVertexReconstructed(fESD)) { | |
160 | AliDebug(AliLog::kDebug+5, "Vertex is not reconstructed"); | |
161 | return kFALSE; | |
162 | } | |
163 | ||
164 | // check if the esd track cut objects are there | |
3c4b53f0 | 165 | if (!fEsdTrackCutsAll || !fEsdTrackCutsPri || !fEsdTrackCutsSec || !fEsdTrackCutsPlusZ || !fEsdTrackCutsMinusZ || !fEsdTrackCutsPos || !fEsdTrackCutsNeg) { |
3633478d | 166 | AliDebug(AliLog::kError, "fEsdTrackCutsXXX not available"); |
167 | return kFALSE; | |
168 | } | |
169 | ||
170 | // get particle stack | |
171 | AliStack* stack = GetStack(); | |
172 | if (!stack) { | |
173 | AliDebug(AliLog::kError, "Stack not available"); | |
174 | return kFALSE; | |
175 | } | |
176 | Int_t nPrim = stack->GetNprimary(); | |
177 | ||
178 | // ######################################################## | |
179 | // loop over esd tracks | |
180 | Int_t nTracks = fESD->GetNumberOfTracks(); | |
181 | ||
182 | // count the number of "good" tracks as parameter for vertex reconstruction efficiency | |
183 | for (Int_t t=0; t<nTracks; t++) { | |
184 | AliDebug(AliLog::kDebug+1, Form("ESD Loop: Processing track %d.", t)); | |
185 | ||
186 | AliESDtrack* esdTrack = fESD->GetTrack(t); | |
187 | ||
70d782ef | 188 | Bool_t passed = fEsdTrackCutsAll->AcceptTrack(esdTrack); |
3633478d | 189 | |
190 | // using the properties of the mc particle | |
191 | Int_t label = TMath::Abs(esdTrack->GetLabel()); | |
192 | if (label == 0) { | |
193 | AliDebug(AliLog::kWarning, Form("WARNING: cannot find corresponding mc part for track %d.", t)); | |
194 | continue; | |
195 | } | |
196 | TParticle* particle = stack->Particle(label); | |
197 | if (!particle) { | |
198 | AliDebug(AliLog::kError, Form("UNEXPECTED: part with label %d not found in stack (track loop).", label)); | |
199 | continue; | |
200 | } | |
0b8a2421 | 201 | |
202 | if (label < nPrim) | |
3633478d | 203 | fEsdTrackCutsPri->AcceptTrack(esdTrack); |
204 | else | |
70d782ef | 205 | { |
3633478d | 206 | fEsdTrackCutsSec->AcceptTrack(esdTrack); |
70d782ef | 207 | if (passed) |
208 | { | |
209 | fPIDAfterCutAll->Fill(particle->GetPdgCode()); | |
210 | fVertex->Fill(particle->Vx(), particle->Vy(), particle->Vz()); | |
211 | } | |
212 | ||
213 | if (fEsdTrackCutsNoVtx->AcceptTrack(esdTrack)) | |
214 | fPIDAfterCutNoVtx->Fill(particle->GetPdgCode()); | |
215 | } | |
3c4b53f0 | 216 | |
217 | TParticlePDG* pdgPart = particle->GetPDG(); | |
218 | if (pdgPart) | |
219 | { | |
220 | if (pdgPart->Charge() > 0) | |
221 | fEsdTrackCutsPos->AcceptTrack(esdTrack); | |
222 | else if (pdgPart->Charge() < 0) | |
223 | fEsdTrackCutsNeg->AcceptTrack(esdTrack); | |
224 | } | |
225 | ||
226 | if (particle->Eta() < 0) | |
227 | fEsdTrackCutsPlusZ->AcceptTrack(esdTrack); | |
228 | else | |
229 | fEsdTrackCutsMinusZ->AcceptTrack(esdTrack); | |
3633478d | 230 | } |
231 | ||
232 | return kTRUE; | |
233 | } | |
234 | ||
235 | void AliTestESDtrackCutsSelector::SlaveTerminate() | |
236 | { | |
237 | // The SlaveTerminate() function is called after all entries or objects | |
238 | // have been processed. When running with PROOF SlaveTerminate() is called | |
239 | // on each slave server. | |
240 | ||
241 | AliSelectorRL::SlaveTerminate(); | |
242 | ||
243 | // Add the histograms to the output on each slave server | |
244 | if (!fOutput) | |
245 | { | |
246 | AliDebug(AliLog::kError, Form("ERROR: Output list not initialized.")); | |
247 | return; | |
248 | } | |
249 | ||
250 | fOutput->Add(fEsdTrackCutsAll); | |
70d782ef | 251 | fOutput->Add(fEsdTrackCutsNoVtx); |
3633478d | 252 | fOutput->Add(fEsdTrackCutsPri); |
253 | fOutput->Add(fEsdTrackCutsSec); | |
3c4b53f0 | 254 | fOutput->Add(fEsdTrackCutsPlusZ); |
255 | fOutput->Add(fEsdTrackCutsMinusZ); | |
256 | fOutput->Add(fEsdTrackCutsPos); | |
257 | fOutput->Add(fEsdTrackCutsNeg); | |
70d782ef | 258 | fOutput->Add(fPIDAfterCutNoVtx); |
259 | fOutput->Add(fPIDAfterCutAll); | |
260 | fOutput->Add(fVertex); | |
3633478d | 261 | } |
262 | ||
263 | void AliTestESDtrackCutsSelector::Terminate() | |
264 | { | |
265 | // The Terminate() function is the last function to be called during | |
266 | // a query. It always runs on the client, it can be used to present | |
267 | // the results graphically or save the results to file. | |
268 | ||
269 | AliSelectorRL::Terminate(); | |
270 | ||
0b8a2421 | 271 | fEsdTrackCutsAll = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("esdTrackCutsAll")); |
70d782ef | 272 | fEsdTrackCutsNoVtx = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsNoVtx")); |
3c4b53f0 | 273 | fEsdTrackCutsPri = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsPri")); |
274 | fEsdTrackCutsSec = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsSec")); | |
275 | fEsdTrackCutsPlusZ = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsPlusZ")); | |
276 | fEsdTrackCutsMinusZ = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsMinusZ")); | |
277 | fEsdTrackCutsPos = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsPos")); | |
278 | fEsdTrackCutsNeg = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCutsNeg")); | |
70d782ef | 279 | fPIDAfterCutNoVtx = dynamic_cast<TH1F*> (fOutput->FindObject("fPIDAfterCutNoVtx")); |
280 | fPIDAfterCutAll = dynamic_cast<TH1F*> (fOutput->FindObject("fPIDAfterCutAll")); | |
281 | fVertex = dynamic_cast<TH3F*> (fOutput->FindObject("fVertex")); | |
0b8a2421 | 282 | |
283 | // check if the esd track cut objects are there | |
3c4b53f0 | 284 | if (!fEsdTrackCutsAll || !fEsdTrackCutsPri || !fEsdTrackCutsSec || !fEsdTrackCutsPlusZ || !fEsdTrackCutsMinusZ || !fEsdTrackCutsPos || !fEsdTrackCutsNeg) { |
285 | AliDebug(AliLog::kError, Form("fEsdTrackCutsXXX not available %p %p %p %p %p %p %p", fEsdTrackCutsAll, fEsdTrackCutsPri, fEsdTrackCutsSec, fEsdTrackCutsPlusZ, fEsdTrackCutsMinusZ, fEsdTrackCutsPos, fEsdTrackCutsNeg)); | |
0b8a2421 | 286 | return; |
287 | } | |
288 | ||
3633478d | 289 | TFile* file = TFile::Open("trackCuts.root", "RECREATE"); |
3c4b53f0 | 290 | |
291 | fEsdTrackCutsAll->SaveHistograms(); | |
70d782ef | 292 | fEsdTrackCutsNoVtx->SaveHistograms(); |
3c4b53f0 | 293 | fEsdTrackCutsPri->SaveHistograms(); |
294 | fEsdTrackCutsSec->SaveHistograms(); | |
295 | fEsdTrackCutsPlusZ->SaveHistograms(); | |
296 | fEsdTrackCutsMinusZ->SaveHistograms(); | |
297 | fEsdTrackCutsPos->SaveHistograms(); | |
298 | fEsdTrackCutsNeg->SaveHistograms(); | |
70d782ef | 299 | fPIDAfterCutNoVtx->Write(); |
300 | fPIDAfterCutAll->Write(); | |
301 | fVertex->Write(); | |
3633478d | 302 | |
303 | file->Close(); | |
3c4b53f0 | 304 | |
305 | fEsdTrackCutsAll->DrawHistograms(); | |
3633478d | 306 | } |