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>
26 #include "AliESDEvent.h"
27 #include "AliESDtrack.h"
28 #include "AliESDtrackCuts.h"
29 #include "AliMultiplicity.h"
30 #include "AliAnalysisCentralCutESD.h"
32 #include "AliAnalysisCentralCutEvtESD.h"
34 //____________________________________________________________________
35 ClassImp(AliAnalysisCentralCutEvtESD)
37 //____________________________________________________________________
38 AliAnalysisCentralCutEvtESD::AliAnalysisCentralCutEvtESD(const Char_t* name, const Char_t* title)
39 :AliAnalysisCuts(name,title)
55 for(Int_t i=0; i<10; i++){
61 AliAnalysisCentralCutEvtESD::~AliAnalysisCentralCutEvtESD() {
71 Bool_t AliAnalysisCentralCutEvtESD::IsSelected(TObject *obj){
72 // check whether the event passes the cuts
73 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent *>(obj);
76 printf("AliAnalysisCentralCutEvtESD:IsSelected ->Can't get ESD event!\n");
81 Int_t mult = CalcMult(esdEvent);
82 if((mult<fMultMin)||(mult>fMultMax)){
88 Double_t dir = CalcDir(esdEvent);
89 if((dir<fDirMin)||(dir>fDirMax)){
95 Double_t spdMult = CalcSPDMult(esdEvent);
96 if((spdMult<fSPDMultMin)||(spdMult>fSPDMultMax)){
102 Double_t spdDir = CalcSPDDir(esdEvent);
103 if((spdDir<fSPDDirMin)||(spdDir>fSPDDirMax)){
111 //_________________________________________________________________________
112 void AliAnalysisCentralCutEvtESD::InitCuts(){
113 //Initialize internal cuts
115 //////////////// FULL ALICE ///////////////////
116 //------------General ESD Cuts------------------
117 AliESDtrackCuts *esdCutsGen = new AliESDtrackCuts("AliESDtrackCuts", "CutEvtESDInternal");
118 esdCutsGen->SetMinNClustersTPC(50);
119 esdCutsGen->SetMaxChi2PerClusterTPC(2.2);
120 esdCutsGen->SetMaxCovDiagonalElements(0.5,0.5,0.5,0.5,0.5);
121 esdCutsGen->SetRequireTPCRefit(kTRUE);
122 esdCutsGen->SetAcceptKinkDaughters(kFALSE);
123 esdCutsGen->SetMaxNsigmaToVertex(2.0);
124 esdCutsGen->SetRequireSigmaToVertex(kTRUE);
126 AliAnalysisCentralCutESD *esdCutsGen1 = new AliAnalysisCentralCutESD("AliAnalysisCentralCutESD","NIHAM");
127 esdCutsGen1->SetReqIsCharged();
129 //-------------Specific ESD Cuts------------------
130 AliESDtrackCuts *esdCutsMult = new AliESDtrackCuts("AliESDCutsMult", "midrapidity");
131 esdCutsMult->SetEtaRange(-0.5,0.5);
132 AliESDtrackCuts *esdCutsDir = new AliESDtrackCuts("AliESDCutsDir", "SPD coverage");
133 esdCutsDir->SetEtaRange(0.0,1.9);
135 /////////////////// SPD ONLY ////////////////////
136 AliESDtrackCuts *esdCutsSPD = new AliESDtrackCuts("AliESDtrackCuts", "CutEvtESDInternal");
137 esdCutsSPD->SetAcceptKinkDaughters(kFALSE);
138 esdCutsSPD->SetMaxNsigmaToVertex(2.0);
139 esdCutsSPD->SetRequireSigmaToVertex(kTRUE);
142 //--------------set the cuts ----------------------
143 TObjArray* esdListMult = new TObjArray();
144 esdListMult->AddLast(esdCutsGen);
145 esdListMult->AddLast(esdCutsGen1);
146 esdListMult->AddLast(esdCutsMult);
148 TObjArray* esdListDir = new TObjArray();
149 esdListDir->AddLast(esdCutsGen);
150 esdListDir->AddLast(esdCutsGen1);
151 esdListDir->AddLast(esdCutsDir);
153 TObjArray* esdListSPD = new TObjArray();
154 esdListSPD->AddLast(esdCutsSPD);
156 fCutsList[0]=esdListDir;
157 fCutsList[1]=esdListMult;
158 fCutsList[2]=esdListSPD;
163 //__________________________________________________________________________
164 Bool_t AliAnalysisCentralCutEvtESD::CheckIntCuts(Int_t no, TObject *obj) const{
165 // Check if the particle passes the internal cuts
168 printf("\n AliAnalysisCentralCutEvtESD::CheckIntCuts -> Cut number is not ok! \n");
173 printf("AliAnalysisCentralCutEvtESD::CheckIntCuts -> cuts list problem! \n");
178 TObjArrayIter iter(fCutsList[no]);
179 AliAnalysisCuts *cut = 0;
182 while((cut = (AliAnalysisCuts*)iter.Next())){
184 if(!cut->IsSelected(obj)) return kFALSE;
191 //__________________________________________________________________________
192 Double_t AliAnalysisCentralCutEvtESD::CalcDir(AliESDEvent* const esdEv) {
194 //Compute the directivity - FULL ALICE
207 printf("NULL tree\n");
211 Int_t totTracks=esdEv->GetNumberOfTracks();
213 for(Int_t itrack = 0; itrack < totTracks; itrack++){//first loop->compute event directivity
215 AliESDtrack* track = esdEv->GetTrack(itrack);
218 Printf("ERROR: Could not receive track %d", itrack);
222 if(!CheckIntCuts(0, track)) continue;
228 sumaPx = sumaPx + px;
229 sumaPy = sumaPy + py;
231 sumaPt = sumaPt + pt;
236 if(sumaPt < 0.0000001){
240 dir = (sqrt(pow(sumaPx,2)+pow(sumaPy,2)))/sumaPt;
245 //__________________________________________________________________________
246 Int_t AliAnalysisCentralCutEvtESD::CalcMult(AliESDEvent* const esdEv) {
248 //Compute multiplicity - FULL ALICE
255 printf("NULL tree\n");
259 Int_t totTracks=esdEv->GetNumberOfTracks();
261 for(Int_t iTrack = 0; iTrack < totTracks; iTrack++){//second track loop -> compute event multiplicity
263 AliESDtrack* track = esdEv->GetTrack(iTrack);
266 Printf("ERROR: Could not receive track %d", iTrack);
270 if(!CheckIntCuts(1, track)) continue;
273 charged++; //multiplicity
275 }//end second track loop
282 //__________________________________________________________________________
283 Double_t AliAnalysisCentralCutEvtESD::CalcSPDDir(AliESDEvent* const esdEv) {
285 //Compute directivity - SPD ONLY
291 Double_t sumaPxU = 0;
292 Double_t sumaPyU = 0;
294 Double_t goodtrack = 0;
295 Double_t spdEta = 0.;
297 const AliMultiplicity *spdMult=esdEv->GetMultiplicity();
299 printf("Unable to get multiplicity! \n");
303 Int_t spdTracks = spdMult->GetNumberOfTracklets(); //SPD multiplicity
305 for(Int_t iTrack = 0; iTrack< spdTracks; iTrack++){ //SPD track loop -> Directivity
307 AliESDtrack* track = esdEv->GetTrack(iTrack);
310 Printf("ERROR: Could not receive track %d", iTrack);
314 if(!CheckIntCuts(2, track)) continue;
316 spdEta = spdMult->GetEta(iTrack);
318 if((spdEta<0.0)||(spdEta>1.9)) continue;
320 Double_t phi = spdMult->GetPhi(iTrack);
322 pxU = TMath::Cos(phi);
323 pyU = TMath::Sin(phi);
325 sumaPxU = sumaPxU + pxU;
326 sumaPyU = sumaPyU + pyU;
330 }//end SPD track loop
332 if(goodtrack < 1.) return -1;
334 dirU = (sqrt(pow(sumaPxU,2)+pow(sumaPyU,2)))/goodtrack;
339 //__________________________________________________________________________
341 Int_t AliAnalysisCentralCutEvtESD::CalcSPDMult(AliESDEvent* const esdEv) {
343 //Compute multiplicity - SPD ONLY
347 const AliMultiplicity *spdMult=esdEv->GetMultiplicity();
349 printf("Unable to get multiplicity! \n");
353 Int_t spdTracks = spdMult->GetNumberOfTracklets(); //SPD multiplicity
358 for(Int_t iTrack = 0; iTrack< spdTracks; iTrack++){ //second SPD track loop -> Multiplicity
360 AliESDtrack* track = esdEv->GetTrack(iTrack);
363 Printf("ERROR: Could not receive track %d", iTrack);
367 if(!CheckIntCuts(2, track)) continue;
369 spdEta = spdMult->GetEta(iTrack);
371 if((spdEta<-0.5)||(spdEta>0.5)) continue;
375 }//end second SPD track loop