1 /*************************************************************************
2 * Copyright(c) 1998-2009, 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 // Dielectron EventCuts //
26 ///////////////////////////////////////////////////////////////////////////
29 #include <AliTriggerAnalysis.h>
30 #include <AliESDVertex.h>
31 #include <AliAODVertex.h>
32 #include <AliESDEvent.h>
33 #include <AliAODEvent.h>
34 #include <AliMultiplicity.h>
35 #include <AliCentrality.h>
36 #include <AliESDVZERO.h>
37 #include <AliAODVZERO.h>
39 #include "AliDielectronVarManager.h"
40 #include "AliDielectronEventCuts.h"
42 ClassImp(AliDielectronEventCuts)
44 const char* AliDielectronEventCuts::fgkVtxNames[AliDielectronEventCuts::kVtxTracksOrSPD+1] = {"Tracks", "SPD", "TPC", "Any", "TracksOrSPD"};
46 AliDielectronEventCuts::AliDielectronEventCuts() :
52 fMinVtxContributors(0),
57 fRequire13sel(kFALSE),
60 fTriggerAnalysis(0x0),
66 fparMinVtxContributors(0x0),
67 fparMaxVtxContributors(0x0)
70 // Default Constructor
75 //______________________________________________
76 AliDielectronEventCuts::AliDielectronEventCuts(const char* name, const char* title) :
77 AliAnalysisCuts(name, title),
82 fMinVtxContributors(0),
87 fRequire13sel(kFALSE),
90 fTriggerAnalysis(0x0),
96 fparMinVtxContributors(0x0),
97 fparMaxVtxContributors(0x0)
104 //______________________________________________
105 AliDielectronEventCuts::~AliDielectronEventCuts()
108 // Default Destructor
110 if (fTriggerAnalysis) delete fTriggerAnalysis;
113 //______________________________________________
114 Bool_t AliDielectronEventCuts::IsSelected(TObject* event)
120 if(event->IsA() == AliESDEvent::Class()) return IsSelectedESD(event);
121 else if(event->IsA() == AliAODEvent::Class()) return IsSelectedAOD(event);
124 //____________________________________________________________________
125 Bool_t AliDielectronEventCuts::IsSelectedESD(TObject* event)
131 AliESDEvent *ev=dynamic_cast<AliESDEvent*>(event);
132 if (!ev) return kFALSE;
134 if (fCentMin<fCentMax){
135 AliCentrality *centrality=ev->GetCentrality();
136 Double_t centralityF=-1;
137 if (centrality) centralityF = centrality->GetCentralityPercentile("V0M");
138 if (centralityF<fCentMin || centralityF>=fCentMax) return kFALSE;
145 case kVtxTracksOrSPD:
146 fkVertex=ev->GetPrimaryVertexTracks();
148 case kVtxSPD: fkVertex=ev->GetPrimaryVertexSPD(); break;
149 case kVtxTPC: fkVertex=ev->GetPrimaryVertexTPC(); break;
150 case kVtxAny: fkVertex=ev->GetPrimaryVertex(); break;
153 if ((fRequireVtx||fVtxZmin<fVtxZmax||fMinVtxContributors>0)&&!fkVertex) return kFALSE;
156 if (fMinVtxContributors>0){
157 Int_t nCtrb = fkVertex->GetNContributors();
158 if (nCtrb<fMinVtxContributors){
159 if (fVtxType==kVtxTracksOrSPD){
160 fkVertex=ev->GetPrimaryVertexSPD();
161 nCtrb = fkVertex->GetNContributors();
162 if (nCtrb<fMinVtxContributors) return kFALSE;
169 if (fVtxZmin<fVtxZmax){
170 Double_t zvtx=fkVertex->GetZv();
171 if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
175 if(!fUtils.IsVertexSelected2013pA(ev)) return kFALSE;
176 if(fUtils.IsFirstEventInChunk(ev)) return kFALSE;
180 if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
181 Bool_t v0AND = kFALSE;
182 if (fRequireV0and==1){
183 Bool_t v0A = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0A);
184 Bool_t v0C = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0C);
188 if (fRequireV0and==2){
189 Bool_t v0AHW = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kASide, kTRUE) == AliTriggerAnalysis::kV0BB);
190 Bool_t v0CHW = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kCSide, kTRUE) == AliTriggerAnalysis::kV0BB);
191 v0AND = v0AHW && v0CHW;
194 if (!v0AND) return kFALSE;
198 const AliESDVertex *vtxESDTPC=ev->GetPrimaryVertexTPC();
199 const AliMultiplicity *multESD = ev->GetMultiplicity();
200 if ( vtxESDTPC && multESD && vtxESDTPC->GetNContributors() < (-10.+0.25*multESD->GetNumberOfITSClusters(0)) )
204 if(fparMean && fparSigma) {
205 Double_t nTrks = ev->GetNumberOfTracks();
206 Double_t multV0 = 0.0;
207 for(Int_t j=0; j<64; j++) multV0 += ev->GetVZEROData()->GetMultiplicity(j);
208 Double_t mV0 = fparMean->Eval(nTrks);
209 Double_t sV0 = fparSigma->Eval(nTrks);
210 if(multV0 > mV0+fcutSigma*sV0 || multV0 < mV0-fcutSigma*sV0) return kFALSE;
213 // cut on the number of vertex contributors using TPC versus global vertex
214 if(fparMinVtxContributors && fparMaxVtxContributors) {
215 const AliESDVertex *vtxTPC = ev->GetPrimaryVertexTPC();
216 const AliESDVertex *vtxGbl = ev->GetPrimaryVertex();
217 Double_t nContribTPC = (vtxTPC ? vtxTPC->GetNContributors() : 0);
218 Double_t nContribGbl = (vtxGbl ? vtxGbl->GetNContributors() : 0);
219 Double_t minCut = fparMinVtxContributors->Eval(nContribGbl);
220 Double_t maxCut = fparMaxVtxContributors->Eval(nContribGbl);
221 if(nContribTPC > maxCut || nContribTPC < minCut) return kFALSE;
227 //______________________________________________
228 Bool_t AliDielectronEventCuts::IsSelectedAOD(TObject* event)
234 AliAODEvent *ev=dynamic_cast<AliAODEvent*>(event);
235 if (!ev) return kFALSE;
238 Int_t run = ev->GetRunNumber();
239 if(fRun.GetNrows()) {
240 for(Int_t irun=0; irun<fRun.GetNrows(); irun++) {
241 printf("check run %.0f \n ",fRun(irun));
242 if(fRun(irun)==run) return kFALSE;
246 if (fCentMin<fCentMax){
247 AliCentrality *centrality=ev->GetCentrality();
248 Double_t centralityF=-1;
249 if (centrality) centralityF = centrality->GetCentralityPercentile("V0M");
250 if (centralityF<fCentMin || centralityF>=fCentMax) return kFALSE;
256 case kVtxTracks: fkVertexAOD=0x0; break;
257 case kVtxTPC: fkVertexAOD=AliDielectronVarManager::GetVertex(ev, AliAODVertex::kMainTPC); break;
259 case kVtxTracksOrSPD: fkVertexAOD=ev->GetPrimaryVertexSPD(); break;
260 case kVtxAny: fkVertexAOD=ev->GetPrimaryVertex(); break;
263 if ((fRequireVtx||fVtxZmin<fVtxZmax||fMinVtxContributors>0)&&!fkVertexAOD) return kFALSE;
265 if (fMinVtxContributors>0){
266 Int_t nCtrb = fkVertexAOD->GetNContributors();
267 if (nCtrb<fMinVtxContributors){
268 // if (fVtxType==kVtxTracksOrSPD){
269 // fkVertexAOD=ev->GetVertex(AliAODVertex::kPrimary);
270 // nCtrb = fkVertexAOD->GetNContributors();
271 // if (nCtrb<fMinVtxContributors) return kFALSE;
279 if (fVtxZmin<fVtxZmax){
280 Double_t zvtx=fkVertexAOD->GetZ();
281 if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
285 if(!fUtils.IsVertexSelected2013pA(ev)) return kFALSE;
286 // if(fUtils.IsFirstEventInChunk(ev)) return kFALSE;
291 // if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
292 Bool_t v0AND = kFALSE;
293 if (fRequireV0and==1){
294 Bool_t v0A = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0A);
295 Bool_t v0A = header->GetOfflineTrigger(); //TODO
296 Bool_t v0C = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0C);
300 if (fRequireV0and==2){
301 Bool_t v0AHW = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kASide, kTRUE) == AliTriggerAnalysis::kV0BB);
302 Bool_t v0CHW = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kCSide, kTRUE) == AliTriggerAnalysis::kV0BB);
303 v0AND = v0AHW && v0CHW;
306 if (!v0AND) return kFALSE;
310 const AliESDVertex *vtxESDTPC=ev->GetPrimaryVertexTPC();
311 const AliMultiplicity *multESD = ev->GetMultiplicity();
312 if ( vtxESDTPC && multESD && vtxESDTPC->GetNContributors() < (-10.+0.25*multESD->GetNumberOfITSClusters(0)) )
317 // correlation cut Ntrks vs. multV0
318 if(fparMean && fparSigma) {
319 Double_t nTrks = ev->GetNumberOfTracks();
320 Double_t multV0 = 0.0;
321 for(Int_t j=0; j<64; j++) multV0 += ev->GetVZEROData()->GetMultiplicity(j);
322 Double_t mV0 = fparMean->Eval(nTrks);
323 Double_t sV0 = fparSigma->Eval(nTrks);
324 if(multV0 > mV0+fcutSigma*sV0 || multV0 < mV0-fcutSigma*sV0) return kFALSE;
327 // cut on the number of vertex contributors using TPC versus global vertex
328 if(fparMinVtxContributors && fparMaxVtxContributors) {
329 const AliAODVertex *vtxTPC = ev->GetVertex(AliAODVertex::kMainTPC);
330 const AliAODVertex *vtxGbl = ev->GetPrimaryVertex();
331 Double_t nContribTPC = (vtxTPC ? vtxTPC->GetNContributors() : 0);
332 Double_t nContribGbl = (vtxGbl ? vtxGbl->GetNContributors() : 0);
333 Double_t minCut = fparMinVtxContributors->Eval(nContribGbl);
334 Double_t maxCut = fparMaxVtxContributors->Eval(nContribGbl);
335 if(nContribTPC > maxCut || nContribTPC < minCut) return kFALSE;
341 //________________________________________________________________________
342 void AliDielectronEventCuts::Print(const Option_t* /*option*/) const
345 // Print cuts and the range
347 printf("cut ranges for '%s'\n",GetTitle());
348 printf("All Cuts have to be fulfilled\n");
352 printf("Cut %02d: vertex required \n",iCut); iCut++; }
353 printf("Cut %02d: vertex type: %s \n", iCut, fgkVtxNames[fVtxType]); iCut++;
354 if(fMinVtxContributors) {
355 printf("Cut %02d: vertex contributors >= %d \n", iCut, fMinVtxContributors); iCut++; }
356 if(fVtxZmin<fVtxZmax) {
357 printf("Cut %02d: %f < %s < %f\n", iCut, fVtxZmin, "Zvtx", fVtxZmax); iCut++; }
358 if(fCentMin<fCentMax) {
359 printf("Cut %02d: %f < %s < %f\n", iCut, fCentMin, "V0centrality", fCentMax);iCut++; }
361 printf("Cut %02d: cut on multiplcity ITS vs. TPC \n", iCut); iCut++; }
362 if(fparMean&&fparSigma) {
363 printf("Cut %02d: multplicity vs. #tracks correlation +-%.1f sigma inclusion \n", iCut, fcutSigma); iCut++; }
365 printf("Cut %02d: vertex and event selection for 2013 pPb data taking required \n",iCut); iCut++; }
367 printf("Cut %02d: require V0and type: %c \n", iCut, fRequireV0and); iCut++; }