1 // $Id: AliJetEmbeddingFromAODTask.cxx $
3 // Jet embedding from AOD task.
5 // Author: S.Aiola, C.Loizides
7 #include "AliJetEmbeddingFromAODTask.h"
9 // C++ standard library
15 #include <TClonesArray.h>
16 #include <TObjArray.h>
17 #include <TObjString.h>
21 #include <TStreamerInfo.h>
24 #include <TLorentzVector.h>
27 #include "AliVEvent.h"
28 #include "AliAODTrack.h"
29 #include "AliESDtrack.h"
30 #include "AliPicoTrack.h"
31 #include "AliVTrack.h"
32 #include "AliVCluster.h"
33 #include "AliVCaloCells.h"
34 #include "AliAODMCParticle.h"
35 #include "AliCentrality.h"
36 #include "AliVHeader.h"
37 #include "AliVVertex.h"
38 #include "AliAODHeader.h"
39 #include "AliFJWrapper.h"
41 #include "AliInputEventHandler.h"
43 ClassImp(AliJetEmbeddingFromAODTask)
45 //________________________________________________________________________
46 AliJetEmbeddingFromAODTask::AliJetEmbeddingFromAODTask() :
47 AliJetModelBaseTask("AliJetEmbeddingFromAODTask"),
49 fRandomAccess(kFALSE),
56 fAODMCParticlesName(),
59 fTriggerMask(AliVEvent::kAny),
69 fJetParticleLevel(kTRUE),
71 fUseNegativeLabels(kTRUE),
94 // Default constructor.
95 SetSuffix("AODEmbedding");
97 fAODfilterBits[0] = -1;
98 fAODfilterBits[1] = -1;
107 //________________________________________________________________________
108 AliJetEmbeddingFromAODTask::AliJetEmbeddingFromAODTask(const char *name, Bool_t drawqa) :
109 AliJetModelBaseTask(name, drawqa),
111 fRandomAccess(kFALSE),
112 fAODTreeName("aodTree"),
113 fAODHeaderName("header"),
114 fAODVertexName("vertices"),
115 fAODTrackName("tracks"),
117 fAODCellsName("emcalCells"),
118 fAODMCParticlesName(AliAODMCParticle::StdBranchName()),
121 fTriggerMask(AliVEvent::kAny),
131 fJetParticleLevel(kTRUE),
132 fIncludeNoITS(kTRUE),
133 fUseNegativeLabels(kTRUE),
138 fEsdTreeMode(kFALSE),
140 fCurrentAODFileID(0),
142 fPicoTrackVersion(0),
150 fCurrentAODEntry(-1),
151 fHistFileMatching(0),
152 fHistAODFileError(0),
156 // Standard constructor.
157 SetSuffix("AODEmbedding");
159 fAODfilterBits[0] = -1;
160 fAODfilterBits[1] = -1;
169 //________________________________________________________________________
170 AliJetEmbeddingFromAODTask::~AliJetEmbeddingFromAODTask()
174 if (fCurrentAODFile) {
175 fCurrentAODFile->Close();
176 delete fCurrentAODFile;
180 //________________________________________________________________________
181 void AliJetEmbeddingFromAODTask::UserCreateOutputObjects()
186 AliJetModelBaseTask::UserCreateOutputObjects();
188 fHistFileMatching = new TH2C("fHistFileMatching", "fHistFileMatching", fTotalFiles, -0.5, fTotalFiles - 0.5, fFileList->GetEntriesFast(), -0.5, fFileList->GetEntriesFast() -0.5);
189 fHistFileMatching->GetXaxis()->SetTitle("File no. (PYTHIA)");
190 fHistFileMatching->GetYaxis()->SetTitle("File no. (Embedded AOD)");
191 fHistFileMatching->GetZaxis()->SetTitle("counts");
192 fOutput->Add(fHistFileMatching);
194 fHistAODFileError = new TH1C("fHistAODFileError", "fHistAODFileError", fFileList->GetEntriesFast(), -0.5, fFileList->GetEntriesFast() -0.5);
195 fHistAODFileError->GetXaxis()->SetTitle("File no. (Embedded AOD)");
196 fHistAODFileError->GetYaxis()->SetTitle("counts");
197 fOutput->Add(fHistAODFileError);
199 fHistNotEmbedded = new TH1C("fHistNotEmbedded", "fHistNotEmbedded", fTotalFiles, -0.5, fTotalFiles - 0.5);
200 fHistNotEmbedded->GetXaxis()->SetTitle("File no. (PYTHIA)");
201 fHistNotEmbedded->GetYaxis()->SetTitle("counts");
202 fOutput->Add(fHistNotEmbedded);
204 fHistEmbeddingQA = new TH1F("fHistEmbeddingQA", "fHistEmbeddingQA", 2, 0, 2);
205 fHistEmbeddingQA->GetXaxis()->SetTitle("Event state");
206 fHistEmbeddingQA->GetYaxis()->SetTitle("counts");
207 fHistEmbeddingQA->GetXaxis()->SetBinLabel(1, "OK");
208 fHistEmbeddingQA->GetXaxis()->SetBinLabel(2, "Not embedded");
209 fOutput->Add(fHistEmbeddingQA);
211 PostData(1, fOutput);
214 //________________________________________________________________________
215 Bool_t AliJetEmbeddingFromAODTask::UserNotify()
217 TString path(fInputHandler->GetTree()->GetCurrentFile()->GetPath());
218 if (path.EndsWith("/"))
219 path.Remove(path.Length()-1);
220 path.Remove(path.Last('/'));
221 path.Remove(0, path.Last('/')+1);
223 AliWarning(Form("Could not extract file number from path %s", path.Data()));
226 fCurrentFileID = path.Atoi();
227 if (!fRandomAccess) {
228 fCurrentAODFileID = fFileList->GetEntriesFast() * fCurrentFileID / fTotalFiles-1;
229 AliInfo(Form("Start embedding from file ID %d", fCurrentAODFileID));
234 //________________________________________________________________________
235 Bool_t AliJetEmbeddingFromAODTask::ExecOnce()
237 if (fAODTreeName.Contains("aod"))
238 fEsdTreeMode = kFALSE;
240 fEsdTreeMode = kTRUE;
242 return AliJetModelBaseTask::ExecOnce();
245 //________________________________________________________________________
246 Bool_t AliJetEmbeddingFromAODTask::OpenNextFile()
248 if (fCurrentAODFile) {
249 fCurrentAODFile->Close();
250 delete fCurrentAODFile;
256 while ((!fCurrentAODFile || fCurrentAODFile->IsZombie()) && i < fAttempts) {
257 if (i > 0 && fHistAODFileError) {
258 fHistAODFileError->Fill(fCurrentAODFileID);
261 fCurrentAODFile = GetNextFile();
265 if (!fCurrentAODFile || fCurrentAODFile->IsZombie())
268 const TList *clist = fCurrentAODFile->GetStreamerInfoCache();
270 TStreamerInfo *cinfo = static_cast<TStreamerInfo*>(clist->FindObject("AliPicoTrack"));
272 fPicoTrackVersion = cinfo->GetClassVersion();
274 fPicoTrackVersion = 0;
277 fCurrentAODTree = static_cast<TTree*>(fCurrentAODFile->Get(fAODTreeName));
278 if (!fCurrentAODTree)
281 if (!fAODHeaderName.IsNull())
282 fCurrentAODTree->SetBranchAddress(fAODHeaderName, &fAODHeader);
284 if (!fAODVertexName.IsNull())
285 fCurrentAODTree->SetBranchAddress(fAODVertexName, &fAODVertex);
287 if (!fAODTrackName.IsNull())
288 fCurrentAODTree->SetBranchAddress(fAODTrackName, &fAODTracks);
290 if (!fAODClusName.IsNull())
291 fCurrentAODTree->SetBranchAddress(fAODClusName, &fAODClusters);
293 if (!fAODCellsName.IsNull())
294 fCurrentAODTree->SetBranchAddress(fAODCellsName, &fAODCaloCells);
296 if (!fAODMCParticlesName.IsNull())
297 fCurrentAODTree->SetBranchAddress(fAODMCParticlesName, &fAODMCParticles);
300 fCurrentAODEntry = TMath::Nint(gRandom->Rndm()*fCurrentAODTree->GetEntries());
302 fCurrentAODEntry = 0;
304 AliDebug(3,Form("Will start embedding from entry %d", fCurrentAODEntry));
306 if (fHistFileMatching)
307 fHistFileMatching->Fill(fCurrentFileID, fCurrentAODFileID-1);
312 //________________________________________________________________________
313 TFile* AliJetEmbeddingFromAODTask::GetNextFile()
316 fCurrentAODFileID = TMath::Nint(gRandom->Rndm()*fFileList->GetEntriesFast());
320 if (fCurrentAODFileID >= fFileList->GetEntriesFast()) {
321 AliError("No more file in the list!");
325 TObjString *objFileName = static_cast<TObjString*>(fFileList->At(fCurrentAODFileID));
326 TString fileName(objFileName->GetString());
328 if (fileName.BeginsWith("alien://") && !gGrid) {
329 AliInfo("Trying to connect to AliEn ...");
330 TGrid::Connect("alien://");
333 TString baseFileName(fileName);
334 if (baseFileName.Contains(".zip#")) {
335 Ssiz_t pos = baseFileName.Last('#');
336 baseFileName.Remove(pos);
339 if (gSystem->AccessPathName(baseFileName)) {
340 AliDebug(3,Form("File %s does not exist!", baseFileName.Data()));
344 AliDebug(3,Form("Trying to open file %s...", fileName.Data()));
345 TFile *file = TFile::Open(fileName);
348 AliDebug(3,Form("Unable to open file: %s!", fileName.Data()));
353 //________________________________________________________________________
354 Bool_t AliJetEmbeddingFromAODTask::GetNextEntry()
359 if (!fCurrentAODFile || !fCurrentAODTree || fCurrentAODEntry >= fCurrentAODTree->GetEntries()) {
364 fCurrentAODTree->GetEntry(fCurrentAODEntry);
368 if (attempts == 1000)
369 AliWarning("After 1000 attempts no event has been accepted by the event selection (trigger, centrality...)!");
371 } while (!IsAODEventSelected() && fCurrentAODTree);
373 return (fCurrentAODTree!=0);
376 //________________________________________________________________________
377 Bool_t AliJetEmbeddingFromAODTask::IsAODEventSelected()
379 // AOD event selection.
381 if (!fEsdTreeMode && fAODHeader) {
382 AliAODHeader *aodHeader = static_cast<AliAODHeader*>(fAODHeader);
385 if (fTriggerMask != AliVEvent::kAny) {
386 UInt_t offlineTrigger = aodHeader->GetOfflineTrigger();
388 if ((offlineTrigger & fTriggerMask) == 0) {
389 AliDebug(2,Form("Event rejected due to physics selection. Event trigger mask: %d, trigger mask selection: %d.",
390 offlineTrigger, fTriggerMask));
395 // Centrality selection
396 if (fMinCentrality >= 0) {
397 AliCentrality *cent = aodHeader->GetCentralityP();
398 Float_t centVal = cent->GetCentralityPercentile("V0M");
399 if (centVal < fMinCentrality || centVal >= fMaxCentrality) {
400 AliDebug(2,Form("Event rejected due to centrality selection. Event centrality: %f, centrality range selection: %f to %f",
401 centVal, fMinCentrality, fMaxCentrality));
409 Double_t vert[3]={0};
410 ((AliVVertex*)fAODVertex->At(0))->GetXYZ(vert);
411 if (TMath::Abs(vert[2]) > fZVertexCut) {
412 AliDebug(2,Form("Event rejected due to Z vertex selection. Event Z vertex: %f, Z vertex cut: %f",
413 vert[2], fZVertexCut));
422 if (fJetParticleLevel) {
424 jet = GetLeadingJet(fAODMCParticles);
426 AliWarning("Particle level jets selected, but not MC particles found. The jet event selection will be skipped.");
431 if (fAODTracks || fAODClusters)
432 jet = GetLeadingJet(fAODTracks, fAODClusters);
434 AliWarning("Detector level jets selected, but not tracks or clusters found. The jet event selection will be skipped.");
439 if (jet.Pt() < fJetMinPt)
446 //________________________________________________________________________
447 void AliJetEmbeddingFromAODTask::Run()
449 if (!GetNextEntry()) {
450 if (fHistNotEmbedded)
451 fHistNotEmbedded->Fill(fCurrentFileID);
452 if (fHistEmbeddingQA)
453 fHistEmbeddingQA->Fill("Not embedded", 1);
454 AliError("Unable to get the AOD event to embed. Nothing will be embedded.");
458 if (fHistEmbeddingQA)
459 fHistEmbeddingQA->Fill("OK", 1);
461 if (fOutMCParticles) {
463 if (fCopyArray && fMCParticles)
466 if (fAODMCParticles) {
467 AliDebug(3, Form("%d MC particles will be processed for embedding.", fAODMCParticles->GetEntriesFast()));
468 for (Int_t i = 0; i < fAODMCParticles->GetEntriesFast(); i++) {
469 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(fAODMCParticles->At(i));
471 AliError(Form("Could not find MC particle %d in branch %s of tree %s!", i, fAODMCParticlesName.Data(), fAODTreeName.Data()));
475 AliDebug(3, Form("Processing MC particle %d with pT = %f, eta = %f, phi = %f", i, part->Pt(), part->Eta(), part->Phi()));
477 if (!part->IsPhysicalPrimary())
480 if (part->Pt() < fPtMin || part->Pt() > fPtMax ||
481 part->Eta() < fEtaMin || part->Eta() > fEtaMax ||
482 part->Phi() < fPhiMin || part->Phi() > fPhiMax)
485 AddMCParticle(part, i);
486 AliDebug(3, "Embedded!");
493 if (fCopyArray && fTracks)
496 AliDebug(3, Form("Start embedding with %d tracks.", fOutTracks->GetEntriesFast()));
499 AliDebug(3, Form("%d tracks will be processed for embedding.", fAODTracks->GetEntriesFast()));
500 for (Int_t i = 0; i < fAODTracks->GetEntriesFast(); i++) {
501 AliVTrack *track = static_cast<AliVTrack*>(fAODTracks->At(i));
503 AliError(Form("Could not find track %d in branch %s of tree %s!", i, fAODTrackName.Data(), fAODTreeName.Data()));
507 AliDebug(3, Form("Processing track %d with pT = %f, eta = %f, phi = %f, label = %d", i, track->Pt(), track->Eta(), track->Phi(), track->GetLabel()));
510 Bool_t isEmc = kFALSE;
512 AliAODTrack *aodtrack = static_cast<AliAODTrack*>(track);
513 if (aodtrack->TestFilterBit(fAODfilterBits[0])) {
516 else if (aodtrack->TestFilterBit(fAODfilterBits[1])) {
517 if ((aodtrack->GetStatus()&AliESDtrack::kITSrefit)==0) {
521 AliDebug(3, "Track not embedded because ITS refit failed.");
529 else { /*not a good track*/
530 AliDebug(3, "Track not embedded because not an hybrid track.");
534 if (TMath::Abs(aodtrack->GetTrackEtaOnEMCal()) < 0.75 &&
535 aodtrack->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
536 aodtrack->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
539 else if (fPicoTrackVersion > 0) { /*not AOD mode, let's see if it is PicoTrack*/
540 AliPicoTrack *ptrack = dynamic_cast<AliPicoTrack*>(track);
542 if (fPicoTrackVersion >= 3)
543 type = ptrack->GetTrackType();
545 type = ptrack->GetLabel();
546 isEmc = ptrack->IsEMCAL();
550 if (track->Pt() < fPtMin || track->Pt() > fPtMax ||
551 track->Eta() < fEtaMin || track->Eta() > fEtaMax ||
552 track->Phi() < fPhiMin || track->Phi() > fPhiMax) {
553 AliDebug(3, "Track not embedded because out of limits.");
557 if (fTrackEfficiency < 1) {
558 Double_t r = gRandom->Rndm();
559 if (fTrackEfficiency < r) {
560 AliDebug(3, "Track not embedded because of artificial inefiiciency.");
567 if (fUseNegativeLabels)
568 label = track->GetLabel();
570 label = TMath::Abs(track->GetLabel());
573 AliWarning(Form("%s: Track %d with label==0", GetName(), i));
576 AddTrack(track->Pt(), track->Eta(), track->Phi(), type, track->GetTrackEtaOnEMCal(), track->GetTrackPhiOnEMCal(), isEmc, label);
577 AliDebug(3, "Track embedded!");
584 if (fCopyArray && fClusters)
588 for (Int_t i = 0; i < fAODClusters->GetEntriesFast(); i++) {
589 AliVCluster *clus = static_cast<AliVCluster*>(fAODClusters->At(i));
591 AliError(Form("Could not find cluster %d in branch %s of tree %s!", i, fAODClusName.Data(), fAODTreeName.Data()));
595 Double_t vert[3] = {0,0,0};
596 clus->GetMomentum(vect,vert);
598 if (vect.Pt() < fPtMin || vect.Pt() > fPtMax ||
599 vect.Eta() < fEtaMin || vect.Eta() > fEtaMax ||
600 vect.Phi() < fPhiMin || vect.Phi() > fPhiMax)
605 label = clus->GetLabel();
607 AliDebug(3,Form("%s: Clus %d with label<=0", GetName(), i));
610 AddCluster(clus->E(), vect.Eta(), vect.Phi(), clus->GetLabel());
617 Double_t totalEnergy = 0;
618 Int_t totalCells = 0;
621 totalCells += fCaloCells->GetNumberOfCells();
623 totalCells += fAODCaloCells->GetNumberOfCells();
625 SetNumberOfOutCells(totalCells);
631 for (Short_t i = 0; i < fAODCaloCells->GetNumberOfCells(); i++) {
635 Short_t cellNum = -1;
638 fAODCaloCells->GetCell(i, cellNum, amp, time, mclabel, efrac);
642 AliDebug(3,Form("%s: Cell %d with label<=0", GetName(), i));
648 AliDebug(2,Form("Adding cell with amplitude %f, absolute ID %d, time %f, mc label %d", amp, cellNum, time, mclabel));
649 AddCell(amp, cellNum, time, mclabel);
654 AliDebug(2,Form("Added cells = %d (energy = %f), total cells = %d", fAddedCells, totalEnergy, totalCells));
658 //________________________________________________________________________
659 TLorentzVector AliJetEmbeddingFromAODTask::GetLeadingJet(TClonesArray *tracks, TClonesArray *clusters)
662 fastjet::JetAlgorithm jalgo(fastjet::kt_algorithm);
665 jalgo = fastjet::antikt_algorithm;
669 AliFJWrapper fjw(name, name);
670 fjw.SetAreaType(fastjet::active_area_explicit_ghosts);
671 fjw.SetGhostArea(1); // set a very large ghost area to speed up jet finding
672 fjw.SetR(fJetRadius);
673 fjw.SetAlgorithm(jalgo);
678 const Int_t Ntracks = tracks->GetEntries();
679 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
680 AliVParticle *t = static_cast<AliVParticle*>(tracks->At(iTracks));
684 if ((fJetType == 1 && t->Charge() == 0) ||
685 (fJetType == 2 && t->Charge() != 0))
688 // TODO: Minimum track pt
693 fjw.AddInputVector(t->Px(), t->Py(), t->Pz(), t->P(), iTracks + 100);
697 if (clusters && fJetType != 1) {
698 Double_t vert[3]={0};
700 ((AliVVertex*)fAODVertex->At(0))->GetXYZ(vert);
702 const Int_t Nclus = clusters->GetEntries();
703 for (Int_t iClus = 0; iClus < Nclus; ++iClus) {
704 AliVCluster *c = static_cast<AliVCluster*>(clusters->At(iClus));
712 c->GetMomentum(nP, vert);
714 // TODO: Minimum cluster et
719 fjw.AddInputVector(nP.Px(), nP.Py(), nP.Pz(), nP.P(), -iClus - 100);
726 std::vector<fastjet::PseudoJet> jets_incl = fjw.GetInclusiveJets();
727 AliDebug(1,Form("%d jets found", (Int_t)jets_incl.size()));
731 Int_t njets = jets_incl.size();
734 std::vector<fastjet::PseudoJet> jets_incl_sorted = fastjet::sorted_by_pt(jets_incl);
735 for (Int_t i = 0; i < njets; i++) {
736 jet.SetPxPyPzE(jets_incl_sorted[i].px(), jets_incl_sorted[i].py(), jets_incl_sorted[i].pz(), jets_incl_sorted[i].E());
737 if (jet.Eta() > fJetMinEta && jet.Eta() < fJetMaxEta && jet.Phi() > fJetMinPhi && jet.Phi() < fJetMaxPhi)