#include <limits.h>
#include <float.h>
+#include "TMath.h"
#include "TNamed.h"
#include "AliVVertex.h"
#include "AliVEvent.h"
#include "AliESDEvent.h"
+#include "AliESDCentrality.h"
+#include "AliESDVZERO.h"
#include "AliMultiplicity.h"
#include "AliMCEvent.h"
#include "AliFlowEventCuts.h"
#include "AliFlowTrackCuts.h"
+#include "AliTriggerAnalysis.h"
ClassImp(AliFlowEventCuts)
fRefMultMax(INT_MAX),
fRefMultMin(INT_MIN),
fRefMultCuts(NULL),
+ fMeanPtCuts(NULL),
fCutPrimaryVertexX(kFALSE),
fPrimaryVertexXmax(INT_MAX),
fPrimaryVertexXmin(INT_MIN),
fPrimaryVertexZmin(INT_MIN),
fCutNContributors(kFALSE),
fNContributorsMax(INT_MAX),
- fNContributorsMin(INT_MIN)
+ fNContributorsMin(INT_MIN),
+ fCutMeanPt(kFALSE),
+ fMeanPtMax(-DBL_MAX),
+ fMeanPtMin(DBL_MAX),
+ fCutSPDvertexerAnomaly(kTRUE),
+ fCutCentralityPercentile(kFALSE),
+ fCentralityPercentileMethod(kTPConly),
+ fCentralityPercentileMax(100.),
+ fCentralityPercentileMin(0.),
+ fCutZDCtiming(kTRUE),
+ fTrigAna()
{
//constructor
}
fRefMultMax(INT_MAX),
fRefMultMin(INT_MIN),
fRefMultCuts(NULL),
+ fMeanPtCuts(NULL),
fCutPrimaryVertexX(kFALSE),
fPrimaryVertexXmax(INT_MAX),
fPrimaryVertexXmin(INT_MIN),
fPrimaryVertexZmin(INT_MIN),
fCutNContributors(kFALSE),
fNContributorsMax(INT_MAX),
- fNContributorsMin(INT_MIN)
+ fNContributorsMin(INT_MIN),
+ fCutMeanPt(kFALSE),
+ fMeanPtMax(-DBL_MAX),
+ fMeanPtMin(DBL_MAX),
+ fCutSPDvertexerAnomaly(kTRUE),
+ fCutCentralityPercentile(kFALSE),
+ fCentralityPercentileMethod(kTPConly),
+ fCentralityPercentileMax(100.),
+ fCentralityPercentileMin(0.),
+ fCutZDCtiming(kTRUE),
+ fTrigAna()
{
//constructor
}
fRefMultMax(that.fRefMultMax),
fRefMultMin(that.fRefMultMin),
fRefMultCuts(NULL),
+ fMeanPtCuts(NULL),
fCutPrimaryVertexX(that.fCutPrimaryVertexX),
fPrimaryVertexXmax(that.fPrimaryVertexXmax),
fPrimaryVertexXmin(that.fPrimaryVertexXmin),
fPrimaryVertexZmin(that.fPrimaryVertexZmin),
fCutNContributors(that.fCutNContributors),
fNContributorsMax(that.fNContributorsMax),
- fNContributorsMin(that.fNContributorsMin)
+ fNContributorsMin(that.fNContributorsMin),
+ fCutMeanPt(that.fCutMeanPt),
+ fMeanPtMax(that.fMeanPtMax),
+ fMeanPtMin(that.fMeanPtMin),
+ fCutSPDvertexerAnomaly(that.fCutSPDvertexerAnomaly),
+ fCutCentralityPercentile(that.fCutCentralityPercentile),
+ fCentralityPercentileMethod(that.fCentralityPercentileMethod),
+ fCentralityPercentileMax(that.fCentralityPercentileMax),
+ fCentralityPercentileMin(that.fCentralityPercentileMin),
+ fCutZDCtiming(that.fCutZDCtiming),
+ fTrigAna()
{
//copy constructor
if (that.fRefMultCuts)
fRefMultCuts = new AliFlowTrackCuts(*(that.fRefMultCuts));
+ if (that.fMeanPtCuts)
+ fMeanPtCuts = new AliFlowTrackCuts(*(that.fMeanPtCuts));
+}
+
+////-----------------------------------------------------------------------
+AliFlowEventCuts::~AliFlowEventCuts()
+{
+ //dtor
+ delete fMeanPtCuts;
+ delete fRefMultCuts;
}
////-----------------------------------------------------------------------
fRefMultMax=that.fRefMultMax;
fRefMultMin=that.fRefMultMin;
if (that.fRefMultCuts) *fRefMultCuts=*(that.fRefMultCuts);
+ if (that.fMeanPtCuts) *fMeanPtCuts=*(that.fMeanPtCuts);
fCutPrimaryVertexX=that.fCutPrimaryVertexX;
fPrimaryVertexXmin=that.fPrimaryVertexXmin;
fPrimaryVertexXmax=that.fPrimaryVertexXmax;
fCutNContributors=that.fCutNContributors;
fNContributorsMax=that.fNContributorsMax;
fNContributorsMin=that.fNContributorsMin;
+ fCutMeanPt=that.fCutMeanPt;
+ fMeanPtMax=that.fMeanPtMax;
+ fMeanPtMin=that.fMeanPtMin;
+ fCutSPDvertexerAnomaly=that.fCutSPDvertexerAnomaly;
+ fCutCentralityPercentile=that.fCutCentralityPercentile;
+ fCentralityPercentileMethod=that.fCentralityPercentileMethod;
+ fCentralityPercentileMax=that.fCentralityPercentileMax;
+ fCentralityPercentileMin=that.fCentralityPercentileMin;
return *this;
}
//-----------------------------------------------------------------------
-Bool_t AliFlowEventCuts::IsSelected(const TObject* obj)
+Bool_t AliFlowEventCuts::IsSelected(TObject* obj)
{
//check cuts
- const AliVEvent* vevent = dynamic_cast<const AliVEvent*>(obj);
+ AliVEvent* vevent = dynamic_cast<AliVEvent*>(obj);
if (vevent) return PassesCuts(vevent);
return kFALSE; //when passed wrong type of object
}
//-----------------------------------------------------------------------
-Bool_t AliFlowEventCuts::PassesCuts(const AliVEvent *event)
+Bool_t AliFlowEventCuts::PassesCuts(AliVEvent *event)
{
///check if event passes cuts
- if(fCutNumberOfTracks) {if (event->GetNumberOfTracks() < fNumberOfTracksMin || event->GetNumberOfTracks() >= fNumberOfTracksMax ) return kFALSE;}
+ AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
+ if (fCutCentralityPercentile)
+ {
+ AliESDCentrality* centr = esdevent->GetCentrality();
+ if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
+ fCentralityPercentileMax,
+ CentrMethName(fCentralityPercentileMethod) ))
+ return kFALSE;
+ }
+ if (fCutSPDvertexerAnomaly&&esdevent)
+ {
+ const AliESDVertex* sdpvertex = esdevent->GetPrimaryVertexSPD();
+ if (sdpvertex->GetNContributors()<1) return kFALSE;
+ if (sdpvertex->GetDispersion()>0.04) return kFALSE;
+ if (sdpvertex->GetZRes()>0.25) return kFALSE;
+ const AliESDVertex* tpcvertex = esdevent->GetPrimaryVertexTPC();
+ if (tpcvertex->GetNContributors()<1) return kFALSE;
+ const AliMultiplicity* tracklets = esdevent->GetMultiplicity();
+ if (tpcvertex->GetNContributors()<(-10.0+0.25*tracklets->GetNumberOfITSClusters(0)))
+ return kFALSE;
+ }
+ if (fCutZDCtiming)
+ {
+ if (!fTrigAna.ZDCTimeTrigger(esdevent)) return kFALSE;
+ }
+ if(fCutNumberOfTracks) {if ( event->GetNumberOfTracks() < fNumberOfTracksMin ||
+ event->GetNumberOfTracks() >= fNumberOfTracksMax ) return kFALSE;}
if(fCutRefMult)
{
//reference multiplicity still to be defined
if (pvtxz < fPrimaryVertexZmin || pvtxz >= fPrimaryVertexZmax)
return kFALSE;
}
+ if (fCutMeanPt)
+ {
+ Float_t meanpt=0.0;
+ Int_t ntracks=event->GetNumberOfTracks();
+ Int_t nselected=0;
+ for (Int_t i=0; i<ntracks; i++)
+ {
+ AliVParticle* track = event->GetTrack(i);
+ if (!track) continue;
+ Bool_t pass=kTRUE;
+ if (fMeanPtCuts) pass=fMeanPtCuts->IsSelected(track);
+ if (pass)
+ {
+ meanpt += track->Pt();
+ nselected++;
+ }
+ }
+ meanpt=meanpt/nselected;
+ if (meanpt<fMeanPtMin || meanpt >= fMeanPtMax) return kFALSE;
+ }
return kTRUE;
}
+//-----------------------------------------------------------------------
+const char* AliFlowEventCuts::CentrMethName(refMultMethod method) const
+{
+ //get the string for refmultmethod, for use with AliESDCentrality in
+ //the cut on centrality percentile
+ switch (method)
+ {
+ case kSPDtracklets:
+ return "TKL";
+ case kSPD1clusters:
+ return "CL1";
+ case kTPConly:
+ return "TRK";
+ case kV0:
+ return "V0M";
+ default:
+ return "";
+ }
+}
//-----------------------------------------------------------------------
AliFlowEventCuts* AliFlowEventCuts::StandardCuts()
{
}
//-----------------------------------------------------------------------
-Int_t AliFlowEventCuts::RefMult(const AliVEvent* event)
+Int_t AliFlowEventCuts::RefMult(AliVEvent* event)
{
//calculate the reference multiplicity, if all fails return 0
- if (!fRefMultCuts)
+ AliESDVZERO* vzero = NULL;
+ AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
+ const AliMultiplicity* mult = esdevent->GetMultiplicity();
+ Int_t refmult=0;
+
+ switch (fRefMultMethod)
{
- switch (fRefMultMethod)
- {
- case kTPConly:
- fRefMultCuts = AliFlowTrackCuts::GetStandardTPCOnlyTrackCuts();
- fRefMultCuts->SetEtaRange(-0.8,0.8);
- fRefMultCuts->SetPtMin(0.15);
- break;
- case kSPDtracklets:
- fRefMultCuts = new AliFlowTrackCuts();
- fRefMultCuts->SetParamType(AliFlowTrackCuts::kESD_SPDtracklet);
- fRefMultCuts->SetEtaRange(-0.8,0.8);
- break;
- default:
- return 0;
- }
+ case kTPConly:
+ if (fRefMultCuts) break;
+ fRefMultCuts = AliFlowTrackCuts::GetStandardTPCOnlyTrackCuts();
+ fRefMultCuts->SetEtaRange(-0.8,0.8);
+ fRefMultCuts->SetPtMin(0.15);
+ break;
+ case kSPDtracklets:
+ if (fRefMultCuts) break;
+ fRefMultCuts = new AliFlowTrackCuts();
+ fRefMultCuts->SetParamType(AliFlowTrackCuts::kESD_SPDtracklet);
+ fRefMultCuts->SetEtaRange(-0.8,0.8);
+ break;
+ case kV0:
+ if (!esdevent) return 0;
+ vzero=esdevent->GetVZEROData();
+ if (!vzero) return 0;
+ refmult = TMath::Nint(vzero->GetMTotV0A()+vzero->GetMTotV0C());
+ return refmult;
+ case kSPD1clusters:
+ if (!mult) return 0;
+ refmult = mult->GetNumberOfITSClusters(1);
+ return refmult;
+ default:
+ return 0;
}
- fRefMultCuts->SetEvent(const_cast<AliVEvent*>(event));
- Int_t refmult=0;
+ fRefMultCuts->SetEvent(event);
for (Int_t i=0; i<fRefMultCuts->GetNumberOfInputObjects(); i++)
{
if (fRefMultCuts->IsSelected(fRefMultCuts->GetInputObject(i),i))