2 // This class is the task for connecting together
3 // MC information and the RC information
5 // The task is a wrapper over two components
7 // AliESDRecInfoMaker.h
14 #include <TTreeStream.h>
15 #include <AliAnalysisManager.h>
16 #include <AliESDInputHandler.h>
18 #include "AliMCEvent.h"
19 #include "AliMCEventHandler.h"
22 #include "AliGenInfoTask.h"
23 #include "AliGenInfoMaker.h"
27 #include "AliMCInfo.h"
28 #include "AliComparisonObject.h"
29 #include "AliESDRecInfo.h"
30 #include "AliTPCParamSR.h"
37 ClassImp(AliGenInfoTask)
39 //________________________________________________________________________
40 AliGenInfoTask::AliGenInfoTask() :
42 fMCinfo(0), //! MC event handler
44 fCompList(0), //array of comparison objects
45 fGenTracksArray(0), //clones array with filtered particles
46 fGenKinkArray(0), //clones array with filtered Kinks
47 fGenV0Array(0), //clones array with filtered V0s
48 fRecTracksArray(0), //clones array with filtered particles
54 // Default constructor (should not be used)
58 AliGenInfoTask::AliGenInfoTask(const AliGenInfoTask& /*info*/) :
60 fMCinfo(0), //! MC event handler
63 fGenTracksArray(0), //clones array with filtered particles
64 fGenKinkArray(0), //clones array with filtered Kinks
65 fGenV0Array(0), //clones array with filtered V0s
66 fRecTracksArray(0), //clones array with filtered particles
73 // Default constructor
79 //________________________________________________________________________
80 AliGenInfoTask::AliGenInfoTask(const char *name) :
81 AliAnalysisTask(name, "AliGenInfoTask"),
82 fMCinfo(0), //! MC event handler
85 fGenTracksArray(0), //clones array with filtered particles
86 fGenKinkArray(0), //clones array with filtered Kinks
87 fGenV0Array(0), //clones array with filtered V0s
88 fRecTracksArray(0), //clones array with filtered particles
96 // Input slot #0 works with a TChain
97 DefineInput(0, TChain::Class());
98 // Output slot #0 writes into a TList
99 DefineOutput(0, TObjArray::Class());
102 fCompList = new TObjArray;
105 AliGenInfoTask::~AliGenInfoTask(){
109 if (fDebugLevel>0) printf("AliGenInfoTask::~AliGenInfoTask\n");
110 if (fDebugStreamer) delete fDebugStreamer;
112 if(fCompList) delete fCompList;
117 //________________________________________________________________________
118 void AliGenInfoTask::ConnectInputData(Option_t *)
121 // Connect the input data
124 cout << "AnalysisTaskTPCCluster::ConnectInputData()" << endl;
126 TTree* tree=dynamic_cast<TTree*>(GetInputData(0));
128 //Printf("ERROR: Could not read chain from input slot 0");
131 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
133 //Printf("ERROR: Could not get ESDInputHandler");
136 fESD = esdH->GetEvent();
137 //Printf("*** CONNECTED NEW EVENT ****");
140 AliMCEventHandler* mcinfo = (AliMCEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
141 mcinfo->SetReadTR(kTRUE);
143 fMCinfo = mcinfo->MCEvent();
149 //_____________________________________________________________________________
150 Bool_t AliGenInfoTask::AddComparisonObject(AliComparisonObject *pObj)
152 // add comparison object to the list
154 Printf("ERROR: Could not add comparison object");
157 // add object to the list
158 fCompList->AddLast(pObj);
165 //________________________________________________________________________
166 void AliGenInfoTask::CreateOutputObjects()
169 // Connect the output objects
172 cout << "AnalysisTaskTPCCluster::CreateOutputObjects()" << endl;
177 //________________________________________________________________________
178 void AliGenInfoTask::Exec(Option_t *) {
180 // Execute analysis for current event
184 cout << "AliGenInfoTask::Exec()" << endl;
187 // If MC has been connected
188 if (fGenTracksArray) fGenTracksArray->Delete();
189 if (fRecTracksArray) fRecTracksArray->Delete();
192 cout << "Not MC info\n" << endl;
206 //________________________________________________________________________
207 void AliGenInfoTask::Terminate(Option_t *) {
212 printf("AliGenInfoTask: Terminate() \n");
214 if (fDebugLevel>0) printf("AliTPCcalibBase::Terminate\n");
215 if (fDebugStreamer) delete fDebugStreamer;
222 TTreeSRedirector *AliGenInfoTask::GetDebugStreamer(){
224 // Get Debug streamer
225 // In case debug streamer not yet initialized and StreamLevel>0 create new one
227 if (fStreamLevel==0) return 0;
228 if (fDebugStreamer) return fDebugStreamer;
231 dsName+="Debug.root";
232 dsName.ReplaceAll(" ","");
233 fDebugStreamer = new TTreeSRedirector(dsName.Data());
234 return fDebugStreamer;
239 AliMCInfo* AliGenInfoTask::GetTrack(Int_t index, Bool_t force){
241 // Get the MC info for given track
243 if (!fGenTracksArray) fGenTracksArray = new TClonesArray("AliMCInfo",1000);
244 if (index>fGenTracksArray->GetEntriesFast()) fGenTracksArray->Expand(index*2+10);
245 AliMCInfo * info = (AliMCInfo*)fGenTracksArray->At(index);
246 if (!force) return info;
248 info = new ((*fGenTracksArray)[index]) AliMCInfo;
253 AliESDRecInfo* AliGenInfoTask::GetRecTrack(Int_t index, Bool_t force){
255 // Get the MC info for given track
257 if (!fRecTracksArray) fRecTracksArray = new TClonesArray("AliESDRecInfo",1000);
258 if (index>fRecTracksArray->GetEntriesFast()) fRecTracksArray->Expand(index*2+10);
259 AliESDRecInfo * info = (AliESDRecInfo*)fRecTracksArray->At(index);
260 if (!force) return info;
262 info = new ((*fRecTracksArray)[index]) AliESDRecInfo;
270 void AliGenInfoTask::ProcessMCInfo(){
272 // Dump information from MC to the array
275 TParticle * particle= new TParticle;
276 TClonesArray * trefs = new TClonesArray("AliTrackReference");
281 Int_t npart = fMCinfo->GetNumberOfTracks();
282 if (npart==0) return;
283 Double_t vertex[4]={0,0,0,0};
284 fMCinfo->GetParticleAndTR(0, particle, trefs);
286 vertex[0]=particle->Vx();
287 vertex[1]=particle->Vy();
288 vertex[2]=particle->Vz();
289 vertex[3]=particle->R();
292 for (Int_t ipart=0;ipart<npart;ipart++){
293 Int_t status = fMCinfo->GetParticleAndTR(ipart, particle, trefs);
294 if (status<0) continue;
295 if (!particle) continue;
296 if (!trefs) continue;
297 if (!AcceptParticle(particle)) continue;
298 //if (trefs->GetEntries()<1) continue;
299 AliMCInfo * mcinfo = GetTrack(ipart,kTRUE);
300 mcinfo->Update(particle,trefs,vertex,ipart);
302 TTreeSRedirector *pcstream = GetDebugStreamer();
312 void AliGenInfoTask::ProcessESDInfo(){
316 static AliTPCParamSR param;
320 Int_t ntracks = fESD->GetNumberOfTracks();
321 for (Int_t itrack=0; itrack<ntracks; itrack++){
322 AliESDtrack *track = fESD->GetTrack(itrack);
323 Int_t label = TMath::Abs(track->GetLabel());
324 AliMCInfo * mcinfo = GetTrack(label,kFALSE);
325 if (!mcinfo) continue;
326 AliESDRecInfo *recInfo= GetRecTrack(label,kTRUE);
327 recInfo->AddESDtrack(track,mcinfo);
328 recInfo->Update(mcinfo,¶m,kTRUE);
333 Int_t ntracksMC = fMCinfo->GetNumberOfTracks();
334 for (Int_t imc=0; imc<ntracksMC; imc++){
335 AliMCInfo * mcinfo = GetTrack(imc,kFALSE);
336 if (!mcinfo) continue;
337 AliESDRecInfo *recInfo= GetRecTrack(imc,kFALSE);
338 if (recInfo) continue;
339 if (mcinfo->GetNTPCRef()<2) continue;
342 for (Int_t itrack=0; itrack<ntracks; itrack++){
343 AliESDtrack *track = fESD->GetTrack(itrack);
344 Int_t label = TMath::Abs(track->GetLabel());
345 if (label!=mcinfo->GetLabel()) continue;
347 AliMCInfo * mcinfo2 = GetTrack(label,kFALSE);
348 if (!mcinfo2) continue;
349 AliESDRecInfo *recInfo= GetRecTrack(label,kTRUE);
350 recInfo->AddESDtrack(track,mcinfo2);
351 recInfo->Update(mcinfo2,¶m,kTRUE);
361 void AliGenInfoTask::ProcessComparison(){
365 static AliESDRecInfo dummy;
366 Int_t npart = fMCinfo->GetNumberOfTracks();
367 for (Int_t ipart=0;ipart<npart;ipart++){
368 AliMCInfo * mcinfo = GetTrack(ipart,kFALSE);
369 if (!mcinfo) continue;
370 AliESDRecInfo *recInfo= GetRecTrack(ipart,kFALSE);
371 if (!recInfo) recInfo=&dummy;
373 for (Int_t icomp = 0; icomp<fCompList->GetEntries(); icomp++){
374 AliComparisonObject *pObj= (AliComparisonObject *)fCompList->At(icomp);
376 pObj->Exec(mcinfo,recInfo);
380 PostData(0, fCompList);
383 void AliGenInfoTask::DumpInfo(){
387 static AliESDRecInfo dummy;
388 Int_t npart = fMCinfo->GetNumberOfTracks();
389 for (Int_t ipart=0;ipart<npart;ipart++){
390 AliMCInfo * mcinfo = GetTrack(ipart,kFALSE);
391 if (!mcinfo) continue;
392 AliESDRecInfo *recInfo= GetRecTrack(ipart,kFALSE);
393 if (!recInfo) recInfo=&dummy;
394 TTreeSRedirector *pcstream = GetDebugStreamer();
406 Bool_t AliGenInfoTask::AcceptParticle(TParticle *part){
410 TCut cutPt("p.Pt()>0.1");
411 TCut cutZ("abs(p.Vz())<250");
412 TCut cutR("abs(p.R())<250");
417 if (part->Pt()<0.1) return kFALSE;
418 if (TMath::Abs(part->Vz())>250) return kFALSE;
419 if (part->R()>360) return kFALSE;
421 if (part->GetPDG()->Charge()==0) return kFALSE;