12 #include "AliVEvent.h"
13 #include "AliVParticle.h"
15 #include "AliESDEvent.h"
16 #include "AliESDtrack.h"
18 #include "AliAODEvent.h"
19 #include "AliAODTrack.h"
21 #include "AliMCEvent.h"
22 #include "AliMCParticle.h"
23 #include "AliAnalysisManager.h"
24 #include "AliMCEvent.h"
25 #include "TParticle.h"
28 #include "AliAODEvent.h"
29 #include "AliAODVertex.h"
30 #include "AliAODHandler.h"
31 #include "AliAODTrack.h"
32 #include "AliAODJet.h"
33 #include "AliAODMCParticle.h"
35 #include "AliAnalysisTaskQGSep.h"
36 #include "AliAnalysisHelperJetTasks.h"
37 ClassImp(AliAnalysisTaskQGSep)
39 //________________________________________________________________________
40 AliAnalysisTaskQGSep::AliAnalysisTaskQGSep(const char *name)
41 : AliAnalysisTaskSE(name),
61 DefineOutput(1, TList::Class());
64 //________________________________________________________________________
65 void AliAnalysisTaskQGSep::UserCreateOutputObjects()
70 fOutputList = new TList();
75 fpHistPtAvEQ = new TProfile("fpHistPtAvEQ", "", 100, 0, 100, 0, 10);
76 fOutputList->Add(fpHistPtAvEQ);
77 fpHistDrEQ = new TProfile("fpHistDrEQ", "", 100, 0, 100, 0, 0.5);
78 fOutputList->Add(fpHistDrEQ);
81 fpHistPtAvEG = new TProfile("fpHistPtAvEG", "", 100, 0, 100, 0., 10.);
82 fOutputList->Add(fpHistPtAvEG);
83 fpHistDrEG = new TProfile("fpHistDrEG", "", 100, 0, 100, 0, 0.5);
84 fOutputList->Add(fpHistDrEG);
87 //histos for full spetra, no separation
88 fpHistDrE = new TProfile("fpHistDrE", "", 100, 0, 100, 0, 0.5);
89 fOutputList->Add(fpHistDrE);
90 fpHistPtAvE = new TProfile("fpHistPtAvE", "", 100, 0, 100, 0., 10.);
91 fOutputList->Add(fpHistPtAvE);
92 fpHistDrE3 = new TProfile("fpHistDrE3", "", 100, 0, 100, 0, 0.5);
93 fOutputList->Add(fpHistDrE3);
94 fpHistPtAvE3 = new TProfile("fpHistPtAvE3", "", 100, 0, 100, 0., 10.);
95 fOutputList->Add(fpHistPtAvE3);
97 for(Int_t i = 0; i < fOutputList->GetEntries(); i++){
98 TH1 * h = dynamic_cast<TH1*>(fOutputList->At(i));
102 if(fDebug)Printf("~# QGSep User objects created");
105 //__________________________________________________________________
106 Bool_t AliAnalysisTaskQGSep::Notify()
111 // Implemented Notify() to read the cross sections
112 // and number of trials from pyxsec.root
116 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
117 Float_t xsection = 0;
120 Float_t fAvgTrials = 1;
122 TFile *curfile = tree->GetCurrentFile();
124 Error("Notify","No current file");
127 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
128 // construct a poor man average trials
129 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
130 if(ftrials>=nEntries)fAvgTrials = ftrials/nEntries; // CKB take this into account for normalisation
134 fXsection = xsection;
135 fWeight = fXsection/fAvgTrials;
148 //________________________________________________________________________
149 void AliAnalysisTaskQGSep::UserExec(Option_t *)
152 // Called for each event
155 AliVEvent *event = InputEvent();
157 Error("UserExec", "Could not retrieve event");
161 fMyAODEvent = dynamic_cast<AliAODEvent*> (InputEvent());
165 // assume that the AOD is in the general output...
166 fMyAODEvent = AODEvent();
168 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
181 PostData(1, fOutputList);
184 //________________________________________________________________________
185 void AliAnalysisTaskQGSep::Terminate(Option_t*)
187 // Draw result to the screen
188 // Called once at the end of the query
190 fOutputList = dynamic_cast<TList*> (GetOutputData(1));
192 Error("Terminate","fOutputList not available");
198 //________________________________________________________________________
199 void AliAnalysisTaskQGSep::LoopAOD(){
200 AliAODJet recJets[4];
205 //array of reconstructed jets from the AOD input
206 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fMyAODEvent->FindListObject(fBranchRec.Data()));
208 PostData(1, fOutputList);
212 // reconstructed jets
213 nRecJets = aodRecJets->GetEntries();
214 if(fDebug)Printf("--- Jets found in bRec: %d", nRecJets);
215 nRecJets = TMath::Min(nRecJets, 4);
216 for(int ir = 0;ir < nRecJets;++ir)
218 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
233 for(Int_t i = 0; i < nRecJets; i++)
237 rJets[nGenSel] = jets[i];
238 v[nGenSel].SetPxPyPzE(jets[i].Px(), jets[i].Py(), jets[i].Pz(), jets[i].E());
240 pxSum += jets[i].Px();
241 pySum += jets[i].Py();
242 pzSum += jets[i].Pz();
249 for(Int_t j = 0; j < nRecJets; j++)
253 Double_t dRij = jets[i].DeltaR(&jets[j]);
255 if(dRij > 2*0.4) tag++;
262 rJets[nGenSel] = jets[i];
263 v[nGenSel].SetPxPyPzE(jets[i].Px(), jets[i].Py(), jets[i].Pz(), jets[i].E());
265 pxSum += jets[i].Px();
266 pySum += jets[i].Py();
267 pzSum += jets[i].Pz();
277 PostData(1, fOutputList);
282 vB.SetPxPyPzE(pxSum, pySum, pzSum, eSum);
284 for(Int_t i = 0; i < nRecJets; i++){
285 v[i].Boost(-vB.Px()/vB.E(),-vB.Py()/vB.E(),-vB.Pz()/vB.E());
290 TMath::Sort(nRecJets, e, idxj);
291 for(Int_t i = 0; i < nRecJets; i++){
292 recJets[i] = rJets[idxj[i]];
296 for(Int_t iJ = 0; iJ < nRecJets; iJ++){
298 TRefArray * tra = dynamic_cast<TRefArray*>(recJets[iJ].GetRefTracks());
300 Int_t nAODtracks = TMath::Min(1000, tra->GetEntries());
302 for(Int_t iT = 0; iT < nAODtracks; iT++){
303 AliAODTrack * jetTrack = dynamic_cast<AliAODTrack*>(tra->At(iT));
304 if(!jetTrack) continue;
305 pTsum += jetTrack->Pt();
306 dR[iT] = recJets[iJ].DeltaR(jetTrack);
310 fpHistPtAvE->Fill(recJets[iJ].E(), (Double_t)pTsum/(Double_t)nAODtracks, fWeight);
312 if(iJ > 1) //fill mulit-jet histo
313 fpHistPtAvE3->Fill(recJets[iJ].E(), (Double_t)pTsum/(Double_t)nAODtracks, fWeight);
316 TMath::Sort(nAODtracks, dR, idxAOD, kFALSE);
318 Double_t pTsum90Inv=0.;
319 for(Int_t iT = 0; iT < nAODtracks; iT++){
320 AliAODTrack * track = dynamic_cast<AliAODTrack*>(tra->At(idxAOD[iT]));
322 pTsum90Inv += track->Pt();
323 if(pTsum90Inv >= 0.9*pTsum){
324 Double_t deltaR = recJets[iJ].DeltaR(track);
326 fpHistDrE->Fill(recJets[iJ].E(), deltaR, fWeight);
329 fpHistDrE3->Fill(recJets[iJ].E(), deltaR, fWeight);
337 //__________________________________________________________________
338 void AliAnalysisTaskQGSep::LoopAODMC(){
340 AliAODJet recJets[4];
345 //array of reconstructed jets from the AOD input
346 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fMyAODEvent->FindListObject(fBranchRec.Data()));
348 PostData(1, fOutputList);
352 // reconstructed jets
353 nRecJets = aodRecJets->GetEntries();
354 if(fDebug)Printf("--- Jets found in bRec: %d", nRecJets);
355 nRecJets = TMath::Min(nRecJets, 4);
356 for(int ir = 0;ir < nRecJets;++ir)
358 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
373 for(Int_t i = 0; i < nRecJets; i++)
377 rJets[nGenSel] = jets[i];
378 v[nGenSel].SetPxPyPzE(jets[i].Px(), jets[i].Py(), jets[i].Pz(), jets[i].E());
380 pxSum += jets[i].Px();
381 pySum += jets[i].Py();
382 pzSum += jets[i].Pz();
389 for(Int_t j = 0; j < nRecJets; j++)
393 Double_t dRij = jets[i].DeltaR(&jets[j]);
395 if(dRij > 2*0.4) tag++;
402 rJets[nGenSel] = jets[i];
403 v[nGenSel].SetPxPyPzE(jets[i].Px(), jets[i].Py(), jets[i].Pz(), jets[i].E());
405 pxSum += jets[i].Px();
406 pySum += jets[i].Py();
407 pzSum += jets[i].Pz();
417 PostData(1, fOutputList);
422 vB.SetPxPyPzE(pxSum, pySum, pzSum, eSum);
424 for(Int_t i = 0; i < nRecJets; i++){
425 v[i].Boost(-vB.Px()/vB.E(),-vB.Py()/vB.E(),-vB.Pz()/vB.E());
430 TMath::Sort(nRecJets, e, idxj);
431 for(Int_t i = 0; i < nRecJets; i++){
432 recJets[i] = rJets[idxj[i]];
436 TClonesArray *tca = dynamic_cast<TClonesArray*>(fMyAODEvent->FindListObject(AliAODMCParticle::StdBranchName()));
438 nMCtracks = TMath::Min(tca->GetEntries(), 10000);
440 //sort AliAODMCParticles in pT
441 Double_t pTMC[10000];
442 for(Int_t iMC = 0; iMC < nMCtracks; iMC++){
443 AliAODMCParticle *partMC = dynamic_cast<AliAODMCParticle*>(tca->At(iMC));
444 if(!partMC) continue;
445 pTMC[iMC]=partMC->Pt();
449 TMath::Sort(nMCtracks, pTMC, idxMC);
452 Int_t flagQ[4], flagG[4];
453 for(Int_t iJ = 0; iJ < nRecJets; iJ++){
456 //look for highest momentum parton in the jet cone
457 for(Int_t iMC = 0; iMC < nMCtracks; iMC++){
458 AliAODMCParticle *partMC = dynamic_cast<AliAODMCParticle*>(tca->At(idxMC[iMC]));
459 if(!partMC) continue;
460 Double_t r = recJets[iJ].DeltaR(partMC);
462 if(TMath::Abs(partMC->GetPdgCode()) < 9)
464 if(TMath::Abs(partMC->GetPdgCode()) == 21)
471 TRefArray * tra = dynamic_cast<TRefArray*>(recJets[iJ].GetRefTracks());
473 Int_t nAODtracks = TMath::Min(1000, tra->GetEntries());
475 for(Int_t iT = 0; iT < nAODtracks; iT++){
476 AliAODTrack * jetTrack = dynamic_cast<AliAODTrack*>(tra->At(iT));
477 if(!jetTrack) continue;
478 pTsum += jetTrack->Pt();
479 dR[iT] = recJets[iJ].DeltaR(jetTrack);
482 fpHistPtAvE->Fill(recJets[iJ].E(), (Double_t)pTsum/(Double_t)nAODtracks, fWeight);
483 if(flagQ[iJ] == 1) fpHistPtAvEQ->Fill(recJets[iJ].E(), (Double_t)pTsum/(Double_t)nAODtracks, fWeight);
484 if(flagG[iJ] == 1) fpHistPtAvEG->Fill(recJets[iJ].E(), (Double_t)pTsum/(Double_t)nAODtracks, fWeight);
486 if(iJ > 1) //fill mulit-jet histo
487 fpHistPtAvE3->Fill(recJets[iJ].E(), (Double_t)pTsum/(Double_t)nAODtracks, fWeight);
490 TMath::Sort(nAODtracks, dR, idxAOD, kFALSE);
492 Double_t pTsum90Inv=0.;
493 for(Int_t iT = 0; iT < nAODtracks; iT++){
494 AliAODTrack * track = dynamic_cast<AliAODTrack*>(tra->At(idxAOD[iT]));
496 pTsum90Inv += track->Pt();
497 if(pTsum90Inv >= 0.9*pTsum){
498 Double_t deltaR = recJets[iJ].DeltaR(track);
500 fpHistDrE->Fill(recJets[iJ].E(), deltaR, fWeight);
501 if(flagQ[iJ] == 1) fpHistDrEQ->Fill(recJets[iJ].E(), deltaR, fWeight);
502 if(flagG[iJ] == 1) fpHistDrEG->Fill(recJets[iJ].E(), deltaR, fWeight);
505 fpHistDrE3->Fill(recJets[iJ].E(), deltaR, fWeight);