1 /*************************************************************************
3 * Task for fast embedding *
4 * read extra input from AOD *
6 *************************************************************************/
9 /**************************************************************************
10 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
12 * Author: The ALICE Off-line Project. *
13 * Contributors are mentioned in the code where appropriate. *
15 * Permission to use, copy, modify and distribute this software and its *
16 * documentation strictly for non-commercial purposes is hereby granted *
17 * without fee, provided that the above copyright notice appears in all *
18 * copies and that both the copyright notice and this permission notice *
19 * appear in the supporting documentation. The authors make no claims *
20 * about the suitability of this software for any purpose. It is *
21 * provided "as is" without express or implied warranty. *
22 **************************************************************************/
29 #include <TClonesArray.h>
30 #include <TDirectory.h>
38 #include "AliAnalysisTaskFastEmbedding.h"
39 #include "AliAnalysisManager.h"
40 #include "AliAODEvent.h"
41 #include "AliAODTrack.h"
42 #include "AliAODJet.h"
43 #include "AliAODMCParticle.h"
47 ClassImp(AliAnalysisTaskFastEmbedding)
49 //__________________________________________________________________________
50 AliAnalysisTaskFastEmbedding::AliAnalysisTaskFastEmbedding()
58 ,fAODPath("AliAOD.root")
59 ,fTrackBranch("aodExtraTracks")
60 ,fMCparticlesBranch("aodExtraMCparticles")
71 ,fToyDistributionTrackPt(0.)
75 ,fToyMaxTrackPhi(2*TMath::Pi())
87 // default constructor
92 //__________________________________________________________________________
93 AliAnalysisTaskFastEmbedding::AliAnalysisTaskFastEmbedding(const char *name)
94 : AliAnalysisTaskSE(name)
101 ,fAODPath("AliAOD.root")
102 ,fTrackBranch("aodExtraTracks")
103 ,fMCparticlesBranch("aodExtraMCparticles")
110 ,fToyMinNbOfTracks(1)
111 ,fToyMaxNbOfTracks(1)
114 ,fToyDistributionTrackPt(0.)
115 ,fToyMinTrackEta(-.5)
118 ,fToyMaxTrackPhi(2*TMath::Pi())
129 DefineOutput(1, TList::Class());
133 //__________________________________________________________________________
134 AliAnalysisTaskFastEmbedding::AliAnalysisTaskFastEmbedding(const AliAnalysisTaskFastEmbedding ©)
135 : AliAnalysisTaskSE()
136 ,fAODout(copy.fAODout)
137 ,fAODevent(copy.fAODevent)
138 ,fAODtree(copy.fAODtree)
139 ,fAODfile(copy.fAODfile)
141 ,fAODPathArray(copy.fAODPathArray)
142 ,fAODPath(copy.fAODPath)
143 ,fTrackBranch(copy.fTrackBranch)
144 ,fMCparticlesBranch(copy.fMCparticlesBranch)
145 ,fJetBranch(copy.fJetBranch)
147 ,fEmbedMode(copy.fEmbedMode)
148 ,fEvtSelecMode(copy.fEvtSelecMode)
149 ,fEvtSelMinJetPt(copy.fEvtSelMinJetPt)
150 ,fEvtSelMaxJetPt(copy.fEvtSelMaxJetPt)
151 ,fToyMinNbOfTracks(copy.fToyMinNbOfTracks)
152 ,fToyMaxNbOfTracks(copy.fToyMaxNbOfTracks)
153 ,fToyMinTrackPt(copy.fToyMinTrackPt)
154 ,fToyMaxTrackPt(copy.fToyMaxTrackPt)
155 ,fToyDistributionTrackPt(copy.fToyDistributionTrackPt)
156 ,fToyMinTrackEta(copy.fToyMinTrackEta)
157 ,fToyMaxTrackEta(copy.fToyMaxTrackEta)
158 ,fToyMinTrackPhi(copy.fToyMinTrackPhi)
159 ,fToyMaxTrackPhi(copy.fToyMaxTrackPhi)
160 ,fToyFilterMap(copy.fToyFilterMap)
161 ,fHistList(copy.fHistList)
162 ,fh1TrackPt(copy.fh1TrackPt)
163 ,fh2TrackEtaPhi(copy.fh2TrackEtaPhi)
164 ,fh1TrackN(copy.fh1TrackN)
165 ,fh1MCTrackPt(copy.fh1MCTrackPt)
166 ,fh2MCTrackEtaPhi(copy.fh2MCTrackEtaPhi)
167 ,fh1MCTrackN(copy.fh1MCTrackN)
173 //__________________________________________________________________________
174 AliAnalysisTaskFastEmbedding& AliAnalysisTaskFastEmbedding::operator=(const AliAnalysisTaskFastEmbedding& o)
179 AliAnalysisTaskSE::operator=(o);
181 fAODevent = o.fAODevent;
182 fAODtree = o.fAODtree;
183 fAODfile = o.fAODfile;
185 fAODPathArray = o.fAODPathArray;
186 fAODPath = o.fAODPath;
187 fTrackBranch = o.fTrackBranch;
188 fMCparticlesBranch = o.fMCparticlesBranch;
189 fJetBranch = o.fJetBranch;
191 fEmbedMode = o.fEmbedMode;
192 fEvtSelecMode = o.fEvtSelecMode;
193 fEvtSelMinJetPt = o.fEvtSelMinJetPt;
194 fEvtSelMaxJetPt = o.fEvtSelMaxJetPt;
195 fToyMinNbOfTracks = o.fToyMinNbOfTracks;
196 fToyMaxNbOfTracks = o.fToyMaxNbOfTracks;
197 fToyMinTrackPt = o.fToyMinTrackPt;
198 fToyMaxTrackPt = o.fToyMaxTrackPt;
199 fToyDistributionTrackPt = o.fToyDistributionTrackPt;
200 fToyMinTrackEta = o.fToyMinTrackEta;
201 fToyMaxTrackEta = o.fToyMaxTrackEta;
202 fToyMinTrackPhi = o.fToyMinTrackPhi;
203 fToyMaxTrackPhi = o.fToyMaxTrackPhi;
204 fToyFilterMap = o.fToyFilterMap;
205 fHistList = o.fHistList;
206 fh1TrackPt = o.fh1TrackPt;
207 fh2TrackEtaPhi = o.fh2TrackEtaPhi;
208 fh1TrackN = o.fh1TrackN;
209 fh1MCTrackPt = o.fh1MCTrackPt;
210 fh2MCTrackEtaPhi = o.fh2MCTrackEtaPhi;
211 fh1MCTrackN = o.fh1MCTrackN;
218 //__________________________________________________________________________
219 AliAnalysisTaskFastEmbedding::~AliAnalysisTaskFastEmbedding()
226 //__________________________________________________________________________
227 void AliAnalysisTaskFastEmbedding::UserCreateOutputObjects()
229 // create output objects
230 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::UserCreateOutputObjects()");
232 rndm = new TRandom3();
233 Int_t id = GetJobID();
234 if(id>-1) rndm->SetSeed(id);
235 else rndm->SetSeed(); // a TTUID is generated and used for seed
236 AliInfo(Form("TRandom3 seed: %d", rndm->GetSeed()));
239 // embed mode with AOD
240 if(fEmbedMode==kAODFull || fEmbedMode==kAODJetTracks || fEmbedMode==kAODJet4Mom){
244 Int_t rc = SelectAODfile();
248 Int_t rc = OpenAODfile();
251 } //end: embed mode with AOD
254 // connect output aod
255 // create a new branch for extra tracks
256 fAODout = AODEvent();
258 AliError("Output AOD not found.");
261 if(!fAODout->FindListObject(fTrackBranch.Data()) && strlen(fTrackBranch.Data())){
262 AliInfo(Form("Add AOD branch %s", fTrackBranch.Data()));
263 TClonesArray *tracks = new TClonesArray("AliAODTrack",0);
264 tracks->SetName(fTrackBranch.Data());
265 AddAODBranch("TClonesArray", &tracks);
267 // create new branch for extra mcparticle if available as input
268 if(fAODevent && fAODevent->FindListObject("mcparticles") && strlen(fMCparticlesBranch.Data())){
269 AliInfo(Form("Add AOD branch %s", fMCparticlesBranch.Data()));
270 TClonesArray *mcparticles = new TClonesArray("AliAODMCParticle",0);
271 mcparticles->SetName(fMCparticlesBranch.Data());
272 AddAODBranch("TClonesArray", &mcparticles);
281 fHistList = new TList();
283 Bool_t oldStatus = TH1::AddDirectoryStatus();
284 TH1::AddDirectory(kFALSE);
286 fh1TrackPt = new TH1F("fh1TrackPt","pT of extra tracks;p_{T};entries", 300, 0., 300.);
287 fh2TrackEtaPhi = new TH2F("fh2TrackEtaPhi","eta-phi distribution of extra tracks;#eta;#phi", 20, -1., 1., 60, 0., 2*TMath::Pi());
288 fh1TrackN = new TH1F("fh1TrackN", "nb. of extra tracks per event;nb. of tracks;entries",300, 0., 3000.);
290 fHistList->Add(fh1TrackPt);
291 fHistList->Add(fh2TrackEtaPhi);
292 fHistList->Add(fh1TrackN);
295 if(fAODevent && fAODevent->FindListObject("mcparticles") && strlen(fMCparticlesBranch.Data())){
297 fh1MCTrackPt = new TH1F("fh1MCTrackPt","pT of MC extra tracks;p_{T};entries", 300, 0., 300.);
298 fh2MCTrackEtaPhi = new TH2F("fh2MCTrackEtaPhi","eta-phi distribution of MC extra tracks;#eta;#phi", 20, -1., 1., 60, 0., 2*TMath::Pi());
299 fh1MCTrackN = new TH1F("fh1MCTrackN", "nb. of MC extra tracks per event;nb. of tracks;entries",300, 0., 3000.);
301 fHistList->Add(fh1MCTrackPt);
302 fHistList->Add(fh2MCTrackEtaPhi);
303 fHistList->Add(fh1MCTrackN);
307 TH1::AddDirectory(oldStatus);
312 //__________________________________________________________________________
313 void AliAnalysisTaskFastEmbedding::Init()
316 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::Init()");
321 //__________________________________________________________________________
322 void AliAnalysisTaskFastEmbedding::UserExec(Option_t *)
324 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::UserExec()");
327 AliError("Need output AOD, but is not connected.");
332 TClonesArray *tracks = (TClonesArray*)(fAODout->FindListObject(fTrackBranch.Data()));
334 AliError("Extra track branch not found in output.");
343 // === embed mode with AOD ===
344 if(fEmbedMode==kAODFull || fEmbedMode==kAODJetTracks || fEmbedMode==kAODJet4Mom){
346 AliError("Need input AOD, but is not connected.");
351 TClonesArray *aodJets = 0;
352 if(fJetBranch.Length()) aodJets = dynamic_cast<TClonesArray*>(fAODevent->FindListObject(fJetBranch.Data()));
353 else aodJets = fAODevent->GetJets();
355 AliError("Could not find jets in AOD. Check jet branch when indicated.");
360 Int_t nEvents = fAODtree->GetEntries();
362 Bool_t useEntry = kFALSE;
363 while(!useEntry){ // protection need, if no event fulfills requierment
367 AliDebug(AliLog::kDebug, "Last event in AOD reached, start from entry 0 again.");
370 AliDebug(AliLog::kDebug, "Last event in AOD reached, select new AOD file ...");
371 Int_t rc = SelectAODfile();
379 fAODtree->GetEvent(fEntry);
382 if(fEvtSelecMode==kEventsJetPt){
383 Int_t nJets = aodJets->GetEntries();
384 for(Int_t ij=0; ij<nJets; ++ij){
385 AliAODJet *jet = dynamic_cast<AliAODJet*>(aodJets->At(ij));
388 if( (fEvtSelMinJetPt==-1. || jet->Pt()>=fEvtSelMinJetPt)
389 && (fEvtSelMaxJetPt==-1. || jet->Pt()<=fEvtSelMaxJetPt)){
397 if(fEvtSelecMode==kEventsAll){
403 AliInfo(Form("Use entry %d from extra AOD.", fEntry-1));
406 TClonesArray *mcpartIN = (TClonesArray*)(fAODevent->FindListObject("mcparticles"));
407 TClonesArray *mcpartOUT = 0x0;
409 mcpartOUT = (TClonesArray*)(fAODout->FindListObject(fMCparticlesBranch.Data()));
412 AliInfo("No extra MC particles found.");
416 if(fEmbedMode==kAODFull || fEmbedMode==kAODJetTracks){ // take all tracks or jet tracks
417 // loop over input tracks
419 Int_t nTracks = fAODevent->GetNumberOfTracks();
420 fh1TrackN->Fill((Float_t)nTracks);
422 for(Int_t it=0; it<nTracks; ++it){
423 AliAODTrack *tmpTr = fAODevent->GetTrack(it);
424 // ?? test filter bit, or something else??
426 if(fEmbedMode==kAODJetTracks){
427 // jet track? else continue
428 // not implemented yet
432 new ((*tracks)[nAODtracks++]) AliAODTrack(*tmpTr);
433 dummy = (*tracks)[nAODtracks-1];
435 fh1TrackPt->Fill(tmpTr->Pt());
436 fh2TrackEtaPhi->Fill(tmpTr->Eta(), tmpTr->Phi());
440 Int_t nMCpart = mcpartIN->GetEntriesFast();
442 Int_t nPhysicalPrimary=0;
444 for(Int_t ip=0; ip<nMCpart; ++ip){
445 AliAODMCParticle *tmpPart = (AliAODMCParticle*) mcpartIN->At(ip);
447 if(fEmbedMode==kAODJetTracks){
448 // jet track? else continue
449 // not implemented yet
453 new((*mcpartOUT)[nAODmcpart++]) AliAODMCParticle(*tmpPart);
454 dummy = (*mcpartOUT)[nAODmcpart-1];
456 if(tmpPart->IsPhysicalPrimary() && tmpPart->Charge()!=0. && tmpPart->Charge()!=-99. ){
457 fh1MCTrackPt->Fill(tmpPart->Pt());
458 fh2MCTrackEtaPhi->Fill(tmpPart->Eta(), tmpPart->Phi());
462 fh1MCTrackN->Fill((Float_t)nPhysicalPrimary);
465 } // end: embed all tracks or jet tracks
468 if(fEmbedMode==kAODJet4Mom){
471 Int_t nJets = aodJets->GetEntries();
472 fh1TrackN->Fill((Float_t)nJets);
473 for(Int_t ij=0; ij<nJets; ++ij){
474 AliAODJet *jet = dynamic_cast<AliAODJet*>(aodJets->At(ij));
476 AliAODTrack *tmpTr = (AliAODTrack*)jet;
478 new ((*tracks)[nAODtracks++]) AliAODTrack(*tmpTr);
479 dummy = (*tracks)[nAODtracks-1];
481 fh1TrackPt->Fill(tmpTr->Pt());
482 fh2TrackEtaPhi->Fill(tmpTr->Eta(), tmpTr->Phi());
485 } // end: embed jets as 4-momenta
488 } //end: embed mode with AOD
491 // === embed mode with toy ===
492 if(fEmbedMode==kToyTracks){
493 Int_t nT = (Int_t)(rndm->Uniform(fToyMinNbOfTracks, fToyMaxNbOfTracks)+0.5);
495 fh1TrackN->Fill((Float_t)nT);
497 for(Int_t i=0; i<nT; ++i){
500 if(fToyMinTrackPt!=fToyMaxTrackPt){
501 if(fToyDistributionTrackPt==0){
502 pt = rndm->Uniform(fToyMinTrackPt, fToyMaxTrackPt);
504 while(pt<fToyMinTrackPt||pt>fToyMaxTrackPt){
505 pt = rndm->Exp(fToyDistributionTrackPt); // no power law yet!!
506 pt += fToyMinTrackPt;
512 Double_t eta = rndm->Uniform(fToyMinTrackEta,fToyMaxTrackEta);
513 Double_t phi = rndm->Uniform(fToyMinTrackPhi,fToyMaxTrackPhi);
514 phi = TVector2::Phi_0_2pi(phi);
516 Printf("Add track #%d: pt %.2f, eta %.2f, phi %.2f", i, pt, eta, phi);
518 Double_t theta = 2*TMath::ATan(1/TMath::Exp(eta));
529 AliAODTrack *tmpTr = new AliAODTrack( -999, // id
540 kFALSE, // used for vertex fit
541 kFALSE, // used for prim vtx fit
542 AliAODTrack::kUndef, // type
543 fToyFilterMap, // select info
544 -999. // chi2 per NDF
546 tmpTr->SetFlags(1<<27);
548 new((*tracks)[nAODtracks++]) AliAODTrack(*tmpTr);
549 dummy = (*tracks)[nAODtracks-1];
551 fh1TrackPt->Fill(pt);
552 fh2TrackEtaPhi->Fill(eta,phi);
556 } //end: embed mode with toy
559 PostData(1, fHistList);
563 //__________________________________________________________________________
564 void AliAnalysisTaskFastEmbedding::Terminate(Option_t *)
566 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::Terminate()");
568 if(fAODfile && fAODfile->IsOpen())
573 //__________________________________________________________________________
574 Int_t AliAnalysisTaskFastEmbedding::GetJobID()
578 const char* env = gSystem->Getenv("ALIEN_PROC_ID"); // GRID
579 //if(!env || !strlen(env)) env = gSystem->Getenv("LSB_JOBINDEX"); // GSI
581 if(env && strlen(env)){
583 AliInfo(Form("Job index %d", id));
586 AliInfo("Job index not found. Okay if running locally.");
592 //__________________________________________________________________________
594 Int_t AliAnalysisTaskFastEmbedding::SelectAODfile(){
596 Int_t nFiles = fAODPathArray->GetEntries();
597 Int_t n = rndm->Integer(nFiles);
598 AliInfo(Form("Select AOD file %d", n));
599 TObjString *objStr = (TObjString*) fAODPathArray->At(n);
601 AliError("Could not get path of aod file.");
604 fAODPath = objStr->GetString();
609 Int_t AliAnalysisTaskFastEmbedding::OpenAODfile(){
611 TDirectory *owd = gDirectory;
612 fAODfile = TFile::Open(fAODPath.Data());
615 AliError("Could not open AOD file.");
619 fAODtree = (TTree*)fAODfile->Get("aodTree");
622 AliError("AOD tree not found.");
626 fAODevent = new AliAODEvent();
627 fAODevent->ReadFromTree(fAODtree);
629 AliError("AOD event not found.");