1 // **************************************
2 // Task used for Pythia MPI studies in ZZ train
3 // Output is stored in an exchance container
4 // *******************************************
7 /**************************************************************************
8 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
10 * Author: The ALICE Off-line Project. *
11 * Contributors are mentioned in the code where appropriate. *
13 * Permission to use, copy, modify and distribute this software and its *
14 * documentation strictly for non-commercial purposes is hereby granted *
15 * without fee, provided that the above copyright notice appears in all *
16 * copies and that both the copyright notice and this permission notice *
17 * appear in the supporting documentation. The authors make no claims *
18 * about the suitability of this software for any purpose. It is *
19 * provided "as is" without express or implied warranty. *
20 **************************************************************************/
24 #include "AliAnalysisDataSlot.h"
25 #include "AliAnalysisDataContainer.h"
26 #include "AliAnalysisManager.h"
27 #include "AliMCEvent.h"
28 #include "AliVEvent.h"
29 #include "AliAnalysisTaskPythiaMpi.h"
30 #include "AliGenEventHeader.h"
31 #include "AliVParticle.h"
32 #include "AliPythia.h"
33 #include "AliPythia8.h"
37 ClassImp(AliAnalysisTaskPythiaMpi)
39 //_________________________________________________________| Constructor
41 AliAnalysisTaskPythiaMpi::AliAnalysisTaskPythiaMpi():
53 // Default constructor
57 ////_________________________________________________________| Specific Constructor
59 AliAnalysisTaskPythiaMpi::AliAnalysisTaskPythiaMpi(const char* name):
60 AliAnalysisTaskSE(name),
72 // Specific constructor. Initialization of Inputs and Outputs
74 Info("AliAnalysisMpi","Calling Constructor");
75 // Output slot #1 writes into a TList container
76 DefineInput(0, TChain::Class());
77 DefineOutput(1, TList::Class());
80 //_________________________________________________________| Assignment Operator
82 AliAnalysisTaskPythiaMpi& AliAnalysisTaskPythiaMpi::operator=(const AliAnalysisTaskPythiaMpi& c)
86 AliAnalysisTaskSE::operator=(c);
87 fMcEvent = c.fMcEvent;
88 fMcHandler = c.fMcHandler;
89 fOutputList = c.fOutputList;
90 fHistEvents = c.fHistEvents;
92 fHistEta = c.fHistEta;
93 fHistMpi = c.fHistMpi;
94 fHistMultMpi = c.fHistMultMpi;
95 fHistdNdetaMpi = c.fHistdNdetaMpi;
101 //_________________________________________________________| Copy Constructor
103 AliAnalysisTaskPythiaMpi::AliAnalysisTaskPythiaMpi(const AliAnalysisTaskPythiaMpi& c):
104 AliAnalysisTaskSE(c),
105 fMcEvent(c.fMcEvent),
106 fMcHandler(c.fMcHandler),
107 fOutputList(c.fOutputList),
108 fHistEvents(c.fHistEvents),
110 fHistEta(c.fHistEta),
111 fHistMpi(c.fHistMpi),
112 fHistMultMpi(c.fHistMultMpi),
113 fHistdNdetaMpi(c.fHistdNdetaMpi)
118 //_________________________________________________________| Destructor
120 AliAnalysisTaskPythiaMpi::~AliAnalysisTaskPythiaMpi()
125 Info("~AliAnalysisTaskPythiaMpi","Calling Destructor");
126 if(fOutputList) delete fOutputList;
127 if(fHistEvents) delete fHistEvents;
128 if(fHistPt) delete fHistPt;
129 if(fHistEta) delete fHistEta;
130 if(fHistMpi) delete fHistMpi;
131 if(fHistMultMpi) delete fHistMultMpi;
132 if(fHistdNdetaMpi) delete fHistdNdetaMpi;
136 //_____________________________________________________________________
138 void AliAnalysisTaskPythiaMpi::UserCreateOutputObjects()
140 Info("CreateOutputObjects","CreateOutputObjects of task %s",GetName());
142 fOutputList = new TList();
143 fOutputList->SetOwner(kTRUE);
145 fHistEvents = new TH1I("fHistNEvents","fHistNEvents",2,0,2);
146 fHistEvents->GetXaxis()->SetBinLabel(1,"All events");
147 fHistEvents->GetXaxis()->SetBinLabel(2,"Events with |zVtx|<10cm");
149 fHistPt = new TH1F("fHistPt","p_{T} distribution",15,0.2,5.0);
150 fHistPt->GetXaxis()->SetTitle("p_{T} (GeV/c)");
151 fHistPt->GetYaxis()->SetTitle("dN/dp_{T} (GeV/c^{-1})");
152 fHistPt->SetMarkerStyle(kFullCircle);
154 fHistEta = new TH1F("fHistEta","eta distribution",20,-1,1);
155 fHistEta->GetXaxis()->SetTitle("#eta");
156 fHistEta->GetYaxis()->SetTitle("dN/d#eta");
157 fHistEta->SetMarkerStyle(kFullCircle);
159 fHistMpi = new TH1F("fHistMpi","MPIs distribution",50,0,50);
160 fHistMpi->GetXaxis()->SetTitle("#MPIs");
161 fHistMpi->GetYaxis()->SetTitle("dN/dMPIs");
162 fHistMpi->SetMarkerStyle(kFullCircle);
164 fHistMultMpi = new TH2F("fHistMultMpi","Multiplicity vs MPIs",50,0,50,100,0,1e4);
165 fHistMultMpi->GetXaxis()->SetTitle("#MPIs");
166 fHistMultMpi->GetYaxis()->SetTitle("MC particles");
167 fHistMultMpi->SetMarkerStyle(kFullDotSmall);
169 fHistdNdetaMpi = new TH2F("fHistdNdetaMpi","dN/d#etadMPIs",50,0,50,100,-5,5);
170 fHistdNdetaMpi->GetXaxis()->SetTitle("#MPIs");
171 fHistdNdetaMpi->GetYaxis()->SetTitle("#eta");
172 //fHistdNdetaMpi->SetMarkerStyle();
175 fOutputList->Add(fHistEvents);
176 fOutputList->Add(fHistPt);
177 fOutputList->Add(fHistEta);
178 fOutputList->Add(fHistMpi);
179 fOutputList->Add(fHistMultMpi);
180 fOutputList->Add(fHistdNdetaMpi);
182 PostData(1,fOutputList);
186 //_________________________________________________________________________
188 void AliAnalysisTaskPythiaMpi::Init()
191 if(fDebug > 1) printf("AnalysisTaskPythiaMpi::Init() \n");
192 fMcHandler = dynamic_cast<AliInputEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
195 //_________________________________________________________________________
197 void AliAnalysisTaskPythiaMpi::LocalInit()
204 if(fDebug > 1) printf("AnalysisTaskPythiaMpi::LocalInit() \n");
208 //____________________________________________| User Exec
210 void AliAnalysisTaskPythiaMpi::UserExec(Option_t*)
213 // handle and reset the output jet branch
214 Info("UserExec","Start of method");
215 if(fDebug > 1) printf("AliAnalysisTaskPythiaMpi::UserExec \n");
218 // Execute analysis for current event
221 fHistEvents->Fill(0.5);
223 fMcEvent = fMcHandler->MCEvent();
225 if(fDebug > 1) printf("AnalysisTaskPythiaMpi::Handler() fMcHandler=NULL\n");
229 if(fDebug > 1) printf("AnalysisTaskPythiaMpi::Exec() fMcEvent=NULL \n");
233 const AliVVertex *vtxMC = fMcEvent->GetPrimaryVertex();
234 Float_t zVtx = vtxMC->GetZ();
235 if(TMath::Abs(zVtx)<10) fHistEvents->Fill(1.5);
238 Printf("MC particles: %d",fMCEvent->GetNumberOfTracks());
242 Double_t Nmpi = (AliPythia8::Instance())->GetNMPI();
243 fHistMpi->Fill(Nmpi);
245 fHistMultMpi->Fill(Nmpi,fMCEvent->GetNumberOfTracks());
247 //loop over the tracks
249 for(Int_t iTracks = 0; iTracks < fMCEvent->GetNumberOfTracks(); iTracks++){
250 AliVParticle* track = fMCEvent->GetTrack(iTracks);
252 Printf("ERROR: Could not receive track %d (mc loop)",iTracks);
255 fHistPt->Fill(track->Pt());
256 fHistEta->Fill(track->Eta());
258 fHistdNdetaMpi->Fill(Nmpi,track->Eta());
262 PostData(1, fOutputList);
266 //____________________________________________________________________________
268 void AliAnalysisTaskPythiaMpi::Terminate(Option_t*){
270 // Terminate analysis
272 Info("Terminate","Start and end of Method");
273 AliAnalysisTaskSE::Terminate();
275 fOutputList = dynamic_cast<TList*>(GetOutputData(1));
277 printf("ERROR: fOutputList not available\n");