fMinVtxType(3),
fMinVtxContr(1),
fMaxVtxRedChi2(1e6),
+fMaxVtxZ(1e6),
fMinSPDMultiplicity(0),
fTriggerMask(0),
fTrackCuts(0),
fVarsForOpt(0),
fGlobalIndex(1),
fCutsRD(0),
-fIsUpperCut(0)
+fIsUpperCut(0),
+fUsePID(kFALSE),
+fPidHF(0),
+fWhyRejection(0),
+fRemoveDaughtersFromPrimary(kFALSE),
+fOptPileup(0),
+fMinContrPileup(3),
+fMinDzPileup(0.6)
{
//
// Default Constructor
fMinVtxType(source.fMinVtxType),
fMinVtxContr(source.fMinVtxContr),
fMaxVtxRedChi2(source.fMaxVtxRedChi2),
+ fMaxVtxZ(source.fMaxVtxZ),
fMinSPDMultiplicity(source.fMinSPDMultiplicity),
fTriggerMask(source.fTriggerMask),
fTrackCuts(0),
fVarsForOpt(0),
fGlobalIndex(source.fGlobalIndex),
fCutsRD(0),
- fIsUpperCut(0)
+ fIsUpperCut(0),
+ fUsePID(source.fUsePID),
+ fPidHF(0),
+ fWhyRejection(source.fWhyRejection),
+ fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
+ fOptPileup(source.fOptPileup),
+ fMinContrPileup(source.fMinContrPileup),
+ fMinDzPileup(source.fMinDzPileup)
{
//
// Copy constructor
if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
+ if(source.fPidHF) SetPidHF(source.fPidHF);
PrintAll();
}
fMinVtxType=source.fMinVtxType;
fMinVtxContr=source.fMinVtxContr;
fMaxVtxRedChi2=source.fMaxVtxRedChi2;
+ fMaxVtxZ=source.fMaxVtxZ;
fMinSPDMultiplicity=source.fMinSPDMultiplicity;
fTriggerMask=source.fTriggerMask;
fnPtBins=source.fnPtBins;
fnVars=source.fnVars;
fGlobalIndex=source.fGlobalIndex;
fnVarsForOpt=source.fnVarsForOpt;
+ fUsePID=source.fUsePID;
+ SetPidHF(source.GetPidHF());
+ fWhyRejection=source.fWhyRejection;
+ fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
+ fOptPileup=source.fOptPileup;
+ fMinContrPileup=source.fMinContrPileup;
+ fMinDzPileup=source.fMinDzPileup;
if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
fCutsRD=0;
}
if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}
-
+ if(fPidHF){
+ delete fPidHF;
+ fPidHF=0;
+ }
}
//---------------------------------------------------------------------------
-Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) const {
+Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
//
// Event selection
//
//if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;
+ fWhyRejection=0;
+
// multiplicity cuts no implemented yet
+
+
const AliVVertex *vertex = event->GetPrimaryVertex();
if(!vertex) return kFALSE;
if(vertex->GetNContributors()<fMinVtxContr) return kFALSE;
+ if(TMath::Abs(vertex->GetZ())>fMaxVtxZ) return kFALSE;
+
+ // switch to settings for 1-pad cls in TPC
+ if(fPidHF) {
+ if(event->GetRunNumber()>121693 && event->GetRunNumber()<136851)
+ fPidHF->SetOnePad(kTRUE);
+ if(event->GetRunNumber()>=136851 && event->GetRunNumber()<=139517)
+ fPidHF->SetPbPb(kTRUE);
+ }
+
+ if(fOptPileup==kRejectPileupEvent){
+ Int_t cutc=(Int_t)fMinContrPileup;
+ Double_t cutz=(Double_t)fMinDzPileup;
+ if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {
+ fWhyRejection=1;
+ return kFALSE;
+ }
+ }
+
return kTRUE;
}
//---------------------------------------------------------------------------
if(!fTrackCuts) return kTRUE;
Int_t ndaughters = d->GetNDaughters();
- AliESDtrack* esdTrack=0;
AliAODVertex *vAOD = d->GetPrimaryVtx();
Double_t pos[3],cov[6];
vAOD->GetXYZ(pos);
vAOD->GetCovarianceMatrix(cov);
- const AliESDVertex *vESD = new AliESDVertex(pos,cov,100.,100);
+ const AliESDVertex vESD(pos,cov,100.,100);
Bool_t retval=kTRUE;
if(!dgTrack) retval = kFALSE;
//printf("charge %d\n",dgTrack->Charge());
if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
- // convert to ESD track here
- esdTrack=new AliESDtrack(dgTrack);
- // needed to calculate the impact parameters
- esdTrack->RelateToVertex(vESD,0.,3.);
- if(!fTrackCuts->IsSelected(esdTrack)) retval = kFALSE;
- delete esdTrack; esdTrack=0;
- }
- delete vESD; vESD=0;
+ if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;
+ }
return retval;
}
//---------------------------------------------------------------------------
+Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
+ //
+ // Convert to ESDtrack, relate to vertex and check cuts
+ //
+ if(!cuts) return kTRUE;
+
+ Bool_t retval=kTRUE;
+
+ // convert to ESD track here
+ AliESDtrack esdTrack(track);
+ // needed to calculate the impact parameters
+ esdTrack.RelateToVertex(primary,0.,3.);
+ if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
+
+ if(fOptPileup==kRejectTracksFromPileupVertex){
+ // to be implemented
+ // we need either to have here the AOD Event,
+ // or to have the pileup vertex object
+ }
+ return retval;
+}
+//---------------------------------------------------------------------------
void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
// Set the pt bins
fnPtBinLimits = nPtBinLimits;
SetGlobalIndex();
- cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
+ //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
fPtBinLimits = new Float_t[fnPtBinLimits];
for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];
if(fVarNames) {
delete [] fVarNames;
fVarNames = NULL;
- printf("Changing the variable names\n");
+ //printf("Changing the variable names\n");
}
if(nVars!=fnVars){
printf("Wrong number of variables: it has to be %d\n",fnVars);
if(fVarsForOpt) {
delete [] fVarsForOpt;
fVarsForOpt = NULL;
- printf("Changing the variables for cut optimization\n");
+ //printf("Changing the variables for cut optimization\n");
}
if(nVars==0){//!=fnVars) {
//
// print all cuts values
//
+
+ printf("Minimum vtx type %d\n",fMinVtxType);
+ printf("Minimum vtx contr %d\n",fMinVtxContr);
+ printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
+ printf("Min SPD mult %d\n",fMinSPDMultiplicity);
+ printf("Use PID %d\n",(Int_t)fUsePID);
+ printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
+
if(fVarNames){
cout<<"Array of variables"<<endl;
for(Int_t iv=0;iv<fnVars;iv++){
}
return fCutsRD[GetGlobalIndex(iVar,iPtBin)];
}
+//-------------------------------------------------------------------
+Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {
+ //
+ // Compare two cuts objects
+ //
+ Bool_t areEqual=kTRUE;
+
+ if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}
+
+ if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}
+
+ if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) { printf("Max vtx red chi2 %f %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}
+
+ if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) { printf("Min SPD mult %d\n %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}
+
+ if(fUsePID!=obj->fUsePID) { printf("Use PID %d %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}
+
+ if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}
+ if(fTrackCuts){
+ if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}
+
+ if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}
+
+ if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}
+
+ if(fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)!=obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)) {printf("ClusterReq SPD %d %d\n",fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD),obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)); areEqual=kFALSE;}
+ }
+
+ if(fCutsRD) {
+ for(Int_t iv=0;iv<fnVars;iv++) {
+ for(Int_t ib=0;ib<fnPtBins;ib++) {
+ if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {
+ cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<" "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";
+ areEqual=kFALSE;
+ }
+ }
+ }
+ }
+
+ return areEqual;
+}
+//---------------------------------------------------------------------------
+void AliRDHFCuts::MakeTable() const {
+ //
+ // print cuts values in table format
+ //
+
+ TString ptString = "pT range";
+ if(fVarNames && fPtBinLimits && fCutsRD){
+ TString firstLine(Form("* %-15s",ptString.Data()));
+ for (Int_t ivar=0; ivar<fnVars; ivar++){
+ firstLine+=Form("* %-15s ",fVarNames[ivar].Data());
+ if (ivar == fnVars){
+ firstLine+="*\n";
+ }
+ }
+ Printf("%s",firstLine.Data());
+
+ for (Int_t ipt=0; ipt<fnPtBins; ipt++){
+ TString line;
+ if (ipt==fnPtBins-1){
+ line=Form("* %5.1f < pt < inf ",fPtBinLimits[ipt]);
+ }
+ else{
+ line=Form("* %5.1f < pt < %4.1f ",fPtBinLimits[ipt],fPtBinLimits[ipt+1]);
+ }
+ for (Int_t ivar=0; ivar<fnVars; ivar++){
+ line+=Form("* %-15f ",fCutsRD[GetGlobalIndex(ivar,ipt)]);
+ }
+ Printf("%s",line.Data());
+ }
+
+ }
+
+
+ return;
+}