// Fill histograms
//
AliESDEvent *esd=dynamic_cast<AliESDEvent*>(event);
-
+ if (!esd) return;
Int_t ntrack=esd->GetNumberOfTracks();
// Fetch Stack
//MC mother
Int_t idMotherP=pP->GetFirstMother();
- TParticle *motherP=0;
+// TParticle *motherP=0;
// Int_t pdgMotherP=0;
if (idMotherP>-1){
- motherP=pStack->Particle(idMotherP);
+// motherP=pStack->Particle(idMotherP);
// pdgMotherP=motherP->GetPdgCode();
}
//===============
fDielectron->Process(InputEvent());
if(fDielectron->HasCandidates()){
- AliAODEvent *aod = ((AliAODHandler*)((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()))->GetAOD();
+ AliAODHandler *aodH=(AliAODHandler*)((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
+ AliAODEvent *aod = aodH->GetAOD();
//replace the references of the legs with the AOD references
TObjArray *obj = 0x0;
}
}
- AliAODExtension *extDielectron = dynamic_cast<AliAODHandler*> ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler())->GetFilteredAOD("AliAOD.Dielectron.root");
+ AliAODExtension *extDielectron = aodH->GetFilteredAOD("AliAOD.Dielectron.root");
extDielectron->SelectEvent();
//after candidate selection
fEventStat->Fill(2.);
// Process the events
//
+ //at least first event is needed!
+ if (!ev1){
+ AliError("At least first event must be set!");
+ return;
+ }
+
AliDielectronVarManager::SetEvent(ev1);
//in case we have MC load the MC event and process the MC particles
// specify whether to 'exclude' the given band
//
- if (fNcuts==kNmaxPID){
+ if (fNcuts>=kNmaxPID){
AliError(Form("only %d pid cut ranges allowed",kNmaxPID));
+ return;
}
if (TMath::Abs(nSigmaUp+99999.)<1e-20){
nSigmaUp=TMath::Abs(nSigmaLow);
// Laboratory frame 4-vectors:
// projectile beam & target beam 4-mom
- AliVParticle *d1 = dynamic_cast<AliVParticle*>(fRefD1.GetObject());
- AliVParticle *d2 = dynamic_cast<AliVParticle*>(fRefD2.GetObject());
+ AliVParticle *d1 = static_cast<AliVParticle*>(fRefD1.GetObject());
+ AliVParticle *d2 = static_cast<AliVParticle*>(fRefD2.GetObject());
const Double_t kBeamEnergy = 3500.;
Double_t px1=d1->Px();
enum EBackgroundMethod {
kFitted = 0,
kLikeSign,
+ kLikeSignArithm,
kEventMixing,
kRotation
};
//
switch ( fMethod ){
case kLikeSign :
+ case kLikeSignArithm :
ProcessLS(arrhist); // process like-sign subtraction method
break;
Float_t background = 2*TMath::Sqrt(pp*mm);
Float_t ebackground = TMath::Sqrt(mm+pp);
+ if (fMethod==kLikeSignArithm){
+ //Arithmetic mean instead of geometric
+ background=(pp+mm);
+ ebackground=TMath::Sqrt(pp+mm);
+ if (TMath::Abs(ebackground)<1e-30) ebackground=1;
+ }
// Float_t signal = pm - background;
// Float_t error = TMath::Sqrt(epm*epm+mm+pp);
fHistDataPM->Fit(fFuncSigBack, fFitOpt.Data(), "", fFitMin, fFitMax);
fHistDataPM->Fit(fFuncSigBack, fFitOpt.Data(), "", fFitMin, fFitMax);
// declare the variables where the like-sign fit results will be stored
- TFitResult *ppFitResult = 0x0;
- TFitResult *mmFitResult = 0x0;
+// TFitResult *ppFitResult = 0x0;
+// TFitResult *mmFitResult = 0x0;
// fit the like sign background
TF1 *funcClonePP = (TF1*)fFuncBackground->Clone("funcClonePP");
TF1 *funcCloneMM = (TF1*)fFuncBackground->Clone("funcCloneMM");
fHistDataPP->Fit(funcClonePP, fFitOpt.Data(), "", fFitMin, fFitMax);
- TFitResultPtr ppFitPtr = fHistDataPP->Fit(funcClonePP, fFitOpt.Data(), "", fFitMin, fFitMax);
- ppFitResult = ppFitPtr.Get();
+ fHistDataPP->Fit(funcClonePP, fFitOpt.Data(), "", fFitMin, fFitMax);
+// TFitResultPtr ppFitPtr = fHistDataPP->Fit(funcClonePP, fFitOpt.Data(), "", fFitMin, fFitMax);
+// ppFitResult = ppFitPtr.Get();
+ fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax);
fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax);
- TFitResultPtr mmFitPtr = fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax);
- mmFitResult = mmFitPtr.Get();
+// TFitResultPtr mmFitPtr = fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax);
+// mmFitResult = mmFitPtr.Get();
for(Int_t iBin=1; iBin<=fHistDataPM->GetXaxis()->GetNbins(); iBin++) {
Double_t m = fHistDataPM->GetBinCenter(iBin);
"NclsTPC",
"NclsTPCiter1",
"NFclsTPC",
+ "NFclsTPCrobust",
"TPCsignalN",
"TPCchi2PerCluster",
"TrackStatus",
kNclsTPC, // number of clusters assigned in the TPC
kNclsTPCiter1, // number of clusters assigned in the TPC after first iteration
kNFclsTPC, // number of findable clusters in the TPC
+ kNFclsTPCr, // number of findable clusters in the TPC with more robust definition
kTPCsignalN, // number of points used for dEdx
kTPCchi2Cl, // chi2/cl in TPC
kTrackStatus, // track status bits
values[AliDielectronVarManager::kNclsTPC] = tpcNcls; // TODO: get rid of the plain numbers
values[AliDielectronVarManager::kNclsTPCiter1] = particle->GetTPCNclsIter1(); // TODO: get rid of the plain numbers
values[AliDielectronVarManager::kNFclsTPC] = particle->GetTPCNclsF();
+ values[AliDielectronVarManager::kNFclsTPCr] = particle->GetTPCClusterInfo(2,1);
values[AliDielectronVarManager::kTPCsignalN] = particle->GetTPCsignalN();
values[AliDielectronVarManager::kNclsTRD] = particle->GetNcls(2); // TODO: get rid of the plain numbers
values[AliDielectronVarManager::kTRDntracklets] = particle->GetTRDntracklets(); // TODO: GetTRDtracklets/GetTRDntracklets?
values[AliDielectronVarManager::kNclsTPC] = particle->GetTPCNcls();
values[AliDielectronVarManager::kNclsTPCiter1] = particle->GetTPCNcls(); // not really available in AOD
values[AliDielectronVarManager::kNFclsTPC] = 0;
+ values[AliDielectronVarManager::kNFclsTPCr] = 0;
values[AliDielectronVarManager::kNclsTRD] = 0;
values[AliDielectronVarManager::kTRDntracklets] = 0;
values[AliDielectronVarManager::kTRDpidQuality] = 0;
values[AliDielectronVarManager::kNclsTPC] = 0;
values[AliDielectronVarManager::kNclsTPCiter1] = 0;
values[AliDielectronVarManager::kNFclsTPC] = 0;
+ values[AliDielectronVarManager::kNFclsTPCr] = 0;
values[AliDielectronVarManager::kNclsTRD] = 0;
values[AliDielectronVarManager::kTRDntracklets] = 0;
values[AliDielectronVarManager::kTRDpidQuality] = 0;
c->SetAlias("nCls","Leg1_NclsTPC>90&&Leg2_NclsTPC>90");
//--------PID
+//-Param dEdx
+c->SetAlias("cutPipardEdx","Leg1_TPC_signal>75-20*exp(-.7*Leg1_P_InnerParam)&&Leg2_TPC_signal>75-20*exp(-.7*Leg2_P_InnerParam)")
+ c->SetAlias("TOFe1r","(((Leg1_TrackStatus&32768)==32768)&&abs(Leg1_TOF_nSigma_Electrons)<3)");
+ c->SetAlias("TOFe2r","(((Leg2_TrackStatus&32768)==32768)&&abs(Leg2_TOF_nSigma_Electrons)<3)");
+
+c->SetAlias("cutPspecial","(abs(Leg1_TPC_nSigma_Protons)>3||(abs(Leg1_TPC_nSigma_Protons)<=3&&TOFe1r))&&(abs(Leg2_TPC_nSigma_Protons)>3||(abs(Leg2_TPC_nSigma_Protons)<=3&&TOFe2r))")
//-- nsigma
c->SetAlias("cutE","abs(Leg1_TPC_nSigma_Electrons)<3&&abs(Leg2_TPC_nSigma_Electrons)<3");
c->SetAlias("cutPi","abs(Leg1_TPC_nSigma_Pions)>3&&abs(Leg2_TPC_nSigma_Pions)>3");
c->SetAlias("cutP","(Leg1_TPC_nSigma_Protons)>3&&(Leg2_TPC_nSigma_Protons)>3");
c->SetAlias("pidSig","cutE&&cutPi&&cutP");
-
//-- Pi param
-// c->SetAlias("eleParam","Leg1_TPC_nSigma_Electrons<5&&Leg2_TPC_nSigma_Electrons<5&&Leg1_TPC_nSigma_Electrons>-2.65*exp(-0.6757*Leg1_P_InnerParam)&&Leg2_TPC_nSigma_Electrons>-8*exp(-0.6*Leg2_P_InnerParam)");
-c->SetAlias("eleParam","Leg1_TPC_nSigma_Electrons<5&&Leg2_TPC_nSigma_Electrons<5&&Leg1_TPC_nSigma_Electrons>-6*exp(-0.6*Leg1_P_InnerParam)&&Leg2_TPC_nSigma_Electrons>-6*exp(-0.6*Leg2_P_InnerParam)");
+// c->SetAlias("eleParam","Leg1_TPC_nSigma_Electrons<5&&Leg2_TPC_nSigma_Electrons<5&&Leg1_TPC_nSigma_Electrons>-2.65*exp(-0.9*Leg1_P_InnerParam)&&Leg2_TPC_nSigma_Electrons>-8*exp(-0.6*Leg2_P_InnerParam)");
+c->SetAlias("eleParam","Leg1_TPC_nSigma_Electrons<5&&Leg2_TPC_nSigma_Electrons<5&&Leg1_TPC_nSigma_Electrons>-3.7*exp(-0.9*Leg1_P_InnerParam)-0.1&&Leg2_TPC_nSigma_Electrons>-3.7*exp(-0.6*Leg2_P_InnerParam)-0.1");
c->SetAlias("pidParam","eleParam&&cutP");
c->SetAlias("LegEta","abs(Leg1_Eta)<0.9&&abs(Leg2_Eta<0.9)");
c->SetAlias("LegNcl","Leg1_NclsTPC>90&&Leg2_NclsTPC>90");
+c->SetAlias("LegPt","Leg1_Pt>1&&Leg2_Pt>1");
c->SetAlias("Rap","abs(Y)<0.9");
c->SetAlias("QA","LegNcl&&LegEta&&Rap");
c->SetAlias("spdFirst","(Leg1_ITS_clusterMap&1)==1 && (Leg2_ITS_clusterMap&1)==1");
c->SetAlias("LegNclDiffIter1","abs(Leg1_NclsTPC-Leg1_NclsTPCiter1)<10&&abs(Leg2_NclsTPC-Leg2_NclsTPCiter1)<10")
c->SetAlias("LegNclPID","(Leg1_NclsTPC-Leg1_TPCsignalN)<20&&(Leg2_NclsTPC-Leg2_TPCsignalN)<20")
-c->SetAlias("cut","PairType==1&&QA&&pidSig")
+c->SetAlias("cut","PairType==1&&QA&&cutPipardEdx&&cutPspecial")
+c->SetAlias("cut","PairType==1&&QA&&pidSig&&LegPt")
c->SetMarkerStyle(20);
c->SetMarkerSize(.8);
c->SetLineColor(kBlack);
// c->SetAlias("nCls","Leg1_NclsTPC>90&&Leg2_NclsTPC>90");
-c->Draw("M>>hM(50,2,4)","cut","e");
+c->Draw("M>>hM(125,0,5)","cut","e");
c->SetMarkerColor(kBlue);
c->SetLineColor(kBlue);
// c->SetAlias("cut","PairType==1&&nCls&&pidParam&&LegEta&&Rap")
-c->SetAlias("cut","PairType==1&&QA&&pidSig&&LegNclPID")
+// c->SetAlias("cut","PairType==1&&QA&&pidSig&&LegNclPID")
// c->SetAlias("nCls","Leg1_NclsTPC>140&&Leg2_NclsTPC>140");
+c->SetAlias("cutPi","abs(Leg1_TPC_nSigma_Pions)>3.5&&abs(Leg2_TPC_nSigma_Pions)>3.5");
c->Draw("M>>hM2(50,2,4)","cut","esame");
c->SetMarkerColor(kGreen);
c->SetLineColor(kGreen);
-c->SetAlias("cut","PairType==1&&QA&&pidSig")
-c->SetAlias("LegNcl","Leg1_NclsTPC>120&&Leg2_NclsTPC>120");
+// c->SetAlias("cut","PairType==1&&QA&&pidSig")
+// c->SetAlias("LegNcl","Leg1_NclsTPC>120&&Leg2_NclsTPC>120");
// c->SetAlias("nCls","Leg1_NclsTPC>150&&Leg2_NclsTPC>150");
+c->SetAlias("cutPi","abs(Leg1_TPC_nSigma_Pions)>3.5&&abs(Leg2_TPC_nSigma_Pions)>3.5");
c->Draw("M>>hM3(50,2,4)","cut","esame");
#include "AliDielectronCFdraw.h"
#include "AliDielectron.h"
-AliDielectronSignalBase* GetSignalLS(AliDielectronCFdraw &d, Int_t step);
+AliDielectronSignalBase* GetSignalLS(AliDielectronCFdraw &d, Int_t step,
+ AliDielectronSignalBase::EBackgroundMethod type=AliDielectronSignalBase::kLikeSign);
AliDielectronSignalBase* GetSignalRot(AliDielectronCFdraw &d, Int_t step);
void SetStyle(AliDielectronSignalBase *sig, const char* nameAdd);
void DrawSpectra(AliDielectronSignalBase *sig, const char* cname, TH1 *hEventStat=0x0, Bool_t save=kFALSE);
//Set common Ranges
// d.SetRangeUser("Leg1_Pt",0.8,1000.);
// d.SetRangeUser("Leg2_Pt",0.8,1000.);
- d.SetRangeUser("Leg1_NclsTPC",140.,170.);
- d.SetRangeUser("Leg2_NclsTPC",140.,170.);
+ d.SetRangeUser("Leg1_NclsTPC",90.,170.);
+ d.SetRangeUser("Leg2_NclsTPC",90.,170.);
d.SetRangeUser("Leg1_Pt",1.01,100000);
d.SetRangeUser("Leg2_Pt",1.01,100000);
// d.SetRangeUser("Leg1_TPC_nSigma_Electrons",-3,3);
//--- Like sign subtraction
AliDielectronSignalBase *sigFirst=GetSignalLS(d,stepFirst);
SetStyle(sigFirst,"ITS First - Like Sign subtraction");
-// DrawSpectra(sigFirst,"cFirst",hStats,save);
+ DrawSpectra(sigFirst,"cFirst",hStats,save);
+ //--- Like sign subtraction Arithmetic mean
+ AliDielectronSignalBase *sigFirstArith=GetSignalLS(d,stepFirst,AliDielectronSignalBase::kLikeSignArithm);
+ SetStyle(sigFirstArith,"ITS FirstArith - Like Sign subtraction");
+ DrawSpectra(sigFirstArith,"cFirstArith",hStats,save);
//--- Rotation subtraction
AliDielectronSignalBase *sigFirstRot=GetSignalRot(d,stepFirst);
SetStyle(sigFirstRot,"ITS First - Track rotation subtraction");
//SPD any
//
AliDielectronSignalBase *sigAny=GetSignalLS(d,stepAny);
- SetStyle(sigAny,"ITS First - Like Sign subtraction");
+ SetStyle(sigAny,"ITS Any - Like Sign subtraction");
DrawSpectra(sigAny,"cAny",hStats,save);
+ //--- like sign with arithmetic mean
+ AliDielectronSignalBase *sigAnyArith=GetSignalLS(d,stepAny,AliDielectronSignalBase::kLikeSignArithm);
+ SetStyle(sigAnyArith,"ITS Any - Like Sign subtraction (Arithm. mean)");
+ DrawSpectra(sigAnyArith,"cAnyArith",hStats,save);
+
//--- Rotation subtraction
AliDielectronSignalBase *sigAnyRot=GetSignalRot(d,stepAny);
SetStyle(sigAnyRot,"ITS First - Track rotation subtraction");
//_______________________________________
-AliDielectronSignalBase *GetSignalLS(AliDielectronCFdraw &d, Int_t step)
+AliDielectronSignalBase *GetSignalLS(AliDielectronCFdraw &d, Int_t step, AliDielectronSignalBase::EBackgroundMethod type)
{
//
// Get Extracted signal from likesign method
}
AliDielectronSignalExt *sig=new AliDielectronSignalExt;
- sig->SetScaleRawToBackground(3.2,5.);
+ sig->SetScaleRawToBackground(3.2,4.9);
sig->SetIntegralRange(2.92,3.15);
- sig->SetMethod(AliDielectronSignalBase::kLikeSign);
+ sig->SetMethod(type);
sig->Process(arr);
delete arr;
arr->AddAt(d.Project("M",step),iType);
AliDielectronSignalExt *sig=new AliDielectronSignalExt;
-// sig->SetScaleRawToBackground(3.2,4.);
+ sig->SetScaleRawToBackground(3.2,4.9);
sig->SetIntegralRange(2.93,3.15);
sig->SetMethod(AliDielectronSignalBase::kRotation);
sig->Process(arr);