8 #include "AliAnalysisTask.h"
9 #include "AliAnalysisManager.h"
10 #include "AliAnalysisTaskGammaJet.h"
12 #include "AliESDEvent.h"
13 #include "AliESDCaloCluster.h"
14 #include "AliESDInputHandler.h"
16 #include "AliAODPWG4ParticleCorrelation.h"
17 #include "AliAODEvent.h"
18 #include "AliAODHandler.h"
19 #include "AliAODCaloCluster.h"
20 #include "AliGammaConversionAODObject.h"
21 #include "AliAODJet.h"
23 // Gamma - jet correlation analysis task
24 // Authors: Svein Lindal
29 ClassImp(AliAnalysisTaskGammaJet)
31 //________________________________________________________________________
32 AliAnalysisTaskGammaJet::AliAnalysisTaskGammaJet() : AliAnalysisTaskSE(),
39 fHistGammaJetsIso(NULL),
41 fHistMaxdPhiIso(NULL),
42 fHistMaxdPhiIsoPt(NULL),
46 fDeltaAODFileName(""),
53 //________________________________________________________________________
54 AliAnalysisTaskGammaJet::AliAnalysisTaskGammaJet(const char *name) :
55 AliAnalysisTaskSE(name),
62 fHistGammaJetsIso(NULL),
64 fHistMaxdPhiIso(NULL),
65 fHistMaxdPhiIsoPt(NULL),
69 fDeltaAODFileName(""),
73 // Define input and output slots here
74 DefineInput(0, TChain::Class());
75 // Output slot #0 id reserved by the base class for AOD
77 // Output slot #1 writes into a TH1 container
78 DefineOutput(1, TList::Class());
81 //________________________________________________________________________
82 void AliAnalysisTaskGammaJet::UserCreateOutputObjects()
84 //Create histograms add, to outputlist
85 fOutputList = new TList();
87 fHistPt = new TH1F("fHistPt", "P_{T} distribution", 150, 0.1, 50);
88 fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");
89 fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
90 fHistPt->SetMarkerStyle(kFullCircle);
91 fOutputList->Add(fHistPt);
93 fHistPtPhos = new TH1F("fHistPtPhos", "P_{T} distribution", 150, 0.1, 50);
94 fHistPtPhos->GetXaxis()->SetTitle("P_{T} (GeV/c)");
95 fHistPtPhos->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
96 fHistPtPhos->SetMarkerStyle(kFullCircle);
97 fOutputList->Add(fHistPtPhos);
99 fHistPtEmcal = new TH1F("fHistPtEmcal", "P_{T} distribution", 150, 0.1, 50);
100 fHistPtEmcal->GetXaxis()->SetTitle("P_{T} (GeV/c)");
101 fHistPtEmcal->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
102 fHistPtEmcal->SetMarkerStyle(kFullCircle);
103 fOutputList->Add(fHistPtEmcal);
106 fHistPtJets = new TH1F("fHistPtJets", "P_{T} distribution", 150, 0.1, 50);
107 fHistPtJets->GetXaxis()->SetTitle("P_{T} (GeV/c)");
108 fHistPtJets->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
109 fHistPtJets->SetMarkerStyle(kFullCircle);
110 fOutputList->Add(fHistPtJets);
112 fHistGammaJets = new TH1F("fHistGammaJets", "fHistGammaJets", 200, -2*TMath::Pi(), 2*TMath::Pi());
113 fOutputList->Add(fHistGammaJets);
115 fHistGammaJetsIso = new TH1F("fHistGammaJetsIso", "fHistGammaJetsIso", 200, -2*TMath::Pi(), 2*TMath::Pi());
116 fOutputList->Add(fHistGammaJetsIso);
119 fHistMaxdPhi = new TH1F("fHistMaxdPhi", "fHistMaxdPhi", 200, -2*TMath::Pi(), 2*TMath::Pi());
120 fOutputList->Add(fHistMaxdPhi);
122 fHistMaxdPhiIso = new TH1F("fHistMaxdPhiIso", "fHistMaxdPhiIso", 200, -2*TMath::Pi(), 2*TMath::Pi());
123 fOutputList->Add(fHistMaxdPhiIso);
125 fHistMaxdPhiIsoPt = new TH1F("fHistMaxdPhiIsoPt", "fHistMaxdPhiIsoPt", 200, -2*TMath::Pi(), 2*TMath::Pi());
126 fOutputList->Add(fHistMaxdPhiIsoPt);
128 //TNtuple * tuple = new TNtuple("fNtuple", "fNtuple", dPhi,
132 fPhotons = new TClonesArray("AliAODPWG4ParticleCorrelation", 0);
133 fPhotons->SetName("fPhotons");
134 AddAODBranch("TClonesArray", &fPhotons);
137 // fIsolation = new AliAnaParticleIsolation();
138 // fIsolation->SetInputAODName("fPhotons");
143 //________________________________________________________________________
144 void AliAnalysisTaskGammaJet::UserExec(Option_t *)
147 // Called for each event
150 //Clear stuff for new event
155 AliAODEvent * aodEvent = GetAODEvent();
157 AliError("No AOD event!!");
162 //FillPWG4PartCorrBranch(convGamma, fPhotons, "ConvGamma");
163 //fIsolation->MakeAnalysisFillAOD();
165 ProcessConvGamma(aodEvent);
166 //ProcessCalorimeters(aodEvent);
169 PostData(1, fOutputList);
172 //_____________________________________________________________________
173 void AliAnalysisTaskGammaJet::Terminate(Option_t *) {
174 // Draw result to the screen
175 // Called once at the end of the query
178 //_____________________________________________________________________
179 AliAODEvent * AliAnalysisTaskGammaJet::GetAODEvent() {
180 //Get the AOD event from whereever it might be
181 AliAODEvent * aodEvent = dynamic_cast<AliAODEvent*>(InputEvent());
183 aodEvent = AODEvent();
191 //_____________________________________________________________________
192 TClonesArray * AliAnalysisTaskGammaJet::GetConversionGammas(const AliAODEvent * aodEvent) {
194 //Get Conversion gamma branch of AOD. First try standard AOD
195 TClonesArray * convGamma = dynamic_cast<TClonesArray*>(aodEvent->FindListObject("GammaConv_gamma"));
197 //If it's there, send it back
198 if(convGamma) return convGamma;
200 //If AOD not in standard file have to locate it in delta AOD
201 if( !(fDeltaAODFileName.Length() > 0) ) return NULL;
203 AliAODHandler * aodHandler = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
205 AliAODExtension * gExt = dynamic_cast<AliAODExtension*>(aodHandler->GetExtensions()->FindObject(fDeltaAODFileName));
207 AliAODEvent * gcEvent = gExt->GetAOD();
208 return dynamic_cast<TClonesArray*>(gcEvent->FindListObject("GammaConv_gamma"));
215 //_____________________________________________________________________
216 void AliAnalysisTaskGammaJet::FillPWG4PartCorrBranch( TClonesArray * gcBranch, TClonesArray * partCorrBranch , TString detector ) {
218 for(int i = 0; i < gcBranch->GetEntriesFast(); i++) {
219 AliGammaConversionAODObject * gcObject = dynamic_cast<AliGammaConversionAODObject*>(gcBranch->At(i));
221 AliAODPWG4ParticleCorrelation pc(gcObject->Px(), gcObject->Py(), gcObject->Pz(), gcObject->E());
222 pc.SetTagged(gcObject->IsTagged());
223 pc.SetTrackLabel(gcObject->GetLabel1(), gcObject->GetLabel2());
224 pc.SetDetector(detector);
225 new((*partCorrBranch)[i]) AliAODPWG4ParticleCorrelation(pc);
228 AliError(Form("Couldn't get gamma conversion aod object"));
235 //_____________________________________________________________________
236 AliAODPWG4ParticleCorrelation * AliAnalysisTaskGammaJet::PWG4PartFromGammaConvAODObject(AliGammaConversionAODObject * gcObject, TString detector ) {
238 AliAODPWG4ParticleCorrelation * pc = new AliAODPWG4ParticleCorrelation(gcObject->Px(), gcObject->Py(), gcObject->Pz(), gcObject->E());
239 pc->SetTagged(gcObject->IsTagged());
240 pc->SetTrackLabel(gcObject->GetLabel1(), gcObject->GetLabel2());
241 pc->SetDetector(detector);
246 //_________________________________________________________________________
247 void AliAnalysisTaskGammaJet::CleanUp() {
251 //_________________________________________________________________________
252 Bool_t AliAnalysisTaskGammaJet::IsIsolated( AliAODPWG4Particle * particle, TClonesArray * tracks, Float_t coneSize, Float_t ptThreshold ) {
253 //See header file for documentation
254 for(int it = 0; it < tracks->GetEntriesFast(); it++) {
255 if ( (it == particle->GetTrackLabel(0)) || it == particle->GetTrackLabel(1) )
258 //BALLE Svein:How are you checking the calorimeters for whether they are decay particles ?
260 AliAODTrack * track = dynamic_cast<AliAODTrack*>(tracks->At(it));
262 if ( IsInCone(particle->Eta() - track->Eta(), particle->Phi() - track->Phi(), coneSize) ) {
263 if (track->Pt() > ptThreshold) {
268 AliError(Form("Bad track!!!! "));
272 //No particle above threshold, it's isolated
277 //______________________________________________________________________________________________
278 void AliAnalysisTaskGammaJet::ProcessCalorimeters( const AliAODEvent * const aodEvent ) {
280 TClonesArray * clusters = aodEvent->GetCaloClusters();
283 for(int ic = 0; ic < clusters->GetEntriesFast(); ic++) {
284 AliAODCaloCluster * cluster = dynamic_cast<AliAODCaloCluster*>(clusters->At(ic));
286 AliError(Form("Error getting cluster"));
291 if (cluster->GetNCells() < 6) continue;
292 if (cluster->GetEmcCpvDistance() < 15) continue;
294 TLorentzVector tlvec;
296 AliAODVertex * vertex = aodEvent->GetPrimaryVertex();
297 Double_t vertexPosition[3];
298 vertex->GetXYZ(vertexPosition);
299 cluster->GetMomentum(tlvec, vertexPosition);
300 if (tlvec.Pt() < GetMinPt()) continue;
302 AliAODPWG4ParticleCorrelation * photon = new AliAODPWG4ParticleCorrelation(tlvec);
304 photon->SetIsolated( IsIsolated(photon, aodEvent->GetTracks(), GetConeSize(), GetPtThreshold()) );
305 CorrelateWithJets(photon, aodEvent->GetJets());
309 //___________________________________________________________________________________________
310 void AliAnalysisTaskGammaJet::ProcessConvGamma( const AliAODEvent * const aodEvent ) {
312 TClonesArray * tracks = aodEvent->GetTracks();
314 cout << "No tracks!!!"<<endl;
318 Bool_t delP = kFALSE;
319 TClonesArray * convGamma = GetConversionGammas(aodEvent);
321 AliError(Form("No convgamma"));
325 for (Int_t iPhot = 0; iPhot < convGamma->GetEntriesFast(); iPhot++) {
326 AliAODPWG4Particle * photon = dynamic_cast<AliAODPWG4Particle*>(convGamma->At(iPhot));
330 AliGammaConversionAODObject * aodO = dynamic_cast<AliGammaConversionAODObject*>(convGamma->At(iPhot));
332 AliError(Form("ERROR: Could not receive ga %d\n", iPhot));
336 if(aodO->Pt() < GetMinPt()) continue;
339 //Use the AODPWG4PartCorr shit!
340 photon = PWG4PartFromGammaConvAODObject(aodO, "ConvGamma");
345 Bool_t isolated = IsIsolated(photon, tracks, GetConeSize(), GetPtThreshold() );
348 // if ( (aodO->Phi()) < 0 )
349 // cout << aodO->Phi() << endl;
351 CorrelateWithJets(photon, aodEvent->GetJets(), isolated);
353 fHistPt->Fill(photon->Pt());
355 if (delP) delete photon;
360 ///________________________________________________________________________________________________________________
361 void AliAnalysisTaskGammaJet::CorrelateWithJets(AliAODPWG4ParticleCorrelation * photon, const TClonesArray * const jets) {
362 //See header file for documentation
364 for(int ij = 0; ij < jets->GetEntriesFast(); ij++) {
365 AliAODJet * jet = dynamic_cast<AliAODJet*>(jets->At(ij));
367 fHistPtJets->Fill(jet->Pt());
369 Float_t dPhi = TMath::Abs(photon->Phi() - jet->Phi());
370 if (photon->IsIsolated())
371 fHistGammaJetsIso->Fill(dPhi, jet->Pt()/photon->Pt());
373 fHistGammaJets->Fill(dPhi);
382 ///________________________________________________________________________________________________________________
383 void AliAnalysisTaskGammaJet::CorrelateWithJets(AliAODPWG4Particle * photon, const TClonesArray * const jets, Bool_t const isolated ) {
384 //See header file for documentation
387 Float_t maxdPhi = 0.0;
388 Float_t maxdPhiPt = 0.0;
389 for(int ij = 0; ij < jets->GetEntriesFast(); ij++) {
390 AliAODJet * jet = dynamic_cast<AliAODJet*>(jets->At(ij));
392 fHistPtJets->Fill(jet->Pt());
394 Float_t dPhi = TMath::Abs(photon->Phi() - jet->Phi());
395 if ( TMath::Abs(dPhi - TMath::Pi()) < TMath::Abs(maxdPhi - TMath::Pi()) ){
397 maxdPhiPt = jet->Pt();
401 fHistGammaJetsIso->Fill(dPhi, jet->Pt()/photon->Pt());
403 fHistGammaJets->Fill(dPhi);
408 fHistMaxdPhi->Fill(maxdPhi);
410 fHistMaxdPhiIso->Fill(maxdPhi);
411 fHistMaxdPhiIsoPt->Fill(maxdPhi, maxdPhiPt/photon->Pt());