, fPlugins(0)
, fFillSignalOnly(kTRUE)
, fFillNoCuts(kFALSE)
+ , fUseFlagAOD(kTRUE)
+ , fApplyCutAOD(kFALSE)
+ , fFlags(1<<4)
, fBackGroundFactorApply(kFALSE)
, fRemovePileUp(kFALSE)
, fIdentifiedAsPileUp(kFALSE)
, fPassTheEventCut(kFALSE)
, fRejectKinkMother(kTRUE)
, fisppMultiBin(kFALSE)
+ , fPbPbUserCentralityBinning(kFALSE)
, fisNonHFEsystematics(kFALSE)
, fSpecialTrigger(NULL)
, fCentralityF(-1)
+ , fCentralityPercent(-1)
, fContributors(0.5)
, fWeightBackGround(0.)
, fVz(0.0)
memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);
memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));
memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));
+ memset(fCentralityLimits, 0, sizeof(Float_t) * 12);
+
+
}
//____________________________________________________________
, fPlugins(0)
, fFillSignalOnly(kTRUE)
, fFillNoCuts(kFALSE)
+ , fUseFlagAOD(kTRUE)
+ , fApplyCutAOD(kFALSE)
+ , fFlags(1<<4)
, fBackGroundFactorApply(kFALSE)
, fRemovePileUp(kFALSE)
, fIdentifiedAsPileUp(kFALSE)
, fPassTheEventCut(kFALSE)
, fRejectKinkMother(kTRUE)
, fisppMultiBin(kFALSE)
+ , fPbPbUserCentralityBinning(kFALSE)
, fisNonHFEsystematics(kFALSE)
, fSpecialTrigger(NULL)
, fCentralityF(-1)
+ , fCentralityPercent(-1)
, fContributors(0.5)
, fWeightBackGround(0.)
, fVz(0.0)
memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);
memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));
memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));
+ memset(fCentralityLimits, 0, sizeof(Float_t) * 12);
+
}
//____________________________________________________________
, fPlugins(0)
, fFillSignalOnly(ref.fFillSignalOnly)
, fFillNoCuts(ref.fFillNoCuts)
+ , fUseFlagAOD(ref.fUseFlagAOD)
+ , fApplyCutAOD(ref.fApplyCutAOD)
+ , fFlags(ref.fFlags)
, fBackGroundFactorApply(ref.fBackGroundFactorApply)
, fRemovePileUp(ref.fRemovePileUp)
, fIdentifiedAsPileUp(ref.fIdentifiedAsPileUp)
, fPassTheEventCut(ref.fPassTheEventCut)
, fRejectKinkMother(ref.fRejectKinkMother)
, fisppMultiBin(ref.fisppMultiBin)
+ , fPbPbUserCentralityBinning(ref.fPbPbUserCentralityBinning)
, fisNonHFEsystematics(ref.fisNonHFEsystematics)
, fSpecialTrigger(ref.fSpecialTrigger)
, fCentralityF(ref.fCentralityF)
+ , fCentralityPercent(ref.fCentralityPercent)
, fContributors(ref.fContributors)
, fWeightBackGround(ref.fWeightBackGround)
, fVz(ref.fVz)
target.fPlugins = fPlugins;
target.fFillSignalOnly = fFillSignalOnly;
target.fFillNoCuts = fFillNoCuts;
+ target.fUseFlagAOD = fUseFlagAOD;
+ target.fApplyCutAOD = fApplyCutAOD;
+ target.fFlags = fFlags;
target.fBackGroundFactorApply = fBackGroundFactorApply;
target.fRemovePileUp = fRemovePileUp;
target.fIdentifiedAsPileUp = fIdentifiedAsPileUp;
target.fPassTheEventCut = fPassTheEventCut;
target.fRejectKinkMother = fRejectKinkMother;
target.fisppMultiBin = fisppMultiBin;
+ target.fPbPbUserCentralityBinning = fPbPbUserCentralityBinning;
target.fisNonHFEsystematics = fisNonHFEsystematics;
target.fSpecialTrigger = fSpecialTrigger;
target.fCentralityF = fCentralityF;
+ target.fCentralityPercent = fCentralityPercent;
target.fContributors = fContributors;
target.fWeightBackGround = fWeightBackGround;
target.fVz = fVz;
fHistMCQA->SetOwner();
if(IsPbPb()) fMCQA->SetPbPb();
if(fisppMultiBin) fMCQA->SetPPMultiBin();
+ if(TestBit(kTreeStream)){
+ fMCQA->EnableDebugStreamer();
+ }
fMCQA->CreatDefaultHistograms(fHistMCQA);
fMCQA->SetBackgroundWeightFactor(fElecBackgroundFactor[0][0][0],fBinLimit);
fQA->Add(fHistMCQA);
}
PrintStatus();
+ // Done!!!
+ PostData(1, fOutput);
+ PostData(2, fQA);
}
//____________________________________________________________
// Event loop
if(IsAODanalysis()){
+ //printf("test\n");
ProcessAOD();
} else {
const char *specialTrigger = GetSpecialTrigger(fInputEvent->GetRunNumber());
fMCQA->SetMCEvent(fMCEvent);
fMCQA->SetGenEventHeader(fMCEvent->GenEventHeader());
fMCQA->SetCentrality(fCentralityF);
+ fMCQA->SetPercentrality(fCentralityPercent);
if(IsPbPb()) { fMCQA->SetPbPb();}
else
{
fMCQA->GetQuarkKine(mcpart, igen, AliHFEmcQA::kBeauty);
fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kCharm);
fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kBeauty);
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kCharm, AliHFEmcQA::kElectronPDG, 0); // no accept cut
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kBeauty, AliHFEmcQA::kElectronPDG, 0); // no accept cut
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kOthers, AliHFEmcQA::kElectronPDG, 0); // no accept cut
- if (TMath::Abs(mcpart->Eta()) < 0.9) {
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kCharm, AliHFEmcQA::kElectronPDG, 1); // accept |eta|<0.9
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kBeauty, AliHFEmcQA::kElectronPDG, 1); // accept |eta|<0.9
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kOthers, AliHFEmcQA::kElectronPDG, 1); // accept |eta|<0.9
- }
- if (TMath::Abs(AliHFEtools::GetRapidity(mcpart)) < 0.5) {
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kCharm, AliHFEmcQA::kElectronPDG, 2); // accept |y|<0.5
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kBeauty, AliHFEmcQA::kElectronPDG, 2); // accept |y|<0.5
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kOthers, AliHFEmcQA::kElectronPDG, 2); // accept |y|<0.5
- }
+ fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kCharm, AliHFEmcQA::kElectronPDG); // no accept cut
+ fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kBeauty, AliHFEmcQA::kElectronPDG); // no accept cut
+ fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kOthers, AliHFEmcQA::kElectronPDG); // no accept cut
}
//fMCQA->EndOfEventAna(AliHFEmcQA::kCharm);
//fMCQA->EndOfEventAna(AliHFEmcQA::kBeauty);
memset(container, 0, sizeof(Double_t) * 10);
// container for the output THnSparse
Double_t dataE[6]; // [pT, eta, Phi, type, 'C' or 'B']
+ Double_t dataDca[6]; // [source, pT, dca, centrality]
Int_t nElectronCandidates = 0;
AliESDtrack *track = NULL, *htrack = NULL;
AliMCParticle *mctrack = NULL;
if(HasMCData()){
FillProductionVertex(track);
- if(fMCQA){
+ if(fMCQA && signal){
fMCQA->SetCentrality(fCentralityF);
if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){
Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.};
+ Double_t hfeimpactRtmp=0., hfeimpactnsigmaRtmp=0.;
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactRtmp, hfeimpactnsigmaRtmp);
+ UChar_t itsPixel = track->GetITSClusterMap();
+ Double_t ilyrhit=0, ilyrstat=0;
+ for(Int_t ilyr=0; ilyr<6; ilyr++){
+ if(TESTBIT(itsPixel, ilyr)) ilyrhit += TMath::Power(2,ilyr);
+ if(fExtraCuts->CheckITSstatus(fExtraCuts->GetITSstatus(track,ilyr))) ilyrstat += TMath::Power(2,ilyr);
+ }
+ fMCQA->SetITSInfo(ilyrhit,ilyrstat);
+ fMCQA->SetHFEImpactParameters(hfeimpactRtmp, hfeimpactnsigmaRtmp);
+ fMCQA->SetTrkKine(track->Pt(),track->Eta(), track->Phi());
+ fMCQA->SetContainerStep(3);
for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
if(!fisNonHFEsystematics)break;
if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
if(elecSource == iSource){
for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
- if(weightElecBgV0[iLevel]>0){ fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, weightElecBgV0[iLevel]);}
- else if(weightElecBgV0[iLevel]<0){ fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, -1*weightElecBgV0[iLevel]);}
+ if(weightElecBgV0[iLevel]>0){
+ fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, weightElecBgV0[iLevel]);
+ }
+ else if(weightElecBgV0[iLevel]<0){
+ fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, -1*weightElecBgV0[iLevel]);
+ }
}
break;
}
}
}
//else{
- if(weightElecBgV0[0]>0) fVarManager->FillContainer(fContainer, "conversionElecs", 3, kFALSE, weightElecBgV0[0]);
- else if(weightElecBgV0[0]<0) fVarManager->FillContainer(fContainer, "mesonElecs", 3, kFALSE, -1*weightElecBgV0[0]);
+ if(weightElecBgV0[0]>0) {
+ fVarManager->FillContainer(fContainer, "conversionElecs", 3, kFALSE, weightElecBgV0[0]);
+ fVarManager->FillContainer(fContainer, "conversionElecs", 4, kTRUE, weightElecBgV0[0]);
+ }
+ else if(weightElecBgV0[0]<0) {
+ fVarManager->FillContainer(fContainer, "mesonElecs", 3, kFALSE, -1*weightElecBgV0[0]);
+ fVarManager->FillContainer(fContainer, "mesonElecs", 4, kTRUE, -1*weightElecBgV0[0]);
+ }
//}
}
}
+
+ Double_t hfeimpactR4all=0., hfeimpactnsigmaR4all=0.;
+ Int_t sourceDca =-1;
+ if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 211)){
+ if(track->Pt()>4.){
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
+ dataDca[0]=0; //pion
+ dataDca[1]=track->Pt();
+ dataDca[2]=hfeimpactR4all;
+ dataDca[3]=fCentralityF;
+ dataDca[4] = v0pid;
+ dataDca[5] = double(track->Charge());
+ fQACollection->Fill("Dca", dataDca);
+ }
+ }
+ else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){ // to increas statistics for Martin
+ if(signal){
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
+ if(fSignalCuts->IsCharmElectron(track)){
+ sourceDca=1;
+ }
+ else if(fSignalCuts->IsBeautyElectron(track)){
+ sourceDca=2;
+ }
+ else if(fSignalCuts->IsGammaElectron(track)){
+ sourceDca=3;
+ }
+ else if(fSignalCuts->IsNonHFElectron(track)){
+ sourceDca=4;
+ }
+ else if(fSignalCuts->IsJpsiElectron(track)){
+ sourceDca=5;
+ }
+ else {
+ sourceDca=6;
+ }
+ dataDca[0]=sourceDca;
+ dataDca[1]=track->Pt();
+ dataDca[2]=hfeimpactR4all;
+ dataDca[3]=fCentralityF;
+ dataDca[4] = v0pid;
+ dataDca[5] = double(track->Charge());
+ if(signal) fQACollection->Fill("Dca", dataDca);
+ }
+ }
}
if(TMath::Abs(track->Eta()) < 0.5){
- fQACollection->Fill("TPCdEdxBeforePID", track->P(), track->GetTPCsignal());
+ if(track->GetInnerParam())
+ fQACollection->Fill("TPCdEdxBeforePID", track->GetInnerParam()->P(), track->GetTPCsignal());
fQACollection->Fill("TPCnSigmaBeforePID", track->P(), fInputHandler->GetPIDResponse()->NumberOfSigmasTPC(track, AliPID::kElectron));
}
// Temporary histogram for chi2/ITS cluster
if(IsPbPb()) {
TBits shared = track->GetTPCSharedMap();
- Int_t sharebit=0;
+ Int_t sharebit=0;
if(shared.CountBits() >= 2) sharebit=1;
+ Double_t itschi2percluster = 0.0;
+ Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));
+ if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;
+
Double_t itsChi2[7] = {track->Pt(),track->Eta(), track->Phi(),
- fCentralityF,track->GetTPCsignalN(), sharebit,
- track->GetITSchi2()/static_cast<Double_t>(track->GetNcls(0))};
+ fCentralityF,track->GetTPCsignalN(), sharebit,itschi2percluster};
fQACollection->Fill("fChi2perITScluster", itsChi2);
}
else{
- Double_t itsChi2[3] = {track->Pt(), fCentralityF, track->GetITSchi2()/static_cast<Double_t>(track->GetNcls(0))};
- fQACollection->Fill("fChi2perITScluster", itsChi2);
+
+ Double_t itschi2percluster = 0.0;
+ Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));
+ if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;
+
+ Double_t itsChi2[3] = {track->Pt(), fCentralityF, itschi2percluster};
+ fQACollection->Fill("fChi2perITScluster", itsChi2);
}
// Fill Histogram for Hadronic Background
Int_t glabel=TMath::Abs(mctrack->GetMother());
if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==321)
- fQACollection->Fill("Ke3Kecorr",mctrackmother->Pt(),mctrack->Pt());
+ fQACollection->Fill("Ke3Kecorr",mctrack->Pt(),mctrackmother->Pt());
else if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==130)
- fQACollection->Fill("Ke3K0Lecorr",mctrackmother->Pt(),mctrack->Pt());
+ fQACollection->Fill("Ke3K0Lecorr",mctrack->Pt(),mctrackmother->Pt());
}
}
}
}
} // end of electron background analysis
-
-
if (GetPlugin(kDEstep)) {
Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.,};
Int_t elecSource = 0;
- // minjung for IP QA(temporary ~ 2weeks)
Double_t hfeimpactR=0., hfeimpactnsigmaR=0.;
fExtraCuts->GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
- fQACollection->Fill("dataDca",track->Pt(),hfeimpactR);
- fQACollection->Fill("dataDcaSig",track->Pt(),hfeimpactnsigmaR);
- fQACollection->Fill("dataDcaSigDca",hfeimpactR,hfeimpactnsigmaR);
- if(HasMCData()){
- // minjung for IP QA(temporary ~ 2weeks)
- if(fSignalCuts->IsCharmElectron(track)){
- fQACollection->Fill("charmDca",track->Pt(),hfeimpactR);
- fQACollection->Fill("charmDcaSig",track->Pt(),hfeimpactnsigmaR);
- }
- else if(fSignalCuts->IsBeautyElectron(track)){
- fQACollection->Fill("beautyDca",track->Pt(),hfeimpactR);
- fQACollection->Fill("beautyDcaSig",track->Pt(),hfeimpactnsigmaR);
- }
- else if(fSignalCuts->IsGammaElectron(track)){
- fQACollection->Fill("conversionDca",track->Pt(),hfeimpactR);
- fQACollection->Fill("conversionDcaSig",track->Pt(),hfeimpactnsigmaR);
- fQACollection->Fill("conversionDcaSigDca",hfeimpactR,hfeimpactnsigmaR);
- }
- else if(fSignalCuts->IsNonHFElectron(track)){
- fQACollection->Fill("nonhfeDca",track->Pt(),hfeimpactR);
- fQACollection->Fill("nonhfeDcaSig",track->Pt(),hfeimpactnsigmaR);
- }
-
+ if(HasMCData())
+ {
if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
- fQACollection->Fill("hadronsBeforeIPcut",track->Pt());
- fQACollection->Fill("hadronsBeforeIPcutMC",mctrack->Pt());
- }
- if(fMCQA) {
+ fQACollection->Fill("hadronsBeforeIPcut",track->Pt());
+ }
+ if(fMCQA && signal) {
+ fMCQA->SetContainerStep(0);
for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
if(!fisNonHFEsystematics)break;
}
}
//else{
- if(weightElecBgV0[0]>0) fVarManager->FillContainer(fContainer, "conversionElecs", 0, kFALSE, weightElecBgV0[0]);
- else if(weightElecBgV0[0]<0) fVarManager->FillContainer(fContainer, "mesonElecs", 0, kFALSE, -1*weightElecBgV0[0]);
+ if(weightElecBgV0[0]>0) {
+ fVarManager->FillContainer(fContainer, "conversionElecs", 0, kFALSE, weightElecBgV0[0]);
+ fVarManager->FillContainer(fContainer, "conversionElecs", 5, kTRUE, weightElecBgV0[0]);
+ }
+ else if(weightElecBgV0[0]<0) {
+ fVarManager->FillContainer(fContainer, "mesonElecs", 0, kFALSE, -1*weightElecBgV0[0]);
+ fVarManager->FillContainer(fContainer, "mesonElecs", 5, kTRUE, -1*weightElecBgV0[0]);
+ }
//}
if(bTagged){ // bg estimation for the secondary vertex tagged signals
if(weightElecBgV0[0]>0) fVarManager->FillContainer(fContainer, "conversionElecs", 2, kFALSE, weightElecBgV0[0]);
else if(weightElecBgV0[0]<0) fVarManager->FillContainer(fContainer, "mesonElecs", 2, kFALSE, -1*weightElecBgV0[0]);
}
}
- }
+ } // end of MC
+
+ dataDca[0]=-1; //for data, don't know the origin
+ dataDca[1]=track->Pt();
+ dataDca[2]=hfeimpactR;
+ dataDca[3]=fCentralityF;
+ dataDca[4] = v0pid;
+ dataDca[5] = double(track->Charge());
+ if (!HasMCData()) fQACollection->Fill("Dca", dataDca);
+
// Fill Containers for impact parameter analysis
if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;
if(HasMCData()){
- if(fMCQA) {
+ if(fMCQA && signal) {
+ fMCQA->SetContainerStep(1);
for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
if(!fisNonHFEsystematics)break;
}
}
// else{
- if(weightElecBgV0[0]>0) fVarManager->FillContainer(fContainer, "conversionElecs", 1, kFALSE, weightElecBgV0[0]);
- else if(weightElecBgV0[0]<0) fVarManager->FillContainer(fContainer, "mesonElecs", 1, kFALSE, -1*weightElecBgV0[0]);
+ if(weightElecBgV0[0]>0) {
+ fVarManager->FillContainer(fContainer, "conversionElecs", 1, kFALSE, weightElecBgV0[0]);
+ fVarManager->FillContainer(fContainer, "conversionElecs", 6, kTRUE, weightElecBgV0[0]);
+ }
+ else if(weightElecBgV0[0]<0) {
+ fVarManager->FillContainer(fContainer, "mesonElecs", 1, kFALSE, -1*weightElecBgV0[0]);
+ fVarManager->FillContainer(fContainer, "mesonElecs", 6, kTRUE, -1*weightElecBgV0[0]);
+ }
//}
}
}
if(HasMCData()){
if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
fQACollection->Fill("hadronsAfterIPcut",track->Pt());
- fQACollection->Fill("hadronsAfterIPcutMC",mctrack->Pt());
}
}
}
// Run Analysis in AOD Mode
// Function is still in development
//
+ //printf("Process AOD\n");
AliDebug(3, "Processing AOD Event");
Double_t eventContainer[4];
if(HasMCData()) eventContainer[0] = fVz;
eventContainer[2] = fCentralityF;
eventContainer[3] = fContributors;
+ //printf("value event container %f, %f, %f, %f\n",eventContainer[0],eventContainer[1],eventContainer[2],eventContainer[3]);
+
AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
if(!fAOD){
AliError("AOD Event required for AOD Analysis");
return;
}
+ //printf("Will fill\n");
//
fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoCut);
-
+ //printf("Fill\n");
//
if(fIdentifiedAsPileUp) return;
fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);
//
if(!fPassTheEventCut) return;
fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepReconstructed);
+ //printf("pass\n");
fContainer->NewEvent();
-
+
+ fCFM->SetRecEventInfo(fAOD);
+
+ // Look for kink mother
+ Int_t numberofvertices = fAOD->GetNumberOfVertices();
+ Double_t listofmotherkink[numberofvertices];
+ Int_t numberofmotherkink = 0;
+ for(Int_t ivertex=0; ivertex < numberofvertices; ivertex++) {
+ AliAODVertex *aodvertex = fAOD->GetVertex(ivertex);
+ if(!aodvertex) continue;
+ if(aodvertex->GetType()==AliAODVertex::kKink) {
+ AliAODTrack *mother = (AliAODTrack *) aodvertex->GetParent();
+ if(!mother) continue;
+ Int_t idmother = mother->GetID();
+ listofmotherkink[numberofmotherkink] = idmother;
+ //printf("ID %d\n",idmother);
+ numberofmotherkink++;
+ }
+ }
+ //printf("Number of kink mother in the events %d\n",numberofmotherkink);
+
+
+ // Loop over tracks
AliAODTrack *track = NULL;
AliAODMCParticle *mctrack = NULL;
Double_t dataE[6]; // [pT, eta, Phi, Charge, type, 'C' or 'B']
Int_t nElectronCandidates = 0;
Int_t pid;
Bool_t signal;
+ //printf("Number of track %d\n",(Int_t) fAOD->GetNumberOfTracks());
for(Int_t itrack = 0; itrack < fAOD->GetNumberOfTracks(); itrack++){
track = fAOD->GetTrack(itrack); mctrack = NULL;
if(!track) continue;
- if(track->GetFlags() != 1<<4) continue; // Only process AOD tracks where the HFE is set
+ if(fUseFlagAOD){
+ if(track->GetFlags() != fFlags) continue; // Only process AOD tracks where the HFE is set
+ }
+ //printf("Pass the flag\n");
signal = kTRUE;
if(HasMCData()){
if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE;
}
fVarManager->NewTrack(track, mctrack, fCentralityF, -1, kTRUE);
+
+ if(fFillNoCuts) {
+ if(signal || !fFillSignalOnly){
+ fVarManager->FillContainer(fContainer, "recTrackContReco", AliHFEcuts::kStepRecNoCut, kFALSE);
+ fVarManager->FillContainer(fContainer, "recTrackContMC", AliHFEcuts::kStepRecNoCut, kTRUE);
+ }
+ }
+
+ if(fApplyCutAOD) {
+ // RecKine: ITSTPC cuts
+ if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
+
+ // Reject kink mother
+ Bool_t kinkmotherpass = kTRUE;
+ for(Int_t kinkmother = 0; kinkmother < numberofmotherkink; kinkmother++) {
+ if(track->GetID() == listofmotherkink[kinkmother]) {
+ kinkmotherpass = kFALSE;
+ continue;
+ }
+ }
+ if(!kinkmotherpass) continue;
+
+ // RecPrim
+ if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;
+
+ // HFEcuts: ITS layers cuts
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;
+
+ // HFE cuts: TOF PID and mismatch flag
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTOF, track)) continue;
+
+ // HFE cuts: TPC PID cleanup
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;
+
+ // HFEcuts: Nb of tracklets TRD0
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTRD, track)) continue;
+ }
+
+ // Fill correlation maps before PID
+ if(signal && fContainer->GetCorrelationMatrix("correlationstepbeforePID")) {
+ //printf("Fill correlation maps before PID\n");
+ fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepbeforePID"));
+ }
+
+ //printf("Will process to PID\n");
+
// track accepted, do PID
AliHFEpidObject hfetrack;
hfetrack.SetAnalysisType(AliHFEpidObject::kAODanalysis);
hfetrack.SetRecTrack(track);
if(HasMCData()) hfetrack.SetMCTrack(mctrack);
hfetrack.SetCentrality(fCentralityF);
+ if(IsPbPb()) hfetrack.SetPbPb();
+ else hfetrack.SetPP();
fPID->SetVarManager(fVarManager);
if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue; // we will do PID here as soon as possible
- // Apply weight for background contamination
- Double_t weightBackGround = 1.0;
-
- // not correct treatment for pp
- if(fBackGroundFactorApply==kTRUE) {
- if(IsPbPb()) weightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));
- else weightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P()));
- if(weightBackGround < 0.0) weightBackGround = 0.0;
- else if(weightBackGround > 1.0) weightBackGround = 1.0;
- fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, weightBackGround);
+
+ // Apply weight for background contamination
+ //Double_t weightBackGround = 1.0;
+ if(signal) {
+ // Apply weight for background contamination
+ if(fBackGroundFactorApply) {
+ if(IsPbPb() && fCentralityF >= 0) fWeightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));
+ else fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
+
+ if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
+ else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
+ // weightBackGround as special weight
+ fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, fWeightBackGround);
+ }
+ fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterPID"));
}
-
+
nElectronCandidates++;
if(HasMCData()){
dataE[0] = track->Pt();
signalContainer[2] = track->Phi();
signalContainer[3] = track->Charge()/3;
- Double_t vertex[3]; // Production vertex cut to mask gammas which are NOT supposed to have hits in the first ITS layer(s)
+ Double_t vertex[3] = {0.,0.,0.}; // Production vertex cut to mask gammas which are NOT supposed to have hits in the first ITS layer(s)
if(IsESDanalysis()){
AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(track);
if(mctrack){
fContainer->CreateContainer("recTrackContSecvtxMC", "Container for secondary vertexing analysis with MC information", 1);
if(HasMCData()){
- fContainer->CreateContainer("conversionElecs", "Container for weighted conversion electrons",4);
- fContainer->CreateContainer("mesonElecs", "Container for weighted electrons from meson decays",4);
+ fContainer->CreateContainer("conversionElecs", "Container for weighted conversion electrons",7);
+ fContainer->CreateContainer("mesonElecs", "Container for weighted electrons from meson decays",7);
fContainer->Sumw2("conversionElecs");
fContainer->Sumw2("mesonElecs");
//
// Add QA for Impact Parameter cut
//
- const Double_t kPtbound[2] = {0.1, 20.};
- Int_t iBin[1];
- iBin[0] = 44; // bins in pt
- fQACollection->CreateTH1F("hadronsBeforeIPcut", "Hadrons before IP cut", iBin[0], kPtbound[0], kPtbound[1], 1);
- fQACollection->CreateTH1F("hadronsAfterIPcut", "Hadrons after IP cut", iBin[0], kPtbound[0], kPtbound[1], 1);
- fQACollection->CreateTH1F("hadronsBeforeIPcutMC", "Hadrons before IP cut; MC p_{t}", iBin[0], kPtbound[0], kPtbound[1], 1);
- fQACollection->CreateTH1F("hadronsAfterIPcutMC", "Hadrons after IP cut; MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
-
- fQACollection->CreateTH2F("Ke3Kecorr", "Ke3 decay e and K correlation; Ke3K p_{t}; Ke3e p_{t}; ",20,0.,20.,iBin[0],kPtbound[0],kPtbound[1], 1);
- fQACollection->CreateTH2F("Ke3K0Lecorr", "Ke3 decay e and K0L correlation; Ke3K0L p_{t}; Ke3e p_{t}; ",20,0.,20.,iBin[0],kPtbound[0],kPtbound[1], 1);
- fQACollection->CreateTH1F("Kptspectra", "Charged Kaons: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
- fQACollection->CreateTH1F("K0Lptspectra", "K0L: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
-
- const Double_t kDCAbound[2] = {-5., 5.};
- const Double_t kDCAsigbound[2] = {-50., 50.};
-
- fQACollection->CreateTH2F("dataDcaSig", "data dca significance: dca sig ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAsigbound[0], kDCAsigbound[1], 0);
- fQACollection->CreateTH2F("charmDcaSig", "charm dca significance: dca sig ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAsigbound[0], kDCAsigbound[1], 0);
- fQACollection->CreateTH2F("beautyDcaSig", "beauty dca significance: dca sig ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAsigbound[0], kDCAsigbound[1], 0);
- fQACollection->CreateTH2F("conversionDcaSig", "conversion dca significance: dca sig ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAsigbound[0], kDCAsigbound[1], 0);
- fQACollection->CreateTH2F("nonhfeDcaSig", "nonhfe dca significance: dca sig ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAsigbound[0], kDCAsigbound[1], 0);
-
- fQACollection->CreateTH2F("dataDca", "data dca : dca ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAbound[0], kDCAbound[1], 0);
- fQACollection->CreateTH2F("charmDca", "charm dca : dca ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAbound[0], kDCAbound[1], 0);
- fQACollection->CreateTH2F("beautyDca", "beauty dca : dca ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAbound[0], kDCAbound[1], 0);
- fQACollection->CreateTH2F("conversionDca", "conversion dca : dca ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAbound[0], kDCAbound[1], 0);
- fQACollection->CreateTH2F("nonhfeDca", "nonhfe dca : dca ",iBin[0], kPtbound[0], kPtbound[1], 2000,kDCAbound[0], kDCAbound[1], 0);
-
- fQACollection->CreateTH2F("dataDcaSigDca", "data dca significance and dca correlation; dca; dca sig ", 2000, kDCAbound[0], kDCAbound[1], 2000, kDCAsigbound[0], kDCAsigbound[1], 0);
- fQACollection->CreateTH2F("conversionDcaSigDca", "conversion dca significance and dca correlation; dca; dca sig ", 2000, kDCAbound[0], kDCAbound[1], 2000, kDCAsigbound[0], kDCAsigbound[1], 0);
+
+ TObjArray *array = fVarManager->GetVariables();
+ Int_t nvars = array->GetEntriesFast();
+ for(Int_t v = 0; v < nvars; v++) {
+ AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);
+ if(!variable) continue;
+ TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());
+ if(!name.CompareTo("pt")) {
+ const Int_t nBinPt = variable->GetNumberOfBins();
+ const Double_t *kPtRange = variable->GetBinning();
+
+ fQACollection->CreateTH1Farray("hadronsBeforeIPcut", "Hadrons before IP cut", nBinPt, kPtRange);
+ fQACollection->CreateTH1Farray("hadronsAfterIPcut", "Hadrons after IP cut", nBinPt, kPtRange);
+
+ fQACollection->CreateTH2Farray("Ke3Kecorr", "Ke3 decay e and K correlation; Ke3K p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
+ fQACollection->CreateTH2Farray("Ke3K0Lecorr", "Ke3 decay e and K0L correlation; Ke3K0L p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
+ fQACollection->CreateTH1Farray("Kptspectra", "Charged Kaons: MC p_{t} ", nBinPt, kPtRange);
+ fQACollection->CreateTH1Farray("K0Lptspectra", "K0L: MC p_{t} ", nBinPt, kPtRange);
+
+ const Double_t kDCAbound[2] = {-0.2, 0.2};
+
+ const Int_t nDimDca=6;
+ const Int_t nBinDca[nDimDca] = { 8, nBinPt, 800, 12, 6, 2};
+ Double_t minimaDca[nDimDca] = { -1., 0., kDCAbound[0], -1., -1, -1.1};
+ Double_t maximaDca[nDimDca] = { 7., 20., kDCAbound[1], 11., 5, 1.1};
+
+ Double_t *sourceBins = AliHFEtools::MakeLinearBinning(nBinDca[0], minimaDca[0], maximaDca[0]);
+ Double_t *dcaBins = AliHFEtools::MakeLinearBinning(nBinDca[2], minimaDca[2], maximaDca[2]);
+ Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBinDca[3], minimaDca[3], maximaDca[3]);
+ Double_t *v0PIDBins = AliHFEtools::MakeLinearBinning(nBinDca[4], minimaDca[4], maximaDca[4]);
+ Double_t *chargeBins = AliHFEtools::MakeLinearBinning(nBinDca[5], minimaDca[5], maximaDca[5]);
+
+ fQACollection->CreateTHnSparseNoLimits("Dca", "Dca; source (0-all, 1-charm,etc); pT [GeV/c]; dca; centrality bin; v0pid; charge", nDimDca, nBinDca);
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(0, sourceBins);
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(1, kPtRange);
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(2, dcaBins);
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(3, centralityBins);
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(4, v0PIDBins);
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(5, chargeBins);
+
+ break;
+ }
+ }
+
}
//____________________________________________________________
//
// Recover the centrality of the event from ESD or AOD
//
+
+ Float_t fCentralityLimitstemp[12];
+ Float_t fCentralityLimitsdefault[12]= {0.,5.,10., 20., 30., 40., 50., 60.,70.,80., 90., 100.};
+ if(!fPbPbUserCentralityBinning) memcpy(fCentralityLimitstemp,fCentralityLimitsdefault,sizeof(fCentralityLimitsdefault));
+ else memcpy(fCentralityLimitstemp,fCentralityLimits,sizeof(fCentralityLimitsdefault));
+
+
Int_t bin = -1;
if(IsPbPb()) {
// Centrality
AliCentrality *centrality = fInputEvent->GetCentrality();
- Float_t fCentralityFtemp = centrality->GetCentralityPercentile("V0M");
- Float_t centralityLimits[12] = {0.,5.,10., 20., 30., 40., 50., 60.,70.,80., 90., 100.};
+ fCentralityPercent = centrality->GetCentralityPercentile("V0M");
+ //printf("centrality %f\n",fCentralityPercent);
+
for(Int_t ibin = 0; ibin < 11; ibin++){
- if(fCentralityFtemp >= centralityLimits[ibin] && fCentralityFtemp < centralityLimits[ibin+1]){
- bin = ibin;
+ if(fCentralityPercent >= fCentralityLimitstemp[ibin] && fCentralityPercent < fCentralityLimitstemp[ibin+1]){
+ bin = ibin;
+ //printf("test bin %f, low %f, high %f, %d\n",fCentralityPercent,fCentralityLimitstemp[ibin],fCentralityLimitstemp[ibin+1],ibin);
break;
}
- }
+ }
+
if(bin == -1) bin = 11; // Overflow
} else {
// PP: Tracklet multiplicity, use common definition
}
fCentralityF = bin;
AliDebug(2, Form("Centrality class %d\n", fCentralityF));
+
// contributors, to be outsourced
const AliVVertex *vtx;
Int_t contributorstemp = vtx->GetNContributors();
if( contributorstemp <= 0) fContributors = 0.5;
else fContributors = 1.5;
+ //printf("Number of contributors %d\n",contributorstemp);
}
return kTRUE;
}
return;
}
// PileUp
+ fIdentifiedAsPileUp = kFALSE;
if(fRemovePileUp && fAOD->IsPileupFromSPD()) fIdentifiedAsPileUp = kTRUE;
// Z vertex
+ fIdentifiedAsOutInz = kFALSE;
+ //printf("Z vertex %f and out %f\n",fAOD->GetPrimaryVertex()->GetZ(),fCuts->GetVertexRange());
if(TMath::Abs(fAOD->GetPrimaryVertex()->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
// Event Cut
fPassTheEventCut = kTRUE;