if(fDebug > 1) printf("AnalysisTaskSEDs::Init() \n");
fListCuts=new TList();
+ fListCuts->SetOwner();
+ fListCuts->SetName("CutObjects");
+
AliRDHFCutsDstoKKpi *production = new AliRDHFCutsDstoKKpi(*fProdCuts);
production->SetName("ProductionCuts");
AliRDHFCutsDstoKKpi *analysis = new AliRDHFCutsDstoKKpi(*fAnalysisCuts);
fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nInvMassBins,minMass,maxMass);
fMassHist[index]->Sumw2();
hisname.Form("hMass%sPt%dphi",htype.Data(),i);
- fMassHistPhi[index]=new TH1F(hisname.Data(),hisname.Data(),100,minMass,maxMass);
+ fMassHistPhi[index]=new TH1F(hisname.Data(),hisname.Data(),nInvMassBins,minMass,maxMass);
fMassHistPhi[index]->Sumw2();
hisname.Form("hMass%sPt%dk0st",htype.Data(),i);
- fMassHistK0st[index]=new TH1F(hisname.Data(),hisname.Data(),100,minMass,maxMass);
+ fMassHistK0st[index]=new TH1F(hisname.Data(),hisname.Data(),nInvMassBins,minMass,maxMass);
fMassHistK0st[index]->Sumw2();
hisname.Form("hCosP%sPt%d",htype.Data(),i);
fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
fOutput->Add(fDalitzK0st[i]);
}
- fChanHist[0] = new TH1F("hChanAll", "KKpi and piKK candidates",16,-0.5,15.5);
- fChanHist[1] = new TH1F("hChanSig", "KKpi and piKK candidates",16,-0.5,15.5);
- fChanHist[2] = new TH1F("hChanBkg", "KKpi and piKK candidates",16,-0.5,15.5);
- fChanHist[3] = new TH1F("hChanReflSig", "KKpi and piKK candidates",16,-0.5,15.5);
+ fChanHist[0] = new TH1F("hChanAll", "KKpi and piKK candidates",64,-0.5,63.5);
+ fChanHist[1] = new TH1F("hChanSig", "KKpi and piKK candidates",64,-0.5,63.5);
+ fChanHist[2] = new TH1F("hChanBkg", "KKpi and piKK candidates",64,-0.5,63.5);
+ fChanHist[3] = new TH1F("hChanReflSig", "KKpi and piKK candidates",64,-0.5,63.5);
for(Int_t i=0;i<4;i++){
fChanHist[i]->Sumw2();
fChanHist[i]->SetMinimum(0);
Int_t isKKpi=retCodeAnalysisCuts&1;
Int_t ispiKK=retCodeAnalysisCuts&2;
- Int_t isPhi=retCodeAnalysisCuts&4;
- Int_t isK0star=retCodeAnalysisCuts&8;
+ Int_t isPhiKKpi=retCodeAnalysisCuts&4;
+ Int_t isPhipiKK=retCodeAnalysisCuts&8;
+ Int_t isK0starKKpi=retCodeAnalysisCuts&16;
+ Int_t isK0starpiKK=retCodeAnalysisCuts&32;
fChanHist[0]->Fill(retCodeAnalysisCuts);
Double_t invMass=d->InvMassDsKKpi();
fMassHist[index]->Fill(invMass);
fPtVsMass->Fill(invMass,ptCand);
- if(isPhi) fMassHistPhi[index]->Fill(invMass);
- if(isK0star) fMassHistK0st[index]->Fill(invMass);
+ if(isPhiKKpi) fMassHistPhi[index]->Fill(invMass);
+ if(isK0starKKpi) fMassHistK0st[index]->Fill(invMass);
if(fReadMC && indexMCKKpi!=-1){
fMassHist[indexMCKKpi]->Fill(invMass);
- if(isPhi) fMassHistPhi[indexMCKKpi]->Fill(invMass);
- if(isK0star) fMassHistK0st[indexMCKKpi]->Fill(invMass);
+ if(isPhiKKpi) fMassHistPhi[indexMCKKpi]->Fill(invMass);
+ if(isK0starKKpi) fMassHistK0st[indexMCKKpi]->Fill(invMass);
}
}
if(ispiKK){
Double_t invMass=d->InvMassDspiKK();
fMassHist[index]->Fill(invMass);
fPtVsMass->Fill(invMass,ptCand);
- if(isPhi) fMassHistPhi[index]->Fill(invMass);
- if(isK0star) fMassHistK0st[index]->Fill(invMass);
+ if(isPhipiKK) fMassHistPhi[index]->Fill(invMass);
+ if(isK0starpiKK) fMassHistK0st[index]->Fill(invMass);
if(fReadMC && indexMCpiKK!=-1){
fMassHist[indexMCpiKK]->Fill(invMass);
- if(isPhi) fMassHistPhi[indexMCpiKK]->Fill(invMass);
- if(isK0star) fMassHistK0st[indexMCpiKK]->Fill(invMass);
+ if(isPhipiKK) fMassHistPhi[indexMCpiKK]->Fill(invMass);
+ if(isK0starpiKK) fMassHistK0st[indexMCpiKK]->Fill(invMass);
}
}
Double_t massKK=d->InvMass2Prongs(0,1,321,321);
Double_t massKp=d->InvMass2Prongs(1,2,321,211);
fDalitz[index]->Fill(massKK,massKp);
- if(isPhi) fDalitzPhi[index]->Fill(massKK,massKp);
- if(isK0star) fDalitzK0st[index]->Fill(massKK,massKp);
+ if(isPhiKKpi) fDalitzPhi[index]->Fill(massKK,massKp);
+ if(isK0starKKpi) fDalitzK0st[index]->Fill(massKK,massKp);
if(fReadMC && indexMCKKpi!=-1){
fDalitz[indexMCKKpi]->Fill(massKK,massKp);
- if(isPhi) fDalitzPhi[indexMCKKpi]->Fill(massKK,massKp);
- if(isK0star) fDalitzK0st[indexMCKKpi]->Fill(massKK,massKp);
+ if(isPhiKKpi) fDalitzPhi[indexMCKKpi]->Fill(massKK,massKp);
+ if(isK0starKKpi) fDalitzK0st[indexMCKKpi]->Fill(massKK,massKp);
fCosPHist[indexMCKKpi]->Fill(cosp);
fDLenHist[indexMCKKpi]->Fill(dlen);
fSigVertHist[indexMCKKpi]->Fill(sigvert);
Double_t massKK=d->InvMass2Prongs(1,2,321,321);
Double_t massKp=d->InvMass2Prongs(0,1,211,321);
fDalitz[index]->Fill(massKK,massKp);
- if(isPhi) fDalitzPhi[index]->Fill(massKK,massKp);
- if(isK0star) fDalitzK0st[index]->Fill(massKK,massKp);
+ if(isPhipiKK) fDalitzPhi[index]->Fill(massKK,massKp);
+ if(isK0starpiKK) fDalitzK0st[index]->Fill(massKK,massKp);
if(fReadMC && indexMCpiKK!=-1){
fDalitz[indexMCpiKK]->Fill(massKK,massKp);
- if(isPhi) fDalitzPhi[indexMCpiKK]->Fill(massKK,massKp);
- if(isK0star) fDalitzK0st[indexMCpiKK]->Fill(massKK,massKp);
+ if(isPhipiKK) fDalitzPhi[indexMCpiKK]->Fill(massKK,massKp);
+ if(isK0starpiKK) fDalitzK0st[indexMCpiKK]->Fill(massKK,massKp);
fCosPHist[indexMCpiKK]->Fill(cosp);
fDLenHist[indexMCpiKK]->Fill(dlen);
fSigVertHist[indexMCpiKK]->Fill(sigvert);
Int_t GetBackgroundHistoIndex(Int_t iPtBin) const { return iPtBin*4+2;}
Int_t GetReflSignalHistoIndex(Int_t iPtBin) const { return iPtBin*4+3;}
- enum {kMaxPtBins=10};
+ enum {kMaxPtBins=20};
AliAnalysisTaskSEDs(const AliAnalysisTaskSEDs &source);
AliAnalysisTaskSEDs& operator=(const AliAnalysisTaskSEDs& source);
fSelectionlevel(0),
fNVars(0),
fNBins(100),
- fPartOrAndAntiPart(0)
+ fPartOrAndAntiPart(0),
+ fDsChannel(0)
{
// Default constructor
SetPDGCodes();
+ SetDsChannel(kPhi);
}
//________________________________________________________________________
fSelectionlevel(selectionlevel),
fNVars(0),
fNBins(100),
- fPartOrAndAntiPart(0)
+ fPartOrAndAntiPart(0),
+ fDsChannel(0)
{
SetPDGCodes();
+ SetDsChannel(kPhi);
SetMassLimits(0.15,fPDGmother); //check range
fNPtBins=fRDCuts->GetNPtBins();
if(fDebug>1) printf("+++++++Is Selected\n");
Int_t nVals=0;
+ if(fDecChannel==3) SetPDGdaughterDstoKKpi();
fRDCuts->GetCutVarsForOpt(d,fVars,fNVars,fPDGdaughters);
Int_t ptbin=fRDCuts->PtBin(d->Pt());
if(ptbin==-1) continue;
TString mdvname=Form("multiDimVectorPtBin%d",ptbin);
AliMultiDimVector* muvec=(AliMultiDimVector*)fCutList->FindObject(mdvname.Data());
+
ULong64_t *addresses = muvec->GetGlobalAddressesAboveCuts(fVars,(Float_t)d->Pt(),nVals);
if(fDebug>1)printf("nvals = %d\n",nVals);
for(Int_t ivals=0;ivals<nVals;ivals++){
delete [] addresses;
return;
}
-
+
fHistNEvents->Fill(3);
-
+
//fill the histograms with the appropriate method
switch (fDecChannel){
case 0:
FillDstar(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected);
break;
case 3:
- FillDs(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected);
+ if(isSelected&1){
+ FillDs(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected,1);
+ }
break;
case 4:
FillD04p(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected);
}
}
+
+ if (fDecChannel==3 && isSelected&2){
+ SetPDGdaughterDstopiKK();
+ nVals=0;
+ fRDCuts->GetCutVarsForOpt(d,fVars,fNVars,fPDGdaughters);
+ addresses = muvec->GetGlobalAddressesAboveCuts(fVars,(Float_t)d->Pt(),nVals);
+ if(fDebug>1)printf("nvals = %d\n",nVals);
+ for(Int_t ivals=0;ivals<nVals;ivals++){
+ if(addresses[ivals]>=muvec->GetNTotCells()){
+ if (fDebug>1) printf("Overflow!!\n");
+ delete [] addresses;
+ return;
+ }
+ FillDs(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected,0);
+
+ }
+
+ }
+
delete [] addresses;
}// end if selected
}
-void AliAnalysisTaskSESignificance::FillDs(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel){
+void AliAnalysisTaskSESignificance::FillDs(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel,Int_t optDecay){
- //AliInfo("Ds channel not implemented\n");
+ // Fill Ds histos
Int_t pdgDsKKpi[3]={321,321,211};//K,K,pi
if(fReadMC){
labDs = d->MatchToMC(431,arrayMC,3,pdgDsKKpi);
}
-
-
- if(isSel&1 && fPartOrAndAntiPart*d->GetCharge()>=0) {
-
- fMassHist[index]->Fill(masses[0]);
-
- if(fReadMC){
- if(labDs>=0){
- Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
- AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
- Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
-
- if(pdgCode0==321) {
-
- fSigHist[index]->Fill(masses[0]); //signal
+ Int_t isKKpi=isSel&1;
+ Int_t ispiKK=isSel&2;
+ Int_t isPhiKKpi=isSel&4;
+ Int_t isPhipiKK=isSel&8;
+ Int_t isK0starKKpi=isSel&16;
+ Int_t isK0starpiKK=isSel&32;
+
+
+ if(fDsChannel==kPhi && (isPhiKKpi==0 && isPhipiKK==0)) return;
+ if(fDsChannel==kK0star && (isK0starKKpi==0 && isK0starpiKK==0)) return;
+
+ if (optDecay==1){
+ if(isKKpi && fPartOrAndAntiPart*d->GetCharge()>=0) {
+ if(fDsChannel==kPhi && isPhiKKpi==0) return;
+ if(fDsChannel==kK0star && isK0starKKpi==0) return;
+
+ fMassHist[index]->Fill(masses[0]);
+
+ if(fReadMC){
+ if(labDs>=0){
+ Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
+ AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
+ Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
+ if(pdgCode0==321) {
+ fSigHist[index]->Fill(masses[0]); //signal
+ }else{
+ fRflHist[index]->Fill(masses[0]); //Reflected signal
+ }
}else{
- fRflHist[index]->Fill(masses[0]); //Reflected signal
+ fBkgHist[index]->Fill(masses[0]); // Background
}
- }else{
- fBkgHist[index]->Fill(masses[0]); // Background
}
}
}
- if(isSel&2 && fPartOrAndAntiPart*d->GetCharge()>=0){
- fMassHist[index]->Fill(masses[1]);
- if(fReadMC){
- if(labDs>=0){
- Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
- AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
- Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
-
- if(pdgCode0==211) {
-
- fSigHist[index]->Fill(masses[1]);
+ if (optDecay==0){
+ if(ispiKK && fPartOrAndAntiPart*d->GetCharge()>=0){
+ if(fDsChannel==kPhi && isPhipiKK==0) return;
+ if(fDsChannel==kK0star && isK0starpiKK==0) return;
+
+ fMassHist[index]->Fill(masses[1]);
+
+ if(fReadMC){
+ if(labDs>=0){
+ Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
+ AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
+ Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
+ if(pdgCode0==211) {
+ fSigHist[index]->Fill(masses[1]);
+ }else{
+ fRflHist[index]->Fill(masses[1]);
+ }
}else{
- fRflHist[index]->Fill(masses[1]);
+ fBkgHist[index]->Fill(masses[1]);
}
- }else{
- fBkgHist[index]->Fill(masses[1]);
}
}
}
-
-
-
}
void AliAnalysisTaskSESignificance::FillD04p(AliAODRecoDecayHF* /*d*/,TClonesArray */*arrayMC*/,Int_t /*index*/,Int_t /*matchtoMC*/){
public:
enum FeedDownEnum {kBoth,kCharmOnly,kBeautyOnly};
+ enum ChanDs {kAllReson,kPhi,kK0star};
AliAnalysisTaskSESignificance();
AliAnalysisTaskSESignificance(const char *name, TList *listMDV,AliRDHFCuts *RDCuts, Int_t decaychannel,Int_t selectionlevel=AliRDHFCuts::kAll);
void SetMassLimits(Float_t lowlimit, Float_t uplimit);
void SetNBins(Int_t nbins){fNBins=nbins;}
void SetFillWithPartAntiPartBoth(Int_t value){fPartOrAndAntiPart=value;}
+ void SetDsChannel(Int_t chan){fDsChannel=chan;}
+
//void SetMultiVector(const AliMultiDimVector *MultiDimVec){fMultiDimVec->CopyStructure(MultiDimVec);}
Float_t GetUpperMassLimit()const {return fUpmasslimit;}
Float_t GetLowerMassLimit()const {return fLowmasslimit;}
Int_t GetNBins()const {return fNBins;}
Int_t GetFillWithPartAntiPartBoth()const {return fPartOrAndAntiPart;}
Int_t GetBFeedDown()const {return fBFeedDown;}
+ Int_t GetDsChannel()const {return fDsChannel;}
// Implementation of interface methods
virtual void UserCreateOutputObjects();
private:
+ void SetPDGdaughterDstoKKpi(){
+ fPDGdaughters[0]=321;//K
+ fPDGdaughters[1]=321;//K
+ fPDGdaughters[2]=211;//pi
+ fPDGdaughters[3]=0; //empty
+ }
+ void SetPDGdaughterDstopiKK(){
+ fPDGdaughters[0]=211;//pi
+ fPDGdaughters[1]=321;//K
+ fPDGdaughters[2]=321;//K
+ fPDGdaughters[3]=0; //empty
+ }
+
AliAnalysisTaskSESignificance(const AliAnalysisTaskSESignificance &source);
AliAnalysisTaskSESignificance& operator=(const AliAnalysisTaskSESignificance& source);
void SetPDGCodes();
void FillDplus(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel);
void FillD02p(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index, Int_t isSel);
- void FillDs(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel);
+ void FillDs(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel,Int_t optDecay);
void FillDstar(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel);
void FillD04p(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel);
void FillLambdac(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index, Int_t isSel);
Float_t fVars[kMaxCutVar]; // array with values of cut variables
Int_t fNBins; //number of bins in the mass histograms
Int_t fPartOrAndAntiPart; //fill histograms with particle only (+1), antiparticle only (-1), both (0)
+ Int_t fDsChannel; // Ds resonant channel selected
- ClassDef(AliAnalysisTaskSESignificance,3); // AliAnalysisTaskSE for the MC association of heavy-flavour decay candidates
+ ClassDef(AliAnalysisTaskSESignificance,4); // AliAnalysisTaskSE for the MC association of heavy-flavour decay candidates
};
#endif
-