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();
377 // new file => we must use the new jet array
378 if(fJetBranch.Length()) aodJets = dynamic_cast<TClonesArray*>(fAODevent->FindListObject(fJetBranch.Data()));
379 else aodJets = fAODevent->GetJets();
381 AliError("Could not find jets in AOD. Check jet branch when indicated.");
387 fAODtree->GetEvent(fEntry);
390 if(fEvtSelecMode==kEventsJetPt){
391 Int_t nJets = aodJets->GetEntries();
392 for(Int_t ij=0; ij<nJets; ++ij){
393 AliAODJet *jet = dynamic_cast<AliAODJet*>(aodJets->At(ij));
396 if( (fEvtSelMinJetPt==-1. || jet->Pt()>=fEvtSelMinJetPt)
397 && (fEvtSelMaxJetPt==-1. || jet->Pt()<=fEvtSelMaxJetPt)){
405 if(fEvtSelecMode==kEventsAll){
411 AliInfo(Form("Use entry %d from extra AOD.", fEntry-1));
414 TClonesArray *mcpartIN = (TClonesArray*)(fAODevent->FindListObject("mcparticles"));
415 TClonesArray *mcpartOUT = 0x0;
417 mcpartOUT = (TClonesArray*)(fAODout->FindListObject(fMCparticlesBranch.Data()));
420 AliInfo("No extra MC particles found.");
424 if(fEmbedMode==kAODFull || fEmbedMode==kAODJetTracks){ // take all tracks or jet tracks
425 // loop over input tracks
427 Int_t nTracks = fAODevent->GetNumberOfTracks();
428 fh1TrackN->Fill((Float_t)nTracks);
430 for(Int_t it=0; it<nTracks; ++it){
431 AliAODTrack *tmpTr = fAODevent->GetTrack(it);
432 // ?? test filter bit, or something else??
434 if(fEmbedMode==kAODJetTracks){
435 // jet track? else continue
436 // not implemented yet
440 new ((*tracks)[nAODtracks++]) AliAODTrack(*tmpTr);
441 dummy = (*tracks)[nAODtracks-1];
443 fh1TrackPt->Fill(tmpTr->Pt());
444 fh2TrackEtaPhi->Fill(tmpTr->Eta(), tmpTr->Phi());
448 Int_t nMCpart = mcpartIN->GetEntriesFast();
450 Int_t nPhysicalPrimary=0;
452 for(Int_t ip=0; ip<nMCpart; ++ip){
453 AliAODMCParticle *tmpPart = (AliAODMCParticle*) mcpartIN->At(ip);
455 if(fEmbedMode==kAODJetTracks){
456 // jet track? else continue
457 // not implemented yet
461 new((*mcpartOUT)[nAODmcpart++]) AliAODMCParticle(*tmpPart);
462 dummy = (*mcpartOUT)[nAODmcpart-1];
464 if(tmpPart->IsPhysicalPrimary() && tmpPart->Charge()!=0. && tmpPart->Charge()!=-99. ){
465 fh1MCTrackPt->Fill(tmpPart->Pt());
466 fh2MCTrackEtaPhi->Fill(tmpPart->Eta(), tmpPart->Phi());
470 fh1MCTrackN->Fill((Float_t)nPhysicalPrimary);
473 } // end: embed all tracks or jet tracks
476 if(fEmbedMode==kAODJet4Mom){
479 Int_t nJets = aodJets->GetEntries();
480 fh1TrackN->Fill((Float_t)nJets);
481 for(Int_t ij=0; ij<nJets; ++ij){
482 AliAODJet *jet = dynamic_cast<AliAODJet*>(aodJets->At(ij));
484 AliAODTrack *tmpTr = (AliAODTrack*)jet;
486 new ((*tracks)[nAODtracks++]) AliAODTrack(*tmpTr);
487 dummy = (*tracks)[nAODtracks-1];
489 fh1TrackPt->Fill(tmpTr->Pt());
490 fh2TrackEtaPhi->Fill(tmpTr->Eta(), tmpTr->Phi());
493 } // end: embed jets as 4-momenta
496 } //end: embed mode with AOD
499 // === embed mode with toy ===
500 if(fEmbedMode==kToyTracks){
501 Int_t nT = (Int_t)(rndm->Uniform(fToyMinNbOfTracks, fToyMaxNbOfTracks)+0.5);
503 fh1TrackN->Fill((Float_t)nT);
505 for(Int_t i=0; i<nT; ++i){
508 if(fToyMinTrackPt!=fToyMaxTrackPt){
509 if(fToyDistributionTrackPt==0){
510 pt = rndm->Uniform(fToyMinTrackPt, fToyMaxTrackPt);
512 while(pt<fToyMinTrackPt||pt>fToyMaxTrackPt){
513 pt = rndm->Exp(fToyDistributionTrackPt); // no power law yet!!
514 pt += fToyMinTrackPt;
520 Double_t eta = rndm->Uniform(fToyMinTrackEta,fToyMaxTrackEta);
521 Double_t phi = rndm->Uniform(fToyMinTrackPhi,fToyMaxTrackPhi);
522 phi = TVector2::Phi_0_2pi(phi);
524 Printf("Add track #%d: pt %.2f, eta %.2f, phi %.2f", i, pt, eta, phi);
526 Double_t theta = 2*TMath::ATan(1/TMath::Exp(eta));
537 AliAODTrack *tmpTr = new AliAODTrack( -999, // id
548 kFALSE, // used for vertex fit
549 kFALSE, // used for prim vtx fit
550 AliAODTrack::kUndef, // type
551 fToyFilterMap, // select info
552 -999. // chi2 per NDF
554 tmpTr->SetFlags(1<<27);
556 new((*tracks)[nAODtracks++]) AliAODTrack(*tmpTr);
557 dummy = (*tracks)[nAODtracks-1];
559 fh1TrackPt->Fill(pt);
560 fh2TrackEtaPhi->Fill(eta,phi);
564 } //end: embed mode with toy
567 PostData(1, fHistList);
571 //__________________________________________________________________________
572 void AliAnalysisTaskFastEmbedding::Terminate(Option_t *)
574 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::Terminate()");
576 if(fAODfile && fAODfile->IsOpen())
581 //__________________________________________________________________________
582 Int_t AliAnalysisTaskFastEmbedding::GetJobID()
586 const char* env = gSystem->Getenv("ALIEN_PROC_ID"); // GRID
587 //if(!env || !strlen(env)) env = gSystem->Getenv("LSB_JOBINDEX"); // GSI
589 if(env && strlen(env)){
591 AliInfo(Form("Job index %d", id));
594 AliInfo("Job index not found. Okay if running locally.");
600 //__________________________________________________________________________
602 Int_t AliAnalysisTaskFastEmbedding::SelectAODfile(){
604 Int_t nFiles = fAODPathArray->GetEntries();
605 Int_t n = rndm->Integer(nFiles);
606 AliInfo(Form("Select AOD file %d", n));
607 TObjString *objStr = (TObjString*) fAODPathArray->At(n);
609 AliError("Could not get path of aod file.");
612 fAODPath = objStr->GetString();
617 Int_t AliAnalysisTaskFastEmbedding::OpenAODfile(){
619 TDirectory *owd = gDirectory;
622 fAODfile = TFile::Open(fAODPath.Data());
625 AliError("Could not open AOD file.");
629 fAODtree = (TTree*)fAODfile->Get("aodTree");
632 AliError("AOD tree not found.");
637 fAODevent = new AliAODEvent();
638 fAODevent->ReadFromTree(fAODtree);