/***************************************************************************
adash@cern.ch - last modified on 03/04/2013
// *** Configuration script for Phi-Meson analysis with 2013 PPb runs ***
//
// A configuration script for RSN package needs to define the followings:
//
// (1) decay tree of each resonance to be studied, which is needed to select
// true pairs and to assign the right mass to all candidate daughters
// (2) cuts at all levels: single daughters, tracks, events
// (3) output objects: histograms or trees
****************************************************************************/
Bool_t ConfigPhiPPb_TPC(
AliRsnMiniAnalysisTask *task,
Bool_t isMC,
Bool_t isPP,
const char *suffix,
AliRsnCutSet *cutsPair,
AliPID::EParticleType type,
Float_t nsigmaKp = 2.0,
Bool_t enableMonitor = kTRUE,
TString optSyt="Default"
)
{
//These are the Default values for 2011 ESD track cuts
Double_t dcaxymax = 2.0;
TString PtDcaFormula = "0.0105+0.0350/pt^1.1";//7sigma
Double_t dcazmax = 2.0;
Double_t minNcls = 50;
Double_t maxX2TPCcls = 4.0;
Double_t maxX2ITScls = 36.0;
Double_t minCrossedRows = 70.0;
Double_t minRatioClsCrRowsOverFCls = 0.8;
if(optSyt.Contains("PtDCAXY5s")) {PtDcaFormula = "0.0075+0.025/pt^1.1";}
if(optSyt.Contains("PtDCAXY6s")) {PtDcaFormula = "0.0090+0.030/pt^1.1";}
if(optSyt.Contains("PtDCAXY7s")) {PtDcaFormula = "0.0105+0.035/pt^1.1";}
if(optSyt.Contains("PtDCAXY8s")) {PtDcaFormula = "0.0120+0.040/pt^1.1";}
if(optSyt.Contains("PtDCAXY9s")) {PtDcaFormula = "0.0135+0.045/pt^1.1";}
if(optSyt.Contains("FixDCAZ1")) {dcazmax = 1.;}
if(optSyt.Contains("FixDCAZ2")) {dcazmax = 2.;}
if(optSyt.Contains("FixDCAZ3")) {dcazmax = 3.;}
if(optSyt.Contains("NCrRows60")){minCrossedRows = 60;}
if(optSyt.Contains("NCrRows70")){minCrossedRows = 70;}
if(optSyt.Contains("NCrRows80")){minCrossedRows = 80;}
if(optSyt.Contains("NCrRows90")){minCrossedRows = 90;}
if(optSyt.Contains("RClsCrRowsOvFCls0.7")){minRatioClsCrRowsOverFCls = 0.7;}
if(optSyt.Contains("RClsCrRowsOvFCls0.8")){minRatioClsCrRowsOverFCls = 0.8;}
if(optSyt.Contains("RClsCrRowsOvFCls0.9")){minRatioClsCrRowsOverFCls = 0.9;}
if(optSyt.Contains("ChiSqrPerTPCCls3")) {maxX2TPCcls = 3.0;}
if(optSyt.Contains("ChiSqrPerTPCCls4")) {maxX2TPCcls = 4.0;}
if(optSyt.Contains("ChiSqrPerTPCCls5")) {maxX2TPCcls = 5.0;}
if(optSyt.Contains("ChiSqrPerITSCls30")) {maxX2ITScls = 30.0;}
if(optSyt.Contains("ChiSqrPerITSCls36")) {maxX2ITScls = 36.0;}
if(optSyt.Contains("ChiSqrPerITSCls45")) {maxX2ITScls = 45.0;}
// manage suffix
if (strlen(suffix) > 0) suffix = Form("_%s", suffix);
// retrieve mass from PDG database
Int_t pdg = 333;
TDatabasePDG *db = TDatabasePDG::Instance();
TParticlePDG *part = db->GetParticle(pdg);
Double_t mass = part->Mass();
TString opt = "PPb";
TString scheme="";
TString cutname = "K_Phi";
if (!opt.IsNull()) cutname += Form("_%s",opt.Data());
AliRsnCutSet * cutSetKaon = new AliRsnCutSet(cutname.Data(), AliRsnTarget::kDaughter);
AliRsnCutTrackQuality *fQualityTrackCut = new AliRsnCutTrackQuality("AliRsnCutTrackQuality");
//
AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
if(optSyt.Contains("Default")){
::Info("ConfigPhipPbTPC", Form("Default 2011 ESD track cuts used : %s\n",optSyt.Data()));
Int_t clusterCut = 1;
Bool_t selPrimaries = kTRUE;
if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(50);
else if (clusterCut == 1) {
esdTrackCuts->SetMinNCrossedRowsTPC(70);
esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
}
esdTrackCuts->SetMaxChi2PerClusterTPC(4);
esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
esdTrackCuts->SetRequireTPCRefit(kTRUE);
// ITS
esdTrackCuts->SetRequireITSRefit(kTRUE);
esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
AliESDtrackCuts::kAny);
if(selPrimaries) {
// 7*(0.0015+0.0050/pt^1.1)
esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
}
esdTrackCuts->SetMaxDCAToVertexZ(2);
esdTrackCuts->SetDCAToVertex2D(kFALSE);
esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
esdTrackCuts->SetMaxChi2PerClusterITS(36);
}
else{
::Info("ConfigPhipPbTPC", Form("User Defined ESD track cuts used for Sys : %s\n",optSyt.Data()));
Int_t clusterCut = 1;
Bool_t selPrimaries = kTRUE;
if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(50);
else if (clusterCut == 1) {
esdTrackCuts->SetMinNCrossedRowsTPC(minCrossedRows);
esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(minRatioClsCrRowsOverFCls);
}
esdTrackCuts->SetMaxChi2PerClusterTPC(maxX2TPCcls);
esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
esdTrackCuts->SetRequireTPCRefit(kTRUE);
// ITS
esdTrackCuts->SetRequireITSRefit(kTRUE);
esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
AliESDtrackCuts::kAny);
if(selPrimaries) {
// 7*(0.0015+0.0050/pt^1.1)
esdTrackCuts->SetMaxDCAToVertexXYPtDep(PtDcaFormula.Data());
esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
}
//esdTrackCuts->SetMaxDCAToVertexXY(2)
esdTrackCuts->SetMaxDCAToVertexZ(dcazmax);
esdTrackCuts->SetDCAToVertex2D(kFALSE);
esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
esdTrackCuts->SetMaxChi2PerClusterITS(maxX2ITScls);
}
fQualityTrackCut->SetESDtrackCuts(esdTrackCuts);
fQualityTrackCut->SetPtRange(0.15,10);
fQualityTrackCut->SetEtaRange(-0.8,0.8);
//fQualityTrackCut->Print();
cutSetKaon->AddCut(fQualityTrackCut);
if (!scheme.IsNull()) scheme += "&";
scheme += fQualityTrackCut->GetName();
//AliRsnCutPIDNSigma *cutKTPC = new AliRsnCutPIDNSigma("cutNSigmaTPCK",AliPID::kKaon,AliRsnCutPIDNSigma::kTPC);
AliRsnCutPIDNSigma *cutKTPC = new AliRsnCutPIDNSigma("cutNSigmaTPCK",type,AliRsnCutPIDNSigma::kTPC);
cutKTPC->SinglePIDRange(nsigmaKp);
cutSetKaon->AddCut(cutKTPC);
if (!scheme.IsNull()) scheme += "&";
scheme += cutKTPC->GetName();
//Printf ("CUT Scheme for KAON is '%s'",scheme.Data());
cutSetKaon->SetCutScheme(scheme.Data());
Int_t iCutK = task->AddTrackCuts(cutSetKaon);
if(enableMonitor){
Printf("======== Monitoring cut AliRsnCutSetDaughterParticle enabled");
gROOT->LoadMacro("$ALICE_ROOT/PWGLF/RESONANCES/macros/mini/AddMonitorOutput.C");
AddMonitorOutput(isMC, cutSetKaon->GetMonitorOutput());
}
// -- Values ------------------------------------------------------------------------------------
/* invariant mass */ Int_t imID = task->CreateValue(AliRsnMiniValue::kInvMass, kFALSE);
/* IM resolution */ Int_t resID = task->CreateValue(AliRsnMiniValue::kInvMassRes, kTRUE);
/* transv. momentum */ Int_t ptID = task->CreateValue(AliRsnMiniValue::kPt, kFALSE);
/* centrality */ Int_t centID = task->CreateValue(AliRsnMiniValue::kMult, kFALSE);
/* pseudorapidity */ Int_t etaID = task->CreateValue(AliRsnMiniValue::kEta, kFALSE);
/* rapidity */ Int_t yID = task->CreateValue(AliRsnMiniValue::kY, kFALSE);
// -- Create all needed outputs -----------------------------------------------------------------
// use an array for more compact writing, which are different on mixing and charges
// [0] = unlike
// [1] = mixing
// [2] = like ++
// [3] = like --
Bool_t use [7] = { 1 , 1 , 1 , 1 , isMC , isMC , isMC };
Bool_t useIM [7] = { 1 , 1 , 1 , 1 , 1 , 1 , 0 };
TString name [7] = {"Unlike", "Mixing", "LikePP", "LikeMM", "MCGen" , "Trues" , "Res" };
TString comp [7] = {"PAIR" , "MIX" , "PAIR" , "PAIR" , "MOTHER", "TRUE" , "TRUE" };
TString output [7] = {"SPARSE", "SPARSE", "SPARSE", "SPARSE", "SPARSE", "SPARSE", "SPARSE"};
Char_t charge1 [7] = {'+' , '+' , '+' , '-' , '+' , '+' , '+' };
Char_t charge2 [7] = {'-' , '-' , '+' , '-' , '-' , '-' , '-' };
Int_t cutID [7] = {iCutK , iCutK , iCutK , iCutK , iCutK , iCutK , iCutK };
for (Int_t i = 0; i < 7; i++) {
if (!use[i]) continue;
AliRsnMiniOutput *out = task->CreateOutput(Form("PhiMeson_%s%s", name[i].Data(), suffix), output[i].Data(), comp[i].Data());
out->SetCutID(0, cutID[i]);
out->SetCutID(1, cutID[i]);
out->SetDaughter(0, AliRsnDaughter::kKaon);
out->SetDaughter(1, AliRsnDaughter::kKaon);
out->SetCharge(0, charge1[i]);
out->SetCharge(1, charge2[i]);
out->SetMotherPDG(pdg);
out->SetMotherMass(mass);
out->SetPairCuts(cutsPair);
// axis X: invmass (or resolution)
if (useIM[i])
out->AddAxis(imID, 120, 0.98, 1.1);
else
out->AddAxis(resID, 200, -0.02, 0.02);
// axis Y: transverse momentum
out->AddAxis(ptID, 100, 0.0, 10.0);
// axis Z: centrality-multiplicity
if (!isPP)
out->AddAxis(centID, 100, 0.0, 100.0);
else
out->AddAxis(centID, 400, 0.0, 400.0);
// axis W: pseudorapidity
// out->AddAxis(etaID, 20, -1.0, 1.0);
// axis J: rapidity
//out->AddAxis(yID, 90, -4.5, 4.5);
}
return kTRUE;
}