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 // ESD event level cuts for azimuthal isotropic
18 // expansion in highly central collisions analysis
19 // author: Cristian Andrei
20 // acristian@niham.nipne.ro
21 // --------------------------------------------------
24 #include <TObjArray.h>
27 #include "AliESDEvent.h"
28 #include "AliESDtrack.h"
29 #include "AliESDtrackCuts.h"
30 #include "AliMultiplicity.h"
32 #include "AliAnalysisCentralCutESD.h"
33 #include "AliAnalysisCentralCutEvtESD.h"
38 //____________________________________________________________________
39 ClassImp(AliAnalysisCentralCutEvtESD)
41 //____________________________________________________________________
42 AliAnalysisCentralCutEvtESD::AliAnalysisCentralCutEvtESD(const Char_t* name, const Char_t* title)
43 :AliAnalysisCuts(name,title)
59 for(Int_t i=0; i<10; i++){
67 AliAnalysisCentralCutEvtESD::~AliAnalysisCentralCutEvtESD() {
69 for (Int_t i=0; i<10; i++)
76 Bool_t AliAnalysisCentralCutEvtESD::IsSelected(TObject *obj){
77 // check whether the event passes the cuts
78 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent *>(obj);
80 printf("AliAnalysisCentralCutEvtESD:IsSelected ->Can't get ESD event!\n");
85 Int_t mult = CalcMult(esdEvent);
86 if((mult<fMultMin)||(mult>fMultMax)){
92 Double_t dir = CalcDir(esdEvent);
93 if((dir<fDirMin)||(dir>fDirMax)){
99 Double_t spdMult = CalcSPDMult(esdEvent);
100 if((spdMult<fSPDMultMin)||(spdMult>fSPDMultMax)){
106 Double_t spdDir = CalcSPDDir(esdEvent);
107 if((spdDir<fSPDDirMin)||(spdDir>fSPDDirMax)){
115 //_________________________________________________________________________
116 void AliAnalysisCentralCutEvtESD::InitCuts(){
117 //Initialize internal cuts
119 //////////////// FULL ALICE ///////////////////
120 //------------General ESD Cuts------------------
121 AliESDtrackCuts *esdCutsGen = new AliESDtrackCuts("AliESDtrackCuts", "CutEvtESDInternal");
122 esdCutsGen->SetMinNClustersTPC(50);
123 esdCutsGen->SetMaxChi2PerClusterTPC(2.2);
124 esdCutsGen->SetMaxCovDiagonalElements(0.5,0.5,0.5,0.5,0.5);
125 esdCutsGen->SetRequireTPCRefit(kTRUE);
126 esdCutsGen->SetAcceptKinkDaughters(kFALSE);
127 esdCutsGen->SetMaxNsigmaToVertex(2.0);
128 esdCutsGen->SetRequireSigmaToVertex(kTRUE);
130 AliAnalysisCentralCutESD *esdCutsGen1 = new AliAnalysisCentralCutESD("AliAnalysisCentralCutESD","NIHAM");
131 esdCutsGen1->SetReqIsCharged();
133 //-------------Specific ESD Cuts------------------
134 AliESDtrackCuts *esdCutsMult = new AliESDtrackCuts("AliESDCutsMult", "midrapidity");
135 esdCutsMult->SetEtaRange(-0.5,0.5);
136 AliESDtrackCuts *esdCutsDir = new AliESDtrackCuts("AliESDCutsDir", "SPD coverage");
137 esdCutsDir->SetEtaRange(0.0,1.9);
139 /////////////////// SPD ONLY ////////////////////
140 AliESDtrackCuts *esdCutsSPD = new AliESDtrackCuts("AliESDtrackCuts", "CutEvtESDInternal");
141 esdCutsSPD->SetAcceptKinkDaughters(kFALSE);
142 esdCutsSPD->SetMaxNsigmaToVertex(2.0);
143 esdCutsSPD->SetRequireSigmaToVertex(kTRUE);
145 //--------------set the cuts ----------------------
146 TObjArray* esdListMult = new TObjArray();
147 esdListMult->AddLast(esdCutsGen);
148 esdListMult->AddLast(esdCutsGen1);
149 esdListMult->AddLast(esdCutsMult);
151 TObjArray* esdListDir = new TObjArray();
152 esdListDir->AddLast(esdCutsGen);
153 esdListDir->AddLast(esdCutsGen1);
154 esdListDir->AddLast(esdCutsDir);
156 TObjArray* esdListSPD = new TObjArray();
157 esdListSPD->AddLast(esdCutsSPD);
159 fCutsList[0]=esdListDir;
160 fCutsList[1]=esdListMult;
161 fCutsList[2]=esdListSPD;
166 //__________________________________________________________________________
167 Bool_t AliAnalysisCentralCutEvtESD::CheckIntCuts(Int_t no, TObject *obj) const{
168 // Check if the particle passes the internal cuts
171 printf("\n AliAnalysisCentralCutEvtESD::CheckIntCuts -> Cut number is not ok! \n");
176 printf("AliAnalysisCentralCutEvtESD::CheckIntCuts -> cuts list problem! \n");
181 TObjArrayIter iter(fCutsList[no]);
182 AliAnalysisCuts *cut = 0;
185 while((cut = (AliAnalysisCuts*)iter.Next())){
187 if(!cut->IsSelected(obj)) return kFALSE;
194 //__________________________________________________________________________
195 Double_t AliAnalysisCentralCutEvtESD::CalcDir(AliESDEvent* const esdEv) {
197 //Compute the directivity - FULL ALICE
208 printf("NULL tree\n");
212 Int_t totTracks=esdEv->GetNumberOfTracks();
214 for(Int_t itrack = 0; itrack < totTracks; itrack++){//first loop->compute event directivity
216 AliESDtrack* track = esdEv->GetTrack(itrack);
219 Printf("ERROR: Could not receive track %d", itrack);
223 if(!CheckIntCuts(0, track)) continue;
229 sumaPx = sumaPx + px;
230 sumaPy = sumaPy + py;
232 sumaPt = sumaPt + pt;
237 if(sumaPt < 0.0000001){
241 dir = (sqrt(pow(sumaPx,2)+pow(sumaPy,2)))/sumaPt;
246 //__________________________________________________________________________
247 Int_t AliAnalysisCentralCutEvtESD::CalcMult(AliESDEvent* const esdEv) {
249 //Compute multiplicity - FULL ALICE
254 printf("NULL tree\n");
258 Int_t totTracks=esdEv->GetNumberOfTracks();
260 for(Int_t iTrack = 0; iTrack < totTracks; iTrack++){//second track loop -> compute event multiplicity
262 AliESDtrack* track = esdEv->GetTrack(iTrack);
265 Printf("ERROR: Could not receive track %d", iTrack);
269 if(!CheckIntCuts(1, track)) continue;
272 charged++; //multiplicity
274 }//end second track loop
281 //__________________________________________________________________________
282 Double_t AliAnalysisCentralCutEvtESD::CalcSPDDir(AliESDEvent* const esdEv) {
284 //Compute directivity - SPD ONLY
288 Double_t sumaPxU = 0;
289 Double_t sumaPyU = 0;
291 Double_t goodtrack = 0;
292 Double_t spdEta = 0.;
294 const AliMultiplicity *spdMult=esdEv->GetMultiplicity();
296 printf("Unable to get multiplicity! \n");
300 Int_t spdTracks = spdMult->GetNumberOfTracklets(); //SPD multiplicity
302 for(Int_t iTrack = 0; iTrack< spdTracks; iTrack++){ //SPD track loop -> Directivity
304 AliESDtrack* track = esdEv->GetTrack(iTrack);
307 Printf("ERROR: Could not receive track %d", iTrack);
311 if(!CheckIntCuts(2, track)) continue;
313 spdEta = spdMult->GetEta(iTrack);
315 if((spdEta<0.0)||(spdEta>1.9)) continue;
317 Double_t phi = spdMult->GetPhi(iTrack);
319 pxU = TMath::Cos(phi);
320 pyU = TMath::Sin(phi);
322 sumaPxU = sumaPxU + pxU;
323 sumaPyU = sumaPyU + pyU;
327 }//end SPD track loop
329 if(goodtrack < 1.) return -1;
331 dirU = (sqrt(pow(sumaPxU,2)+pow(sumaPyU,2)))/goodtrack;
336 //__________________________________________________________________________
338 Int_t AliAnalysisCentralCutEvtESD::CalcSPDMult(AliESDEvent* const esdEv) {
340 //Compute multiplicity - SPD ONLY
342 const AliMultiplicity *spdMult=esdEv->GetMultiplicity();
344 printf("Unable to get multiplicity! \n");
348 Int_t spdTracks = spdMult->GetNumberOfTracklets(); //SPD multiplicity
353 for(Int_t iTrack = 0; iTrack< spdTracks; iTrack++){ //second SPD track loop -> Multiplicity
355 AliESDtrack* track = esdEv->GetTrack(iTrack);
358 Printf("ERROR: Could not receive track %d", iTrack);
362 if(!CheckIntCuts(2, track)) continue;
364 spdEta = spdMult->GetEta(iTrack);
366 if((spdEta<-0.5)||(spdEta>0.5)) continue;
370 }//end second SPD track loop