fPdgMother(443),
fPdgLeg1(11),
fPdgLeg2(11),
+ fNoPairing(kFALSE),
fHistos(0x0),
fPairCandidates(new TObjArray(10)),
fCfManagerPair(0x0),
fTrackRotator(0x0),
- fDebugTree(0x0)
+ fDebugTree(0x0),
+ fPreFilterUnlikeOnly(kFALSE)
{
//
// Default constructor
fPdgMother(443),
fPdgLeg1(11),
fPdgLeg2(11),
+ fNoPairing(kFALSE),
fHistos(0x0),
fPairCandidates(new TObjArray(10)),
fCfManagerPair(0x0),
fTrackRotator(0x0),
- fDebugTree(0x0)
+ fDebugTree(0x0),
+ fPreFilterUnlikeOnly(kFALSE)
{
//
// Named constructor
AliDielectronVarManager::SetEvent(ev1);
//fill track arrays for the first event
- if (ev1) FillTrackArrays(ev1);
+ if (ev1){
+ FillTrackArrays(ev1);
+ if ((fPreFilterUnlikeOnly) && ( fPairPreFilter.GetCuts()->GetEntries()>0 )) PairPreFilter(0, 1, fTracks[0], fTracks[1]);
+ }
+
//fill track arrays for the second event
- if (ev2) FillTrackArrays(ev2,1);
+ if (ev2) {
+ FillTrackArrays(ev2,1);
+ if ((fPreFilterUnlikeOnly) && ( fPairPreFilter.GetCuts()->GetEntries()>0 )) PairPreFilter(2, 3, fTracks[2], fTracks[3]);
+ }
- // create pairs and fill pair candidate arrays
- for (Int_t itrackArr1=0; itrackArr1<4; ++itrackArr1){
- for (Int_t itrackArr2=itrackArr1; itrackArr2<4; ++itrackArr2){
- FillPairArrays(itrackArr1, itrackArr2);
+ if (!fNoPairing){
+ // create pairs and fill pair candidate arrays
+ for (Int_t itrackArr1=0; itrackArr1<4; ++itrackArr1){
+ for (Int_t itrackArr2=itrackArr1; itrackArr2<4; ++itrackArr2){
+ FillPairArrays(itrackArr1, itrackArr2);
+ }
}
- }
- //track rotation
- if (fTrackRotator) FillPairArrayTR();
+ //track rotation
+ if (fTrackRotator) FillPairArrayTR();
+ }
//in case there is a histogram manager, fill the QA histograms
if (fHistos) FillHistograms(ev1);
}
}
+//________________________________________________________________
+void AliDielectron::FillHistogramsTracks(TObjArray **tracks)
+{
+ //
+ // Fill Histogram information for tracks after prefilter
+ // ignore mixed events - for prefilter, only single tracks +/- are relevant
+ //
+
+ TString className,className2;
+ Double_t values[AliDielectronVarManager::kNMaxValues];
+
+ //Fill track information, separately for the track array candidates
+ for (Int_t i=0; i<2; ++i){
+ className.Form("Pre_%s",fgkTrackClassNames[i]);
+ if (!fHistos->GetHistogramList()->FindObject(className.Data())) continue;
+ Int_t ntracks=tracks[i]->GetEntriesFast();
+ for (Int_t itrack=0; itrack<ntracks; ++itrack){
+ AliDielectronVarManager::Fill(tracks[i]->UncheckedAt(itrack), values);
+ fHistos->FillClass(className, AliDielectronVarManager::kNMaxValues, values);
+ }
+ }
+}
//________________________________________________________________
void AliDielectron::FillHistograms(const AliVEvent *ev)
{
// NOTE: in this funtion the leg information may be filled multiple
// times. This funtion is used in the track rotation pairing
// and those legs are not saved!
- //
+ //=fHistos
TString className,className2;
Double_t values[AliDielectronVarManager::kNMaxValues];
AliDielectronPair candidate;
UInt_t selectedMask=(1<<fPairPreFilter.GetCuts()->GetEntries())-1;
+ UInt_t selectedMaskPair=(1<<fPairFilter.GetCuts()->GetEntries())-1;
for (Int_t itrack1=0; itrack1<ntrack1; ++itrack1){
Int_t end=ntrack2;
//apply cut
if (cutMask!=selectedMask) continue;
+ if (fCfManagerPair) fCfManagerPair->Fill(selectedMaskPair+1 ,&candidate);
accepted=kTRUE;
//remove the tracks from the Track arrays
arrTracks2.AddAt(0x0,itrack2);
if ( accepted ) arrTracks1.AddAt(0x0,itrack1);
}
//compress the track arrays
+
+
+
arrTracks1.Compress();
arrTracks2.Compress();
for (Int_t itrack=0; itrack<arrTracks1.GetEntriesFast();++itrack){
//test cuts
UInt_t cutMask=fPairPreFilterLegs.IsSelected(arrTracks1.UncheckedAt(itrack));
+
//apply cut
if (cutMask!=selectedMask) arrTracks1.AddAt(0x0,itrack);;
}
}
}
+ //For unlike-sign monitor track-cuts:
+ if (arr1!=arr2) {
+ TObjArray *unlikesignArray[2] = {&arrTracks1,&arrTracks2};
+ FillHistogramsTracks(unlikesignArray);
+ }
}
//________________________________________________________________
TObjArray arrTracks2=fTracks[arr2];
//process pre filter if set
- if ( fPairPreFilter.GetCuts()->GetEntries()>0 ) PairPreFilter(arr1, arr2, arrTracks1, arrTracks2);
+ if ((!fPreFilterUnlikeOnly) && ( fPairPreFilter.GetCuts()->GetEntries()>0 )) PairPreFilter(arr1, arr2, arrTracks1, arrTracks2);
Int_t pairIndex=GetPairIndex(arr1,arr2);
Int_t GetMotherPdg() const { return fPdgMother; }
Int_t GetLeg1Pdg() const { return fPdgLeg1; }
Int_t GetLeg2Pdg() const { return fPdgLeg2; }
-
+
+ void SetNoPairing(Bool_t noPairing=kTRUE) { fNoPairing=noPairing; }
const TObjArray* GetTrackArray(Int_t i) const {return (i>=0&&i<4)?&fTracks[i]:0;}
const TObjArray* GetPairArray(Int_t i) const {return (i>=0&&i<10)?
static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i)):0;}
void SetCFManagerPair(AliDielectronCF * const cf) { fCfManagerPair=cf; }
AliDielectronCF* GetCFManagerPair() const { return fCfManagerPair; }
+ void SetPreFilterUnlikeOnly(Bool_t setValue=kTRUE){fPreFilterUnlikeOnly=setValue;};
+
void SetTrackRotator(AliDielectronTrackRotator * const rot) { fTrackRotator=rot; }
AliDielectronTrackRotator* GetTrackRotator() const { return fTrackRotator; }
Int_t fPdgMother; // pdg code of mother tracks
Int_t fPdgLeg1; // pdg code leg1
Int_t fPdgLeg2; // pdg code leg2
-
+
+ Bool_t fNoPairing; // if to skip pairing, can be used for track QA only
+
AliDielectronHistos *fHistos; // Histogram manager
// Streaming and merging should be handled
// by the analysis framework
-
+
TObjArray fTracks[4]; //! Selected track candidates
// 0: Event1, positive particles
// 1: Event1, negative particles
AliDielectronCF *fCfManagerPair;//Correction Framework Manager for the Pair
AliDielectronTrackRotator *fTrackRotator; //Track rotator
AliDielectronDebugTree *fDebugTree; // Debug tree output
+
+ Bool_t fPreFilterUnlikeOnly; //Apply PreFilter either in +- or to ++/--/+- individually
+
void FillTrackArrays(AliVEvent * const ev, Int_t eventNr=0);
void PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2);
void FillHistograms(const AliVEvent *ev);
void FillHistogramsPair(AliDielectronPair *pair);
-
+ void FillHistogramsTracks(TObjArray **tracks);
+
void FillDebugTree();
AliDielectron(const AliDielectron &c);
fStepForMCtruth(kFALSE),
fStepForNoCutsMCmotherPid(kFALSE),
fStepForAfterAllCuts(kTRUE),
+ fStepForPreFilter(kFALSE),
fStepsForEachCut(kFALSE),
fStepsForCutsIncreasing(kFALSE),
fStepsForSignal(kTRUE),
fStepForMCtruth(kFALSE),
fStepForNoCutsMCmotherPid(kFALSE),
fStepForAfterAllCuts(kTRUE),
+ fStepForPreFilter(kFALSE),
fStepsForEachCut(kFALSE),
fStepsForCutsIncreasing(kFALSE),
fStepsForSignal(kTRUE),
if (fStepsForCutsIncreasing&&fNCuts>2) fNSteps+=(fNAddSteps*(fNCuts-2)); //one step for the increasing cuts + Signal (MC)
// e.g. cut2&cut3, cut2&cut3&cut4
fNSteps+=(fNAddSteps*fNStepMasks); // cuts for the additional cut masks
+
+ if (fStepForPreFilter) fNSteps+=fNAddSteps; //Add at the end for Prefilter (maxcutmask+1)
+
// create the container
Int_t *nbins=new Int_t[fNVars+2*fNVarsLeg];
}
}
+ //Additional Step for result after PreFilter
+ if (fStepForPreFilter){
+ cutName="PreFilter";
+ fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut
+ if (fHasMC){
+ if (fStepsForSignal)
+ fCfContainer->SetStepTitle(step++, (cutName+" (Signal)").Data()); //Step for the cut with MC truth
+ if (fStepsForBackground)
+ fCfContainer->SetStepTitle(step++, (cutName+" (Background)").Data()); //Step for the cut with MC truth
+ }
+ }
+
+
+
if (step!=fNSteps) {
AliError(Form("Something went wrong in the naming of the steps!!! (%d != %d)",step,fNSteps));
}
}
}
+
//Steps for increasing cut match
if (fStepsForCutsIncreasing&&fNCuts>2){
for (Int_t iCut=1; iCut<fNCuts-1;++iCut) {
step+=fNAddSteps;
}
}
-
+ if (fStepForPreFilter) {
+ if (mask&(1<<fNCuts)) {
+ fCfContainer->Fill(fValues,step);
+ ++step;
+
+ if (fHasMC){
+ if ( fStepsForSignal){
+ if (isMCTruth) fCfContainer->Fill(fValues,step);
+ ++step;
+ }
+ if ( fStepsForBackground ){
+ if (!isMCTruth) fCfContainer->Fill(fValues,step);
+ ++step;
+ }
+ }
+ }
+ else {
+ step+=fNAddSteps;
+ }
+ }
if (step!=fNSteps) {
AliError("Something went wrong in the step filling!!!");
}
void SetStepForMCtruth(Bool_t steps=kTRUE) { fStepForMCtruth=steps; }
void SetStepForNoCutsMCmotherPid(Bool_t steps=kTRUE) { fStepForNoCutsMCmotherPid=steps; }
void SetStepForAfterAllCuts(Bool_t steps=kTRUE) { fStepForAfterAllCuts=steps; }
+ void SetStepForPreFilter(Bool_t steps=kTRUE) { fStepForPreFilter=steps; }
void SetStepsForEachCut(Bool_t steps=kTRUE) { fStepsForEachCut=steps; }
void SetStepsForCutsIncreasing(Bool_t steps=kTRUE) { fStepsForCutsIncreasing=steps; }
void SetStepsForSignal(Bool_t steps=kTRUE) { fStepsForSignal=steps; }
Bool_t fStepForMCtruth; //create a step for the MC truth
Bool_t fStepForNoCutsMCmotherPid; //create a step for before cuts, but with MC truth of the mother
Bool_t fStepForAfterAllCuts; //create a step for before cuts, but with MC truth of the mother
+ Bool_t fStepForPreFilter; //create a step after PreFilter application
Bool_t fStepsForEachCut; //create steps for each cut?
Bool_t fStepsForCutsIncreasing; //create steps for increasing cut combinatons?
//e.g. cut1&cut2, cut1&cut2&cut3 ...
}
//________________________________________________________________
-void AliDielectronCFdraw::DrawEfficiency(const char* varnames, const char* nominators, Int_t denominator, const char* opt)
+void AliDielectronCFdraw::DrawEfficiency(const char* varnames, const char* numerators, Int_t denominator, const char* opt)
{
//
// plot efficiencies for variables. Variable may be up to 3 dim, separated by a ':'
- // you may have several nominators, sparated by one of ',:;'
+ // you may have several numerators, sparated by one of ',:;'
//
TObjArray *arrVars=TString(varnames).Tokenize(":");
switch (entries){
case 1:
- DrawEfficiency(ivar[0],nominators, denominator,opt,type);
+ DrawEfficiency(ivar[0],numerators, denominator,opt,type);
break;
case 2:
- DrawEfficiency(ivar[1],ivar[0], nominators, denominator,opt,type);
+ DrawEfficiency(ivar[1],ivar[0], numerators, denominator,opt,type);
break;
case 3:
- DrawEfficiency(ivar[2],ivar[1],ivar[0],nominators, denominator,opt,type);
+ DrawEfficiency(ivar[2],ivar[1],ivar[0],numerators, denominator,opt,type);
break;
}
delete arrVars;
}
//________________________________________________________________
-void AliDielectronCFdraw::DrawEfficiency(Int_t var, const char* nominators, Int_t denominator, const char* opt, Int_t type)
+void AliDielectronCFdraw::DrawEfficiency(Int_t var, const char* numerators, Int_t denominator, const char* opt, Int_t type)
{
//
- // Draw Efficiencies for all nominators
- // nominators may be divided by and of ,;:
+ // Draw Efficiencies for all numerators
+ // numerators may be divided by and of ,;:
//
// if opt contains 'same' all histograms are drawn in the same pad
// otherwise the pad will be divided in sub pads and the histograms
const Int_t ndim=1;
Int_t vars[ndim]={var};
- TObjArray *arr=CollectHistosEff(ndim,vars,nominators,denominator,type);
+ TObjArray *arr=CollectHistosEff(ndim,vars,numerators,denominator,type);
TString drawOpt=opt;
drawOpt+="eff";
Draw(arr,drawOpt);
}
//________________________________________________________________
-void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, const char* nominators, Int_t denominator, const char* opt, Int_t type)
+void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, const char* numerators, Int_t denominator, const char* opt, Int_t type)
{
//
// Draw 2D case
//
const Int_t ndim=2;
Int_t vars[ndim]={var0,var1};
- TObjArray *arr=CollectHistosEff(ndim,vars,nominators,denominator,type);
+ TObjArray *arr=CollectHistosEff(ndim,vars,numerators,denominator,type);
TString drawOpt=opt;
drawOpt+="eff";
Draw(arr,drawOpt);
}
//________________________________________________________________
-void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, Int_t var2, const char* nominators, Int_t denominator, const char* opt, Int_t type)
+void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, Int_t var2, const char* numerators, Int_t denominator, const char* opt, Int_t type)
{
//
// Draw 3D case
//
const Int_t ndim=3;
Int_t vars[ndim]={var0,var1,var2};
- TObjArray *arr=CollectHistosEff(ndim,vars,nominators,denominator,type);
+ TObjArray *arr=CollectHistosEff(ndim,vars,numerators,denominator,type);
TString drawOpt=opt;
drawOpt+="eff";
Draw(arr,drawOpt);
}
//________________________________________________________________
-TObjArray* AliDielectronCFdraw::CollectHistosEff(Int_t dim, Int_t *vars, const char* nominators, Int_t denominator, Int_t type)
+TObjArray* AliDielectronCFdraw::CollectHistosEff(Int_t dim, Int_t *vars, const char* numerators, Int_t denominator, Int_t type)
{
//
// Collect histos with 'dim'ension of the 'slices' separated by one of "':;'"
// in a TObjArray and return it
//
- TObjArray *arr=TString(nominators).Tokenize(",:;");
+ TObjArray *arr=TString(numerators).Tokenize(",:;");
TObjArray *arrHists=0x0;
if (type==0){
}
}
+
+//________________________________________________________________
+Double_t AliDielectronCFdraw::GetAverageEfficiency(Int_t numerator, Int_t denominator, Double_t &effErr)
+{
+ //
+ // Extract the mean efficiency of the numerator and denominator
+ //
+
+ //use variable 0 as default, since for the average it doesn't matter
+ TH1 *hDen=fCfContainer->Project(0,denominator);
+ Double_t entriesDen=hDen->GetEffectiveEntries();
+ TH1 *hproj=fCfContainer->Project(0,numerator);
+ if (!hproj) return -1.;
+ Double_t entriesNum=hproj->GetEffectiveEntries();
+ if (entriesDen<1||entriesNum<1) return -1;
+
+ Double_t eff=-1.;
+ if (entriesDen>0) eff=entriesNum/entriesDen;
+ effErr=TMath::Sqrt(1./entriesNum+1./entriesDen)*eff;
+ delete hDen;
+ delete hproj;
+ return eff;
+}
TH1* Project(const Option_t* var, Int_t slice);
//Draw efficiencies
- void DrawEfficiency(const char* varnames, const char* nominators, Int_t denominator=0, const char* opt="sameleg2");
- void DrawEfficiency(Int_t var, const char* nominators, Int_t denominator=0, const char* opt="sameleg", Int_t type=0);
- void DrawEfficiency(Int_t var0, Int_t var1, const char* nominators, Int_t denominator=0, const char* opt="sameleg", Int_t type=0);
- void DrawEfficiency(Int_t var0, Int_t var1, Int_t var2, const char* nominators, Int_t denominator=0, const char* opt="sameleg", Int_t type=0);
+ void DrawEfficiency(const char* varnames, const char* numerators, Int_t denominator=0, const char* opt="sameleg2");
+ void DrawEfficiency(Int_t var, const char* numerators, Int_t denominator=0, const char* opt="sameleg", Int_t type=0);
+ void DrawEfficiency(Int_t var0, Int_t var1, const char* numerators, Int_t denominator=0, const char* opt="sameleg", Int_t type=0);
+ void DrawEfficiency(Int_t var0, Int_t var1, Int_t var2, const char* numerators, Int_t denominator=0, const char* opt="sameleg", Int_t type=0);
- TObjArray* CollectHistosEff(Int_t dim, Int_t *vars, const char* nominators, Int_t denominator, Int_t type=0);
+ TObjArray* CollectHistosEff(Int_t dim, Int_t *vars, const char* numerators, Int_t denominator, Int_t type=0);
TH1* ProjectEff(Int_t ndim, Int_t *vars);
+
+ Double_t GetAverageEfficiency(Int_t numerator, Int_t denominator, Double_t &effErr);
const TVectorD& GetData() const {return fVdata;}
void Draw(const TObjArray *arr, const char* opt="");
fFitMax(0),
fRebin(1),
fMethod(kLikeSign),
+ fScaleMin(0.),
+ fScaleMax(0.),
+ fScaleFactor(0.),
fProcessed(kFALSE)
{
//
fFitMax(0),
fRebin(1),
fMethod(kLikeSign),
+ fScaleMin(0.),
+ fScaleMax(0.),
+ fScaleFactor(0.),
fProcessed(kFALSE)
{
//
//
if(fHistSignal) delete fHistSignal;
if(fHistBackground) delete fHistBackground;
+ if (fHistDataPP) delete fHistDataPP;
+ if (fHistDataPM) delete fHistDataPM;
+ if (fHistDataMM) delete fHistDataMM;
+
}
//______________________________________________
}
//______________________________________________
-void AliDielectronSignalBase::ScaleHistograms(TH1* histRaw, TH1* histBackground, Double_t intMin, Double_t intMax)
+Double_t AliDielectronSignalBase::ScaleHistograms(TH1* histRaw, TH1* histBackground, Double_t intMin, Double_t intMax)
{
//
// scale histBackground to match the integral of histRaw in the interval intMin, intMax
Double_t intRaw = histRaw->Integral(histRaw->FindBin(intMin),histRaw->FindBin(intMax));
Double_t intBack = histBackground->Integral(histBackground->FindBin(intMin),histBackground->FindBin(intMax));
+ Double_t scaleFactor=intBack>0?intRaw/intBack:0.;
if (intBack>0){
histBackground->Sumw2();
- histBackground->Scale(1./intBack);
- histBackground->Scale(intRaw);
+ histBackground->Scale(scaleFactor);
}
+
+ return scaleFactor;
}
TH1* GetSignalHistogram() const {return fHistSignal;}
TH1* GetBackgroundHistogram() const {return fHistBackground;}
TH1* GetUnlikeSignHistogram() const {return fHistDataPM;}
+
+ void SetScaleRawToBackground(Double_t intMin, Double_t intMax) { fScaleMin=intMin; fScaleMax=intMax; }
+ Double_t GetScaleFactor() const { return fScaleFactor; }
- static void ScaleHistograms(TH1* histRaw, TH1* histBackground, Double_t intMin, Double_t intMax);
+ static Double_t ScaleHistograms(TH1* histRaw, TH1* histBackground, Double_t intMin, Double_t intMax);
virtual void Print(Option_t *option="") const;
Int_t fRebin; // histogram rebin factor
EBackgroundMethod fMethod; // method for background substraction
-
+ Double_t fScaleMin; // min for scaling of raw and background histogram
+ Double_t fScaleMax; // max for scaling of raw and background histogram
+ Double_t fScaleFactor; // scale factor of raw to background histogram scaling
+
Bool_t fProcessed; // flag
-
+
void SetSignificanceAndSOB(); // calculate the significance and S/B
TPaveText* DrawStats(Double_t x1=0., Double_t y1=0., Double_t x2=0., Double_t y2=0.);
AliDielectronSignalBase(const AliDielectronSignalBase &c);
AliDielectronSignalBase &operator=(const AliDielectronSignalBase &c);
- ClassDef(AliDielectronSignalBase,3) // Dielectron SignalBase
+ ClassDef(AliDielectronSignalBase,4) // Dielectron SignalBase
};
inline void AliDielectronSignalBase::SetSignificanceAndSOB()
fHistDataPP->Sumw2();
fHistDataPM->Sumw2();
fHistDataMM->Sumw2();
+ fHistDataPP->SetDirectory(0);
+ fHistDataPM->SetDirectory(0);
+ fHistDataMM->SetDirectory(0);
// rebin the histograms
if (fRebin>1) {
fHistSignal = new TH1D("HistSignal", "Like-Sign substracted signal",
fHistDataPM->GetXaxis()->GetNbins(),
fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
+ fHistSignal->SetDirectory(0);
fHistBackground = new TH1D("HistBackground", "Like-sign contribution",
fHistDataPM->GetXaxis()->GetNbins(),
fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
-
+ fHistBackground->SetDirectory(0);
+
// fill out background and subtracted histogram
for(Int_t ibin=1; ibin<=fHistDataPM->GetXaxis()->GetNbins(); ibin++) {
Float_t pm = fHistDataPM->GetBinContent(ibin);
Float_t background = 2*TMath::Sqrt(pp*mm);
Float_t ebackground = TMath::Sqrt(mm+pp);
- Float_t signal = pm - background;
- Float_t error = TMath::Sqrt(epm*epm+mm+pp);
+// Float_t signal = pm - background;
+// Float_t error = TMath::Sqrt(epm*epm+mm+pp);
- fHistSignal->SetBinContent(ibin, signal);
- fHistSignal->SetBinError(ibin, error);
+ fHistSignal->SetBinContent(ibin, pm);
+ fHistSignal->SetBinError(ibin, epm);
fHistBackground->SetBinContent(ibin, background);
fHistBackground->SetBinError(ibin, ebackground);
}
+ //scale background histogram to match integral of the data histogram between fScaleMin and fScaleMax
+ if (fScaleMax>fScaleMin) fScaleFactor=ScaleHistograms(fHistDataPM,fHistBackground,fScaleMin,fScaleMax);
+
+ //subract background
+ fHistSignal->Add(fHistBackground,-1);
+
// signal
fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin),
fHistSignal->FindBin(fIntMax), fErrors(0));
return;
}
- //scale histograms to match integral between 3.2 and 4. GeV
- ScaleHistograms(fHistDataPM,fHistBackground,3.2,4.0);
+ //scale histograms to match integral between fScaleMin and fScaleMax
+ if (fScaleMax>fScaleMin) fScaleFactor=ScaleHistograms(fHistDataPM,fHistBackground,fScaleMin,fScaleMax);
+
fHistSignal=(TH1*)fHistDataPM->Clone("histSignal");
fHistSignal->Add(fHistBackground,-1.);
"Charge",
"NclsITS",
"NclsTPC",
+ "NclsTPCiter1",
"NFclsTPC",
"TPCsignalN",
"TPCchi2PerCluster",
kCharge, // charge
kNclsITS, // number of clusters assigned in the ITS
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
kTPCsignalN, // number of points used for dEdx
kTPCchi2Cl, // chi2/cl in TPC
Double_t tpcNcls=particle->GetTPCNcls();
values[AliDielectronVarManager::kNclsITS] = particle->GetNcls(0); // TODO: get rid of the plain numbers
values[AliDielectronVarManager::kNclsTPC] = tpcNcls; // TODO: get rid of the plain numbers
+ values[AliDielectronVarManager::kNclsTPC] = particle->GetTPCNclsIter1(); // TODO: get rid of the plain numbers
values[AliDielectronVarManager::kNFclsTPC] = particle->GetTPCNclsF();
values[AliDielectronVarManager::kTPCsignalN] = particle->GetTPCsignalN();
values[AliDielectronVarManager::kNclsTRD] = particle->GetNcls(2); // TODO: get rid of the plain numbers
// Reset AliESDtrack interface specific information
values[AliDielectronVarManager::kNclsITS] = 0;
values[AliDielectronVarManager::kNclsTPC] = particle->GetTPCNcls();
+ values[AliDielectronVarManager::kNclsTPCiter1] = particle->GetTPCNcls(); // not really available in AOD
values[AliDielectronVarManager::kNFclsTPC] = 0;
values[AliDielectronVarManager::kNclsTRD] = 0;
values[AliDielectronVarManager::kTRDntracklets] = 0;
// Fill track information available for histogramming into an array
//
+ values[AliDielectronVarManager::kNclsITS] = 0;
+ values[AliDielectronVarManager::kNclsTPC] = 0;
+ values[AliDielectronVarManager::kNclsTPCiter1] = 0;
+ values[AliDielectronVarManager::kNFclsTPC] = 0;
+ values[AliDielectronVarManager::kNclsTRD] = 0;
+ values[AliDielectronVarManager::kTRDntracklets] = 0;
+ values[AliDielectronVarManager::kTRDpidQuality] = 0;
+ values[AliDielectronVarManager::kTPCchi2Cl] = 0;
+ values[AliDielectronVarManager::kTrackStatus] = 0;
+ values[AliDielectronVarManager::kTRDprobEle] = 0;
+ values[AliDielectronVarManager::kTRDprobPio] = 0;
+ values[AliDielectronVarManager::kTPCsignalN] = 0;
+ values[AliDielectronVarManager::kImpactParXY] = 0;
+ values[AliDielectronVarManager::kImpactParZ] = 0;
+ values[AliDielectronVarManager::kPIn] = 0;
+ values[AliDielectronVarManager::kTPCsignal] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaEle] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaPio] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaMuo] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaKao] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaPro] = 0;
+ values[AliDielectronVarManager::kITSclusterMap] = 0;
+
+ values[AliDielectronVarManager::kPdgCode] = 0;
+ values[AliDielectronVarManager::kPdgCodeMother] = 0;
+
// Fill common AliVParticle interface information
FillVarVParticle(particle, values);
-
-
- values[AliDielectronVarManager::kPdgCode]=0;
- values[AliDielectronVarManager::kPdgCodeMother]=0;
AliDielectronMC *mc=AliDielectronMC::Instance();
// Fill track information available for histogramming into an array
//
+ values[AliDielectronVarManager::kNclsITS] = 0;
+ values[AliDielectronVarManager::kNclsTPC] = 0;
+ values[AliDielectronVarManager::kNclsTPCiter1] = 0;
+ values[AliDielectronVarManager::kNFclsTPC] = 0;
+ values[AliDielectronVarManager::kNclsTRD] = 0;
+ values[AliDielectronVarManager::kTRDntracklets] = 0;
+ values[AliDielectronVarManager::kTRDpidQuality] = 0;
+ values[AliDielectronVarManager::kTPCchi2Cl] = 0;
+ values[AliDielectronVarManager::kTrackStatus] = 0;
+ values[AliDielectronVarManager::kTRDprobEle] = 0;
+ values[AliDielectronVarManager::kTRDprobPio] = 0;
+ values[AliDielectronVarManager::kTPCsignalN] = 0;
+ values[AliDielectronVarManager::kImpactParXY] = 0;
+ values[AliDielectronVarManager::kImpactParZ] = 0;
+ values[AliDielectronVarManager::kPIn] = 0;
+ values[AliDielectronVarManager::kTPCsignal] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaEle] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaPio] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaMuo] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaKao] = 0;
+ values[AliDielectronVarManager::kTPCnSigmaPro] = 0;
+ values[AliDielectronVarManager::kITSclusterMap] = 0;
+
+ values[AliDielectronVarManager::kPdgCode] = 0;
+ values[AliDielectronVarManager::kPdgCodeMother] = 0;
+
// Fill common AliVParticle interface information
FillVarVParticle(particle, values);
-
-
- values[AliDielectronVarManager::kPdgCode]=0;
- values[AliDielectronVarManager::kPdgCodeMother]=0;
-
+
AliDielectronMC *mc=AliDielectronMC::Instance();
// data
- Double_t res=5.7e-2;
+ Double_t res=5.2e-2;
alephParameters[0] = 0.0283086;
alephParameters[1] = 2.63394e+01;
alephParameters[2] = 5.04114e-11;
alephParameters[4] = 4.88663e+00;
Color_t color=kRed;
+ alephParameters[0] = 0.0283086/0.97;
+ //alephParameters[0] = 0.0283086;
+ alephParameters[1] = 2.63394e+01;
+ alephParameters[2] = 5.04114e-11;
+ alephParameters[3] = 2.12543e+00;
+ alephParameters[4] = 4.88663e+00;
TF1 *foDataProton = new TF1("foDataProton", "50*AliExternalTrackParam::BetheBlochAleph(x/0.93827,[0],[1],[2],[3],[4])",0.05,20);
- TF1 *foDataProtonP = new TF1("foDataProtonP",Form( "50*AliExternalTrackParam::BetheBlochAleph(x/0.93827,[0],[1],[2],[3],[4])*(1+%f)",res),0.05,20);
+ TF1 *foDataProtonP = new TF1("foDataProtonP",Form( "50*AliExternalTrackParam::BetheBlochAleph(x/0.93827,[0],[1],[2],[3],[4])*(1+%f)",3*res),0.05,20);
TF1 *foDataProtonM = new TF1("foDataProtonM", Form("50*AliExternalTrackParam::BetheBlochAleph(x/0.93827,[0],[1],[2],[3],[4])*(1-%f)",res),0.05,20);
TF1 *foDataPion = new TF1("foDataPion", "50*AliExternalTrackParam::BetheBlochAleph(x/0.13957,[0],[1],[2],[3],[4])",0.05,20);
- TF1 *foDataPionP = new TF1("foDataPionP",Form( "50*AliExternalTrackParam::BetheBlochAleph(x/0.93827,[0],[1],[2],[3],[4])*(1+%f)",res),0.05,20);
+ TF1 *foDataPionP = new TF1("foDataPionP",Form( "50*AliExternalTrackParam::BetheBlochAleph(x/0.13957,[0],[1],[2],[3],[4])*(1+%f)",res),0.05,20);
TF1 *foDataPionM = new TF1("foDataPionM", Form("50*AliExternalTrackParam::BetheBlochAleph(x/0.93827,[0],[1],[2],[3],[4])*(1-%f)",res),0.05,20);
TF1 *foDataElec = new TF1("foDataElec", "50*AliExternalTrackParam::BetheBlochAleph(x/0.000511,[0],[1],[2],[3],[4])",0.05,20);
*/
-/*
-
-c->SetLineColor(kRed); c->Draw("M","Leg1_Pt>1.2","same");
-c->SetLineColor(kGreen); c->Draw("M","Leg1_Pt>1.5","same");
-c->SetLineColor(kBlue); c->Draw("M","Leg1_Pt>2","same");
-c->SetLineColor(kMagenta); c->Draw("M","Leg1_Pt>2.5","same");
-c->SetLineColor(kGreen-4); c->Draw("M","Leg1_Pt>3","same");
-
-c->SetLineColor(kRed-2); c->Draw("M","Leg1_Pt>1.2&&Leg2_Pt>.5","same");
-c->SetLineColor(kRed-4); c->Draw("M","Leg1_Pt>1.2&&Leg2_Pt>.7","same");
-c->SetLineColor(kRed-6); c->Draw("M","Leg1_Pt>1.2&&Leg2_Pt>1","same");
-c->SetLineColor(kRed-8); c->Draw("M","Leg1_Pt>1.2&&Leg2_Pt>1.2","same");
+/*
-c=Pair
-
+ Double_t resolution=0.052;
+ Double_t nSigma=3.;
+ TF1 *ffPio=new TF1(Form("fBethe%d",AliPID::kPion), Form("(%f*%f+(AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])-AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])))/%f", nSigma,resolution, AliPID::ParticleMass(AliPID::kPion), AliPID::ParticleMass(AliPID::kElectron), resolution), 0.05,200.);
+ ffPio->SetParameters(0.0283086/0.97,2.63394e+01,5.04114e-11,2.12543e+00,4.88663e+00);
+fPPio->Draw("same");
-c->SetAlias("cutE","Leg1_TPC_nSigma_Electrons>-2&&(Leg2_TPC_nSigma_Electrons)>-2");
-c->SetAlias("cutE","abs(Leg1_TPC_nSigma_Electrons)<2&&abs(Leg2_TPC_nSigma_Electrons)<2");
+ TF1 f("fP","-8*exp(-0.6*x)",0,40);
+f.Draw("same")
-c->SetAlias("cutPi","Leg1_TPC_nSigma_Pions>2&&Leg2_TPC_nSigma_Pions>2");
-c->SetAlias("cutP","abs(Leg1_TPC_nSigma_Protons)>2&&abs(Leg2_TPC_nSigma_Protons)>2");
-c->SetAlias("cutK","abs(Leg1_TPC_nSigma_Kaons)>2&&abs(Leg2_TPC_nSigma_Kaons)>2");
-c->SetAlias("cutMu","abs(Leg1_TPC_nSigma_Muons)>1.5&&abs(Leg2_TPC_nSigma_Muons)>1.5");
-
-c->SetAlias("cutE","abs(Leg1_TPC_nSigma_Electrons)<3&&abs(Leg2_TPC_nSigma_Electrons)<3");
-c->SetAlias("cutPi","abs(Leg1_TPC_nSigma_Pions)>2&&abs(Leg2_TPC_nSigma_Pions)>2");
-c->SetAlias("cutP","abs(Leg1_TPC_nSigma_Protons+.5)>2&&abs(Leg2_TPC_nSigma_Protons+.5)>2");
-c->SetAlias("pid","cutPi&&cutE");
+*/
-c->SetAlias("pid","cutPi&&cutP&&cutK&&cutE");
-c->SetAlias("pid","cutPi&&cutP&&cutK&&cutMu");
-c->Draw("M>>h(50,1.99,3.99)","pid&&PairType==1&&Leg2_Pt>1","e");
-hist=h
-TObjArray arr;
-arr.AddAt(hist,1);
+/*
-AliDielectronSignalFunc fun
-fun.SetDefaults(1);
-fun.Process(&arr);
-fun.Draw("samestat");
+c->SetAlias("cut","PairType==1")
-c->SetLineColor(kBlack);
-c->Draw("M>>h(50,1.99,3.99)","cutPi&&PairType==1","e");
-c->SetLineColor(kRed);
-c->Draw("M>>h2(50,1.99,3.99)","cutPi&&cutK&&PairType==1","esame");
+c->SetAlias("nCls","Leg1_NclsTPC>90&&Leg2_NclsTPC>90");
-c->SetLineColor(kBlue);
-c->Draw("M>>h3(50,1.99,3.99)","cutPi&&cutP&&PairType==1","esame");
+//--------PID
-c->SetLineColor(kGreen);
-c->Draw("M>>h4(50,1.99,3.99)","cutPi&&cutMu&&PairType==1","esame");
+//-- nsigma
+c->SetAlias("cutE","abs(Leg1_TPC_nSigma_Electrons)<3&&abs(Leg2_TPC_nSigma_Electrons)<3");
+c->SetAlias("cutE","Leg1_TPC_nSigma_Electrons>-1 && Leg2_TPC_nSigma_Electrons>-1");
+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("pidParam","eleParam&&cutP");
+c->SetAlias("LegEta","abs(Leg1_Eta)<0.9&&abs(Leg2_Eta<0.9)");
+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("cut","PairType==1&&nCls&&pidSig&&LegEta&&Rap")
+c->SetMarkerStyle(20);
+c->SetMarkerSize(.8);
+c->SetMarkerColor(kBlack);
c->SetLineColor(kBlack);
-c->Draw("Leg1_Pt>>hPt(50,1.99,3.99)","cutPi&&PairType==1","goff");
-c->Draw("Leg2_Pt>>hPt+","cutPi&&PairType==1","e");
-c->SetLineColor(kRed);
-c->Draw("Leg1_Pt>>hPt2(50,1.99,3.99)","cutPi&&cutK&&PairType==1","goff");
-c->Draw("Leg2_Pt>>hPt2+","cutPi&&cutK&&PairType==1","esame");
+// c->SetAlias("nCls","Leg1_NclsTPC>120&&Leg2_NclsTPC>120");
+c->Draw("M>>hM(50,2,4)","cut","e");
+c->SetMarkerColor(kBlue);
c->SetLineColor(kBlue);
-c->Draw("Leg1_Pt>>hPt3(50,1.99,3.99)","cutPi&&cutP&&PairType==1","goff");
-c->Draw("Leg2_Pt>>hPt3+","cutPi&&cutP&&PairType==1","esame");
+c->SetAlias("cut","PairType==1&&nCls&&pidParam&&LegEta&&Rap")
+// c->SetAlias("nCls","Leg1_NclsTPC>140&&Leg2_NclsTPC>140");
+c->Draw("M>>hM2(50,2,4)","cut","esame");
+c->SetMarkerColor(kGreen);
c->SetLineColor(kGreen);
-c->Draw("Leg1_Pt>>hPt4(50,1.99,3.99)","cutPi&&cutLeg1_Ptu&&PairType==1","goff");
-c->Draw("Leg1_Pt>>hPt4+","cutPi&&cutMu&&PairType==1","esame");
-
-
-
-
-c->Draw("M>>hM5(100,1.99,3.99)","Leg1_TPC_signal>65&&Leg2_TPC_signal>65&&Leg2_Pt>1.3&&PairType==1","e");
-
-
-c=Pair
-c->Draw("M>>hM5(100,1.99,3.99)","Leg1_TPC_signal>65&&Leg2_TPC_signal>65&&Leg2_Pt>1.&&PairType==1","e")
-hist=hM5
-AliDielectronSignalFunc fun
-fun.SetDefaults(1);
-fun.SetFitRange(2,4)
-fun.Process(hM)
-fun.Draw("samestat");
+c->SetAlias("nCls","Leg1_NclsTPC>150&&Leg2_NclsTPC>150");
+c->Draw("M>>hM3(50,2,4)","cut","esame");
-c->Draw("M>>hM5(50,1.99,3.99)","Leg1_TPC_signal>65&&Leg2_TPC_signal>65&&Leg2_Pt>1.1&&PairType==1","e")
-
-c->SetAlias("cut","Leg1_TPC_signal>65&&Leg2_TPC_signal>65&&Leg2_Pt>1.&&PairType==1")
-c->SetAlias("cut","Leg2_Pt>1&&PairType==1")
-c->SetAlias("cut","Leg1_TPC_signal>65&&Leg2_TPC_signal>65&&cutP&&cutK&&PairType==1")
-c->SetAlias("cut","cutP&&PairType==1")
-c->SetAlias("cut","PairType==1&&abs(Leg1_TOF_nSigma_Protons)>2&&abs(Leg2_TOF_nSigma_Protons)>2")
-
-c->SetAlias("cut","abs(Leg2_TOF_nSigma_Protons)>3&&abs(Leg2_TOF_nSigma_Pions)>")
-c->SetAlias("cut","abs(Leg2_TOF_nSigma_Protons)>7-5.5/3*Leg2_P_InnerParam")
+c->SetAlias("cut","PairType==1&&nCls&&LegEta&&Rap")
// histos
AliDielectronHistos h("h","h");
h.AddClass("TPCsignal");
h.UserHistogram("TPCsignal","sigTPC","TPC signal;P [GeV];TPC signal [arb. Units]",400,.3,40,400,0.,200.,0,0,kTRUE,kFALSE)
h.GetHistogram("TPCsignal","sigTPC")->SetDirectory(gDirectory)
-h.UserHistogram("TPCsignal","nSigE","TPC n #sigma Electrons;P [GeV];TPC n #sigma Electrons",200,.3,40.,100,-4.,4.,0,0,kTRUE,kFALSE)
+h.UserHistogram("TPCsignal","nSigE","TPC n #sigma Electrons;P [GeV];TPC n #sigma Electrons",200,.3,40.,100,-10.,10.,0,0,kTRUE,kFALSE)
h.GetHistogram("TPCsignal","nSigE")->SetDirectory(gDirectory)
-h.UserHistogram("TPCsignal","nSigMu","TPC n #sigma Muons;P [GeV];TPC n #sigma Muons",400,.3,40.,400,-4.,4.,0,0,kTRUE,kFALSE)
+h.UserHistogram("TPCsignal","nSigMu","TPC n #sigma Muons;P [GeV];TPC n #sigma Muons",400,.3,40.,500,-10.,10.,0,0,kTRUE,kFALSE)
h.GetHistogram("TPCsignal","nSigMu")->SetDirectory(gDirectory)
-h.UserHistogram("TPCsignal","nSigPi","TPC n #sigma Pions;P [GeV];TPC n #sigma Pions",400,.3,40.,400,-4.,4.,0,0,kTRUE,kFALSE)
+h.UserHistogram("TPCsignal","nSigPi","TPC n #sigma Pions;P [GeV];TPC n #sigma Pions",400,.3,40.,500,-10.,10.,0,0,kTRUE,kFALSE)
h.GetHistogram("TPCsignal","nSigPi")->SetDirectory(gDirectory)
-h.UserHistogram("TPCsignal","nSigK","TPC n #sigma Kaons;P [GeV];TPC n #sigma Kaons",400,.3,40,400,-4,4,0,0,kTRUE,kFALSE)
+h.UserHistogram("TPCsignal","nSigK","TPC n #sigma Kaons;P [GeV];TPC n #sigma Kaons",400,.3,40,500,-10,10,0,0,kTRUE,kFALSE)
h.GetHistogram("TPCsignal","nSigK")->SetDirectory(gDirectory)
-h.UserHistogram("TPCsignal","nSigP","TPC n #sigma Protons;P [GeV];TPC n #sigma Protons",400,.3,40.,400,-4,4.,0,0,kTRUE,kFALSE)
+h.UserHistogram("TPCsignal","nSigP","TPC n #sigma Protons;P [GeV];TPC n #sigma Protons",400,.3,40.,500,-10,10.,0,0,kTRUE,kFALSE)
h.GetHistogram("TPCsignal","nSigP")->SetDirectory(gDirectory)
AliDielectronSignalFunc sig;
sig.SetDefaults(1);
+
+
//WooJins cuts:
c->SetAlias("cutE","abs(Leg1_TPC_nSigma_Electrons)<3&&abs(Leg2_TPC_nSigma_Electrons)<3");
-c->SetAlias("cutPi","abs(Leg1_TPC_nSigma_Pions)>2&&abs(Leg2_TPC_nSigma_Pions)>2");
+c->SetAlias("cutPi","abs(Leg1_TPC_nSigma_Pions)>5&&abs(Leg2_TPC_nSigma_Pions)>5");
// c->SetAlias("cutPi","Leg1_TPC_signal>65&&Leg2_TPC_signal>65");
-c->SetAlias("cutP","abs(Leg1_TPC_nSigma_Protons)>2&&abs(Leg2_TPC_nSigma_Protons)>2");
+c->SetAlias("cutP","(Leg1_TPC_nSigma_Protons)>5&&(Leg2_TPC_nSigma_Protons)>5");
c->SetAlias("cutK","abs(Leg1_TPC_nSigma_Kaons)>2&&abs(Leg2_TPC_nSigma_Kaons)>2");
-c->SetAlias("pid","cutE&&cutPi&&cutP&&cutK");
+c->SetAlias("pid","cutE&&cutPi&&cutP");
+c->SetAlias("etaLeg","abs(Leg1_Eta)<.9&&abs(Leg2_Eta)<.9");
+c->SetAlias("rap","abs(Y)<.9");
c->SetAlias("cutAdd","PairType==1&&abs(Leg1_ImpactParXY)<.02&&abs(Leg2_ImpactParXY)<.02&&Leg2_Pt>1.")
-c->Draw("M>>hM(100,2,4)","cutAdd&&pid","e");
+c->Draw("M>>hM(50,2,4)","PairType==1&&pid","e");
h.Rebin();
h.Rebin();
h.Rebin();
//test
-c->SetAlias("cutE","abs(Leg1_TPC_nSigma_Electrons)<3&&abs(Leg2_TPC_nSigma_Electrons)<2");
-c->SetAlias("cutPi","abs(Leg1_TPC_nSigma_Pions)>1&&abs(Leg2_TPC_nSigma_Pions)>2");
-c->SetAlias("cutPi","Leg1_TPC_signal>67&&Leg2_TPC_signal>67");
-c->SetAlias("cutP","abs(Leg1_TPC_nSigma_Protons)>2&&abs(Leg2_TPC_nSigma_Protons)>2");
-c->SetAlias("cutK","abs(Leg1_TPC_nSigma_Kaons)>2&&abs(Leg2_TPC_nSigma_Kaons)>2");
-
-
-c->SetAlias("pid","cutE&&cutPi&&cutP&&cutK");
c->SetAlias("cutAdd","PairType==1&&abs(Leg1_ImpactParXY)<.03&&abs(Leg2_ImpactParXY)<.03&&Leg2_Pt>1")
-c->SetAlias("cut","cutAdd&&pid")
+c->SetAlias("cut","cutAdd&&pid&etaLeg&&rap")
c->Draw("M>>hM(50,1.99,3.99)","cut","e");
sig.Process(hM);
#include <TCanvas.h>
#include <TMath.h>
#include <TAxis.h>
+#include <TLatex.h>
+#include <TFile.h>
+#include <TString.h>
+#include <TLegend.h>
+#include <TList.h>
#include "AliDielectronSignalExt.h"
#include "AliDielectronCFdraw.h"
#include "AliDielectron.h"
-/*
-gSystem->AddIncludePath("-I/data/Work/software/svngsi/dielectron/trunk/dielectron");
-.L PlotDataResults.C+g
-PlotDataResuts("/data/Work/train/V005.data/2010-10-29_2144.3552/mergedPeriods/data/7TeV/LHC10c.pass2/jpsi.root");
-PlotDataResuts("/data/Work/train/V005.data/2010-10-21_2342.3445/mergedPeriods/data/7TeV/LHC10pass2/jpsi.root")
-PlotDataResuts("/data/Work/train/V005.data/2010-10-21_2342.3445/mergedPeriods/data/7TeV/LHC10d.pass1/wiechula_jpsi.root");
-*/
+AliDielectronSignalBase* GetSignalLS(AliDielectronCFdraw &d, Int_t step);
+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);
+void FitMCshape(AliDielectronSignalBase *sig);
-AliDielectronSignalBase* GetSignalLS(AliDielectronCFdraw &d, Int_t step, const char* nameAdd);
-AliDielectronSignalBase* GetSignalRot(AliDielectronCFdraw &d, Int_t step, const char* nameAdd);
-void DrawSpectra(AliDielectronSignalBase *sig, const char* cname);
+const char *mcLineShapeFile="$ALICE_ROOT/PWG3/dielectron/macros/mcMinv_LHC10e2.root";
//_______________________________________
-void PlotDataResuts(const char* filename)
+void PlotDataResults(const char* filenameData, const char* filenameMC="", Bool_t save=kFALSE)
{
- AliDielectronCFdraw d(filename);
+ AliDielectronCFdraw d(filenameData);
+ AliDielectronCFdraw dCorr("corrCont","corrCont");
+ TString nameCorr(filenameMC);
+ if (!nameCorr.IsNull()) d.SetCFContainers(nameCorr.Data());
+ TFile f(filenameData);
+ TH1 *hStats=(TH1*)f.Get("hEventStat");
+ hStats->SetDirectory(0);
+ f.Close();
- Int_t stepFirst=0, stepAny=1;
+ Int_t stepFirst=0, stepAny=1, stepTOFmix=2;
gStyle->SetOptStat(0);
//Set common Ranges
-// d.SetRangeUser("Leg1_Pt",1.,1000.);
-// d.SetRangeUser("Leg2_Pt",1.,1000.);
-
+// d.SetRangeUser("Leg1_Pt",0.8,1000.);
+// d.SetRangeUser("Leg2_Pt",0.8,1000.);
+// d.SetRangeUser("Leg1_NclsTPC",120.,170.);
+// d.SetRangeUser("Leg2_NclsTPC",120.,170.);
+ d.SetRangeUser("M",1.,5.);
//============================
//SPD first
//
-
+
//--- Like sign subtraction
- AliDielectronSignalBase *sigFirst=GetSignalLS(d,stepFirst,"First");
- DrawSpectra(sigFirst,"cFirst");
+ AliDielectronSignalBase *sigFirst=GetSignalLS(d,stepFirst);
+ SetStyle(sigFirst,"ITS First - Like Sign subtraction");
+ DrawSpectra(sigFirst,"cFirst",hStats,save);
//--- Rotation subtraction
- AliDielectronSignalBase *sigFirstRot=GetSignalRot(d,stepFirst,"FirstRot");
- DrawSpectra(sigFirstRot,"cFirstRot");
+ AliDielectronSignalBase *sigFirstRot=GetSignalRot(d,stepFirst);
+ SetStyle(sigFirstRot,"ITS First - Track rotation subtraction");
+// DrawSpectra(sigFirstRot,"cFirstRot",hStats,save);
//============================
//SPD any
//
- AliDielectronSignalBase *sigAny=GetSignalLS(d,stepAny,"Any");
- DrawSpectra(sigAny,"cAny");
+ AliDielectronSignalBase *sigAny=GetSignalLS(d,stepAny);
+ SetStyle(sigAny,"ITS First - Like Sign subtraction");
+ DrawSpectra(sigAny,"cAny",hStats,save);
+ //--- Rotation subtraction
+ AliDielectronSignalBase *sigAnyRot=GetSignalRot(d,stepAny);
+ SetStyle(sigAnyRot,"ITS First - Track rotation subtraction");
+// DrawSpectra(sigAnyRot,"cAnyRot",save);
+
+ //=============================
+ //TOF up to 1.2, parametrisation in TPC ele
+ //
+ AliDielectronSignalBase *sigTOFmix=GetSignalLS(d,stepTOFmix);
+ SetStyle(sigTOFmix,"TOF + TPC - Like Sign subtraction");
+// DrawSpectra(sigTOFmix,"cTOFTPC",hStats,save);
//--- Rotation subtraction
- AliDielectronSignalBase *sigAnyRot=GetSignalRot(d,stepAny,"AnyRot");
- DrawSpectra(sigAnyRot,"cAnyRot");
+ AliDielectronSignalBase *sigTOFmixRot=GetSignalRot(d,stepTOFmix);
+ SetStyle(sigTOFmixRot,"TOF + TPC - Track rotation subtraction");
+// DrawSpectra(sigTOFmixRot,"cTOFTPCrot",save);
+ if (hStats) delete hStats;
}
//_______________________________________
-AliDielectronSignalBase *GetSignalLS(AliDielectronCFdraw &d, Int_t step, const char* nameAdd)
+AliDielectronSignalBase *GetSignalLS(AliDielectronCFdraw &d, Int_t step)
{
//
// Get Extracted signal from likesign method
TObjArray *arr=new TObjArray;
arr->SetOwner();
-
+
for (Int_t iType=0;iType<3;++iType){
d.SetRangeUser("PairType",iType,iType);
arr->AddAt(d.Project("M",step),iType);
}
-
+
AliDielectronSignalExt *sig=new AliDielectronSignalExt;
- sig->SetIntegralRange(2.9,3.15);
+ sig->SetScaleRawToBackground(3.2,5.);
+ sig->SetIntegralRange(2.92,3.15);
sig->SetMethod(AliDielectronSignalBase::kLikeSign);
sig->Process(arr);
}
//_______________________________________
-AliDielectronSignalBase *GetSignalRot(AliDielectronCFdraw &d, Int_t step, const char* nameAdd)
+AliDielectronSignalBase *GetSignalRot(AliDielectronCFdraw &d, Int_t step)
{
//
// Get Extracted signal from likesign method
TObjArray *arr=new TObjArray;
arr->SetOwner();
-
+
Int_t iType=AliDielectron::kEv1PM;
d.SetRangeUser("PairType",iType,iType);
arr->AddAt(d.Project("M",step),iType);
arr->AddAt(d.Project("M",step),iType);
AliDielectronSignalExt *sig=new AliDielectronSignalExt;
- sig->SetIntegralRange(2.9,3.15);
+ sig->SetScaleRawToBackground(3.2,4.);
+ sig->SetIntegralRange(2.93,3.15);
sig->SetMethod(AliDielectronSignalBase::kRotation);
sig->Process(arr);
+
delete arr;
return sig;
}
//_______________________________________
-void DrawSpectra(AliDielectronSignalBase *sig, const char* cname)
+void SetStyle(AliDielectronSignalBase *sig, const char* nameAdd)
+{
+ //
+ //
+ //
+ TH1 *hUS=sig->GetUnlikeSignHistogram();
+ hUS->SetMarkerStyle(20);
+ hUS->SetMarkerSize(0.7);
+ hUS->SetMarkerColor(kRed);
+ hUS->SetLineColor(kRed);
+ hUS->SetStats(0);
+ hUS->SetTitle(Form("Like sign spectrum %s;M inv. ee;counts per %.4g MeV",
+ nameAdd,1000*hUS->GetXaxis()->GetBinWidth(1)));
+
+ TH1* hBackground=sig->GetBackgroundHistogram();
+ hBackground->SetMarkerStyle(24);
+ hBackground->SetMarkerSize(0.7);
+ hBackground->SetStats(0);
+ hBackground->SetMarkerColor(kBlue);
+ hBackground->SetLineColor(kBlue);
+ hBackground->SetTitle(Form("Like sign spectrum %s;M inv. ee;counts per %.4g MeV",
+ nameAdd,1000*hBackground->GetXaxis()->GetBinWidth(1)));
+
+ TH1* hSignal=sig->GetSignalHistogram();
+ hSignal->SetMarkerStyle(20);
+ hSignal->SetMarkerSize(0.7);
+ hSignal->SetMarkerColor(kRed);
+ hSignal->SetLineColor(kRed);
+ hSignal->SetTitle(Form("Like sign spectrum %s;M inv. ee;counts per %.4g MeV",
+ nameAdd,1000*hSignal->GetXaxis()->GetBinWidth(1)));
+
+
+}
+
+//_______________________________________
+void DrawSpectra(AliDielectronSignalBase *sig, const char* cname, TH1 *hEventStat, Bool_t save)
{
//
//
//
+
+
+ FitMCshape(sig);
+
gStyle->SetOptTitle(0);
TCanvas *c=(TCanvas*)gROOT->FindObject(cname);
- if (!c) c=new TCanvas(cname,cname,400,600);
+ if (!c) c=new TCanvas(cname,cname,400,500);
+ c->SetTopMargin(0.04); c->SetRightMargin(0.04);
+ c->SetLeftMargin(0.13); c->SetBottomMargin(0.14);
c->Clear();
c->Divide(1,2,0,0);
c->cd(1);
gPad->SetTopMargin(0.01);
gPad->SetRightMargin(0.01);
-
- gPad->SetBottomMargin(0);
+ gPad->SetLeftMargin(0.15);
+ gPad->SetBottomMargin(0.001);
+ /*
gPad->SetGridx();
gPad->SetGridy();
+*/
gPad->SetTickx();
gPad->SetTicky();
-
+
TH1 *hUS=sig->GetUnlikeSignHistogram();
- hUS->SetMarkerStyle(20);
- hUS->SetMarkerSize(0.7);
- hUS->SetMarkerColor(kRed);
- hUS->SetLineColor(kRed);
- hUS->SetStats(0);
TH1* hBackground=sig->GetBackgroundHistogram();
- hBackground->SetMarkerStyle(24);
- hBackground->SetMarkerSize(0.7);
- hBackground->SetStats(0);
- hBackground->SetMarkerColor(kBlue);
- hBackground->SetLineColor(kBlue);
+ hUS->GetXaxis()->CenterTitle();
+ hUS->GetXaxis()->SetTitleSize(0.07); hUS->GetXaxis()->SetLabelSize(0.059);
+// hUS->GetXaxis()->SetLabelOffset(1.);
+ hUS->GetXaxis()->SetTitleOffset(1.1);
+ hUS->GetXaxis()->SetNdivisions(510);
+ hUS->GetYaxis()->CenterTitle();
+ hUS->GetYaxis()->SetTitleSize(0.07); hUS->GetYaxis()->SetLabelSize(0.059);
+ hUS->GetYaxis()->SetTitleOffset(1.);
+ hUS->GetXaxis()->SetLabelFont(42); hUS->GetYaxis()->SetLabelFont(42);
+ hUS->GetXaxis()->SetTitleFont(42); hUS->GetYaxis()->SetTitleFont(42);
+ hUS->GetYaxis()->SetNdivisions(510);
+ //hUS->GetXaxis()->SetLimits(mMinPlot,mMmaxPlot);
+ //hUS->SetLineWidth(.7);
+ hUS->SetMarkerSize(.8);
+ hUS->SetMarkerColor(2); hUS->SetMarkerStyle(20); hUS->SetLineColor(2);
hUS->Draw();
+ hUS->SetMaximum(hUS->GetMaximum()*1.3);
+
+ //hBackground->SetLineWidth(.4);
+ hBackground->SetMarkerSize(.7);
+ hBackground->SetMarkerColor(4); hBackground->SetMarkerStyle(27); hBackground->SetLineColor(4);
+
hBackground->Draw("same");
+ TLatex *lat=new TLatex;
+ lat->SetNDC(kTRUE);
+ // lat->DrawLatex(0.68, 0.67, "ALICE Performance");
+ lat->SetTextColor(1);lat->SetTextFont(42);lat->SetTextSize(.045);
+
+ Double_t sigN=sig->GetSignal();
+ Double_t sigEr=sig->GetSignalError();
+ Double_t sigS2B=sig->GetSB();
+ Double_t sigS2Ber=sig->GetSBError();
+ Double_t sigSignif= sig->GetSignificance();
+ Double_t sigSignifEr= sig->GetSignificanceError();
+ lat->DrawLatex(0.18, 0.92, Form("S: %3d#pm%4.1f, S/B: %3.1f#pm %4.2f, Signif.: %4.1f#pm%4.2f (%4.2f-%4.2f GeV) ",(int)sigN,sigEr,sigS2B,sigS2Ber,sigSignif,sigSignifEr,
+ hUS->GetBinLowEdge(hUS->FindBin(sig->GetIntegralMin())),
+ hUS->GetBinLowEdge(hUS->FindBin(sig->GetIntegralMax())+1)));
+
+ TLegend *leg=new TLegend(0.17,0.72,0.42,0.88);
+ leg->SetBorderSize(0); leg->SetFillColor(0); leg->SetTextFont(42);
+ leg->SetFillStyle(0); leg->SetMargin(0.25); //separation symbol-text
+ leg->SetEntrySeparation(0.15);
+ leg->AddEntry(hUS,"OS", "p");
+ leg->AddEntry(hBackground, Form("LS*%4.2f",sig->GetScaleFactor()), "p");
+ leg->Draw();
+
c->cd(2);
gPad->SetRightMargin(0.01);
+ gPad->SetTopMargin(0);
+ gPad->SetLeftMargin(0.15);
+ gPad->SetBottomMargin(.15);
+ /*
gPad->SetGridx();
gPad->SetGridy();
+ */
gPad->SetTickx();
gPad->SetTicky();
- gPad->SetTopMargin(0);
-
+
TH1* hSignal=sig->GetSignalHistogram();
- hSignal->SetMarkerStyle(20);
- hSignal->SetMarkerSize(0.7);
- hSignal->SetMarkerColor(kRed);
- hSignal->SetLineColor(kRed);
+ hSignal->GetXaxis()->SetTitle("M_{ee} (GeV/c^{2})");
+ hSignal->GetXaxis()->CenterTitle();
+ hSignal->GetXaxis()->SetTitleSize(0.06); hSignal->GetXaxis()->SetLabelSize(0.05);
+ hSignal->GetXaxis()->SetTitleOffset(1.1);
+ hSignal->GetXaxis()->SetNdivisions(510);
+ hSignal->GetYaxis()->CenterTitle();
+ hSignal->GetYaxis()->SetTitleSize(0.06); hSignal->GetYaxis()->SetLabelSize(0.05);
+ hSignal->GetYaxis()->SetTitleOffset(1.1);
+ hSignal->GetXaxis()->SetLabelFont(42); hSignal->GetYaxis()->SetLabelFont(42);
+ hSignal->GetXaxis()->SetTitleFont(42); hSignal->GetYaxis()->SetTitleFont(42);
+ hSignal->GetYaxis()->SetNdivisions(510);
+ //hSignal->GetXaxis()->SetLimits(mMinPlot,mMmaxPlot);
+ //hSignal->SetLineWidth(.7);
+ hSignal->SetMarkerSize(.8);
+ hSignal->SetMarkerColor(2); hSignal->SetMarkerStyle(20); hSignal->SetLineColor(2);
+
hSignal->Draw();
+
+ TLegend *leg2=new TLegend(0.16,0.8,0.57,0.93);
+ leg2->SetBorderSize(0); leg2->SetFillColor(0); leg2->SetTextFont(42);
+ leg2->SetFillStyle(0); leg2->SetMargin(0.25); //separation symbol-text
+ leg2->SetEntrySeparation(0.15);
+ leg2->AddEntry(hSignal, Form("OS-%4.2f*LS",sig->GetScaleFactor()), "p");
+ TObject *hMmc=hSignal->GetListOfFunctions()->FindObject("mcMinv");
+ if (hMmc) leg2->AddEntry(hMmc, Form("MC (#chi^{2}/dof=%3.1f)",TString(hMmc->GetTitle()).Atof()), "l");
+ leg2->Draw();
+
+ Double_t beforePhys=0;
+ Double_t afterPhys=0;
+ Double_t afterV0and=0;
+ Double_t afterEventSel=0;
+ Double_t afterPileupRej=0;
+
+ if (hEventStat){
+ Int_t beforePhysBin=hEventStat->GetXaxis()->FindBin("Before Phys. Sel.");
+ Int_t afterPhysBin=hEventStat->GetXaxis()->FindBin("After Phys. Sel.");
+ Int_t afterV0andBin=hEventStat->GetXaxis()->FindBin("V0and triggers");
+ Int_t afterEventSelBin=hEventStat->GetXaxis()->FindBin("After Event Filter");
+ Int_t afterPileupRejBin=hEventStat->GetXaxis()->FindBin("After Pileup rejection");
+
+ beforePhys=hEventStat->GetBinContent(beforePhysBin);
+ afterPhys=hEventStat->GetBinContent(afterPhysBin);
+ afterV0and=hEventStat->GetBinContent(afterV0andBin);
+ afterEventSel=hEventStat->GetBinContent(afterEventSelBin);
+ afterPileupRej=hEventStat->GetBinContent(afterPileupRejBin);
+
+ printf("Mevents: all: %4.1f, PhysSel: %4.1f, V0AND: %4.1f, EventSel: %4.1f, PileupRej: %4.1f\n",(Float_t)beforePhys/1.e+6,(Float_t)afterPhys/1.e+6,(Float_t)afterV0and/1.e+6,(Float_t)afterEventSel/1.e+6,(Float_t)afterPileupRej/1.e+6);
+
+ lat->DrawLatex(0.18, 0.2, Form("%4.1f Mevents",(Float_t)afterPhys/1.e+6));
+ }
+
+ if (save){
+ c->SaveAs(Form("%s.eps",cname));
+ c->SaveAs(Form("%s.png",cname));
+
+ FILE *out_file;
+ if ( (out_file = fopen(Form("sig_%s.txt",cname), "w")) == NULL )
+ { fprintf(stderr, "Cannot open file %s\n", Form("sig_%s.txt",cname)); }
+ fprintf(stdout, "Signal file: %s\n", Form("sig_%s.txt",cname));
+ fprintf(out_file,"%3d %4.1f %3.1f %4.2f %4.1f %4.2f %d\n",(int)sigN,sigEr,sigS2B,sigS2Ber,sigSignif,sigSignifEr,(Int_t)afterPhys);
+ fclose(out_file);
+
+ TFile outMinv(Form("Minv_%s.root",cname), "RECREATE");
+ hUS->Write();
+ hBackground->Write();
+ hSignal->Write();
+ hMmc->Write();
+ outMinv.Close();
+
+ }
+
+ return;
}
+//_______________________________________
+void FitMCshape(AliDielectronSignalBase *sig)
+{
+ TFile mcFile(mcLineShapeFile);
+ if (!mcFile.IsOpen()) {
+ printf("mcMinv_LHC10e2 not found!!!\n");
+ return;
+ }
+ TH1D *hMmc = (TH1D*)mcFile.Get("mcMinv");
+ if (!hMmc) {
+ printf("mcMinv not found!!\n");
+ return;
+ }
+ hMmc->SetDirectory(0);
+ hMmc->SetName("mcMinv");
+ mcFile.Close();
+
+ TH1* hMsub=sig->GetSignalHistogram();
+ Double_t mb1=sig->GetIntegralMin();
+ Double_t mb2=sig->GetIntegralMax();
+
+ Double_t effInt = 0.;
+ for(Int_t iBin=hMmc->FindBin(mb1); iBin<hMmc->FindBin(mb2); iBin++) {
+ effInt += hMmc->GetBinContent(iBin);
+ }
+ effInt/=hMmc->Integral();
+ printf("MC signal fraction in range %4.2f-%4.2f GeV: %5.3f \n",hMmc->GetBinLowEdge(hMmc->FindBin(mb1)),hMmc->GetBinLowEdge(hMmc->FindBin(mb2)+1),effInt);
+
+ Float_t mcScale1=(hMsub->GetXaxis()->GetBinWidth(1)/hMmc->GetXaxis()->GetBinWidth(1))*
+ hMsub->Integral(hMsub->FindBin(mb1),hMsub->FindBin(mb2))/
+ hMmc->Integral(hMmc->FindBin(mb1),hMmc->FindBin(mb2));
+
+ printf("1st guess of MC scale factor: %6.3f\n",mcScale1);
+
+ Float_t mcScale=0.;
+ Float_t chi2_min=100000.;
+ Int_t iMin=0;
+ Int_t ndf=0;
+
+ for(Int_t i=0; i<20; i++){
+ Float_t chi2=0.;
+ Float_t scale=(0.4+0.05*(Float_t)i)*mcScale1;
+ ndf=0;
+ for(Int_t ib=1; ib<=hMsub->GetXaxis()->GetNbins(); ib++){
+ Float_t data=(Float_t)hMsub->GetBinContent(ib);
+ Float_t err=(Float_t)hMsub->GetBinError(ib);
+ Float_t mc=scale*((Float_t)hMmc->GetBinContent(hMmc->FindBin(hMsub->GetBinCenter(ib))));
+ if (err>0) {
+ chi2 += ((data-mc)*(data-mc))/(err*err);
+ ndf++;
+ } else {
+ printf("bin %d Err: %6.3f, chi2: %6.1f\n",ib,err,chi2);
+ }
+ }
+ //printf("%d scale factor: %6.3f, chi2: %6.1f\n",i,scale,chi2);
+ if(chi2 < chi2_min){
+ chi2_min = chi2;
+ mcScale = scale;
+ iMin=i;
+ }
+ }
+ //Float_t chi2dof=chi2_min/(Float_t)(hMinv->GetXaxis()->GetNbins()-1);
+ Float_t chi2dof=chi2_min/((Float_t)(ndf-1));
+ printf("MC fit (i=%d): chi2/dof: %6.3f/%d, Scale: %7.4f \n",iMin,chi2_min,(ndf-1),mcScale);
+ hMmc->SetTitle(Form("%f",chi2dof));
+
+ //mcScale=IntData/IntMC;printf("Int Data, MC: %10.1f %10.1f, MC scale: %6.3f\n",IntData,IntMC,mcScale);
+
+ hMmc->Scale(mcScale);
+ hMmc->SetOption("sameHISTC");
+ hMsub->GetListOfFunctions()->Add(hMmc);
+}