ClassImp(AliRsnCutPrimaryVertex)
-//_________________________________________________________________________________________________
-AliRsnCutPrimaryVertex::AliRsnCutPrimaryVertex() :
- AliRsnCut(AliRsnCut::kEvent),
- fAcceptTPC(kFALSE)
-{
-//
-// Default constructor.
-//
-}
-
//_________________________________________________________________________________________________
AliRsnCutPrimaryVertex::AliRsnCutPrimaryVertex
(const char *name, Double_t maxVz, Int_t nContributors, Bool_t acceptTPC) :
- AliRsnCut(name, AliRsnCut::kEvent, 0, nContributors - 1),
- fAcceptTPC(acceptTPC)
+ AliRsnCut(name, AliRsnCut::kEvent, 0, nContributors - 1, 0.0, maxVz),
+ fAcceptTPC(acceptTPC),
+ fCheckPileUp(kFALSE)
{
//
// Main constructor.
//
fMinD = 0.0;
- fMaxD = maxVz;
+ fMaxD = maxVz + 1E-6;
}
//_________________________________________________________________________________________________
-Bool_t AliRsnCutPrimaryVertex::IsSelected(TObject *obj1, TObject* /*obj2*/)
+Bool_t AliRsnCutPrimaryVertex::IsSelected(TObject *object)
{
//
// Cut checker
//
+ static Int_t evNum = 0;
+ evNum++;
+
// retrieve ESD event
- AliRsnEvent *rsn = dynamic_cast<AliRsnEvent*>(obj1);
+ AliRsnEvent *rsn = dynamic_cast<AliRsnEvent*>(object);
if (!rsn) return kFALSE;
- AliESDEvent *esd = dynamic_cast<AliESDEvent*>(rsn->GetRef());
- if (!esd)
- {
- AliDebug(AliLog::kDebug+2, "NO ESD");
- return kFALSE;
- }
-
- // get the best primary vertex:
- // first try the one with tracks
- const AliESDVertex *vTrk = esd->GetPrimaryVertexTracks();
- const AliESDVertex *vSPD = esd->GetPrimaryVertexSPD();
- const AliESDVertex *vTPC = esd->GetPrimaryVertexTPC();
- Double_t vzTrk = 2.0 * fMaxD;
- Double_t vzSPD = 2.0 * fMaxD;
- Double_t vzTPC = 2.0 * fMaxD;
- if (vTrk) vzTrk = TMath::Abs(vTrk->GetZv());
- if (vSPD) vzSPD = TMath::Abs(vSPD->GetZv());
- if (vTPC) vzTPC = TMath::Abs(vTPC->GetZv());
- AliDebug(AliLog::kDebug + 1, Form("Vertex with tracks: contributors = %d, abs(vz) = %f", vTrk->GetNContributors(), vzTrk));
- AliDebug(AliLog::kDebug + 1, Form("Vertex with SPD, contributors = %d, abs(vz) = %f", vSPD->GetNContributors(), vzSPD));
- AliDebug(AliLog::kDebug + 1, Form("Vertex with TPC, contributors = %d, abs(vz) = %f", vTPC->GetNContributors(), vzTPC));
- if(vTrk->GetStatus())
- {
- fCutValueI = vTrk->GetNContributors();
- fCutValueD = vzTrk;
- }
- else if (vSPD->GetStatus())
+ AliESDEvent *esd = rsn->GetRefESD();
+ AliAODEvent *aod = rsn->GetRefAOD();
+
+ if (esd)
{
- fCutValueI = vSPD->GetNContributors();
- fCutValueD = vzSPD;
+ // pile-up check
+ if (fCheckPileUp)
+ {
+ if (esd->IsPileupFromSPD()) return kFALSE;
+ }
+
+ // get the best primary vertex:
+ // first try the one with tracks
+ const AliESDVertex *vTrk = esd->GetPrimaryVertexTracks();
+ const AliESDVertex *vSPD = esd->GetPrimaryVertexSPD();
+ const AliESDVertex *vTPC = esd->GetPrimaryVertexTPC();
+ Int_t ncTrk = -1;
+ Int_t ncSPD = -1;
+ Int_t ncTPC = -1;
+ Double_t vzTrk = 2.0 * fMaxD;
+ Double_t vzSPD = 2.0 * fMaxD;
+ Double_t vzTPC = 2.0 * fMaxD;
+ if (vTrk) vzTrk = TMath::Abs(vTrk->GetZv());
+ if (vSPD) vzSPD = TMath::Abs(vSPD->GetZv());
+ if (vTPC) vzTPC = TMath::Abs(vTPC->GetZv());
+ if (vTrk) ncTrk = (Int_t)vTrk->GetNContributors();
+ if (vSPD) ncSPD = (Int_t)vSPD->GetNContributors();
+ if (vTPC) ncTPC = (Int_t)vTPC->GetNContributors();
+ if(vTrk && ncTrk > 0)
+ {
+ fCutValueI = ncTrk;
+ fCutValueD = vzTrk;
+ }
+ else if (vSPD && ncSPD > 0)
+ {
+ fCutValueI = ncSPD;
+ fCutValueD = vzSPD;
+ }
+ else if (vTPC && fAcceptTPC && ncTPC > 0)
+ {
+ fCutValueI = ncTPC;
+ fCutValueD = vzTPC;
+ }
+ else
+ {
+ fCutValueI = -1;
+ fCutValueD = 2.0 * fMaxD;
+ }
}
- else if (vTPC->GetStatus() && fAcceptTPC)
+ else if (aod)
{
- fCutValueI = vTPC->GetNContributors();
- fCutValueD = vzTPC;
+ // pile-up check is not yet available for AODs
+
+ // lines suggested by Andrea to reject TPC-only events
+ if(!fAcceptTPC)
+ {
+ if (!aod->GetPrimaryVertexSPD()) return kFALSE;
+ else if(aod->GetPrimaryVertexSPD()->GetNContributors() < 1) return kFALSE;
+ }
+
+ AliAODVertex *prim = (AliAODVertex*)aod->GetPrimaryVertex();
+ if (!prim) return kFALSE;
+
+ fCutValueI = prim->GetNContributors();
+ fCutValueD = prim->GetZ();
}
else
return kFALSE;
-
- return OkRangeI() && OkRangeD();
+
+ // output
+ Bool_t result = ((!OkRangeI()) && OkRangeD());
+ return result;
}
-