#include "AliRDHFCutsD0toKpipipi.h"
#include "AliCFVertexingHF2Prong.h"
#include "AliCFVertexingHF3Prong.h"
+#include "AliCFVertexingHFCascade.h"
#include "AliCFVertexingHF.h"
#include "AliAnalysisDataSlot.h"
#include "AliAnalysisDataContainer.h"
fWeight(1.),
fNvar(0),
fPartName(""),
- fDauNames("")
+ fDauNames(""),
+ fSign(2),
+ fCentralitySelection(kTRUE),
+ fFakeSelection(0),
+ fRejectIfNoQuark(kTRUE),
+ fUseMCVertex(kFALSE),
+ fDsOption(1)
{
//
//Default ctor
fWeight(1.),
fNvar(0),
fPartName(""),
- fDauNames("")
+ fDauNames(""),
+ fSign(2),
+ fCentralitySelection(kTRUE),
+ fFakeSelection(0),
+ fRejectIfNoQuark(kTRUE),
+ fUseMCVertex(kFALSE),
+ fDsOption(1)
{
//
// Constructor. Initialization of Inputs and Outputs
fWeight(c.fWeight),
fNvar(c.fNvar),
fPartName(c.fPartName),
- fDauNames(c.fDauNames)
+ fDauNames(c.fDauNames),
+ fSign(c.fSign),
+ fCentralitySelection(c.fCentralitySelection),
+ fFakeSelection(c.fFakeSelection),
+ fRejectIfNoQuark(c.fRejectIfNoQuark),
+ fUseMCVertex(c.fUseMCVertex),
+ fDsOption(c.fDsOption)
{
//
// Copy Constructor
if (fDebug>1) printf("AliCFTaskVertexingHF::Init()");
AliRDHFCuts *copyfCuts = 0x0;
-
+ if (!fCuts){
+ AliFatal("No cuts defined - Exiting...");
+ return;
+ }
+
switch (fDecayChannel){
case 2:{
- copyfCuts = new AliRDHFCutsD0toKpi(*(dynamic_cast<AliRDHFCutsD0toKpi*>(fCuts)));
- fNvar = 13;
+ copyfCuts = new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fCuts)));
+ fNvar = 15;
fPartName="D0";
fDauNames="K+pi";
break;
}
case 21:{
- copyfCuts = new AliRDHFCutsDStartoKpipi(*(dynamic_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
- fNvar = 13;
+ copyfCuts = new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
+ fNvar = 15;
fPartName="Dstar";
fDauNames="K+pi+pi";
break;
}
case 31:{
- copyfCuts = new AliRDHFCutsDplustoKpipi(*(dynamic_cast<AliRDHFCutsDplustoKpipi*>(fCuts)));
- fNvar = 12;
+ copyfCuts = new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fCuts)));
+ fNvar = 14;
fPartName="Dplus";
fDauNames="K+pi+pi";
break;
}
case 32:{
- copyfCuts = new AliRDHFCutsLctopKpi(*(dynamic_cast<AliRDHFCutsLctopKpi*>(fCuts)));
- fNvar = 12;
+ copyfCuts = new AliRDHFCutsLctopKpi(*(static_cast<AliRDHFCutsLctopKpi*>(fCuts)));
+ fNvar = 18;
fPartName="Lambdac";
fDauNames="p+K+pi";
break;
}
case 33:{
- copyfCuts = new AliRDHFCutsDstoKKpi(*(dynamic_cast<AliRDHFCutsDstoKKpi*>(fCuts)));
- fNvar = 12;
+ copyfCuts = new AliRDHFCutsDstoKKpi(*(static_cast<AliRDHFCutsDstoKKpi*>(fCuts)));
+ fNvar = 14;
fPartName="Ds";
fDauNames="K+K+pi";
break;
}
case 4:{
- copyfCuts = new AliRDHFCutsD0toKpipipi(*(dynamic_cast<AliRDHFCutsD0toKpipipi*>(fCuts)));
- fNvar = 13;
+ copyfCuts = new AliRDHFCutsD0toKpipipi(*(static_cast<AliRDHFCutsD0toKpipipi*>(fCuts)));
+ fNvar = 15;
fPartName="D0";
fDauNames="K+pi+pi+pi";
break;
}
const char* nameoutput=GetOutputSlot(4)->GetContainer()->GetName();
- copyfCuts->SetName(nameoutput);
-
- //Post the data
- PostData(4, copyfCuts);
+ if (copyfCuts){
+ copyfCuts->SetName(nameoutput);
+
+ //Post the data
+ PostData(4, copyfCuts);
+ }
+ else{
+ AliFatal("Failing initializing AliRDHFCuts object - Exiting...");
+ }
return;
}
PostData(1,fHistEventsProcessed) ;
PostData(2,fCFManager->GetParticleContainer()) ;
- PostData(3,fCorrelation) ;
-
- AliESDtrackCuts* trackCuts = fCuts->GetTrackCuts();
-
+ PostData(3,fCorrelation) ;
+
if (fFillFromGenerated){
AliWarning("Flag to fill container with generated value ON ---> dca, d0pi, d0K, d0xd0, cosPointingAngle will be set as dummy!");
}
//******** DEFINE number of variables of the container***** for now set at 13, in the future in the config macro.
- Double_t* containerInput = new Double_t[fNvar];
- Double_t* containerInputMC = new Double_t[fNvar];
-
//loop on the MC event
TClonesArray* mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
AliError("Could not find MC Header in AOD");
return;
}
+
+ Double_t* containerInput = new Double_t[fNvar];
+ Double_t* containerInputMC = new Double_t[fNvar];
+
AliCFVertexingHF* cfVtxHF=0x0;
switch (fDecayChannel){
case 2:{
- cfVtxHF = new AliCFVertexingHF2Prong(mcArray, fOriginDselection);
- break;
+ cfVtxHF = new AliCFVertexingHF2Prong(mcArray, fOriginDselection);
+ break;
}
case 21:{
- // cfVtxHF = new AliCFVertexingHFCascade(mcArray, originDselection); // not there yet
- break;
+ cfVtxHF = new AliCFVertexingHFCascade(mcArray, fOriginDselection);
+ break;
}
case 31:
case 32:
default:
break;
}
+ if (!cfVtxHF){
+ AliError("No AliCFVertexingHF initialized");
+ delete[] containerInput;
+ delete[] containerInputMC;
+ return;
+ }
Double_t zPrimVertex = aodVtx ->GetZ();
Double_t zMCVertex = mcHeader->GetVtxZ();
-
+ if (TMath::Abs(zMCVertex) > fCuts->GetMaxVtxZ()){
+ AliDebug(3,Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fCuts->GetMaxVtxZ(), fCuts->GetMaxVtxZ()));
+ delete[] containerInput;
+ delete[] containerInputMC;
+ return;
+ }
+
+ AliESDtrackCuts** trackCuts = new AliESDtrackCuts*[cfVtxHF->GetNProngs()];
+ if (fDecayChannel == 21){
+ // for the D*, setting the third element of the array of the track cuts to those for the soft pion
+ for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs()-1; iProng++){
+ trackCuts[iProng]=fCuts->GetTrackCuts();
+ }
+ trackCuts[2] = fCuts->GetTrackCutsSoftPi();
+ }
+ else {
+ for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs(); iProng++){
+ trackCuts[iProng]=fCuts->GetTrackCuts();
+ }
+ }
+
//General settings: vertex, feed down and fill reco container with generated values.
cfVtxHF->SetRecoPrimVertex(zPrimVertex);
cfVtxHF->SetMCPrimaryVertex(zMCVertex);
cfVtxHF->SetFillFromGenerated(fFillFromGenerated);
+ cfVtxHF->SetNVar(fNvar);
+ cfVtxHF->SetFakeSelection(fFakeSelection);
+ cfVtxHF->SetRejectCandidateIfNotFromQuark(fRejectIfNoQuark);
+
+ // switch-off the trigger class selection (doesn't work for MC)
+ fCuts->SetTriggerClass("");
+
+ // MC vertex, to be used, in case, for pp
+ if (fUseMCVertex) fCuts->SetUseMCVertex();
+
+ if (fCentralitySelection){ // keep only the requested centrality
+ if(fCuts->IsEventSelectedInCentrality(aodEvent)!=0) {
+ delete[] containerInput;
+ delete[] containerInputMC;
+ delete [] trackCuts;
+ return;
+ }
+ } else { // keep all centralities
+ fCuts->SetMinCentrality(0.);
+ fCuts->SetMaxCentrality(100.);
+ }
+
+
+ Float_t centValue = fCuts->GetCentrality(aodEvent);
+ cfVtxHF->SetCentralityValue(centValue);
for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
-
- AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
-
- // check the MC-level cuts, must be the desidered particle
- if (!fCFManager->CheckParticleCuts(0, mcPart)) continue; // 0 stands for MC level
-
- cfVtxHF->SetMCCandidateParam(iPart);
- cfVtxHF->SetNVar(fNvar);
- //counting c quarks
- cquarks += cfVtxHF->MCcquarkCounting(mcPart);
-
- if (!(cfVtxHF->SetLabelArray())){
- AliDebug(2,Form("Impossible to set the label array (decaychannel = %d)",fDecayChannel));
- continue;
- }
+ AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
+ if (!mcPart){
+ AliError("Failed casting particle from MC array!, Skipping particle");
+ continue;
+ }
+ // check the MC-level cuts, must be the desidered particle
+ if (!fCFManager->CheckParticleCuts(0, mcPart)) {
+ continue; // 0 stands for MC level
+ }
+ cfVtxHF->SetMCCandidateParam(iPart);
+
+ //counting c quarks
+ cquarks += cfVtxHF->MCcquarkCounting(mcPart);
+
+ if (!(cfVtxHF->SetLabelArray())){
+ AliDebug(2,Form("Impossible to set the label array (decaychannel = %d)",fDecayChannel));
+ continue;
+ }
- //check the candiate family at MC level
- if (!(cfVtxHF->CheckMCPartFamily(mcPart, mcArray))) {
- AliDebug(2,Form("Check on the family wrong!!! (decaychannel = %d)",fDecayChannel));
- continue;
- }
+ //check the candiate family at MC level
+ if (!(cfVtxHF->CheckMCPartFamily(mcPart, mcArray))) {
+ AliDebug(2,Form("Check on the family wrong!!! (decaychannel = %d)",fDecayChannel));
+ continue;
+ }
else{
AliDebug(2,Form("Check on the family OK!!! (decaychannel = %d)",fDecayChannel));
}
icountVertex++;
//mc Refit requirement
- Bool_t mcRefitStep = cfVtxHF->MCRefitStep(aodEvent, trackCuts);
+ Bool_t mcRefitStep = cfVtxHF->MCRefitStep(aodEvent, &trackCuts[0]);
if (mcRefitStep){
fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepRefit, fWeight);
AliDebug(3,"MC Refit cut passed and container filled\n");
icountRefit++;
+
+
}
else{
AliDebug(3,"MC Refit cut not passed\n");
charmCandidate = 0x0;
continue;
}
-
- Int_t isPartOrAntipart = cfVtxHF->CheckReflexion();
+
+ Int_t isPartOrAntipart = cfVtxHF->CheckReflexion(fSign);
+ if (isPartOrAntipart == 0){
+ AliDebug(2, Form("The candidate pdg code doesn't match the requirement set in the task (fSign = %d)",fSign));
+ continue;
+ }
+
+
Bool_t recoContFilled = cfVtxHF->FillRecoContainer(containerInput);
if (recoContFilled){
-
+
+ // weight according to pt
+ if (fUseWeight)fWeight = GetWeight(containerInput[0]);
+
if (!fCuts->IsInFiducialAcceptance(containerInput[0],containerInput[1])) continue;
//Reco Step
AliDebug(3,"Reco step passed and container filled\n");
//Reco in the acceptance -- take care of UNFOLDING!!!!
- Bool_t recoAcceptanceStep = cfVtxHF->RecoAcceptStep(trackCuts);
+ Bool_t recoAcceptanceStep = cfVtxHF->RecoAcceptStep(&trackCuts[0]);
if (recoAcceptanceStep) {
fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoAcceptance, fWeight) ;
icountRecoAcc++;
fCuts->SetUsePID(kFALSE);
recoAnalysisCuts = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
- if (recoAnalysisCuts > 3){ // Ds case, where more possibilities are considered
- if (recoAnalysisCuts >= 8){
- recoAnalysisCuts -= 8; // removing K0star mass
- }
- if (recoAnalysisCuts >= 4){
- recoAnalysisCuts -= 4; // removing Phi mass
- }
+ if (fDecayChannel==33){ // Ds case, where more possibilities are considered
+ Bool_t keepDs=ProcessDs(recoAnalysisCuts);
+ if(keepDs) recoAnalysisCuts=3;
}
+
fCuts->SetUsePID(iscutsusingpid); //restoring usage of the PID from the cuts object
if (recoAnalysisCuts == 3 || recoAnalysisCuts == isPartOrAntipart){
//recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kPID);
//if((fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==isPartOrAntipart)||(fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==3)){
recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
+
+ if (fDecayChannel==33){ // Ds case, where more possibilities are considered
+ Bool_t keepDs=ProcessDs(recoPidSelection);
+ if(keepDs) recoPidSelection=3;
+ }
+
if (recoPidSelection == 3 || recoPidSelection == isPartOrAntipart){
fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPID, fWeight);
icountRecoPID++;
fHistEventsProcessed->Fill(0);
delete[] containerInput;
- containerInput = 0x0;
delete[] containerInputMC;
- containerInputMC = 0x0;
delete cfVtxHF;
-
+ if (trackCuts){
+ // for (Int_t i=0; i<cfVtxHF->GetNProngs(); i++){
+ // delete [] trackCuts[i];
+ // }
+ delete [] trackCuts;
+ }
}
//___________________________________________________________________________
//slot #1
OpenFile(1);
fHistEventsProcessed = new TH1I("CFHFchist0","",1,0,1) ;
+
+ PostData(1,fHistEventsProcessed) ;
+ PostData(2,fCFManager->GetParticleContainer()) ;
+ PostData(3,fCorrelation) ;
+
}
return dNdpt;
}
+
+
+//__________________________________________________________________________________________________
+Bool_t AliCFTaskVertexingHF::ProcessDs(Int_t recoAnalysisCuts) const{
+ // processes output of Ds is selected
+ Bool_t keep=kFALSE;
+ if(recoAnalysisCuts > 0){
+ Int_t isKKpi=recoAnalysisCuts&1;
+ Int_t ispiKK=recoAnalysisCuts&2;
+ Int_t isPhiKKpi=recoAnalysisCuts&4;
+ Int_t isPhipiKK=recoAnalysisCuts&8;
+ Int_t isK0starKKpi=recoAnalysisCuts&16;
+ Int_t isK0starpiKK=recoAnalysisCuts&32;
+ if(fDsOption==1){
+ if(isKKpi && isPhiKKpi) keep=kTRUE;
+ if(ispiKK && isPhipiKK) keep=kTRUE;
+ }
+ else if(fDsOption==2){
+ if(isKKpi && isK0starKKpi) keep=kTRUE;
+ if(ispiKK && isK0starpiKK) keep=kTRUE;
+ }
+ else if(fDsOption==3)keep=kTRUE;
+ }
+ return keep;
+}