16 #include <TDatabasePDG.h>
18 #include <THashList.h>
23 #include <TParticlePDG.h>
29 #include "AliAnalysisManager.h"
30 #include "AliAnalysisUtils.h"
31 #include "AliAODHeader.h"
32 #include "AliAODMCHeader.h"
33 #include "AliAODMCParticle.h"
34 #include "AliAODTrack.h"
35 #include "AliESDtrack.h"
36 #include "AliESDtrackCuts.h"
37 #include "AliExternalTrackParam.h"
38 #include "AliGenPythiaEventHeader.h"
40 #include "AliMCEvent.h"
41 #include "AliMCParticle.h"
42 #include "AliVParticle.h"
43 #include "AliVTrack.h"
44 #include "AliVEvent.h"
46 #include "fastjet/PseudoJet.hh"
47 #include "fastjet/ClusterSequence.hh"
48 #include "fastjet/JetDefinition.hh"
54 namespace EMCalTriggerPtAnalysis {
59 AliAnalysisTaskTracksInJet::AliAnalysisTaskTracksInJet() :
64 fTrackCutsDefault(NULL),
65 fHybridCutsCat1(NULL),
66 fHybridCutsCat2(NULL),
73 AliAnalysisTaskTracksInJet::AliAnalysisTaskTracksInJet(
const char *taskname) :
74 AliAnalysisTaskSE(taskname),
78 fTrackCutsDefault(NULL),
79 fHybridCutsCat1(NULL),
80 fHybridCutsCat2(NULL),
85 DefineOutput(1, TList::Class());
86 DefineOutput(2, TTree::Class());
89 AliAnalysisTaskTracksInJet::~AliAnalysisTaskTracksInJet() {}
91 void AliAnalysisTaskTracksInJet::UserCreateOutputObjects(){
93 fHistosMC->CreateTH1(
"hNtrials",
"Number of trials", 1., 0.5, 1.5);
94 fHistosMC->CreateTH1(
"hNtrialsEvent",
"Number of trials (from header, after event selection)", 1, 0.5, 1.5);
95 fHistosMC->CreateTH1(
"hPtHard",
"Pt of the hard interaction", 1000, 0., 500);
96 fHistosMC->CreateTProfile(
"hCrossSection",
"PYTHIA Cross section", 1, 0.5, 1.5);
99 fJetTree =
new TTree(
"JetTreeRec",
"Jet Tree on reconstructed data");
100 fJetTree->Branch(
"JetsRec", &fJetStructure,
"pjet[3]/D:plead[3]/D:psub[3]/D:isData/I");
102 fAnalysisUtils =
new AliAnalysisUtils;
104 fTrackCutsDefault = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(
true, 1);
105 fTrackCutsDefault->SetName(
"Standard Track cuts");
106 fTrackCutsDefault->SetMinNCrossedRowsTPC(120);
107 fTrackCutsDefault->SetMaxDCAToVertexXYPtDep(
"0.0182+0.0350/pt^1.01");
110 fHybridCutsCat1 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE,1);
111 fHybridCutsCat1->SetMaxDCAToVertexXY(2.4);
112 fHybridCutsCat1->SetMaxDCAToVertexZ(3.2);
113 fHybridCutsCat1->SetDCAToVertex2D(kTRUE);
114 fHybridCutsCat1->SetMaxChi2TPCConstrainedGlobal(36);
115 fHybridCutsCat1->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
116 fHybridCutsCat1->SetMaxFractionSharedTPCClusters(0.4);
119 fHybridCutsCat2 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE,1);
120 fHybridCutsCat2->SetMaxDCAToVertexXY(2.4);
121 fHybridCutsCat2->SetMaxDCAToVertexZ(3.2);
122 fHybridCutsCat2->SetDCAToVertex2D(kTRUE);
123 fHybridCutsCat2->SetMaxChi2TPCConstrainedGlobal(36);
124 fHybridCutsCat2->SetMaxFractionSharedTPCClusters(0.4);
125 fHybridCutsCat2->SetRequireITSRefit(kFALSE);
126 fHybridCutsCat2->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
128 PostData(1, fHistosMC->GetListOfHistograms());
129 PostData(2, fJetTree);
136 Bool_t AliAnalysisTaskTracksInJet::UserNotify()
141 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
143 AliError(Form(
"%s - UserNotify: No current tree!",GetName()));
147 Float_t xsection = 0;
151 TFile *curfile = tree->GetCurrentFile();
153 AliError(Form(
"%s - UserNotify: No current file!",GetName()));
157 TChain *chain =
dynamic_cast<TChain*
>(tree);
158 if (chain) tree = chain->GetTree();
160 Int_t
nevents = tree->GetEntriesFast();
162 PythiaInfoFromFile(curfile->GetName(), xsection, trials, pthardbin);
164 fHistosMC->FillTH1(
"hNtrials", 1., trials);
165 fHistosMC->FillProfile(
"hCrossSection", 1., xsection);
176 void AliAnalysisTaskTracksInJet::UserExec(Option_t *){
178 if(!fAnalysisUtils->IsVertexSelected2013pA(InputEvent()))
return;
179 if(fAnalysisUtils->IsPileUpEvent(InputEvent()))
return;
183 AliGenPythiaEventHeader *pyheader = GetPythiaHeader();
185 if(pyheader && IsOutlier(pyheader))
188 fHistosMC->FillTH1(
"hNtrialsEvent", pyheader->Trials());
189 fHistosMC->FillTH1(
"hPtHard", pyheader->GetPtHard());
192 Double_t pvecjet[3], pveclead[3], pvecsublead[3];
195 std::vector<fastjet::PseudoJet> mcpseudo;
196 for(
int itrk = 0; itrk < fMCEvent->GetNumberOfTracks(); itrk++){
197 AliVParticle *mctrack = fMCEvent->GetTrack(itrk);
198 if(!mctrack->Charge())
continue;
199 if(TMath::Abs(mctrack->Pt()) < 0.15)
continue;
200 if(TMath::Abs(mctrack->Eta()) > 0.8)
continue;
201 if(!IsPhysicalPrimary(mctrack, MCEvent()))
continue;
203 fastjet::PseudoJet inputjet(mctrack->Px(), mctrack->Py(), mctrack->Pz(), mctrack->E());
204 inputjet.set_user_index(itrk);
205 mcpseudo.push_back(inputjet);
209 fastjet::ClusterSequence jetfinder(mcpseudo, fastjet::JetDefinition(fastjet::antikt_algorithm, 0.4));
210 std::vector<fastjet::PseudoJet> genjets = sorted_by_pt(jetfinder.inclusive_jets());
212 for(std::vector<fastjet::PseudoJet>::const_iterator jetit = genjets.begin(); jetit != genjets.end(); ++jetit){
213 if(TMath::Abs(jetit->eta()) > 0.5)
continue;
214 std::vector<fastjet::PseudoJet> constituentssorted = sorted_by_pt(jetit->constituents());
215 memset(pveclead, 0,
sizeof(Double_t) * 3);
216 memset(pvecsublead, 0,
sizeof(Double_t) * 3);
217 pvecjet[0] = jetit->px();
218 pvecjet[1] = jetit->py();
219 pvecjet[2] = jetit->pz();
221 for(std::vector<fastjet::PseudoJet>::const_iterator cit = constituentssorted.begin(); cit != constituentssorted.end(); ++cit){
222 AliVParticle *basepart = fMCEvent->GetTrack(cit->user_index());
224 basepart->PxPyPz(pveclead);
225 }
else if(icounter == 1) {
226 basepart->PxPyPz(pvecsublead);
235 fJetStructure.Reset();
236 fJetStructure.fIsData = 0;
237 memcpy(fJetStructure.fPvecJet, pvecjet,
sizeof(Double_t) * 3);
238 memcpy(fJetStructure.fPvecLead, pveclead,
sizeof(Double_t) * 3);
239 memcpy(fJetStructure.fPvecSubLead, pvecsublead,
sizeof(Double_t) * 3);
247 std::vector<fastjet::PseudoJet> datapseudo;
248 AliESDtrack *esdtrack(NULL);
249 AliAODTrack *aodtrack(NULL);
250 double mpion = TDatabasePDG::Instance()->GetParticle(kPiPlus)->Mass();
252 for(
int ipart = 0; ipart < fInputEvent->GetNumberOfTracks(); ipart++){
253 AliVParticle *recpart = fInputEvent->GetTrack(ipart);
255 AliVParticle *assocMC = fMCEvent->GetTrack(TMath::Abs(recpart->GetLabel()));
256 if(!assocMC)
continue;
257 if(!IsPhysicalPrimary(assocMC, fMCEvent))
continue;
258 mass = TDatabasePDG::Instance()->GetParticle(assocMC->PdgCode())->Mass();
264 if(TMath::Abs(recpart->Eta()) > 0.8)
continue;
265 if((esdtrack = dynamic_cast<AliESDtrack *>(recpart))){
266 AliESDtrack copytrack(*esdtrack);
267 if(!TrackSelectionESDHybrid(©track))
continue;
268 pvectrack.SetXYZ(copytrack.Px(), copytrack.Py(), copytrack.Pz());
269 }
else if((aodtrack = dynamic_cast<AliAODTrack *>(recpart))){
270 if(!TrackSelectionAODHybrid(aodtrack))
continue;
271 pvectrack.SetXYZ(recpart->Px(), recpart->Py(), recpart->Pz());
275 fastjet::PseudoJet inputparticle(pvectrack.Px(), pvectrack.Py(), pvectrack.Pz(), TMath::Sqrt(pvectrack.Perp()*pvectrack.Perp() + mass *
mass));
276 inputparticle.set_user_index(ipart);
277 datapseudo.push_back(inputparticle);
281 fastjet::ClusterSequence jetfinder(datapseudo, fastjet::JetDefinition(fastjet::antikt_algorithm, 0.4));
282 std::vector<fastjet::PseudoJet> recjets = sorted_by_pt(jetfinder.inclusive_jets());
285 for(std::vector<fastjet::PseudoJet>::const_iterator jetit = recjets.begin(); jetit != recjets.end(); ++jetit){
286 if(TMath::Abs(jetit->eta()) > 0.5)
continue;
287 std::vector<fastjet::PseudoJet> constituentssorted = sorted_by_pt(jetit->constituents());
288 memset(pveclead, 0,
sizeof(Double_t) * 3);
289 memset(pvecsublead, 0,
sizeof(Double_t) * 3);
290 pvecjet[0] = jetit->px();
291 pvecjet[1] = jetit->py();
292 pvecjet[2] = jetit->pz();
294 for(std::vector<fastjet::PseudoJet>::const_iterator cit = constituentssorted.begin(); cit != constituentssorted.end(); ++cit){
295 AliVParticle *basepart = fInputEvent->GetTrack(cit->user_index());
297 bool isSelected =
false;
298 if(basepart->IsA() == AliESDtrack::Class()){
299 isSelected = TrackSelectionESDDefault(static_cast<AliESDtrack *>(basepart));
301 isSelected = TrackSelectionAODDefault(static_cast<AliAODTrack *>(basepart));
303 if(!isSelected)
continue;
305 basepart->PxPyPz(pveclead);
306 }
else if(icounter == 1) {
307 basepart->PxPyPz(pvecsublead);
316 fJetStructure.Reset();
317 fJetStructure.fIsData = 1;
318 memcpy(fJetStructure.fPvecJet, pvecjet,
sizeof(Double_t) * 3);
319 memcpy(fJetStructure.fPvecLead, pveclead,
sizeof(Double_t) * 3);
320 memcpy(fJetStructure.fPvecSubLead, pvecsublead,
sizeof(Double_t) * 3);
325 PostData(1, fHistosMC->GetListOfHistograms());
326 PostData(2, fJetTree);
335 Bool_t AliAnalysisTaskTracksInJet::TrackSelectionESDHybrid(AliESDtrack* track)
const {
336 if (fHybridCutsCat1->AcceptTrack(track)) {
337 track->SetBit(BIT(22),0);
338 track->SetBit(BIT(23),0);
340 }
else if (fHybridCutsCat2->AcceptTrack(track)) {
341 if (!track->GetConstrainedParam())
343 UInt_t status = track->GetStatus();
344 if (((status&AliESDtrack::kITSrefit)==0))
346 const AliExternalTrackParam* constrainParam = track->GetConstrainedParam();
347 track->Set(constrainParam->GetX(),
348 constrainParam->GetAlpha(),
349 constrainParam->GetParameter(),
350 constrainParam->GetCovariance());
351 if ((status&AliESDtrack::kITSrefit)==0) {
352 track->SetBit(BIT(22),0);
353 track->SetBit(BIT(23),1);
355 track->SetBit(BIT(22),1);
356 track->SetBit(BIT(23),0);
369 Bool_t AliAnalysisTaskTracksInJet::TrackSelectionESDDefault(AliESDtrack* track)
const {
370 return fTrackCutsDefault->AcceptTrack(track);
378 Bool_t AliAnalysisTaskTracksInJet::TrackSelectionAODHybrid(AliAODTrack* track)
const {
380 if(!(track->TestFilterBit(256) || track->TestFilterBit(512)))
return false;
389 Bool_t AliAnalysisTaskTracksInJet::TrackSelectionAODDefault(AliAODTrack* track)
const {
390 if(!track->TestFilterBit(AliAODTrack::kTrkGlobal))
return false;
391 if(track->GetTPCNCrossedRows() < 120)
return false;
407 Bool_t AliAnalysisTaskTracksInJet::PythiaInfoFromFile(
const char* currFile, Float_t &fXsec, Float_t &fTrials, Int_t &pthard)
const {
409 TString
file(currFile);
413 if (file.Contains(
".zip#")) {
414 Ssiz_t pos1 = file.Index(
"root_archive",12,0,TString::kExact);
415 Ssiz_t pos = file.Index(
"#",1,pos1,TString::kExact);
416 Ssiz_t pos2 = file.Index(
".root",5,TString::kExact);
417 file.Replace(pos+1,pos2-pos1,
"");
420 file.ReplaceAll(
gSystem->BaseName(file.Data()),
"");
422 AliDebug(1,Form(
"File name: %s",file.Data()));
425 TString strPthard(file);
427 strPthard.Remove(strPthard.Last(
'/'));
428 strPthard.Remove(strPthard.Last(
'/'));
429 if (strPthard.Contains(
"AOD")) strPthard.Remove(strPthard.Last(
'/'));
430 strPthard.Remove(0,strPthard.Last(
'/')+1);
431 if (strPthard.IsDec())
432 pthard = strPthard.Atoi();
434 AliWarning(Form(
"Could not extract file number from path %s", strPthard.Data()));
437 TFile *fxsec = TFile::Open(Form(
"%s%s",file.Data(),
"pyxsec.root"));
441 fxsec = TFile::Open(Form(
"%s%s",file.Data(),
"pyxsec_hists.root"));
447 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
452 TList *
list =
dynamic_cast<TList*
>(key->ReadObj());
457 fXsec = ((TProfile*)list->FindObject(
"h1Xsec"))->GetBinContent(1);
458 fTrials = ((TH1F*)list->FindObject(
"h1Trials"))->GetBinContent(1);
462 TTree *xtree = (TTree*)fxsec->Get(
"Xsection");
468 Double_t xsection = 0;
469 xtree->SetBranchAddress(
"xsection",&xsection);
470 xtree->SetBranchAddress(
"ntrials",&ntrials);
487 Bool_t AliAnalysisTaskTracksInJet::IsPhysicalPrimary(
const AliVParticle*
const part, AliMCEvent*
const mcevent)
const {
488 Bool_t physprim =
false;
489 const AliAODMCParticle *aodmc =
dynamic_cast<const AliAODMCParticle *
>(part);
491 physprim = aodmc->IsPhysicalPrimary();
493 physprim = mcevent->IsPhysicalPrimary(part->GetLabel());
502 AliGenPythiaEventHeader *AliAnalysisTaskTracksInJet::GetPythiaHeader()
const {
503 AliGenPythiaEventHeader *pythiaHeader =
dynamic_cast<AliGenPythiaEventHeader*
>(MCEvent()->GenEventHeader());
506 AliAODMCHeader* aodMCH =
dynamic_cast<AliAODMCHeader*
>(InputEvent()->FindListObject(AliAODMCHeader::StdBranchName()));
508 for (UInt_t i = 0;i<aodMCH->GetNCocktailHeaders();i++) {
509 pythiaHeader =
dynamic_cast<AliGenPythiaEventHeader*
>(aodMCH->GetCocktailHeader(i));
510 if (pythiaHeader)
break;
522 Bool_t AliAnalysisTaskTracksInJet::IsOutlier(AliGenPythiaEventHeader *
const header)
const {
523 Bool_t hasOutlier = kFALSE;
525 TLorentzVector jetvec;
526 for(
int ijet = 0; ijet < header->NTriggerJets(); ijet++){
527 memset(pbuf, 0,
sizeof(Float_t) * 4);
528 header->TriggerJet(ijet, pbuf);
529 jetvec.SetPxPyPzE(pbuf[0], pbuf[1], pbuf[2], pbuf[3]);
530 if(TMath::Abs(jetvec.Pt()) >= fFracPtHard * header->GetPtHard()){
ClassImp(EMCalTriggerPtAnalysis::AliAnalysisTaskTracksInJet) namespace EMCalTriggerPtAnalysis
Stores p-vector of jet, leading track and subleading track.
Container class for histograms for the high- charged particle analysis.