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 **************************************************************************/
18 //class AliAODInputHandler;
19 //class AliAODHandler;
32 #include "AliAnalyseUE.h"
33 #include "AliAnalysisTaskUE.h"
34 #include "AliHistogramsUE.h"
36 #include "AliAnalysisManager.h"
37 #include "AliMCEventHandler.h"
39 #include "AliAnalysisHelperJetTasks.h"
40 #include "AliAODHandler.h"
41 #include "AliAODInputHandler.h"
42 #include "AliGenPythiaEventHeader.h"
44 #include "AliInputEventHandler.h"
46 ////////////////////////////////////////////////////////////////////////
48 // Analysis class for Underlying Event studies
50 // Look for correlations on the tranverse regions to
51 // the leading charged jet
53 // This class needs as input AOD with track and Jets.
54 // The output is a list of histograms
56 // AOD can be either connected to the InputEventHandler
57 // for a chain of AOD files
59 // to the OutputEventHandler
60 // for a chain of ESD files, so this case class should be
61 // in the train after the Jet finder
63 // Arian.Abrahantes.Quintana@cern.ch
64 // Ernesto.Lopez.Torres@cern.ch
66 ////////////////////////////////////////////////////////////////////////
69 ClassImp( AliAnalysisTaskUE)
71 // Define global pointer
72 AliAnalysisTaskUE* AliAnalysisTaskUE::fgTaskUE=NULL;
74 //____________________________________________________________________
75 AliAnalysisTaskUE:: AliAnalysisTaskUE(const char* name):
76 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),
113 // Default constructor
114 // Define input and output slots here
115 // Input slot #0 works with a TChain
116 DefineInput(0, TChain::Class());
117 // Output slot #0 writes into a TList container
118 DefineOutput(0, TList::Class());
122 //____________________________________________________________________
123 AliAnalysisTaskUE:: AliAnalysisTaskUE(const AliAnalysisTaskUE & original):
125 fAnaUE(original.fAnaUE),
127 fAODBranch(original.fAODBranch),
128 fDebug(original.fDebug),
129 fListOfHistos(original.fListOfHistos),
130 fBinsPtInHist(original.fBinsPtInHist),
131 fIsNorm2Area(original.fIsNorm2Area),
132 fMaxJetPtInHist(original.fMaxJetPtInHist),
133 fMinJetPtInHist(original.fMinJetPtInHist),
134 fConstrainDistance(original.fConstrainDistance),
135 fMinDistance(original.fMinDistance),
136 fSimulateChJetPt(original.fSimulateChJetPt),
137 fUseAliStack(original.fUseAliStack),
138 fUseMCParticleBranch(original.fUseMCParticleBranch),
139 fnTracksVertex(original.fnTracksVertex), // QA tracks pointing to principal vertex (= 3 default)
140 fZVertex(original.fZVertex),
141 fAnaType(original.fAnaType),
142 fConePosition(original.fConePosition),
143 fConeRadius(original.fConeRadius),
144 fFilterBit(original.fFilterBit),
145 fJetsOnFly(original.fJetsOnFly),
146 fRegionType(original.fRegionType),
147 fUseChargeHadrons(original.fUseChargeHadrons),
148 fUseChPartJet(original.fUseChPartJet),
149 fUsePositiveCharge(original.fUsePositiveCharge),
150 fUseSingleCharge(original.fUseSingleCharge),
151 fOrdering(original.fOrdering),
152 fChJetPtMin(original.fChJetPtMin),
153 fJet1EtaCut(original.fJet1EtaCut),
154 fJet2DeltaPhiCut(original.fJet2DeltaPhiCut), // 150 degrees
155 fJet2RatioPtCut(original.fJet2RatioPtCut),
156 fJet3PtCut(original.fJet3PtCut),
157 fTrackEtaCut(original.fTrackEtaCut),
158 fTrackPtCut(original.fTrackPtCut),
159 fAvgTrials(original.fAvgTrials)
165 //______________________________________________________________
166 AliAnalysisTaskUE & AliAnalysisTaskUE::operator = (const AliAnalysisTaskUE & /*source*/)
168 // assignment operator
172 //______________________________________________________________
173 Bool_t AliAnalysisTaskUE::Notify()
176 // Implemented Notify() to read the cross sections
177 // and number of trials from pyxsec.root
178 // Copy from AliAnalysisTaskJFSystematics
180 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
181 Float_t xsection = 0;
184 TFile *curfile = tree->GetCurrentFile();
186 Error("Notify","No current file");
190 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,trials);
192 fAnaUE->FillXsec("<#sigma>",xsection);
194 // construct average trials
195 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
196 if(trials>=nEntries && nEntries>0.)fAvgTrials = trials/nEntries;
202 //____________________________________________________________________
203 void AliAnalysisTaskUE::ConnectInputData(Option_t* /*option*/)
205 // Connect the input data
207 // We need AOD with tracks and jets.
208 // Since AOD can be either connected to the InputEventHandler (input chain fron AOD files)
209 // or to the OutputEventHandler ( AOD is create by a previus task in the train )
210 // we need to check where it is and get the pointer to AODEvent in the right way
212 // Delta AODs are also accepted
215 if (fDebug > 1) AliInfo("ConnectInputData() ");
217 TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
219 if( handler && handler->InheritsFrom("AliAODInputHandler") ) { // input AOD
220 fAOD = ((AliAODInputHandler*)handler)->GetEvent();
222 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODInputHandler");
224 AliInfo(" ==== Tracks from AliAODInputHandler / Jets on-the-fly");
226 } else { //output AOD
227 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
228 if( handler && handler->InheritsFrom("AliAODHandler") ) {
229 fAOD = ((AliAODHandler*)handler)->GetAOD();
231 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler");
233 if (fDebug > 1) AliInfo(" ==== Tracks from AliAODHandler / Jets on-the-fly");
236 AliFatal("I can't get any AOD Event Handler");
241 fAnaUE->Initialize( *this );
244 //____________________________________________________________________
245 void AliAnalysisTaskUE::CreateOutputObjects()
247 // Create the output container
249 if (fDebug > 1) AliInfo("CreateOutPutData()");
251 //Initialize AliAnalysisUE, a class implementing the main analysis algorithms
252 fAnaUE = new AliAnalyseUE();
254 //Initialize output histograms
255 fAnaUE->CreateHistograms(fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
256 fListOfHistos = (TList*)fAnaUE->GetHistograms()->Clone();
257 fListOfHistos->SetOwner(kTRUE);
258 PostData(0,fListOfHistos);
262 //____________________________________________________________________
263 void AliAnalysisTaskUE::Exec(Option_t */*option*/)
265 // Trigger selection ************************************************
266 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
267 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
268 if( !inputHandler->InheritsFrom("AliAODInputHandler") ) { // input AOD
269 if (inputHandler->IsEventSelected()) {
270 if (fDebug > 1) AliInfo(" Trigger Selection: event ACCEPTED ... ");
272 if (fDebug > 1) AliInfo(" Trigger Selection: event REJECTED ... ");
276 // Event selection (vertex) *****************************************
278 if(!fAnaUE->VertexSelection(fAOD,fnTracksVertex,fZVertex)) return;
280 // Execute analysis for current event ******************************
282 if ( fDebug > 3 ) AliInfo( " Processing event..." );
284 // fetch the pythia header info and get the trials
285 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
288 AliMCEvent* mcEvent = mcHandler->MCEvent();
290 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
292 nTrials = pythiaGenHeader->Trials();
296 fAnaUE->FillTrials("#sum{ntrials}",fAvgTrials);
300 fListOfHistos = (TList*)fAnaUE->GetHistograms()->Clone();
301 PostData(0,fListOfHistos);
304 //____________________________________________________________________
305 void AliAnalysisTaskUE::AnalyseUE()
309 // Get jets and order by pT
311 *jetVect = fAnaUE->GetOrderedClusters(fAODBranch, fUseChPartJet, fChJetPtMin);
313 if( jetVect[0].Pt() < 0. ) {
314 if( fDebug > 1 ) AliInfo("\n Skipping Event, not jet found...");
317 if (fDebug >1 ) AliInfo(Form("\n Pt Leading Jet = %6.1f eta=%5.3f ", jetVect[0].Pt(), jetVect[0].Eta() ));
320 // Select events according to analysis type
321 if ( ! (fAnaUE->AnaTypeSelection(jetVect))) return;
323 // Find max and min regions with real tracks
324 if (!fUseMCParticleBranch){
325 // Primary vertex distribution
326 AliAODVertex* vertex = (AliAODVertex*)fAOD->GetPrimaryVertex();
327 fAnaUE->FillVertex(vertex->GetNContributors());
329 // Fill leading "jet" histogram
330 fAnaUE->FillLeadingJet(jetVect[0].Pt());
332 fAnaUE->FindMaxMinRegions( jetVect, fConePosition );
336 // this is the part we only use when we have MC information
337 // More than a test for values of it also resumes the reconstruction efficiency of jets
338 // As commented bellow if available for the data, we try to pair reconstructed jets with simulated ones
339 // afterwards we kept angular variables of MC jet to perform UE analysis over MC particles
340 // TODO: Handle Multiple jet environment. 06/2009 just suited for inclusive jet condition ( fAnaType = 1 )
342 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
344 Printf("ERROR: Could not retrieve MC event handler");
348 AliMCEvent* mcEvent = mcHandler->MCEvent();
350 Printf("ERROR: Could not retrieve MC event");
353 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
354 if(!pythiaGenHeader){
358 fAnaUE->AnalyseMC(jetVect,mcEvent,pythiaGenHeader, fConePosition, fUseAliStack, fConstrainDistance, fMinDistance);
362 fAnaUE->FillRegions(fIsNorm2Area, jetVect);
366 //____________________________________________________________________
367 AliAnalysisTaskUE* AliAnalysisTaskUE::Instance()
374 fgTaskUE = new AliAnalysisTaskUE();
379 //____________________________________________________________________
380 void AliAnalysisTaskUE::Terminate(Option_t */*option*/)
383 // Terminate analysis
385 fListOfHistos = dynamic_cast<TList*> (GetOutputData(0));
387 AliError("Histogram List is not available");
390 if (!gROOT->IsBatch()){
391 //call class AliHistogramsUE
392 AliHistogramsUE *histos=new AliHistogramsUE(fListOfHistos);
395 AliInfo(" Batch mode, not histograms will be shown...");
399 AliInfo("End analysis");
403 void AliAnalysisTaskUE::WriteSettings()
406 //Print analysis settings on screen
408 AliInfo(" All Analysis Settings in Saved Tree");
409 fAnaUE->WriteSettings();