#include <AliAODEvent.h>
#include <AliMultiplicity.h>
#include <AliCentrality.h>
+#include <AliESDVZERO.h>
+#include <AliAODVZERO.h>
+#include "AliDielectronVarManager.h"
#include "AliDielectronEventCuts.h"
ClassImp(AliDielectronEventCuts)
+const char* AliDielectronEventCuts::fgkVtxNames[AliDielectronEventCuts::kVtxTracksOrSPD+1] = {"Tracks", "SPD", "TPC", "Any", "TracksOrSPD"};
+
AliDielectronEventCuts::AliDielectronEventCuts() :
AliAnalysisCuts(),
+ fRun(),
fVtxZmin(0.),
fVtxZmax(0.),
fRequireVtx(kFALSE),
fCentMin(1.),
fCentMax(0.),
fVtxType(kVtxTracks),
+ fRequire13sel(kFALSE),
+ fUtils(),
fRequireV0and(0),
fTriggerAnalysis(0x0),
fkVertex(0x0),
- fkVertexAOD(0x0)
+ fkVertexAOD(0x0),
+ fparMean(0x0),
+ fparSigma(0x0),
+ fcutSigma(3.),
+ fparMinVtxContributors(0x0),
+ fparMaxVtxContributors(0x0)
{
//
// Default Constructor
//______________________________________________
AliDielectronEventCuts::AliDielectronEventCuts(const char* name, const char* title) :
AliAnalysisCuts(name, title),
+ fRun(),
fVtxZmin(0.),
fVtxZmax(0.),
fRequireVtx(kFALSE),
fCentMin(1.),
fCentMax(0.),
fVtxType(kVtxTracks),
+ fRequire13sel(kFALSE),
+ fUtils(),
fRequireV0and(0),
fTriggerAnalysis(0x0),
fkVertex(0x0),
- fkVertexAOD(0x0)
+ fkVertexAOD(0x0),
+ fparMean(0x0),
+ fparSigma(0x0),
+ fcutSigma(3.),
+ fparMinVtxContributors(0x0),
+ fparMaxVtxContributors(0x0)
{
//
// Named Constructor
Double_t zvtx=fkVertex->GetZv();
if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
}
-
+
+ if(fRequire13sel){
+ if(!fUtils.IsVertexSelected2013pA(ev)) return kFALSE;
+ if(fUtils.IsFirstEventInChunk(ev)) return kFALSE;
+ }
+
if (fRequireV0and){
if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
Bool_t v0AND = kFALSE;
return kFALSE;
}
-
+ if(fparMean && fparSigma) {
+ Double_t nTrks = ev->GetNumberOfTracks();
+ Double_t multV0 = 0.0;
+ for(Int_t j=0; j<64; j++) multV0 += ev->GetVZEROData()->GetMultiplicity(j);
+ Double_t mV0 = fparMean->Eval(nTrks);
+ Double_t sV0 = fparSigma->Eval(nTrks);
+ if(multV0 > mV0+fcutSigma*sV0 || multV0 < mV0-fcutSigma*sV0) return kFALSE;
+ }
+
+ // cut on the number of vertex contributors using TPC versus global vertex
+ if(fparMinVtxContributors && fparMaxVtxContributors) {
+ const AliESDVertex *vtxTPC = ev->GetPrimaryVertexTPC();
+ const AliESDVertex *vtxGbl = ev->GetPrimaryVertex();
+ Double_t nContribTPC = (vtxTPC ? vtxTPC->GetNContributors() : 0);
+ Double_t nContribGbl = (vtxGbl ? vtxGbl->GetNContributors() : 0);
+ Double_t minCut = fparMinVtxContributors->Eval(nContribGbl);
+ Double_t maxCut = fparMaxVtxContributors->Eval(nContribGbl);
+ if(nContribTPC > maxCut || nContribTPC < minCut) return kFALSE;
+ }
+
+
return kTRUE;
}
//______________________________________________
AliAODEvent *ev=dynamic_cast<AliAODEvent*>(event);
if (!ev) return kFALSE;
+ // run rejection
+ Int_t run = ev->GetRunNumber();
+ if(fRun.GetNrows()) {
+ for(Int_t irun=0; irun<fRun.GetNrows(); irun++) {
+ if(fRun(irun)==run) return kFALSE;
+ }
+ }
+
if (fCentMin<fCentMax){
AliCentrality *centrality=ev->GetCentrality();
Double_t centralityF=-1;
switch(fVtxType){
case kVtxTracks: fkVertexAOD=0x0; break;
- case kVtxTPC: fkVertexAOD=GetPrimaryVertexTPC(ev); break;
+ case kVtxTPC: fkVertexAOD=AliDielectronVarManager::GetVertex(ev, AliAODVertex::kMainTPC); break;
case kVtxSPD:
case kVtxTracksOrSPD: fkVertexAOD=ev->GetPrimaryVertexSPD(); break;
case kVtxAny: fkVertexAOD=ev->GetPrimaryVertex(); break;
if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
}
+ if(fRequire13sel){
+ if(!fUtils.IsVertexSelected2013pA(ev)) return kFALSE;
+// if(fUtils.IsFirstEventInChunk(ev)) return kFALSE;
+ }
+
/*
if (fRequireV0and){
// if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
}
*/
+ // correlation cut Ntrks vs. multV0
+ if(fparMean && fparSigma) {
+ Double_t nTrks = ev->GetNumberOfTracks();
+ Double_t multV0 = 0.0;
+ for(Int_t j=0; j<64; j++) multV0 += ev->GetVZEROData()->GetMultiplicity(j);
+ Double_t mV0 = fparMean->Eval(nTrks);
+ Double_t sV0 = fparSigma->Eval(nTrks);
+ if(multV0 > mV0+fcutSigma*sV0 || multV0 < mV0-fcutSigma*sV0) return kFALSE;
+ }
+
+ // cut on the number of vertex contributors using TPC versus global vertex
+ if(fparMinVtxContributors && fparMaxVtxContributors) {
+ const AliAODVertex *vtxTPC = ev->GetVertex(AliAODVertex::kMainTPC);
+ const AliAODVertex *vtxGbl = ev->GetPrimaryVertex();
+ Double_t nContribTPC = (vtxTPC ? vtxTPC->GetNContributors() : 0);
+ Double_t nContribGbl = (vtxGbl ? vtxGbl->GetNContributors() : 0);
+ Double_t minCut = fparMinVtxContributors->Eval(nContribGbl);
+ Double_t maxCut = fparMaxVtxContributors->Eval(nContribGbl);
+ if(nContribTPC > maxCut || nContribTPC < minCut) return kFALSE;
+ }
+
return kTRUE;
}
+//________________________________________________________________________
+void AliDielectronEventCuts::Print(const Option_t* /*option*/) const
+{
+ //
+ // Print cuts and the range
+ //
+ printf("cut ranges for '%s'\n",GetTitle());
+ printf("All Cuts have to be fulfilled\n");
+
+ Int_t iCut=0;
+ if(fRequireVtx) {
+ printf("Cut %02d: vertex required \n",iCut); iCut++; }
+ printf("Cut %02d: vertex type: %s \n", iCut, fgkVtxNames[fVtxType]); iCut++;
+ if(fMinVtxContributors) {
+ printf("Cut %02d: vertex contributors >= %d \n", iCut, fMinVtxContributors); iCut++; }
+ if(fVtxZmin<fVtxZmax) {
+ printf("Cut %02d: %f < %s < %f\n", iCut, fVtxZmin, "Zvtx", fVtxZmax); iCut++; }
+ if(fCentMin<fCentMax) {
+ printf("Cut %02d: %f < %s < %f\n", iCut, fCentMin, "V0centrality", fCentMax);iCut++; }
+ if(fMultITSTPC) {
+ printf("Cut %02d: cut on multiplcity ITS vs. TPC \n", iCut); iCut++; }
+ if(fparMean&&fparSigma) {
+ printf("Cut %02d: multplicity vs. #tracks correlation +-%.1f sigma inclusion \n", iCut, fcutSigma); iCut++; }
+ if(fRequire13sel){
+ printf("Cut %02d: vertex and event selection for 2013 pPb data taking required \n",iCut); iCut++; }
+ if(fRequireV0and) {
+ printf("Cut %02d: require V0and type: %c \n", iCut, fRequireV0and); iCut++; }
+
+}
+