]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/qaRec/AliTRDtrackInfoGen.cxx
functionality moved to run.C
[u/mrichter/AliRoot.git] / TRD / qaRec / AliTRDtrackInfoGen.cxx
CommitLineData
814ecea4 1/**************************************************************************
d2381af5 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**************************************************************************/
814ecea4 15
16/* $Id: AliTRDtrackInfoGen.cxx 27496 2008-07-22 08:35:45Z cblume $ */
17
18////////////////////////////////////////////////////////////////////////////
19// //
20// Reconstruction QA //
21// //
22// Authors: //
23// Markus Fasel <M.Fasel@gsi.de> //
24// //
25////////////////////////////////////////////////////////////////////////////
26
27#include <TClonesArray.h>
28#include <TObjArray.h>
29#include <TObject.h>
30#include <TH1F.h>
31#include <TFile.h>
32#include <TTree.h>
33#include <TROOT.h>
34#include <TChain.h>
35#include <TParticle.h>
36
37#include "AliLog.h"
38#include "AliAnalysisManager.h"
39#include "AliESDEvent.h"
40#include "AliMCEvent.h"
41#include "AliESDInputHandler.h"
42#include "AliMCEventHandler.h"
43
44#include "AliESDfriend.h"
45#include "AliESDfriendTrack.h"
46#include "AliESDtrack.h"
47#include "AliMCParticle.h"
48#include "AliStack.h"
49#include "AliTRDtrackV1.h"
50#include "AliTrackReference.h"
51#include "AliTRDgeometry.h"
52#include "TTreeStream.h"
53
54#include <cstdio>
55#include <cstring>
56
57#include "AliTRDtrackInfoGen.h"
58#include "AliTRDtrackInfo/AliTRDtrackInfo.h"
59
60ClassImp(AliTRDtrackInfoGen)
61
62
63//____________________________________________________________________
64AliTRDtrackInfoGen::AliTRDtrackInfoGen(const Char_t *name):
65 AliAnalysisTask(name, "")
66 ,fESD(0x0)
67 ,fMC(0x0)
68 ,fESDfriend(0x0)
69 ,fTrackInfo(0x0)
70 ,fObjectContainer(0x0)
4b8f8a35 71 ,fHasMCdata(kTRUE)
814ecea4 72 ,fDebugLevel(0)
73 ,fDebugStream(0x0)
74 //,fTree(0x0) // temporary
75{
76 //
77 // Default constructor
78 //
79
80 DefineInput(0, TChain::Class());
81 DefineOutput(0, TObjArray::Class());
82 //DefineOutput(1, TTree::Class());
83}
84
85//____________________________________________________________________
86void AliTRDtrackInfoGen::ConnectInputData(Option_t *)
87{
88 //
89 // Link the Input Data
90 //
d2381af5 91 TTree *tree = dynamic_cast<TChain*>(GetInputData(0));
92 if(!tree){
814ecea4 93 printf("ERROR - ESD event not found");
d2381af5 94 } else {
95 tree->SetBranchStatus("Tracks", 1);
96 tree->SetBranchStatus("ESDfriend*",1);
814ecea4 97 }
98
99 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
100 if(!esdH){
d2381af5 101 printf("ERROR - ESD input handler not found");
814ecea4 102 } else {
103 fESD = esdH->GetEvent();
104 if(!fESD){
d2381af5 105 printf("ERROR - ESD event not found");
814ecea4 106 } else {
107 esdH->SetActiveBranches("ESDfriend*");
108 fESDfriend = (AliESDfriend *)fESD->FindListObject("AliESDfriend");
109 printf("fESDfriend = %p\n", (void*)fESDfriend);
110 }
111 }
4b8f8a35 112 if(HasMCdata()){
d2381af5 113 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
114 if(!mcH){
115 AliError("MC input handler not found");
116 } else {
117 fMC = mcH->MCEvent();
118 }
814ecea4 119 }
120}
121
122//____________________________________________________________________
123void AliTRDtrackInfoGen::CreateOutputObjects()
124{
125 //
126 // Create Output Containers (TObjectArray containing 1D histograms)
127 //
128 fTrackInfo = new AliTRDtrackInfo();
129 fObjectContainer = new TObjArray(1000);
130
131/* OpenFile(1, "RECREATE");
132 fTree = new TTree("trd", "extract of the TRD detector");
133 fTree->Branch("info", &fTrackInfo);
134 printf("output tree build in %s\n", fTree->GetDirectory()->GetName());*/
135}
136
137//____________________________________________________________________
138void AliTRDtrackInfoGen::Exec(Option_t *){
d2381af5 139 //
140 // Run the Analysis
141 //
142 if(!fESD){
143 puts("Error: ESD not found");
144 return;
145 }
146 if(!fESDfriend){
147 puts("Error: ESD friend not found");
148 return;
149 }
150 if(HasMCdata() && !fMC){
151 puts("Error: Monte Carlo Event not available");
152 return;
153 }
154 fObjectContainer->Delete();
155 fESD->SetESDfriend(fESDfriend);
156
157 Bool_t *trackMap = 0x0;
158 AliStack * mStack = 0x0;
159 if(HasMCdata()){
160 mStack = fMC->Stack();
161 if(!mStack){
162 puts("Error: Cannot get the Monte Carlo Stack");
163 return;
164 }
165 trackMap = new Bool_t[fMC->GetNumberOfTracks()];
166 memset(trackMap, 0, sizeof(Bool_t) * fMC->GetNumberOfTracks());
167 }
168
169 Int_t nTRD = 0, nTPC = 0, nclsTrklt;
170 Int_t nTracks = fESD->GetNumberOfTracks();
171 if(fDebugLevel>=1){
172 printf("%3d Tracks: ESD[%d] MC[%d]\n", (Int_t)AliAnalysisManager::GetAnalysisManager()->GetCurrentEntry(), nTracks, fHasMCdata ? mStack->GetNtrack() : 0);
173 }
174 AliESDtrack *esdTrack = 0x0;
175 AliESDfriendTrack *esdFriendTrack = 0x0;
176 TObject *calObject = 0x0;
177 AliTRDtrackV1 *track = 0x0;
178 for(Int_t itrk = 0; itrk < nTracks; itrk++){
179 esdTrack = fESD->GetTrack(itrk);
180 if(fDebugLevel>=2) printf("\n%3d ITS[%d] TPC[%d] TRD[%d]\n", itrk, esdTrack->GetNcls(0), esdTrack->GetNcls(1), esdTrack->GetNcls(2));
181 if(esdTrack->GetNcls(1)) nTPC++;
182 if(esdTrack->GetNcls(2)) nTRD++;
814ecea4 183
d2381af5 184 // look at esternal track param
185 const AliExternalTrackParam *op = esdTrack->GetOuterParam();
186 Double_t xyz[3];
187 if(op){
188 op->GetXYZ(xyz);
189 op->Global2LocalPosition(xyz, op->GetAlpha());
190 if(fDebugLevel>=2) printf("op @ X[%7.3f]\n", xyz[0]);
191 }
814ecea4 192/* if(xyz[0] < 270.){
d2381af5 193 printf("TPC track missing\n");
194 } else { */
814ecea4 195// op->GetXYZAt(ref->LocalX(), AliTracker::GetBz(), xyz);
196// op->Global2LocalPosition(xyz, op->GetAlpha());
197// dy = ref->LocalY()- xyz[1];
198// dz = ref->Z() - xyz[2];
199// }
200
d2381af5 201 // read MC info
202 Int_t fPdg = -1;
203 Int_t label = -1;
204 if(HasMCdata()){
205 label = esdTrack->GetLabel();
206 if(label < fMC->GetNumberOfTracks()) trackMap[TMath::Abs(label)] = kTRUE; // register the track
207 //if (TMath::Abs(label) > mStack->GetNtrack()) continue;
208 AliMCParticle *mcParticle = fMC->GetTrack(TMath::Abs(label));
209 fPdg = mcParticle->Particle()->GetPdgCode();
210 Int_t nRefs = mcParticle->GetNumberOfTrackReferences();
211 Int_t iref = 0; AliTrackReference *ref = 0x0;
212 while(iref<nRefs){
213 ref = mcParticle->GetTrackReference(iref);
214 if(ref->LocalX() > 250.) break;
215 //printf("\ttrackRef[%2d] @ %7.3f\n", iref, ref->LocalX());
216 iref++;
217 }
218 if(iref == nRefs){
814ecea4 219// if(!esdTrack->GetNcls(2)) continue;
220/* printf("No TRD Track References in the Track [%d] I\n", itrk);
d2381af5 221 printf("Label = %d ITS[%d] TPC[%d] TRD[%d]\n", label, esdTrack->GetITSLabel(), esdTrack->GetTPCLabel(), esdTrack->GetTRDLabel());
222 Int_t kref = 0;
223 while(kref<nRefs){
224 ref = mcParticle->GetTrackReference(kref);
225 printf("\ttrackRef[%2d] @ %7.3f\n", kref, ref->LocalX());
226 kref++;
227 }*/
228 }
814ecea4 229
d2381af5 230 new(fTrackInfo) AliTRDtrackInfo(fPdg);
231 fTrackInfo->SetPrimary(mcParticle->Particle()->IsPrimary());
232 Int_t jref = iref;//, kref = 0;
233 while(jref<nRefs){
234 ref = mcParticle->GetTrackReference(jref);
235 if(ref->LocalX() > 370.) break;
236 if(fDebugLevel>=3) printf("\ttrackRef[%2d (%2d)] @ %7.3f OK\n", jref-iref, jref, ref->LocalX());
237 fTrackInfo->AddTrackRef(ref);
238 jref++;
239 }
240 if(!fTrackInfo->GetNTrackRefs()){
241 //if(!esdTrack->GetNcls(2)) continue;
242 /* printf("No TRD Track References in the Track [%d] II\n", itrk);
243 printf("Label = %d ITS[%d] TPC[%d] TRD[%d]\n", label, esdTrack->GetITSLabel(), esdTrack->GetTPCLabel(), esdTrack- >GetTRDLabel());
244 Int_t kref = 0;
245 while(kref<nRefs){
246 ref = mcParticle->GetTrackReference(kref);
247 printf("\ttrackRef[%2d] @ %7.3f\n", kref, ref->LocalX());
248 kref++;
249 }*/
250 }
251 if(fDebugLevel>=2) printf("NtrackRefs[%d(%d)]\n", fTrackInfo->GetNTrackRefs(), nRefs);
252 } else {
253 new (fTrackInfo) AliTRDtrackInfo(fPdg);
254 }
814ecea4 255
d2381af5 256 // copy some relevant info to TRD track info
257 fTrackInfo->SetStatus(esdTrack->GetStatus());
258 fTrackInfo->SetTrackId(esdTrack->GetID());
259 fTrackInfo->SetLabel(label);
260 fTrackInfo->SetNumberOfClustersRefit(esdTrack->GetNcls(2));
261 nclsTrklt = 0;
262
814ecea4 263
d2381af5 264 // read REC info
265 esdFriendTrack = fESDfriend->GetTrack(itrk);
266 if(esdFriendTrack){
267 Int_t icalib = 0;
268 while((calObject = esdFriendTrack->GetCalibObject(icalib++))){
269 if(strcmp(calObject->IsA()->GetName(),"AliTRDtrackV1") != 0) continue; // Look for the TRDtrack
270 track = dynamic_cast<AliTRDtrackV1*>(calObject);
271 //nTRD++;
272 if(!esdTrack->GetNcls(2)){
273 printf("No TRD clusters but track\n");
274 nTRD++;
275 }
276 if(!track) continue;
277 if(fDebugLevel>=3) printf("TRD track OK\n");
278 fTrackInfo->SetTRDtrack(track);
279 break;
280 }
281 if(fDebugLevel>=2) printf("Ntracklets[%d]\n", fTrackInfo->GetNTracklets());
282 } else if(fDebugLevel>=2) printf("No ESD friends\n");
283 if(op) fTrackInfo->SetOuterParam(op);
814ecea4 284
d2381af5 285 if(fDebugLevel >= 1){
286 Int_t ncls = esdTrack->GetNcls(2);
287 nclsTrklt = fTrackInfo->GetNumberOfClusters();
288 (*fDebugStream) << "trackInfo"
289 << "ncls=" << ncls
290 << "Ncls=" << nclsTrklt
291 << "TrackInfo.=" << fTrackInfo
292 << "\n";
293 }
294
295 fObjectContainer->Add(new AliTRDtrackInfo(*fTrackInfo));
296 fTrackInfo->Delete("");
297 }
298 if(fDebugLevel>=1) printf("%3d Tracks: TPC[%d] TRD[%d]\n", (Int_t)AliAnalysisManager::GetAnalysisManager()->GetCurrentEntry(), nTPC, nTRD);
4b8f8a35 299
d2381af5 300 // Insert also MC tracks which are passing TRD where the track is not reconstructed
301 if(HasMCdata()){
302 if(fDebugLevel > 10){
303 printf("Output of the MC track map:\n");
304 for(Int_t itk = 0; itk < fMC->GetNumberOfTracks(); itk++)
305 printf("trackMap[%d] = %s\n", itk, trackMap[itk] == kTRUE ? "TRUE" : "kFALSE");
306 }
307
308 for(Int_t itk = 0; itk < fMC->GetNumberOfTracks(); itk++){
309 if(fDebugLevel >=2 ) printf("Number of MC tracks: %d\n", fMC->GetNumberOfTracks());
310 if(trackMap[itk]) continue;
311 AliMCParticle *mcParticle = fMC->GetTrack(TMath::Abs(itk));
312 Int_t fPdg = mcParticle->Particle()->GetPdgCode();
313 Int_t nRefs = mcParticle->GetNumberOfTrackReferences();
314 Int_t iref = 0; AliTrackReference *ref = 0x0;
315 Int_t nRefsTRD = 0;
316 new(fTrackInfo) AliTRDtrackInfo(fPdg);
317 while(iref<nRefs){
318 ref = mcParticle->GetTrackReference(iref);
319 if(fDebugLevel > 3) printf("\ttrackRef[%2d] @ %7.3f", iref, ref->LocalX());
320 if(ref->LocalX() > 250. && ref->LocalX() < 370.){
321 if(fDebugLevel > 3) printf(" OK\n");
322 fTrackInfo->AddTrackRef(ref);
323 nRefsTRD++;
324 }
325 else
326 if(fDebugLevel > 3) printf("\n");
327 iref++;
328 }
329 if(!nRefsTRD){
330 // In this stage we at least require 1 hit inside TRD. What will be done with this tracks is a task for the
331 // analysis job
332 fTrackInfo->Delete("");
333 continue;
334 }
335 fTrackInfo->SetPrimary(mcParticle->Particle()->IsPrimary());
336 fTrackInfo->SetLabel(itk);
337 if(fDebugLevel >= 1){
338 Int_t ncls = esdTrack->GetNcls(2);
339 (*fDebugStream) << "trackInfo"
340 << "ntrackRefs=" << ncls
341 << "TrackInfo.=" << fTrackInfo
342 << "\n";
343 }
344 if(fDebugLevel > 2)printf("Registering rejected MC track with label %d\n", itk);
345 fObjectContainer->Add(new AliTRDtrackInfo(*fTrackInfo));
346 fTrackInfo->Delete("");
347 }
348 delete[] trackMap;
349 }
350 PostData(0, fObjectContainer);
814ecea4 351}
352
353//____________________________________________________________________
354void AliTRDtrackInfoGen::SetDebugLevel(Int_t level)
355{
356 //
357 // Set the debug level
358 //
359
360 fDebugLevel = level;
361 if(fDebugLevel<=0) return;
362 if(fDebugStream) return;
363 fDebugStream = new TTreeSRedirector("TRD.TrackInfoDebug.root");
364}
365
366//____________________________________________________________________
367void AliTRDtrackInfoGen::Terminate(Option_t *)
368{
369 //
370 // Stays empty because we are only interested in the tree
371 //
372
373 if(fDebugLevel>=1) printf("Terminate:\n");
374 //TFile *f =((TFile*)gROOT->FindObject("TRD.TrackInfo.root"));
375 //f->cd(); f->Write(); f->Close();
376
377 if(fDebugStream) delete fDebugStream;
378}