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>
41 #include "AliAnalysisTaskFastEmbedding.h"
42 #include "AliAnalysisManager.h"
43 #include "AliESDEvent.h"
44 #include "AliESDtrack.h"
45 #include "AliAODEvent.h"
46 #include "AliAODTrack.h"
47 #include "AliAODJet.h"
48 #include "AliAODMCParticle.h"
49 #include "AliAODMCHeader.h"
50 #include "AliInputEventHandler.h"
54 ClassImp(AliAnalysisTaskFastEmbedding)
56 //__________________________________________________________________________
57 AliAnalysisTaskFastEmbedding::AliAnalysisTaskFastEmbedding()
69 ,fAODPath("AliAOD.root")
73 ,fOfflineTrgMask(AliVEvent::kAny)
83 ,fTrackBranch("aodExtraTracks")
84 ,fMCparticlesBranch("aodExtraMCparticles")
93 ,fEvtSelMinJetEta(-999.)
94 ,fEvtSelMaxJetEta( 999.)
96 ,fEvtSelMaxJetPhi(TMath::Pi()*2.)
101 ,fToyDistributionTrackPt(0.)
102 ,fToyMinTrackEta(-.5)
105 ,fToyMaxTrackPhi(2*TMath::Pi())
116 ,fHistEvtSelection(0)
135 // default constructor
140 //__________________________________________________________________________
141 AliAnalysisTaskFastEmbedding::AliAnalysisTaskFastEmbedding(const char *name)
142 : AliAnalysisTaskSE(name)
153 ,fAODPath("AliAOD.root")
157 ,fOfflineTrgMask(AliVEvent::kAny)
166 ,fNInputTracksMax(-1)
167 ,fTrackBranch("aodExtraTracks")
168 ,fMCparticlesBranch("aodExtraMCparticles")
177 ,fEvtSelMinJetEta(-999.)
178 ,fEvtSelMaxJetEta( 999.)
179 ,fEvtSelMinJetPhi(0.)
180 ,fEvtSelMaxJetPhi(TMath::Pi()*2.)
181 ,fToyMinNbOfTracks(1)
182 ,fToyMaxNbOfTracks(1)
185 ,fToyDistributionTrackPt(0.)
186 ,fToyMinTrackEta(-.5)
189 ,fToyMaxTrackPhi(2*TMath::Pi())
200 ,fHistEvtSelection(0)
220 DefineOutput(1, TList::Class());
224 //__________________________________________________________________________
225 AliAnalysisTaskFastEmbedding::AliAnalysisTaskFastEmbedding(const AliAnalysisTaskFastEmbedding ©)
226 : AliAnalysisTaskSE()
228 ,fAODout(copy.fAODout)
229 ,fAODevent(copy.fAODevent)
230 ,fAODtree(copy.fAODtree)
231 ,fAODfile(copy.fAODfile)
232 ,mcHeader(copy.mcHeader)
234 ,fInputEntries(copy.fInputEntries)
235 ,fAODPathArray(copy.fAODPathArray)
236 ,fAODEntriesArray(copy.fAODEntriesArray)
237 ,fAODPath(copy.fAODPath)
238 ,fAODEntries(copy.fAODEntries)
239 ,fAODEntriesSum(copy.fAODEntriesSum)
240 ,fAODEntriesMax(copy.fAODEntriesMax)
241 ,fOfflineTrgMask(copy.fOfflineTrgMask)
242 ,fMinContribVtx(copy.fMinContribVtx)
243 ,fVtxZMin(copy.fVtxZMin)
244 ,fVtxZMax(copy.fVtxZMax)
245 ,fEvtClassMin(copy.fEvtClassMin)
246 ,fEvtClassMax(copy.fEvtClassMax)
247 ,fCentMin(copy.fCentMin)
248 ,fCentMax(copy.fCentMax)
249 ,fNInputTracksMin(copy.fNInputTracksMin)
250 ,fNInputTracksMax(copy.fNInputTracksMax)
251 ,fTrackBranch(copy.fTrackBranch)
252 ,fMCparticlesBranch(copy.fMCparticlesBranch)
253 ,fJetBranch(copy.fJetBranch)
254 ,fFileId(copy.fFileId)
255 ,fAODEntry(copy.fAODEntry)
256 ,fCountEvents(copy.fCountEvents)
257 ,fEmbedMode(copy.fEmbedMode)
258 ,fEvtSelecMode(copy.fEvtSelecMode)
259 ,fEvtSelMinJetPt(copy.fEvtSelMinJetPt)
260 ,fEvtSelMaxJetPt(copy.fEvtSelMaxJetPt)
261 ,fEvtSelMinJetEta(copy.fEvtSelMinJetEta)
262 ,fEvtSelMaxJetEta(copy.fEvtSelMaxJetEta)
263 ,fEvtSelMinJetPhi(copy.fEvtSelMinJetPhi)
264 ,fEvtSelMaxJetPhi(copy.fEvtSelMaxJetPhi)
265 ,fToyMinNbOfTracks(copy.fToyMinNbOfTracks)
266 ,fToyMaxNbOfTracks(copy.fToyMaxNbOfTracks)
267 ,fToyMinTrackPt(copy.fToyMinTrackPt)
268 ,fToyMaxTrackPt(copy.fToyMaxTrackPt)
269 ,fToyDistributionTrackPt(copy.fToyDistributionTrackPt)
270 ,fToyMinTrackEta(copy.fToyMinTrackEta)
271 ,fToyMaxTrackEta(copy.fToyMaxTrackEta)
272 ,fToyMinTrackPhi(copy.fToyMinTrackPhi)
273 ,fToyMaxTrackPhi(copy.fToyMaxTrackPhi)
274 ,fToyFilterMap(copy.fToyFilterMap)
275 ,fTrackFilterMap(copy.fTrackFilterMap)
276 ,fNPtHard(copy.fNPtHard)
277 ,fPtHard(copy.fPtHard)
278 ,fPtHardBin(copy.fPtHardBin)
279 ,fAODJets(copy.fAODJets)
280 ,fNevents(copy.fNevents)
281 ,fXsection(copy.fXsection)
282 ,fAvgTrials(copy.fAvgTrials)
283 ,fHistList(copy.fHistList)
284 ,fHistEvtSelection(copy.fHistEvtSelection)
285 ,fh1Xsec(copy.fh1Xsec)
286 ,fh1Trials(copy.fh1Trials)
287 ,fh1TrialsEvtSel(copy.fh1TrialsEvtSel)
288 ,fh2PtHard(copy.fh2PtHard)
289 ,fh2PtHardEvtSel(copy.fh2PtHardEvtSel)
290 ,fh2PtHardTrials(copy.fh2PtHardTrials)
291 ,fh1TrackPt(copy.fh1TrackPt)
292 ,fh2TrackEtaPhi(copy.fh2TrackEtaPhi)
293 ,fh1TrackN(copy.fh1TrackN)
294 ,fh1JetPt(copy.fh1JetPt)
295 ,fh2JetEtaPhi(copy.fh2JetEtaPhi)
296 ,fh1JetN(copy.fh1JetN)
297 ,fh1MCTrackPt(copy.fh1MCTrackPt)
298 ,fh2MCTrackEtaPhi(copy.fh2MCTrackEtaPhi)
299 ,fh1MCTrackN(copy.fh1MCTrackN)
300 ,fh1AODfile(copy.fh1AODfile)
301 ,fh2AODevent(copy.fh2AODevent)
307 //__________________________________________________________________________
308 AliAnalysisTaskFastEmbedding& AliAnalysisTaskFastEmbedding::operator=(const AliAnalysisTaskFastEmbedding& o)
313 AliAnalysisTaskSE::operator=(o);
316 fAODevent = o.fAODevent;
317 fAODtree = o.fAODtree;
318 fAODfile = o.fAODfile;
319 mcHeader = o.mcHeader;
321 fInputEntries = o.fInputEntries;
322 fAODPathArray = o.fAODPathArray;
323 fAODEntriesArray = o.fAODEntriesArray;
324 fAODPath = o.fAODPath;
325 fAODEntries = o.fAODEntries;
326 fAODEntriesSum = o.fAODEntriesSum;
327 fAODEntriesMax = o.fAODEntriesMax;
328 fOfflineTrgMask = o.fOfflineTrgMask;
329 fMinContribVtx = o.fMinContribVtx;
330 fVtxZMin = o.fVtxZMin;
331 fVtxZMax = o.fVtxZMax;
332 fEvtClassMin = o.fEvtClassMin;
333 fEvtClassMax = o.fEvtClassMax;
334 fCentMin = o.fCentMin;
335 fCentMax = o.fCentMax;
336 fNInputTracksMin = o.fNInputTracksMin;
337 fNInputTracksMax = o.fNInputTracksMax;
338 fTrackBranch = o.fTrackBranch;
339 fMCparticlesBranch = o.fMCparticlesBranch;
340 fJetBranch = o.fJetBranch;
342 fAODEntry = o.fAODEntry;
343 fCountEvents = o.fCountEvents;
344 fEmbedMode = o.fEmbedMode;
345 fEvtSelecMode = o.fEvtSelecMode;
346 fEvtSelMinJetPt = o.fEvtSelMinJetPt;
347 fEvtSelMaxJetPt = o.fEvtSelMaxJetPt;
348 fEvtSelMinJetEta = o.fEvtSelMinJetEta;
349 fEvtSelMaxJetEta = o.fEvtSelMaxJetEta;
350 fEvtSelMinJetPhi = o.fEvtSelMinJetPhi;
351 fEvtSelMaxJetPhi = o.fEvtSelMaxJetPhi;
352 fToyMinNbOfTracks = o.fToyMinNbOfTracks;
353 fToyMaxNbOfTracks = o.fToyMaxNbOfTracks;
354 fToyMinTrackPt = o.fToyMinTrackPt;
355 fToyMaxTrackPt = o.fToyMaxTrackPt;
356 fToyDistributionTrackPt = o.fToyDistributionTrackPt;
357 fToyMinTrackEta = o.fToyMinTrackEta;
358 fToyMaxTrackEta = o.fToyMaxTrackEta;
359 fToyMinTrackPhi = o.fToyMinTrackPhi;
360 fToyMaxTrackPhi = o.fToyMaxTrackPhi;
361 fToyFilterMap = o.fToyFilterMap;
362 fTrackFilterMap = o.fTrackFilterMap;
363 fNPtHard = o.fNPtHard;
365 fPtHardBin = o.fPtHardBin;
366 fAODJets = o.fAODJets;
367 fNevents = o.fNevents;
368 fXsection = o.fXsection;
369 fAvgTrials = o.fAvgTrials;
370 fHistList = o.fHistList;
371 fHistEvtSelection = o.fHistEvtSelection;
373 fh1Trials = o.fh1Trials;
374 fh1TrialsEvtSel = o.fh1TrialsEvtSel;
375 fh2PtHard = o.fh2PtHard;
376 fh2PtHardEvtSel = o.fh2PtHardEvtSel;
377 fh2PtHardTrials = o.fh2PtHardTrials;
378 fh1TrackPt = o.fh1TrackPt;
379 fh2TrackEtaPhi = o.fh2TrackEtaPhi;
380 fh1TrackN = o.fh1TrackN;
381 fh1JetPt = o.fh1JetPt;
382 fh2JetEtaPhi = o.fh2JetEtaPhi;
384 fh1MCTrackPt = o.fh1MCTrackPt;
385 fh2MCTrackEtaPhi = o.fh2MCTrackEtaPhi;
386 fh1MCTrackN = o.fh1MCTrackN;
387 fh1AODfile = o.fh1AODfile;
388 fh2AODevent = o.fh2AODevent;
395 //__________________________________________________________________________
396 AliAnalysisTaskFastEmbedding::~AliAnalysisTaskFastEmbedding()
403 //__________________________________________________________________________
404 void AliAnalysisTaskFastEmbedding::UserCreateOutputObjects()
406 // create output objects
407 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::UserCreateOutputObjects()");
408 AliLog::SetClassDebugLevel("AliAnalysisTaskFastEmbedding", AliLog::kInfo);
411 if(!fHistList) fHistList = new TList();
412 fHistList->SetOwner(kTRUE);
416 rndm = new TRandom3();
417 Int_t id = GetJobID();
418 if(id>-1) rndm->SetSeed(id);
419 else rndm->SetSeed(); // a TTUID is generated and used for seed
420 AliInfo(Form("TRandom3 seed: %d", rndm->GetSeed()));
424 // embed mode with AOD
425 if(fEmbedMode==kAODFull || fEmbedMode==kAODJetTracks || fEmbedMode==kAODJet4Mom){
428 fFileId = OpenAODfile();
429 fNevents = 0; // force to open another aod in UserExec()
432 PostData(1, fHistList);
435 } //end: embed mode with AOD
438 // connect output aod
439 // create a new branch for extra tracks
440 fAODout = AODEvent();
442 AliError("Output AOD not found.");
443 PostData(1, fHistList);
446 if(!fAODout->FindListObject(fTrackBranch.Data()) && strlen(fTrackBranch.Data())){
447 AliInfo(Form("Add AOD branch %s", fTrackBranch.Data()));
448 TClonesArray *tracks = new TClonesArray("AliAODTrack",0);
449 tracks->SetName(fTrackBranch.Data());
450 AddAODBranch("TClonesArray", &tracks);
452 // create new branch for extra mcparticle if available as input
453 if(fAODevent && fAODevent->FindListObject("mcparticles") && strlen(fMCparticlesBranch.Data())){
454 AliInfo(Form("Add AOD branch %s", fMCparticlesBranch.Data()));
455 TClonesArray *mcparticles = new TClonesArray("AliAODMCParticle",0);
456 mcparticles->SetName(fMCparticlesBranch.Data());
457 AddAODBranch("TClonesArray", &mcparticles);
463 Bool_t oldStatus = TH1::AddDirectoryStatus();
464 TH1::AddDirectory(kFALSE);
466 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
467 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
468 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
469 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
470 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
471 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
472 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
474 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root;p_{T,hard} bin;<#sigma>",fNPtHard+1,-1.5,fNPtHard-0.5);
475 fh1Trials = new TH1F("fh1Trials","trials (simulation) from pyxsec.root;p_{T,hard} bin;#sum{ntrials}",fNPtHard+1,-1.5,fNPtHard-0.5);
476 fh1TrialsEvtSel = new TH1F("fh1TrialsEvtSel","trials (event selection) from pyxsec.root;p_{T,hard} bin;#sum{ntrials}",fNPtHard+1,-1.5,fNPtHard-0.5);
477 fh2PtHard = new TH2F("fh2PtHard","PYTHIA Pt hard;p_{T,hard} bin;p_{T,hard}",fNPtHard+1,-1.5,fNPtHard-0.5,350,-.5,349.5);
478 fh2PtHardEvtSel = new TH2F("fh2PtHardEvtSel","PYTHIA Pt hard (event selection);p_{T,hard} bin;p_{T,hard}",fNPtHard+1,-1.5,fNPtHard-0.5,350,-.5,349.5);
479 fh2PtHardTrials = new TH2F("fh2PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard} bin;#sum{p_{T,hard}}",fNPtHard+1,-1.5,fNPtHard-0.5,350,-.5,349.5);
481 fHistList->Add(fHistEvtSelection);
482 fHistList->Add(fh1Xsec);
483 fHistList->Add(fh1Trials);
484 fHistList->Add(fh1TrialsEvtSel);
485 fHistList->Add(fh2PtHard);
486 fHistList->Add(fh2PtHardEvtSel);
487 fHistList->Add(fh2PtHardTrials);
489 fh1TrackPt = new TH1F("fh1TrackPt","pT of extra tracks;p_{T};entries", 250, 0., 250.);
490 fh2TrackEtaPhi = new TH2F("fh2TrackEtaPhi","eta-phi distribution of extra tracks;#eta;#phi", 20, -1., 1., 60, 0., 2*TMath::Pi());
491 fh1TrackN = new TH1F("fh1TrackN", "nb. of extra tracks per event;nb. of tracks;entries",300, 0., 300.);
493 fHistList->Add(fh1TrackPt);
494 fHistList->Add(fh2TrackEtaPhi);
495 fHistList->Add(fh1TrackN);
497 if(fEmbedMode==kAODFull || fEmbedMode==kAODJetTracks || fEmbedMode==kAODJet4Mom){
499 fh1JetPt = new TH1F("fh1JetPt", "pT of extra jets;p_{T};entries", 120, 0., 120.);
500 fh2JetEtaPhi = new TH2F("fh2JetEtaPhi", "eta-phi distribution of extra jets;#eta;#phi", 20, -1., 1., 60, 0., 2*TMath::Pi());
501 fh1JetN = new TH1F("fh1JetN", "nb. of extra jets per event;nb. of jets;entries",20,0.,20.);
503 fHistList->Add(fh1JetPt);
504 fHistList->Add(fh2JetEtaPhi);
505 fHistList->Add(fh1JetN);
509 if(fAODevent && fAODevent->FindListObject("mcparticles") && strlen(fMCparticlesBranch.Data())){
511 fh1MCTrackPt = new TH1F("fh1MCTrackPt","pT of MC extra tracks;p_{T};entries", 250, 0., 250.);
512 fh2MCTrackEtaPhi = new TH2F("fh2MCTrackEtaPhi","eta-phi distribution of MC extra tracks;#eta;#phi", 20, -1., 1., 60, 0., 2*TMath::Pi());
513 fh1MCTrackN = new TH1F("fh1MCTrackN", "nb. of MC extra tracks per event;nb. of tracks;entries",300, 0., 300.);
515 fHistList->Add(fh1MCTrackPt);
516 fHistList->Add(fh2MCTrackEtaPhi);
517 fHistList->Add(fh1MCTrackN);
521 fh1AODfile = new TH1I("fh1AODfile", "overview of opened AOD files from the array", 2300, -0.5, 2299.5);
522 fh2AODevent = new TH2I("fh1AODevent","selected events;file;event", 2500,-.5,2499.5,5000,-.5,4999.5);
523 fHistList->Add(fh1AODfile);
524 fHistList->Add(fh2AODevent);
526 // =========== Switch on Sumw2 for all histos ===========
527 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
528 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
535 TH1::AddDirectory(oldStatus);
537 PostData(1, fHistList);
541 //__________________________________________________________________________
542 void AliAnalysisTaskFastEmbedding::Init()
545 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::Init()");
549 //__________________________________________________________________________
550 Bool_t AliAnalysisTaskFastEmbedding::UserNotify()
552 // User defined Notify(), called once
553 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::UserNotify()");
555 // get total nb of events in tree (of this subjob)
556 AliInputEventHandler* inputHandler = (AliInputEventHandler*)((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
557 fInputEntries = inputHandler->GetTree()->GetEntriesFast();
558 AliInfo(Form("Total nb. of events: %d", fInputEntries));
565 //__________________________________________________________________________
566 void AliAnalysisTaskFastEmbedding::UserExec(Option_t *)
568 // Analysis, called once per event
569 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::UserExec()");
572 AliError("Need output AOD, but is not connected.");
573 PostData(1, fHistList);
577 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
579 AliError("ESD not available");
580 PostData(1, fHistList);
584 // -- event selection --
585 fHistEvtSelection->Fill(1); // number of events before event selection
588 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
589 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
590 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
591 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
592 fHistEvtSelection->Fill(2);
593 PostData(1, fHistList);
598 AliAODVertex* primVtx = fAODout->GetPrimaryVertex();
599 Int_t nTracksPrim = primVtx->GetNContributors();
600 if ((nTracksPrim < fMinContribVtx) ||
601 (primVtx->GetZ() < fVtxZMin) ||
602 (primVtx->GetZ() > fVtxZMax) ){
603 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
604 fHistEvtSelection->Fill(3);
605 PostData(1, fHistList);
609 /** takes wrong value, since jet service tasks runs later
610 // event class selection (from jet helper task)
611 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
612 if(fDebug) Printf("Event class %d", eventClass);
613 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
614 fHistEvtSelection->Fill(4);
615 PostData(1, fHistList);
619 // centrality selection
620 AliCentrality *cent = 0x0;
621 Float_t centValue = 0.;
622 if(fESD) cent = fESD->GetCentrality();
623 if(cent) centValue = cent->GetCentralityPercentile("V0M");
624 if(fDebug) printf("centrality: %f\n", centValue);
625 if (centValue < fCentMin || centValue > fCentMax){
626 fHistEvtSelection->Fill(4);
627 PostData(1, fHistList);
632 /* ** not implemented **
633 // multiplicity due to input tracks
634 Int_t nInputTracks = GetNInputTracks();
636 if (nInputTracks < fNInputTracksMin || (fNInputTracksMax > -1 && nInputTracks > fNInputTracksMax)){
637 fHistEvtSelection->Fill(5);
638 PostData(1, fHistList);
643 fHistEvtSelection->Fill(0); // accepted events
644 // -- end event selection --
647 TClonesArray *tracks = (TClonesArray*)(fAODout->FindListObject(fTrackBranch.Data()));
649 AliError("Extra track branch not found in output.");
650 PostData(1, fHistList);
658 // === embed mode with AOD ===
659 if(fEmbedMode==kAODFull || fEmbedMode==kAODJetTracks || fEmbedMode==kAODJet4Mom){
661 AliError("Need input AOD, but is not connected.");
662 PostData(1, fHistList);
668 Bool_t useEntry = kFALSE;
669 while(!useEntry){ // protection need, if no event fulfills requirement
671 fAODEntry++; // go to next event
673 if(fAODEntry>=fNevents) fAODEntry=0;
676 if(fCountEvents>=fNevents){
678 AliDebug(AliLog::kDebug, "No list of AODs, keep current AOD.");
681 AliDebug(AliLog::kDebug, "Select new AOD file ...");
683 fFileId = OpenAODfile();
685 PostData(1, fHistList);
688 fh1AODfile->Fill(fFileId);
689 if(fAODEntries!=fNevents){
690 AliError("File with list of AODs and file with nb. of entries inconsistent");
691 PostData(1, fHistList);
700 fAODtree->GetEvent(fAODEntry);
704 fPtHard = mcHeader->GetPtHard();
705 GetPtHard(kTRUE,fPtHard); // make value available for other tasks (e.g. jet response task)
706 AliDebug(AliLog::kDebug,Form("pt hard %.2f", fPtHard));
709 AliDebug(AliLog::kDebug,"No mcHeader");
711 fPtHardBin = GetPtHardBin(fPtHard);
713 //Printf("pt hard (bin) %.2f (%d), xSection %.2e, trials %.2f",fPtHard, fPtHardBin, fXsection, fAvgTrials);
715 // fill event variables for each event
716 fh1Xsec->Fill(fPtHardBin,fXsection);
717 fh2PtHard->Fill(fPtHardBin,fPtHard);
719 fh1Trials->Fill(fPtHardBin, fAvgTrials);
720 fh1TrialsEvtSel->Fill(fPtHardBin);
721 fh2PtHardTrials->Fill(fPtHardBin,fPtHard,fAvgTrials);
724 if(fEvtSelecMode==kEventsJetPt){
725 Int_t nJets = fAODJets->GetEntries();
726 //Printf("nb. jets: %d",nJets);
727 for(Int_t ij=0; ij<nJets; ++ij){
728 AliAODJet *jet = dynamic_cast<AliAODJet*>(fAODJets->At(ij));
731 if( (fEvtSelMinJetPt==-1. || jet->Pt()>=fEvtSelMinJetPt)
732 && (fEvtSelMaxJetPt==-1. || jet->Pt()<=fEvtSelMaxJetPt)
733 && (jet->Eta()>=fEvtSelMinJetEta && jet->Eta()<=fEvtSelMaxJetEta)
734 && (jet->Phi()>=fEvtSelMinJetPhi && jet->Phi()<=fEvtSelMaxJetPhi)){
742 if(fEvtSelecMode==kEventsAll){
747 AliDebug(AliLog::kDebug,Form("Use entry %d from extra AOD.", fAODEntry));
749 fh2PtHardEvtSel->Fill(fPtHardBin,fPtHard);
750 fh2AODevent->Fill(fFileId,fAODEntry);
752 TClonesArray *mcpartIN = (TClonesArray*)(fAODevent->FindListObject("mcparticles"));
753 TClonesArray *mcpartOUT = 0x0;
755 mcpartOUT = (TClonesArray*)(fAODout->FindListObject(fMCparticlesBranch.Data()));
757 AliError("Extra MC particles branch not found in output.");
758 PostData(1, fHistList);
763 AliInfo("No extra MC particles found.");
767 if(fEmbedMode==kAODFull || fEmbedMode==kAODJetTracks){ // take all tracks or jet tracks
768 // loop over input tracks
771 Int_t nJets = fAODJets->GetEntries();
772 Int_t nSelectedJets = 0;
773 AliAODJet *leadJet = 0x0; // used for jet tracks only
775 if(fEmbedMode==kAODFull){
776 nTracks = fAODevent->GetNumberOfTracks();
778 for(Int_t ij=0; ij<nJets; ++ij){
779 AliAODJet *jet = dynamic_cast<AliAODJet*>(fAODJets->At(ij));
781 if( (fEvtSelMinJetPt==-1. || jet->Pt()>=fEvtSelMinJetPt)
782 && (fEvtSelMaxJetPt==-1. || jet->Pt()<=fEvtSelMaxJetPt)
783 && (jet->Eta()>=fEvtSelMinJetEta && jet->Eta()<=fEvtSelMaxJetEta)
784 && (jet->Phi()>=fEvtSelMinJetPhi && jet->Eta()<=fEvtSelMaxJetPhi)){
786 fh1JetPt->Fill(jet->Pt());
787 fh2JetEtaPhi->Fill(jet->Eta(), jet->Phi());
792 fh1JetN->Fill(nSelectedJets);
795 if(fEmbedMode==kAODJetTracks){
796 // look for leading jet within selection
797 // get reference tracks for this jet
798 Float_t leadJetPt = 0.;
799 for(Int_t ij=0; ij<nJets; ++ij){
800 AliAODJet *jet = dynamic_cast<AliAODJet*>(fAODJets->At(ij));
802 if( (fEvtSelMinJetPt==-1. || jet->Pt()>=fEvtSelMinJetPt)
803 && (fEvtSelMaxJetPt==-1. || jet->Pt()<=fEvtSelMaxJetPt)
804 && (jet->Eta()>=fEvtSelMinJetEta && jet->Eta()<=fEvtSelMaxJetEta)
805 && (jet->Phi()>=fEvtSelMinJetPhi && jet->Eta()<=fEvtSelMaxJetPhi)){
806 if(jet->Pt()>leadJetPt){
807 leadJetPt = jet->Pt();
813 nTracks = leadJet->GetRefTracks()->GetEntriesFast();
814 fh1JetPt->Fill(leadJet->Pt());
815 fh2JetEtaPhi->Fill(leadJet->Eta(), leadJet->Pt());
820 fh1TrackN->Fill((Float_t)nTracks);
822 for(Int_t it=0; it<nTracks; ++it){
823 AliAODTrack *tmpTr = 0x0;
824 if(fEmbedMode==kAODFull) tmpTr = fAODevent->GetTrack(it);
825 if(fEmbedMode==kAODJetTracks) tmpTr = dynamic_cast<AliAODTrack*>(leadJet->GetRefTracks()->At(it));
828 tmpTr->SetStatus(AliESDtrack::kEmbedded);
830 new ((*tracks)[nAODtracks++]) AliAODTrack(*tmpTr);
831 dummy = (*tracks)[nAODtracks-1];
833 if(fTrackFilterMap<=0 || tmpTr->TestFilterBit(fTrackFilterMap)){
834 fh1TrackPt->Fill(tmpTr->Pt());
835 fh2TrackEtaPhi->Fill(tmpTr->Eta(), tmpTr->Phi());
840 Int_t nMCpart = mcpartIN->GetEntriesFast();
842 Int_t nPhysicalPrimary=0;
844 for(Int_t ip=0; ip<nMCpart; ++ip){
845 AliAODMCParticle *tmpPart = (AliAODMCParticle*) mcpartIN->At(ip);
847 if(fEmbedMode==kAODJetTracks){
848 // jet track? else continue
849 // not implemented yet
853 new((*mcpartOUT)[nAODmcpart++]) AliAODMCParticle(*tmpPart);
854 dummy = (*mcpartOUT)[nAODmcpart-1];
856 if(tmpPart->IsPhysicalPrimary() && tmpPart->Charge()!=0. && tmpPart->Charge()!=-99. ){
857 fh1MCTrackPt->Fill(tmpPart->Pt());
858 fh2MCTrackEtaPhi->Fill(tmpPart->Eta(), tmpPart->Phi());
862 fh1MCTrackN->Fill((Float_t)nPhysicalPrimary);
865 } // end: embed all tracks or jet tracks
868 if(fEmbedMode==kAODJet4Mom){
871 Int_t nJets = fAODJets->GetEntries();
872 fh1TrackN->Fill((Float_t)nJets);
873 for(Int_t ij=0; ij<nJets; ++ij){
874 AliAODJet *jet = dynamic_cast<AliAODJet*>(fAODJets->At(ij));
876 AliAODTrack *tmpTr = (AliAODTrack*)jet;
877 tmpTr->SetFlags(AliESDtrack::kEmbedded);
879 new ((*tracks)[nAODtracks++]) AliAODTrack(*tmpTr);
880 dummy = (*tracks)[nAODtracks-1];
882 fh1TrackPt->Fill(tmpTr->Pt());
883 fh2TrackEtaPhi->Fill(tmpTr->Eta(), tmpTr->Phi());
886 } // end: embed jets as 4-momenta
889 } //end: embed mode with AOD
892 // === embed mode with toy ===
893 if(fEmbedMode==kToyTracks){
894 Int_t nT = (Int_t)(rndm->Uniform(fToyMinNbOfTracks, fToyMaxNbOfTracks)+0.5);
896 fh1TrackN->Fill((Float_t)nT);
898 for(Int_t i=0; i<nT; ++i){
901 if(fToyMinTrackPt!=fToyMaxTrackPt){
902 if(fToyDistributionTrackPt==0){
903 pt = rndm->Uniform(fToyMinTrackPt, fToyMaxTrackPt);
905 while(pt<fToyMinTrackPt||pt>fToyMaxTrackPt){
906 pt = rndm->Exp(fToyDistributionTrackPt); // no power law yet!!
907 pt += fToyMinTrackPt;
913 Double_t eta = rndm->Uniform(fToyMinTrackEta,fToyMaxTrackEta);
914 Double_t phi = rndm->Uniform(fToyMinTrackPhi,fToyMaxTrackPhi);
915 phi = TVector2::Phi_0_2pi(phi);
917 if(fDebug) Printf("Add track #%d: pt %.2f, eta %.2f, phi %.2f", i, pt, eta, phi);
919 Double_t theta = 2*TMath::ATan(1/TMath::Exp(eta));
930 AliAODTrack *tmpTr = new AliAODTrack( -999, // id
941 kFALSE, // used for vertex fit
942 kFALSE, // used for prim vtx fit
943 AliAODTrack::kUndef, // type
944 fToyFilterMap, // select info
945 -999. // chi2 per NDF
947 tmpTr->SetFlags(AliESDtrack::kEmbedded);
949 new((*tracks)[nAODtracks++]) AliAODTrack(*tmpTr);
950 dummy = (*tracks)[nAODtracks-1];
952 fh1TrackPt->Fill(pt);
953 fh2TrackEtaPhi->Fill(eta,phi);
957 } //end: embed mode with toy
960 PostData(1, fHistList);
964 //__________________________________________________________________________
965 void AliAnalysisTaskFastEmbedding::Terminate(Option_t *)
968 if(fDebug > 1) Printf("AliAnalysisTaskFastEmbedding::Terminate()");
970 if(fAODfile && fAODfile->IsOpen())
975 //__________________________________________________________________________
976 Int_t AliAnalysisTaskFastEmbedding::GetJobID()
978 // gives back the alien subjob id, if available, else -1
982 const char* env = gSystem->Getenv("ALIEN_PROC_ID"); // GRID
983 //if(!env || !strlen(env)) env = gSystem->Getenv("LSB_JOBINDEX"); // GSI
985 if(env && strlen(env)){
987 AliInfo(Form("Job index %d", id));
990 AliInfo("Job index not found. Okay if running locally.");
996 //__________________________________________________________________________
997 Int_t AliAnalysisTaskFastEmbedding::SelectAODfile()
999 // select an AOD file from fAODPathArray
1001 Int_t nFiles = fAODPathArray->GetEntries();
1003 // choose randomly file and event
1005 Float_t tmpProp = -1.;
1006 Int_t pendingEvents = fInputEntries-Entry();
1007 //Printf("input entries %d, entry %d, pending events %d", fInputEntries, (Int_t)Entry(), pendingEvents);
1008 if(fAODEntriesArray){
1009 while(rndm->Rndm()>tmpProp){
1010 n = rndm->Integer(nFiles);
1011 fAODEntries = fAODEntriesArray->At(n);
1012 Int_t tmpEntries = fAODEntries<pendingEvents ? pendingEvents : fAODEntries;
1013 tmpProp = fAODEntriesMax ? (Float_t)tmpEntries/fAODEntriesMax : 1.;
1015 fAODEntry = (Int_t)(rndm->Uniform(fAODEntries));
1017 AliWarning("Number of entries in extra AODs not set!");
1018 n = rndm->Integer(nFiles);
1022 AliInfo(Form("Select AOD file %d", n));
1023 TObjString *objStr = (TObjString*) fAODPathArray->At(n);
1025 AliError("Could not get path of aod file.");
1028 fAODPath = objStr->GetString();
1033 //__________________________________________________________________________
1034 Int_t AliAnalysisTaskFastEmbedding::OpenAODfile(Int_t trial)
1036 // select and open an AOD file from fAODPathArray
1038 if(fAODPathArray) fFileId = SelectAODfile();
1039 if(fFileId<0) return -1;
1042 AliInfo("Trying to connect to AliEn ...");
1043 TGrid::Connect("alien://");
1046 TDirectory *owd = gDirectory;
1047 if (fAODfile && fAODfile->IsOpen()) fAODfile->Close();
1048 fAODfile = TFile::Open(fAODPath.Data(),"TIMEOUT=180");
1055 AliError(Form("Could not open AOD file %s (trial %d), try again ...", fAODPath.Data(), trial));
1056 fFileId = OpenAODfile(trial+1);
1058 AliError(Form("Could not open AOD file %s, give up ...",fAODPath.Data()));
1062 AliError(Form("Could not open AOD file %s.", fAODPath.Data()));
1068 fAODtree = (TTree*)fAODfile->Get("aodTree");
1071 AliError("AOD tree not found.");
1076 fAODtree->SetBranchStatus("*",0);
1077 fAODtree->SetBranchStatus("header",1);
1078 fAODtree->SetBranchStatus("tracks*",1);
1079 fAODtree->SetBranchStatus("jets*",1);
1080 fAODtree->SetBranchStatus("clusters*",1);
1081 fAODtree->SetBranchStatus("mcparticles*",1);
1082 fAODtree->SetBranchStatus("mcHeader*",1);
1086 fAODevent = new AliAODEvent();
1087 fAODevent->ReadFromTree(fAODtree);
1090 // fetch header, jets, etc. from new file
1091 fNevents = fAODtree->GetEntries();
1092 mcHeader = (AliAODMCHeader*)fAODevent->FindListObject(AliAODMCHeader::StdBranchName());
1094 if(fJetBranch.Length()) fAODJets = dynamic_cast<TClonesArray*>(fAODevent->FindListObject(fJetBranch.Data()));
1095 else fAODJets = fAODevent->GetJets();
1097 AliError("Could not find jets in AOD. Check jet branch when indicated.");
1101 TFile *curfile = fAODtree->GetCurrentFile();
1103 AliError("No current file.");
1107 Float_t trials = 1.;
1109 PythiaInfoFromFile(curfile->GetName(),xsec,trials);
1112 // construct a poor man average trials
1113 Float_t nEntries = (Float_t)fAODtree->GetTree()->GetEntries();
1114 if(trials>=nEntries && nEntries>0.)fAvgTrials = trials/nEntries;
1117 AliInfo(Form("Read successfully AOD event from file %d",fFileId));
1120 fCountEvents=0; // new file, reset counter
1122 return fFileId; // file position in AOD path array, if array available
1126 //____________________________________________________________________________
1127 Float_t AliAnalysisTaskFastEmbedding::GetPtHard(Bool_t bSet, Float_t newValue){
1129 // static stored, available for other tasks in train
1131 static Float_t ptHard = -1.;
1132 if(bSet) ptHard = newValue;
1137 //____________________________________________________________________________
1138 Int_t AliAnalysisTaskFastEmbedding::GetPtHardBin(Double_t ptHard){
1140 // returns pt hard bin (for LHC10e14, LHC11a1x, LHC11a2x simulations)
1142 const Int_t nBins = 10;
1143 Double_t binLimits[nBins] = { 5., 11., 21., 36., 57., 84., 117., 156., 200., 249. }; // lower limits
1146 while(bin<nBins-1 && binLimits[bin+1]<ptHard){
1153 //____________________________________________________________________________
1154 Bool_t AliAnalysisTaskFastEmbedding::PythiaInfoFromFile(const char* currFile,Float_t &fXsec,Float_t &fTrials){
1156 // get the cross section and the trails either from pyxsec.root or from pysec_hists.root
1157 // This should provide the path to the AOD/ESD file
1158 // (taken from PWG4/JetTasks/AliAnalysisHelperJetTasks)
1160 TString file(currFile);
1164 if(file.Contains("root_archive.zip#")){
1165 Ssiz_t pos1 = file.Index("root_archive",12,0,TString::kExact);
1166 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
1167 Ssiz_t pos2 = file.Index(".root",5,TString::kExact);
1168 file.Replace(pos+1,pos2-pos1,"");
1169 // file.Replace(pos+1,20,"");
1172 // not an archive take the basename....
1173 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
1176 TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root")); // problem that we cannot really test the existance of a file in a archive so we have to lvie with open error message from root
1178 // next trial fetch the histgram file
1179 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
1181 // not a severe condition but inciate that we have no information
1182 AliDebug(AliLog::kDebug,Form("Neither pyxsec.root nor pyxsec_hists.root found in %s",file.Data()));
1186 // find the tlist we want to be independtent of the name so use the Tkey
1187 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
1192 TList *list = dynamic_cast<TList*>(key->ReadObj());
1197 fXsec = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
1198 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
1201 } // no tree pyxsec.root
1203 TTree *xtree = (TTree*)fxsec->Get("Xsection");
1209 Double_t xsection = 0;
1210 xtree->SetBranchAddress("xsection",&xsection);
1211 xtree->SetBranchAddress("ntrials",&ntrials);