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),
43 fDeltaAODFileName(""),
50 //________________________________________________________________________
51 AliAnalysisTaskGammaJet::AliAnalysisTaskGammaJet(const char *name) :
52 AliAnalysisTaskSE(name),
59 fHistGammaJetsIso(NULL),
63 fDeltaAODFileName(""),
67 // Define input and output slots here
68 DefineInput(0, TChain::Class());
69 // Output slot #0 id reserved by the base class for AOD
71 // Output slot #1 writes into a TH1 container
72 DefineOutput(1, TList::Class());
75 //________________________________________________________________________
76 void AliAnalysisTaskGammaJet::UserCreateOutputObjects()
78 //Create histograms add, to outputlist
79 fOutputList = new TList();
81 fHistPt = new TH1F("fHistPt", "P_{T} distribution", 150, 0.1, 50);
82 fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");
83 fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
84 fHistPt->SetMarkerStyle(kFullCircle);
85 fOutputList->Add(fHistPt);
87 fHistPtPhos = new TH1F("fHistPtPhos", "P_{T} distribution", 150, 0.1, 50);
88 fHistPtPhos->GetXaxis()->SetTitle("P_{T} (GeV/c)");
89 fHistPtPhos->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
90 fHistPtPhos->SetMarkerStyle(kFullCircle);
91 fOutputList->Add(fHistPtPhos);
93 fHistPtEmcal = new TH1F("fHistPtEmcal", "P_{T} distribution", 150, 0.1, 50);
94 fHistPtEmcal->GetXaxis()->SetTitle("P_{T} (GeV/c)");
95 fHistPtEmcal->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
96 fHistPtEmcal->SetMarkerStyle(kFullCircle);
97 fOutputList->Add(fHistPtEmcal);
100 fHistPtJets = new TH1F("fHistPtJets", "P_{T} distribution", 150, 0.1, 50);
101 fHistPtJets->GetXaxis()->SetTitle("P_{T} (GeV/c)");
102 fHistPtJets->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
103 fHistPtJets->SetMarkerStyle(kFullCircle);
104 fOutputList->Add(fHistPtJets);
106 fHistGammaJets = new TH1F("fHistGammaJets", "fHistGammaJets", 200, -TMath::Pi(), 2*TMath::Pi());
107 fOutputList->Add(fHistGammaJets);
109 fHistGammaJetsIso = new TH1F("fHistGammaJetsIso", "fHistGammaJetsIso", 200, -TMath::Pi(), 2*TMath::Pi());
110 fOutputList->Add(fHistGammaJetsIso);
112 //TNtuple * tuple = new TNtuple("fNtuple", "fNtuple", dPhi,
116 fPhotons = new TClonesArray("AliAODPWG4ParticleCorrelation", 0);
117 fPhotons->SetName("fPhotons");
118 AddAODBranch("TClonesArray", &fPhotons);
121 // fIsolation = new AliAnaParticleIsolation();
122 // fIsolation->SetInputAODName("fPhotons");
127 //________________________________________________________________________
128 void AliAnalysisTaskGammaJet::UserExec(Option_t *)
131 // Called for each event
134 //Clear stuff for new event
139 AliAODEvent * aodEvent = GetAODEvent();
141 AliError("No AOD event!!");
145 //FillPWG4PartCorrBranch(convGamma, fPhotons, "ConvGamma");
146 //fIsolation->MakeAnalysisFillAOD();
148 ProcessConvGamma(aodEvent);
149 ProcessCalorimeters(aodEvent);
152 PostData(1, fOutputList);
155 //_____________________________________________________________________
156 void AliAnalysisTaskGammaJet::Terminate(Option_t *) {
157 // Draw result to the screen
158 // Called once at the end of the query
161 //_____________________________________________________________________
162 AliAODEvent * AliAnalysisTaskGammaJet::GetAODEvent() {
163 //Get the AOD event from whereever it might be
164 AliAODEvent * aodEvent = dynamic_cast<AliAODEvent*>(InputEvent());
166 aodEvent = AODEvent();
174 //_____________________________________________________________________
175 TClonesArray * AliAnalysisTaskGammaJet::GetConversionGammas(const AliAODEvent * aodEvent) {
177 //Get Conversion gamma branch of AOD. First try standard AOD
178 TClonesArray * convGamma = dynamic_cast<TClonesArray*>(aodEvent->FindListObject("GammaConv_gamma"));
180 //If it's there, send it back
181 if(convGamma) return convGamma;
183 //If AOD not in standard file have to locate it in delta AOD
184 if( !(fDeltaAODFileName.Length() > 0) ) return NULL;
186 AliAODHandler * aodHandler = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
188 AliAODExtension * gExt = dynamic_cast<AliAODExtension*>(aodHandler->GetExtensions()->FindObject(fDeltaAODFileName));
190 AliAODEvent * gcEvent = gExt->GetAOD();
191 return dynamic_cast<TClonesArray*>(gcEvent->FindListObject("GammaConv_gamma"));
198 //_____________________________________________________________________
199 void AliAnalysisTaskGammaJet::FillPWG4PartCorrBranch( TClonesArray * gcBranch, TClonesArray * partCorrBranch , TString detector ) {
201 for(int i = 0; i < gcBranch->GetEntriesFast(); i++) {
202 AliGammaConversionAODObject * gcObject = dynamic_cast<AliGammaConversionAODObject*>(gcBranch->At(i));
204 AliAODPWG4ParticleCorrelation pc(gcObject->Px(), gcObject->Py(), gcObject->Pz(), gcObject->E());
205 pc.SetTagged(gcObject->IsTagged());
206 pc.SetTrackLabel(gcObject->GetLabel1(), gcObject->GetLabel2());
207 pc.SetDetector(detector);
208 new((*partCorrBranch)[i]) AliAODPWG4ParticleCorrelation(pc);
211 AliError(Form("Couldn't get gamma conversion aod object"));
218 //_____________________________________________________________________
219 AliAODPWG4ParticleCorrelation * AliAnalysisTaskGammaJet::PWG4PartFromGammaConvAODObject(AliGammaConversionAODObject * gcObject, TString detector ) {
221 AliAODPWG4ParticleCorrelation * pc = new AliAODPWG4ParticleCorrelation(gcObject->Px(), gcObject->Py(), gcObject->Pz(), gcObject->E());
222 pc->SetTagged(gcObject->IsTagged());
223 pc->SetTrackLabel(gcObject->GetLabel1(), gcObject->GetLabel2());
224 pc->SetDetector(detector);
229 //_________________________________________________________________________
230 void AliAnalysisTaskGammaJet::CleanUp() {
234 //_________________________________________________________________________
235 Bool_t AliAnalysisTaskGammaJet::IsIsolated( AliAODPWG4ParticleCorrelation * particle, TClonesArray * tracks, Float_t coneSize, Float_t ptThreshold ) {
236 //See header file for documentation
237 for(int it = 0; it < tracks->GetEntriesFast(); it++) {
238 if ( (it == particle->GetTrackLabel(0)) || it == particle->GetTrackLabel(1) )
241 //BALLE Svein:How are you checking the calorimeters for whether they are decay particles ?
243 AliAODTrack * track = dynamic_cast<AliAODTrack*>(tracks->At(it));
245 if ( IsInCone(particle->Eta() - track->Eta(), particle->Phi() - track->Phi(), coneSize) ) {
246 if (track->Pt() > ptThreshold) {
251 AliError(Form("Bad track!!!! "));
255 //No particle above threshold, it's isolated
260 //______________________________________________________________________________________________
261 void AliAnalysisTaskGammaJet::ProcessCalorimeters( const AliAODEvent * const aodEvent ) {
263 TClonesArray * clusters = aodEvent->GetCaloClusters();
266 for(int ic = 0; ic < clusters->GetEntriesFast(); ic++) {
267 AliAODCaloCluster * cluster = dynamic_cast<AliAODCaloCluster*>(clusters->At(ic));
269 AliError(Form("Error getting cluster"));
274 if (cluster->GetNCells() < 6) continue;
275 if (cluster->GetEmcCpvDistance() < 15) continue;
277 TLorentzVector tlvec;
279 AliAODVertex * vertex = aodEvent->GetPrimaryVertex();
280 Double_t vertexPosition[3];
281 vertex->GetXYZ(vertexPosition);
282 cluster->GetMomentum(tlvec, vertexPosition);
283 if (tlvec.Pt() < GetMinPt()) continue;
285 AliAODPWG4ParticleCorrelation * photon = new AliAODPWG4ParticleCorrelation(tlvec);
287 photon->SetIsolated( IsIsolated(photon, aodEvent->GetTracks(), GetConeSize(), GetPtThreshold()) );
288 CorrelateWithJets(photon, aodEvent->GetJets());
292 //___________________________________________________________________________________________
293 void AliAnalysisTaskGammaJet::ProcessConvGamma( const AliAODEvent * const aodEvent ) {
295 TClonesArray * convGamma = GetConversionGammas(aodEvent);
297 AliError(Form("No convgamma"));
301 for (Int_t iPhot = 0; iPhot < convGamma->GetEntriesFast(); iPhot++) {
302 AliGammaConversionAODObject * aodO = dynamic_cast<AliGammaConversionAODObject*>(convGamma->At(iPhot));
305 AliError(Form("ERROR: Could not receive ga %d\n", iPhot));
309 if(aodO->Pt() < GetMinPt()) continue;
312 //Use the AODPWG4PartCorr shit!
313 AliAODPWG4ParticleCorrelation * photon = PWG4PartFromGammaConvAODObject(aodO, "ConvGamma");
314 photon->SetIsolated( IsIsolated(photon, aodEvent->GetTracks(), GetConeSize(), GetPtThreshold()) );
317 // if ( (aodO->Phi()) < 0 )
318 // cout << aodO->Phi() << endl;
320 CorrelateWithJets(photon, aodEvent->GetJets());
322 fHistPt->Fill(photon->Pt());
328 void AliAnalysisTaskGammaJet::CorrelateWithJets(AliAODPWG4ParticleCorrelation * photon, const TClonesArray * const jets) {
329 //See header file for documentation
331 for(int ij = 0; ij < jets->GetEntriesFast(); ij++) {
332 AliAODJet * jet = dynamic_cast<AliAODJet*>(jets->At(ij));
334 fHistPtJets->Fill(jet->Pt());
336 Float_t dPhi = TMath::Abs(photon->Phi() - jet->Phi());
337 if (photon->IsIsolated())
338 fHistGammaJetsIso->Fill(dPhi, jet->Pt()/photon->Pt());
340 fHistGammaJets->Fill(dPhi);