1 /*************************************************************************
2 * Copyright(c) 1998-2008, 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 **************************************************************************/
16 // ******************************************
17 // * analysis task for azimuthal isotropic *
18 // * expansion in highly central collisions *
19 // * author: Cristian Andrei *
20 // * acristian@niham.nipne.ro *
21 // ******************************************
27 #include "TObjArray.h"
29 // #include "TCanvas.h"
31 #include "AliAnalysisManager.h"
32 #include "AliMCEvent.h"
33 #include "AliMCEventHandler.h"
34 #include "AliESDEvent.h"
35 #include "AliESDInputHandler.h"
36 #include "AliESDtrackCuts.h"
37 #include "AliCFContainer.h"
39 #include "AliAnalysisCentralCutMC.h"
40 #include "AliAnalysisCentralCutESD.h"
41 #include "AliAnalysisCentralCutEvtMC.h"
42 #include "AliAnalysisCentralCutEvtESD.h"
43 #include "AliAnalysisCentralExtrapolate.h"
44 #include "AliAnalysisTaskCentral.h"
47 ClassImp(AliAnalysisTaskCentral)
50 //________________________________________________________________________
51 AliAnalysisTaskCentral::AliAnalysisTaskCentral(const char *name)
52 : AliAnalysisTask(name, "")
63 printf("AliAnalysisTaskCentral::AliAnalysisTaskCentral(const char *name)\n");
65 // Define input and output slots here
66 DefineInput(0, TChain::Class());
68 DefineOutput(0, TList::Class());
71 for(Int_t i=0; i<10; i++){
78 //________________________________________________________________________
79 AliAnalysisTaskCentral::~AliAnalysisTaskCentral()
82 // Delete the created objects
91 if(fNoEvt) delete fNoEvt;
93 if(fCFContainerPi) delete fCFContainerPi;
94 if(fCFContainerPi) delete fCFContainerK;
95 if(fCFContainerPi) delete fCFContainerP;
97 if(fOutList) delete fOutList;
101 //________________________________________________________________________
102 void AliAnalysisTaskCentral::ConnectInputData(Option_t *) {
103 // get the event from the input chain
105 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
106 printf("tree(%p)\n", (void*)tree);
109 Printf("ERROR: Could not read chain from input slot 0");
111 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
113 Printf("ERROR: Could not get ESDInputHandler");
115 else fESD = esdH->GetEvent();
117 AliMCEventHandler *mcH = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
119 Printf("ERROR: Could not get MCInputHandler");
121 else fMC = mcH->MCEvent();
125 //________________________________________________________________________
126 void AliAnalysisTaskCentral::CreateOutputObjects(){
127 //Creates the output list
129 fNoEvt = new TH1F(Form("%s_NoEvt",GetName()), "Number of processed events", 1, 0.0, 1.0);
132 //min and max variable values (to do: move these to a separate cuts class)
133 const Double_t ptmin = 0.0 ; //bins in pt
134 const Double_t ptmax = 5.0 ; //bins in y
135 const Double_t etamin = -0.9 ; //bins in pt
136 const Double_t etamax = 0.9 ; //bins in y
137 //apropiate number of bins for histos and CF Container
138 const Int_t nbinpt = 25 ; //bins in pt
139 const Int_t nbineta = 25 ; //bins in y
141 //Correction Framework CONTAINER DEFINITION
142 //the sensitive variables, their indices
145 //Setting up the container grid...
146 const UInt_t nstep = 2 ; //number of selection steps MC & ESD
147 const Int_t nvar = 2 ; //number of variables on the grid:pt,eta
149 //arrays for the number of bins in each dimension
150 //nbin is defined above =
155 //arrays for lower bounds :
156 Double_t *binLim1=new Double_t[nbinpt+1];
157 Double_t *binLim2=new Double_t[nbineta+1];
159 //values for bin lower bounds
160 for(Int_t i=0; i<=nbinpt; i++) binLim1[i]=(Double_t)ptmin + (ptmax-ptmin)/nbinpt*(Double_t)i ;
161 for(Int_t i=0; i<=nbineta; i++) binLim2[i]=(Double_t)etamin + (etamax-etamin) /nbineta*(Double_t)i ;
164 fCFContainerPi = new AliCFContainer(Form("%s_CFCont_Pi",GetName()),"container for tracks",nstep,nvar,iBin);
165 fCFContainerK = new AliCFContainer(Form("%s_CFCont_K",GetName()),"container for tracks",nstep,nvar,iBin);
166 fCFContainerP = new AliCFContainer(Form("%s_CFCont_P",GetName()),"container for tracks",nstep,nvar,iBin);
168 //setting the bin limits
169 fCFContainerPi -> SetBinLimits(ipt,binLim1);
170 fCFContainerPi -> SetBinLimits(ieta,binLim2);
172 fCFContainerK -> SetBinLimits(ipt,binLim1);
173 fCFContainerK -> SetBinLimits(ieta,binLim2);
175 fCFContainerP -> SetBinLimits(ipt,binLim1);
176 fCFContainerP -> SetBinLimits(ieta,binLim2);
178 //outout list creation
179 fOutList = new TList();
180 fOutList->Add(fNoEvt);
181 fOutList->Add(fCFContainerPi);
182 fOutList->Add(fCFContainerK);
183 fOutList->Add(fCFContainerP);
187 //________________________________________________________________
188 void AliAnalysisTaskCentral::InitCuts(){
190 //Create and set cuts
192 //------------------EVENT LEVEL CUTS--------------------
193 //-----------------------MC-----------------------------
194 AliAnalysisCentralCutEvtMC *evMCCuts = new AliAnalysisCentralCutEvtMC();
195 evMCCuts->SetMultiplicityRange(1,100);
196 evMCCuts->SetDirectivityRange(0.0, 1.0);
197 evMCCuts->SetDirUnitRange(0.0, 1.0);
199 //-----------------------ESD----------------------------
200 AliAnalysisCentralCutEvtESD *evESDCuts = new AliAnalysisCentralCutEvtESD();
201 evESDCuts->SetMultiplicityRange(1,100);
202 evESDCuts->SetDirectivityRange(0.0, 1.0);
203 evESDCuts->SetSPDMultiplicityRange(1,20000);
204 evESDCuts->SetSPDDirectivityRange(0.0, 1.0);
206 TObjArray* mcEventCuts = new TObjArray();
207 mcEventCuts->AddLast(evMCCuts);
209 TObjArray* esdEventCuts = new TObjArray();
210 esdEventCuts->AddLast(evESDCuts);
213 //------------------PARTICLE LEVEL CUTS-----------------
214 //-------------------General MC Cuts--------------------
215 AliAnalysisCentralCutMC *mcCutsGen = new AliAnalysisCentralCutMC();
216 mcCutsGen->SetOnlyPrimaries(kTRUE);
217 mcCutsGen->SetPtRange(0.2,4.0);
218 mcCutsGen->SetEtaRange(-0.2,0.2);
220 //-------------------Specific MC Cuts-------------------
221 AliAnalysisCentralCutMC *mcCutsPi = new AliAnalysisCentralCutMC();
222 mcCutsPi->SetPDGCode(211); //211 pion; 321 kaon; 2212 proton
224 AliAnalysisCentralCutMC *mcCutsK = new AliAnalysisCentralCutMC();
225 mcCutsK->SetPDGCode(321); //211 pion; 321 kaon; 2212 proton
227 AliAnalysisCentralCutMC *mcCutsP = new AliAnalysisCentralCutMC();
228 mcCutsP->SetPDGCode(2212); //211 pion; 321 kaon; 2212 proton
230 //--------each task has its own mcList of cuts----------
231 TObjArray *mcListGen = new TObjArray(); //general MC cuts
232 mcListGen->AddLast(mcCutsGen);
234 TObjArray *mcListPi = new TObjArray(); //task pt pions
235 mcListPi->AddLast(mcCutsPi);
237 TObjArray *mcListK = new TObjArray(); //task pt kaons
238 mcListK->AddLast(mcCutsK);
240 TObjArray *mcListP = new TObjArray(); //task pt protons
241 mcListP->AddLast(mcCutsP);
244 //-------------------General ESD Cuts-------------------
245 AliESDtrackCuts *esdCutsGen = new AliESDtrackCuts("AliESDtrackCuts", "Loose");
246 esdCutsGen->SetMinNClustersTPC(50);
247 esdCutsGen->SetMaxChi2PerClusterTPC(2.2);
248 esdCutsGen->SetMaxCovDiagonalElements(0.5,0.5,0.5,0.5,0.5);
249 esdCutsGen->SetRequireTPCRefit(kTRUE);
250 esdCutsGen->SetAcceptKinkDaughters(kFALSE);
251 esdCutsGen->SetMaxNsigmaToVertex(2.0);
252 esdCutsGen->SetRequireSigmaToVertex(kTRUE);
253 esdCutsGen->SetPtRange(0.2,4.0);
254 esdCutsGen->SetEtaRange(-0.2,0.2);
256 //-------------------Specific ESD Cuts------------------
257 AliAnalysisCentralCutESD *esdCutsPi = new AliAnalysisCentralCutESD("AliAnalysisCentralCutESD","NIHAM");
258 esdCutsPi->SetPIDtype("Custom");
259 esdCutsPi->SetPriorFunctions(kFALSE);
260 esdCutsPi->SetPartType(kPiPlus);
262 AliAnalysisCentralCutESD *esdCutsK = new AliAnalysisCentralCutESD("AliAnalysisCentralCutESD","NIHAM");
263 esdCutsK->SetPIDtype("Custom");
264 esdCutsK->SetPriorFunctions(kFALSE);
265 esdCutsK->SetPartType(kKPlus);
267 AliAnalysisCentralCutESD *esdCutsP = new AliAnalysisCentralCutESD("AliAnalysisCentralCutESD","NIHAM");
268 esdCutsP->SetPIDtype("Custom");
269 esdCutsP->SetPriorFunctions(kFALSE);
270 esdCutsP->SetPartType(kProton);
272 //--------each task has its own esdList of cuts---------
273 TObjArray* esdListGen = new TObjArray(); //general ESD track cuts
274 esdListGen->AddLast(esdCutsGen);
276 TObjArray* esdListPi = new TObjArray();
277 esdListPi->AddLast(esdCutsPi);
279 TObjArray* esdListK = new TObjArray();
280 esdListK->AddLast(esdCutsK);
282 TObjArray* esdListP = new TObjArray();
283 esdListP->AddLast(esdCutsP);
285 //------set the cuts to the RIGHT! fCutsList slots-------
286 // // event level cuts
287 SetCuts(0, mcEventCuts);
288 SetCuts(1, esdEventCuts);
290 //particle level cuts
291 SetCuts(2, mcListGen);
292 SetCuts(3, mcListPi);
296 SetCuts(6, esdListGen);
297 SetCuts(7, esdListPi);
298 SetCuts(8, esdListK);
299 SetCuts(9, esdListP);
304 //_______________________________________________________________________
305 void AliAnalysisTaskCentral::SendEvent(TObject *obj) const{
307 // Some cuts (ie MC IsPrimary) need the MC Event info
310 printf("No particle cut list found!\n\n");
314 for(Int_t isel=0;isel< 10; isel++){
315 if(!fCutsList[isel]) continue;
316 TObjArrayIter iter(fCutsList[isel]);
317 AliAnalysisCuts *cut = 0;
319 while ((cut = (AliAnalysisCuts*)iter.Next())) {
321 TString cutName=cut->GetName();
323 printf("No cutname!\n");
327 Bool_t checkCut=cutName.Contains("AliAnalysisCentralCutMC");
330 AliAnalysisCentralCutMC *newcut = dynamic_cast<AliAnalysisCentralCutMC *>(cut);
331 newcut->ReceiveEvt(obj);
340 //________________________________________________________________________
341 Bool_t AliAnalysisTaskCentral::CheckCuts(Int_t no, TObject *obj) const{
343 // For each cut run IsSelected();
346 printf("\nAliAnalysisTaskCentral::CheckCuts -> Cut number is not ok! \n");
351 printf("AliAnalysisTaskCentral::CheckCuts -> cuts list problem! \n");
355 TObjArrayIter iter(fCutsList[no]);
356 AliAnalysisCuts *cut = 0;
358 while((cut = (AliAnalysisCuts*)iter.Next())){
359 if(!cut->IsSelected(obj)) return kFALSE;
366 //________________________________________________________________________
367 void AliAnalysisTaskCentral::Exec(Option_t *) {
370 // Called for each event
372 InitCuts(); //initialize the analysis specific cuts
374 Printf("ERROR: fCutsList not available");
380 const Int_t nvar=2; //number of variables on the grid:pt,vtx
381 Double_t value[nvar];//used to fill the CF container
383 if(fSim){ // if running on simulations -> look at MC Truth
386 Printf("ERROR: fMC not available");
390 if(CheckCuts(0, fMC)){ //check event level cuts
395 for (Int_t ipart=0; ipart<fMC->GetNumberOfTracks(); ipart++) {
397 AliMCParticle *particle = dynamic_cast<AliMCParticle*>(fMC->GetTrack(ipart));
400 printf("\nMCParticle pointer is null!!!\n");
404 if (!CheckCuts(2, particle)) continue; //check the MC general particle cuts
407 eta = particle->Eta();
409 if(pt>0) w = 1.0/pt; //invariant distribution
414 if(CheckCuts(3, particle)){ //fill the right container for each particle
415 fCFContainerPi->Fill(value,0,w);
417 else if(CheckCuts(4, particle)){
418 fCFContainerK->Fill(value,0,w);
420 else if(CheckCuts(5, particle)){
421 fCFContainerP->Fill(value,0,w);
423 } //end MC particle loop
426 else{ // if we DONT run in simulated data we fill the MC step of the CFCont with 0
430 fCFContainerPi->Fill(value,0);
431 fCFContainerK->Fill(value,0);
432 fCFContainerP->Fill(value,0);
437 Printf("ERROR: fESD not available");
441 if(CheckCuts(1, fESD)){
443 Printf("There are %d ESD tracks in this event\n", fESD->GetNumberOfTracks());
446 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
448 AliESDtrack* track = fESD->GetTrack(iTracks);
451 Printf("ERROR: Could not receive track %d", iTracks);
455 if(!CheckCuts(6, track)) continue; //check general ESD track cuts
460 if(pt>0) w = 1.0/pt; // invariant
465 if(CheckCuts(7, track)){
466 fCFContainerPi->Fill(value,1,w);
468 else if(CheckCuts(8, track)){
469 fCFContainerK->Fill(value,1,w);
471 else if(CheckCuts(9, track)){
472 fCFContainerP->Fill(value,1,w);
475 } //end ESD track loop
477 fNoEvt->Fill(0); //get the number of analyzed events
481 PostData(0, fOutList);
485 //________________________________________________________________________
486 void AliAnalysisTaskCentral::Terminate(Option_t *) {
488 // Called once at the end of the query
489 printf("\n\n****************************************\n");
490 printf("\tAliAnalysisCentralExtrapolate Terminate... \n");
492 TList *outList = dynamic_cast<TList*>(GetOutputData(0));
494 printf("Unable to get output list! \n");
498 AliAnalysisCentralExtrapolate *extPi = new AliAnalysisCentralExtrapolate("extrapolationpi");
499 extPi->SetInputList(outList); //send the outlist to the extrapolation class
500 extPi->SetParticle("kPiPlus"); //set the particle type
501 extPi->ApplyEff(); //correct the pt distribution !!HAS TO RUN BEFORE extrapolation!!
502 extPi->BoltzmannFit(); //fit and extrapolate using Boltzmann-Gibbs Blast wave model
503 extPi->TsallisFit(); //fit and extrapolate using Tsallis Blast wave model
504 TList *extOutListPi = extPi->GetOutputList();
506 AliAnalysisCentralExtrapolate *extK = new AliAnalysisCentralExtrapolate("extrapolationK");
507 extK->SetInputList(outList);
508 extK->SetParticle("kKPlus");
510 extK->BoltzmannFit();
512 TList *extOutListK = extK->GetOutputList();
514 AliAnalysisCentralExtrapolate *extP = new AliAnalysisCentralExtrapolate("extrapolationP");
515 extP->SetInputList(outList);
516 extP->SetParticle("kProton");
518 extP->BoltzmannFit();
520 TList *extOutListP = extP->GetOutputList();
522 fOutList->Add(extOutListPi);
523 fOutList->Add(extOutListK);
524 fOutList->Add(extOutListP);