1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
28 #include "AliAnalyseUE.h"
29 #include "AliHistogramsUE.h"
30 #include "AliAnalysisTaskUE.h"
31 #include "AliHistogramsUE.h"
33 #include "AliAnalysisManager.h"
34 #include "AliMCEventHandler.h"
36 #include "AliAnalysisHelperJetTasks.h"
37 #include "AliAODHandler.h"
38 #include "AliAODInputHandler.h"
39 #include "AliGenPythiaEventHeader.h"
41 #include "AliInputEventHandler.h"
44 ////////////////////////////////////////////////////////////////////////
46 // Analysis class for Underlying Event studies
48 // Look for correlations on the tranverse regions to
49 // the leading charged jet
51 // This class needs as input AOD with track and Jets.
52 // The output is a list of histograms
54 // AOD can be either connected to the InputEventHandler
55 // for a chain of AOD files
57 // to the OutputEventHandler
58 // for a chain of ESD files, so this case class should be
59 // in the train after the Jet finder
61 // Arian.Abrahantes.Quintana@cern.ch
62 // Ernesto.Lopez.Torres@cern.ch
63 // vallero@physi.uni-heidelberg.de
65 ////////////////////////////////////////////////////////////////////////
67 ClassImp( AliAnalysisTaskUE)
69 // Define global pointer
70 AliAnalysisTaskUE* AliAnalysisTaskUE::fgTaskUE=NULL;
72 //____________________________________________________________________
73 AliAnalysisTaskUE:: AliAnalysisTaskUE(const char* name):
74 AliAnalysisTask(name,""),
84 fMaxJetPtInHist(300.),
86 fConstrainDistance(kTRUE),
88 fSimulateChJetPt(kFALSE),
90 fUseMCParticleBranch(kFALSE),
91 fnTracksVertex(3), // QA tracks pointing to principal vertex (= 3 default)
99 fUseChargeHadrons(kFALSE),
100 fUseChPartJet(kFALSE),
101 fUsePositiveCharge(kTRUE),
102 fUseSingleCharge(kFALSE),
106 fJet2DeltaPhiCut(2.616), // 150 degrees
107 fJet2RatioPtCut(0.8),
114 // Default constructor
115 // Define input and output slots here
116 // Input slot #0 works with a TChain
117 DefineInput(0, TChain::Class());
118 // Output slot #0 writes into a TList container
119 DefineOutput(0, TList::Class());
123 //____________________________________________________________________
124 AliAnalysisTaskUE:: AliAnalysisTaskUE(const AliAnalysisTaskUE & original):
126 fHistosUE(original.fHistosUE),
127 fAnaUE(original.fAnaUE),
129 fAODBranch(original.fAODBranch),
130 fDebug(original.fDebug),
131 fListOfHistos(original.fListOfHistos),
133 fBinsPtInHist(original.fBinsPtInHist),
134 fIsNorm2Area(original.fIsNorm2Area),
135 fMaxJetPtInHist(original.fMaxJetPtInHist),
136 fMinJetPtInHist(original.fMinJetPtInHist),
137 fConstrainDistance(original.fConstrainDistance),
138 fMinDistance(original.fMinDistance),
139 fSimulateChJetPt(original.fSimulateChJetPt),
140 fUseAliStack(original.fUseAliStack),
141 fUseMCParticleBranch(original.fUseMCParticleBranch),
142 fnTracksVertex(original.fnTracksVertex), // QA tracks pointing to principal vertex (= 3 default)
143 fZVertex(original.fZVertex),
144 fAnaType(original.fAnaType),
145 fConePosition(original.fConePosition),
146 fConeRadius(original.fConeRadius),
147 fFilterBit(original.fFilterBit),
148 fJetsOnFly(original.fJetsOnFly),
149 fRegionType(original.fRegionType),
150 fUseChargeHadrons(original.fUseChargeHadrons),
151 fUseChPartJet(original.fUseChPartJet),
152 fUsePositiveCharge(original.fUsePositiveCharge),
153 fUseSingleCharge(original.fUseSingleCharge),
154 fOrdering(original.fOrdering),
155 fChJetPtMin(original.fChJetPtMin),
156 fJet1EtaCut(original.fJet1EtaCut),
157 fJet2DeltaPhiCut(original.fJet2DeltaPhiCut), // 150 degrees
158 fJet2RatioPtCut(original.fJet2RatioPtCut),
159 fJet3PtCut(original.fJet3PtCut),
160 fTrackEtaCut(original.fTrackEtaCut),
161 fTrackPtCut(original.fTrackPtCut),
163 fAvgTrials(original.fAvgTrials)
169 //______________________________________________________________
170 AliAnalysisTaskUE & AliAnalysisTaskUE::operator = (const AliAnalysisTaskUE & /*source*/)
172 // assignment operator
176 //______________________________________________________________
177 Bool_t AliAnalysisTaskUE::Notify()
180 // Implemented Notify() to read the cross sections
181 // and number of trials from pyxsec.root
182 // Copy from AliAnalysisTaskJFSystematics
184 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
185 Float_t xsection = 0;
188 TFile *curfile = tree->GetCurrentFile();
190 Error("Notify","No current file");
194 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,trials);
196 fHistosUE->GetXsec()->Fill("<#sigma>",xsection);
198 // construct average trials
199 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
200 if(trials>=nEntries && nEntries>0.)fAvgTrials = trials/nEntries;
206 //____________________________________________________________________
207 void AliAnalysisTaskUE::ConnectInputData(Option_t* /*option*/)
209 // Connect the input data
211 // We need AODs with tracks and jets.
212 // Since AODs can either be connected to the InputEventHandler
213 // or to the OutputEventHandler ( the AOD is created by a previus task in the train )
214 // we need to check where it is and get the pointer to AODEvent in the right way
216 // Delta AODs are also accepted
219 if (fDebug > 1) AliInfo("ConnectInputData() ");
221 TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
223 if( handler && handler->InheritsFrom("AliAODInputHandler") ) { // input AOD
224 fAOD = ((AliAODInputHandler*)handler)->GetEvent();
226 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODInputHandler");
228 if (fDebug > 1) AliInfo(" ==== Tracks from AliAODInputHandler / Jets on-the-fly");
230 } else { //output AOD
231 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
232 if( handler && handler->InheritsFrom("AliAODHandler") ) {
233 fAOD = ((AliAODHandler*)handler)->GetAOD();
235 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler");
237 if (fDebug > 1) AliInfo(" ==== Tracks from AliAODHandler / Jets on-the-fly");
240 AliFatal("I can't get any AOD Event Handler");
245 fAnaUE->Initialize( *this );
249 //____________________________________________________________________
250 void AliAnalysisTaskUE::CreateOutputObjects()
252 // Create the output container
254 if (fDebug > 1) AliInfo("CreateOutPutData()");
256 //Initialize AliAnalysisUE, a class implementing the main analysis algorithms
257 fAnaUE = new AliAnalyseUE();
258 fHistosUE = new AliHistogramsUE();
260 if (fListOfHistos != NULL){
261 delete fListOfHistos;
262 fListOfHistos = NULL;
265 fListOfHistos = new TList();
266 fListOfHistos->SetOwner(kTRUE);
269 //Initialize output histograms
270 fHistosUE->CreateHistograms(fListOfHistos,fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist, fTrackEtaCut);
273 PostData(0,fListOfHistos);
276 //____________________________________________________________________
277 void AliAnalysisTaskUE::Exec(Option_t */*option*/)
279 // Trigger selection ************************************************
280 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
281 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
282 if (!fAnaUE->TriggerSelection(inputHandler)) return;
284 // Vertex selection *************************************************
285 if(!fAnaUE->VertexSelection(fAOD,fnTracksVertex,fZVertex)) return;
286 //if(!fAnaUE->VertexSelectionOld(fAOD)) return; // temporary to compare with old task and to have same cuts for MC !!!
288 // Execute analysis for current event ******************************
290 if ( fDebug > 3 ) AliInfo( " Processing event..." );
292 // fetch the pythia header info and get the trials
293 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
296 AliMCEvent* mcEvent = mcHandler->MCEvent();
298 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
300 nTrials = pythiaGenHeader->Trials();
304 fHistosUE->GetTrials()->Fill("#sum{ntrials}",fAvgTrials);
309 PostData(0,fListOfHistos);
312 //____________________________________________________________________
313 void AliAnalysisTaskUE::AddSettingsTree()
315 //Write settings to output list
316 TTree *settingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");
317 settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
318 settingsTree->Branch("fConeRadius", &fConeRadius,"Rad/D");
319 settingsTree->Branch("fJet1EtaCut", &fJet1EtaCut, "LeadJetEtaCut/D");
320 settingsTree->Branch("fJet2DeltaPhiCut", &fJet2DeltaPhiCut, "DeltaPhi/D");
321 settingsTree->Branch("fJet2RatioPtCut", &fJet2RatioPtCut, "Jet2Ratio/D");
322 settingsTree->Branch("fJet3PtCut", &fJet3PtCut, "Jet3PtCut/D");
323 settingsTree->Branch("fTrackPtCut", &fTrackPtCut, "TrackPtCut/D");
324 settingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
325 settingsTree->Branch("fAnaType", &fAnaType, "Ana/I");
326 settingsTree->Branch("fRegionType", &fRegionType,"Reg/I");
327 settingsTree->Branch("fOrdering", &fOrdering,"OrderMeth/I");
328 settingsTree->Branch("fUseChPartJet", &fUseChPartJet,"UseChPart/O");
329 settingsTree->Branch("fUseChargeHadrons", &fUseChargeHadrons,"UseChHadrons/O");
330 settingsTree->Branch("fUseSingleCharge", &fUseSingleCharge,"UseSingleCh/O");
331 settingsTree->Branch("fUsePositiveCharge", &fUsePositiveCharge,"UsePositiveCh/O");
332 settingsTree->Fill();
333 fListOfHistos->Add(settingsTree);
336 //____________________________________________________________________
337 void AliAnalysisTaskUE::AnalyseUE()
341 // Get jets and order by pT
343 *jetVect = fAnaUE->GetOrderedClusters(fAODBranch, fUseChPartJet, fChJetPtMin );
345 if( jetVect[0].Pt() < 0. ) {
346 if( fDebug > 1 ) AliInfo("\n Skipping Event, not jet found...");
349 if (fDebug >1 ) AliInfo(Form("\n Pt Leading Jet = %6.1f eta=%5.3f ", jetVect[0].Pt(), jetVect[0].Eta() ));
352 // Select events according to analysis type ***********************************
353 if ( ! (fAnaUE->AnaTypeSelection(jetVect))) return;
355 // Find max and min regions with real tracks
356 if (!fUseMCParticleBranch){
357 // Primary vertex distribution
358 AliAODVertex* vertex = (AliAODVertex*)fAOD->GetPrimaryVertex();
359 fHistosUE->FillHistogram("hVertexMult",vertex->GetNContributors());
361 // Fill leading "jet" histogram
362 fHistosUE->FillHistogram("hEleadingPt",jetVect[0].Pt());
364 fAnaUE->FindMaxMinRegions( jetVect, fConePosition, 0, 0 );
368 // this is the part we only use when we have MC information
369 // More than a test for values of it also resumes the reconstruction efficiency of jets
370 // As commented bellow if available for the data, we try to pair reconstructed jets with simulated ones
371 // afterwards we kept angular variables of MC jet to perform UE analysis over MC particles
372 // TODO: Handle Multiple jet environment. 06/2009 just suited for inclusive jet condition ( fAnaType = 1 )
374 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
376 Printf("ERROR: Could not retrieve MC event handler");
380 AliMCEvent* mcEvent = mcHandler->MCEvent();
382 Printf("ERROR: Could not retrieve MC event");
385 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
386 if(!pythiaGenHeader){
390 fAnaUE->AnalyseMC(jetVect,mcEvent,pythiaGenHeader, fConePosition, fUseAliStack, fConstrainDistance, fMinDistance);
394 fAnaUE->FillRegions(fIsNorm2Area, jetVect);
398 //____________________________________________________________________
399 AliAnalysisTaskUE* AliAnalysisTaskUE::Instance()
406 fgTaskUE = new AliAnalysisTaskUE();
412 //____________________________________________________________________
413 void AliAnalysisTaskUE::Terminate(Option_t */*option*/)
416 // Terminate analysis
418 if (!gROOT->IsBatch()){
419 fListOfHistos = dynamic_cast<TList*> (GetOutputData(0));
421 AliError("Histogram List is not available");
424 //call class AliHistogramsUE
425 AliHistogramsUE *histos=new AliHistogramsUE(fListOfHistos);
428 AliInfo(" Batch mode, not histograms will be shown...");
432 AliInfo("End analysis");
436 void AliAnalysisTaskUE::WriteSettings()
439 //Print analysis settings on screen
441 AliInfo(" All Analysis Settings in Saved Tree");
442 fListOfHistos = dynamic_cast<TList*> (GetOutputData(0));
444 AliError("Histogram List is not available");
447 TTree *tree = (TTree*)(fListOfHistos->FindObject("UEAnalysisSettings"));