]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGJE/AliAnalysisTaskUE.cxx
Transition PWG0 -> PWGUD
[u/mrichter/AliRoot.git] / PWGJE / AliAnalysisTaskUE.cxx
CommitLineData
f3050824 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/* $Id:$ */
6ef5bfa4 17
f3050824 18#include <TROOT.h>
f3050824 19#include <TChain.h>
20#include <TFile.h>
21#include <TList.h>
f3050824 22#include <TMath.h>
ddbad1f5 23#include <TProfile.h>
6ef5bfa4 24#include <TTree.h>
00a1afbd 25#include <TVector3.h>
26#include <TH1F.h>
f3050824 27
00a1afbd 28#include "AliAnalyseUE.h"
ddbad1f5 29#include "AliHistogramsUE.h"
f3050824 30#include "AliAnalysisTaskUE.h"
00a1afbd 31#include "AliHistogramsUE.h"
32
f3050824 33#include "AliAnalysisManager.h"
34#include "AliMCEventHandler.h"
f3050824 35
623ed0a0 36#include "AliAnalysisHelperJetTasks.h"
00a1afbd 37#include "AliAODHandler.h"
38#include "AliAODInputHandler.h"
39#include "AliGenPythiaEventHeader.h"
f3050824 40#include "AliLog.h"
00a1afbd 41#include "AliInputEventHandler.h"
f3050824 42
ddbad1f5 43
00a1afbd 44////////////////////////////////////////////////////////////////////////
45//
f3050824 46// Analysis class for Underlying Event studies
47//
48// Look for correlations on the tranverse regions to
49// the leading charged jet
50//
02480db2 51// This class needs as input AOD with track and Jets.
52// The output is a list of histograms
f3050824 53//
54// AOD can be either connected to the InputEventHandler
55// for a chain of AOD files
56// or
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
60//
61// Arian.Abrahantes.Quintana@cern.ch
62// Ernesto.Lopez.Torres@cern.ch
ddbad1f5 63// vallero@physi.uni-heidelberg.de
f3050824 64//
00a1afbd 65////////////////////////////////////////////////////////////////////////
f3050824 66
f3050824 67ClassImp( AliAnalysisTaskUE)
68
00a1afbd 69// Define global pointer
70AliAnalysisTaskUE* AliAnalysisTaskUE::fgTaskUE=NULL;
f3050824 71
72//____________________________________________________________________
73AliAnalysisTaskUE:: AliAnalysisTaskUE(const char* name):
94ee88d4 74AliAnalysisTask(name,""),
ddbad1f5 75fHistosUE(0x0),
00a1afbd 76fAnaUE(0x0),
6ef5bfa4 77fAOD(0x0),
00a1afbd 78fAODBranch("jets"),
79fDebug(0),
ddbad1f5 80fListOfHistos(0x0),
81//Configuration
6ef5bfa4 82fBinsPtInHist(30),
baf36668 83fIsNorm2Area(kTRUE),
00a1afbd 84fMaxJetPtInHist(300.),
85fMinJetPtInHist(0.),
623ed0a0 86fConstrainDistance(kTRUE),
87fMinDistance(0.2),
88fSimulateChJetPt(kFALSE),
89fUseAliStack(kTRUE),
00a1afbd 90fUseMCParticleBranch(kFALSE),
94ee88d4 91fnTracksVertex(3), // QA tracks pointing to principal vertex (= 3 default)
92fZVertex(5.),
6ef5bfa4 93fAnaType(1),
623ed0a0 94fConePosition(1),
00a1afbd 95fConeRadius(0.7),
96fFilterBit(0xFF),
97fJetsOnFly(kFALSE),
98fRegionType(1),
9d9a3c85 99fUseChargeHadrons(kFALSE),
00a1afbd 100fUseChPartJet(kFALSE),
6ef5bfa4 101fUsePositiveCharge(kTRUE),
00a1afbd 102fUseSingleCharge(kFALSE),
6ef5bfa4 103fOrdering(1),
623ed0a0 104fChJetPtMin(5.0),
6ef5bfa4 105fJet1EtaCut(0.2),
106fJet2DeltaPhiCut(2.616), // 150 degrees
107fJet2RatioPtCut(0.8),
108fJet3PtCut(15.),
6ef5bfa4 109fTrackEtaCut(0.9),
00a1afbd 110fTrackPtCut(0.),
ddbad1f5 111//For MC
00a1afbd 112fAvgTrials(1)
f3050824 113{
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());
94ee88d4 120
f3050824 121}
122
00a1afbd 123//____________________________________________________________________
124AliAnalysisTaskUE:: AliAnalysisTaskUE(const AliAnalysisTaskUE & original):
125AliAnalysisTask(),
ddbad1f5 126fHistosUE(original.fHistosUE),
00a1afbd 127fAnaUE(original.fAnaUE),
128fAOD(original.fAOD),
129fAODBranch(original.fAODBranch),
130fDebug(original.fDebug),
131fListOfHistos(original.fListOfHistos),
ddbad1f5 132//Configuration
00a1afbd 133fBinsPtInHist(original.fBinsPtInHist),
134fIsNorm2Area(original.fIsNorm2Area),
135fMaxJetPtInHist(original.fMaxJetPtInHist),
136fMinJetPtInHist(original.fMinJetPtInHist),
137fConstrainDistance(original.fConstrainDistance),
138fMinDistance(original.fMinDistance),
139fSimulateChJetPt(original.fSimulateChJetPt),
140fUseAliStack(original.fUseAliStack),
141fUseMCParticleBranch(original.fUseMCParticleBranch),
142fnTracksVertex(original.fnTracksVertex), // QA tracks pointing to principal vertex (= 3 default)
143fZVertex(original.fZVertex),
144fAnaType(original.fAnaType),
145fConePosition(original.fConePosition),
146fConeRadius(original.fConeRadius),
147fFilterBit(original.fFilterBit),
148fJetsOnFly(original.fJetsOnFly),
149fRegionType(original.fRegionType),
150fUseChargeHadrons(original.fUseChargeHadrons),
151fUseChPartJet(original.fUseChPartJet),
152fUsePositiveCharge(original.fUsePositiveCharge),
153fUseSingleCharge(original.fUseSingleCharge),
154fOrdering(original.fOrdering),
155fChJetPtMin(original.fChJetPtMin),
156fJet1EtaCut(original.fJet1EtaCut),
157fJet2DeltaPhiCut(original.fJet2DeltaPhiCut), // 150 degrees
158fJet2RatioPtCut(original.fJet2RatioPtCut),
159fJet3PtCut(original.fJet3PtCut),
160fTrackEtaCut(original.fTrackEtaCut),
161fTrackPtCut(original.fTrackPtCut),
ddbad1f5 162//For MC
00a1afbd 163fAvgTrials(original.fAvgTrials)
164{
165 // Copy constructor
166}
167
168
169//______________________________________________________________
170AliAnalysisTaskUE & AliAnalysisTaskUE::operator = (const AliAnalysisTaskUE & /*source*/)
171{
172 // assignment operator
173 return *this;
174}
175
623ed0a0 176//______________________________________________________________
177Bool_t AliAnalysisTaskUE::Notify()
178{
179 //
180 // Implemented Notify() to read the cross sections
181 // and number of trials from pyxsec.root
519378fb 182 // Copy from AliAnalysisTaskJFSystematics
856f9829 183 fAvgTrials = 1;
623ed0a0 184 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
519378fb 185 Float_t xsection = 0;
00a1afbd 186 Float_t trials = 1;
623ed0a0 187 if(tree){
00a1afbd 188 TFile *curfile = tree->GetCurrentFile();
189 if (!curfile) {
190 Error("Notify","No current file");
191 return kFALSE;
192 }
193
194 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,trials);
195
ddbad1f5 196 fHistosUE->GetXsec()->Fill("<#sigma>",xsection);
9d9a3c85 197
00a1afbd 198 // construct average trials
199 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
200 if(trials>=nEntries && nEntries>0.)fAvgTrials = trials/nEntries;
201 }
c4396fd4 202
623ed0a0 203 return kTRUE;
204}
205
f3050824 206//____________________________________________________________________
207void AliAnalysisTaskUE::ConnectInputData(Option_t* /*option*/)
208{
6ef5bfa4 209 // Connect the input data
f3050824 210
3a9d4bcf 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 )
6ef5bfa4 214 // we need to check where it is and get the pointer to AODEvent in the right way
f3050824 215
00a1afbd 216 // Delta AODs are also accepted
c4396fd4 217
218
219 if (fDebug > 1) AliInfo("ConnectInputData() ");
f3050824 220
221 TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
222
c4396fd4 223 if( handler && handler->InheritsFrom("AliAODInputHandler") ) { // input AOD
00a1afbd 224 fAOD = ((AliAODInputHandler*)handler)->GetEvent();
225 if(!fJetsOnFly){
226 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODInputHandler");
227 }else{
ddbad1f5 228 if (fDebug > 1) AliInfo(" ==== Tracks from AliAODInputHandler / Jets on-the-fly");
00a1afbd 229 }
230 } else { //output AOD
231 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
232 if( handler && handler->InheritsFrom("AliAODHandler") ) {
233 fAOD = ((AliAODHandler*)handler)->GetAOD();
234 if (!fJetsOnFly){
235 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler");
236 } else {
237 if (fDebug > 1) AliInfo(" ==== Tracks from AliAODHandler / Jets on-the-fly");
238 }
239 }else {
240 AliFatal("I can't get any AOD Event Handler");
241 return;
242 }
243 }
244
245 fAnaUE->Initialize( *this );
ddbad1f5 246
f3050824 247}
248
249//____________________________________________________________________
250void AliAnalysisTaskUE::CreateOutputObjects()
251{
6ef5bfa4 252 // Create the output container
00a1afbd 253
f3050824 254 if (fDebug > 1) AliInfo("CreateOutPutData()");
00a1afbd 255
256 //Initialize AliAnalysisUE, a class implementing the main analysis algorithms
257 fAnaUE = new AliAnalyseUE();
ddbad1f5 258 fHistosUE = new AliHistogramsUE();
259
260 if (fListOfHistos != NULL){
261 delete fListOfHistos;
262 fListOfHistos = NULL;
263 }
264 if (!fListOfHistos){
265 fListOfHistos = new TList();
266 fListOfHistos->SetOwner(kTRUE);
267 }
00a1afbd 268
269 //Initialize output histograms
ddbad1f5 270 fHistosUE->CreateHistograms(fListOfHistos,fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist, fTrackEtaCut);
271 AddSettingsTree();
1e996f55 272
ddbad1f5 273 PostData(0,fListOfHistos);
f3050824 274}
275
f3050824 276//____________________________________________________________________
277void AliAnalysisTaskUE::Exec(Option_t */*option*/)
278{
00a1afbd 279 // Trigger selection ************************************************
280 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
216601f0 281 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
3a9d4bcf 282 if (!fAnaUE->TriggerSelection(inputHandler)) return;
283
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 !!!
00a1afbd 287
288 // Execute analysis for current event ******************************
289
6ef5bfa4 290 if ( fDebug > 3 ) AliInfo( " Processing event..." );
00a1afbd 291
519378fb 292 // fetch the pythia header info and get the trials
293 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
294 Float_t nTrials = 1;
c4396fd4 295 if (mcHandler) {
00a1afbd 296 AliMCEvent* mcEvent = mcHandler->MCEvent();
297 if (mcEvent) {
298 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
299 if(pythiaGenHeader){
300 nTrials = pythiaGenHeader->Trials();
301 }
302 }
303 }
ddbad1f5 304 fHistosUE->GetTrials()->Fill("#sum{ntrials}",fAvgTrials);
00a1afbd 305
306 //analyse the event
02480db2 307 AnalyseUE();
ddbad1f5 308
309 PostData(0,fListOfHistos);
f3050824 310}
f3050824 311
ddbad1f5 312//____________________________________________________________________
313void AliAnalysisTaskUE::AddSettingsTree()
314{
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);
334}
335
f3050824 336//____________________________________________________________________
337void AliAnalysisTaskUE::AnalyseUE()
338{
00a1afbd 339
6ef5bfa4 340
00a1afbd 341 // Get jets and order by pT
342 TVector3 jetVect[3];
ddbad1f5 343 *jetVect = fAnaUE->GetOrderedClusters(fAODBranch, fUseChPartJet, fChJetPtMin );
c4396fd4 344
00a1afbd 345 if( jetVect[0].Pt() < 0. ) {
346 if( fDebug > 1 ) AliInfo("\n Skipping Event, not jet found...");
347 return;
348 } else {
349 if (fDebug >1 ) AliInfo(Form("\n Pt Leading Jet = %6.1f eta=%5.3f ", jetVect[0].Pt(), jetVect[0].Eta() ));
350 }
c4396fd4 351
3a9d4bcf 352 // Select events according to analysis type ***********************************
00a1afbd 353 if ( ! (fAnaUE->AnaTypeSelection(jetVect))) return;
02480db2 354
00a1afbd 355 // Find max and min regions with real tracks
356 if (!fUseMCParticleBranch){
357 // Primary vertex distribution
358 AliAODVertex* vertex = (AliAODVertex*)fAOD->GetPrimaryVertex();
ddbad1f5 359 fHistosUE->FillHistogram("hVertexMult",vertex->GetNContributors());
00a1afbd 360
361 // Fill leading "jet" histogram
ddbad1f5 362 fHistosUE->FillHistogram("hEleadingPt",jetVect[0].Pt());
02480db2 363
3a9d4bcf 364 fAnaUE->FindMaxMinRegions( jetVect, fConePosition, 0, 0 );
baf36668 365
00a1afbd 366 }else {
6ef5bfa4 367
623ed0a0 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 )
6ef5bfa4 373
623ed0a0 374 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
375 if (!mcHandler) {
376 Printf("ERROR: Could not retrieve MC event handler");
377 return;
378 }
379
380 AliMCEvent* mcEvent = mcHandler->MCEvent();
381 if (!mcEvent) {
382 Printf("ERROR: Could not retrieve MC event");
383 return;
384 }
385 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
386 if(!pythiaGenHeader){
387 return;
388 }
f3050824 389
00a1afbd 390 fAnaUE->AnalyseMC(jetVect,mcEvent,pythiaGenHeader, fConePosition, fUseAliStack, fConstrainDistance, fMinDistance);
623ed0a0 391
f3050824 392 }
f3050824 393
00a1afbd 394 fAnaUE->FillRegions(fIsNorm2Area, jetVect);
6ef5bfa4 395
f3050824 396}
397
398//____________________________________________________________________
00a1afbd 399AliAnalysisTaskUE* AliAnalysisTaskUE::Instance()
400{
f3050824 401
00a1afbd 402 //Create instance
403 if (fgTaskUE) {
404 return fgTaskUE;
405 } else {
406 fgTaskUE = new AliAnalysisTaskUE();
407 return fgTaskUE;
408 }
02480db2 409}
6ef5bfa4 410
ddbad1f5 411
6ef5bfa4 412//____________________________________________________________________
00a1afbd 413void AliAnalysisTaskUE::Terminate(Option_t */*option*/)
6ef5bfa4 414{
94ee88d4 415
00a1afbd 416 // Terminate analysis
6ef5bfa4 417
3a9d4bcf 418 if (!gROOT->IsBatch()){
00a1afbd 419 fListOfHistos = dynamic_cast<TList*> (GetOutputData(0));
420 if (!fListOfHistos){
421 AliError("Histogram List is not available");
422 return;
3a9d4bcf 423 }
00a1afbd 424 //call class AliHistogramsUE
425 AliHistogramsUE *histos=new AliHistogramsUE(fListOfHistos);
426 histos->DrawUE(0);
6ef5bfa4 427 } else {
00a1afbd 428 AliInfo(" Batch mode, not histograms will be shown...");
6ef5bfa4 429 }
00a1afbd 430
6ef5bfa4 431 if( fDebug > 1 )
432 AliInfo("End analysis");
00a1afbd 433
6ef5bfa4 434}
f3050824 435
6ef5bfa4 436void AliAnalysisTaskUE::WriteSettings()
1e996f55 437{
00a1afbd 438
439 //Print analysis settings on screen
440 if (fDebug > 5){
6ef5bfa4 441 AliInfo(" All Analysis Settings in Saved Tree");
ddbad1f5 442 fListOfHistos = dynamic_cast<TList*> (GetOutputData(0));
443 if (!fListOfHistos){
444 AliError("Histogram List is not available");
445 return;
446 }
447 TTree *tree = (TTree*)(fListOfHistos->FindObject("UEAnalysisSettings"));
448 tree->Scan();
449 }
6ef5bfa4 450}