]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Framework updates, including macro to plot Minv (and the root file containing MC...
authorandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 13 Nov 2010 12:17:28 +0000 (12:17 +0000)
committerandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 13 Nov 2010 12:17:28 +0000 (12:17 +0000)
14 files changed:
PWG3/dielectron/AliDielectron.cxx
PWG3/dielectron/AliDielectron.h
PWG3/dielectron/AliDielectronCF.cxx
PWG3/dielectron/AliDielectronCF.h
PWG3/dielectron/AliDielectronCFdraw.cxx
PWG3/dielectron/AliDielectronCFdraw.h
PWG3/dielectron/AliDielectronSignalBase.cxx
PWG3/dielectron/AliDielectronSignalBase.h
PWG3/dielectron/AliDielectronSignalExt.cxx
PWG3/dielectron/AliDielectronVarManager.cxx
PWG3/dielectron/AliDielectronVarManager.h
PWG3/dielectron/macros/MakeDataReport.C
PWG3/dielectron/macros/PlotDataResults.C
PWG3/dielectron/macros/mcMinv_LHC10e2.root [new file with mode: 0644]

index 7bf1d19383b1700d5eaf5923241b008ca9cbd3a7..7ab83df40de9464038a03d4900804307598f06f9 100644 (file)
@@ -96,11 +96,13 @@ AliDielectron::AliDielectron() :
   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
@@ -119,11 +121,13 @@ AliDielectron::AliDielectron(const char* name, const char* title) :
   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
@@ -188,20 +192,29 @@ void AliDielectron::Process(AliVEvent *ev1, AliVEvent *ev2)
   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);
@@ -229,6 +242,28 @@ void AliDielectron::ProcessMC()
   }
 }
 
+//________________________________________________________________
+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)
 {
@@ -300,7 +335,7 @@ void AliDielectron::FillHistogramsPair(AliDielectronPair *pair)
   // 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];
   
@@ -378,6 +413,7 @@ void AliDielectron::PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1,
   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;
@@ -398,6 +434,7 @@ void AliDielectron::PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1,
       
       //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);
@@ -407,6 +444,9 @@ void AliDielectron::PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1,
     if ( accepted ) arrTracks1.AddAt(0x0,itrack1);
   }
   //compress the track arrays
+  
+
+
   arrTracks1.Compress();
   arrTracks2.Compress();
   
@@ -417,6 +457,7 @@ void AliDielectron::PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1,
     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);;
     }
@@ -438,6 +479,11 @@ void AliDielectron::PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1,
       
     }
   }
+  //For unlike-sign monitor track-cuts:
+  if (arr1!=arr2) {
+    TObjArray *unlikesignArray[2] = {&arrTracks1,&arrTracks2};
+    FillHistogramsTracks(unlikesignArray);
+  }
 }
 
 //________________________________________________________________
@@ -451,7 +497,7 @@ void AliDielectron::FillPairArrays(Int_t arr1, Int_t arr2)
   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);
 
index 34e9049a1e00bd04b7a63c76029ae85ba8783b12..5be7eb492d3c043486e9cb6a90b79d577bd9304b 100644 (file)
@@ -64,7 +64,8 @@ public:
   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;}
@@ -79,6 +80,8 @@ public:
   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; }
   
@@ -101,11 +104,13 @@ private:
   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
@@ -118,6 +123,9 @@ private:
   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);
@@ -138,7 +146,8 @@ private:
   
   void  FillHistograms(const AliVEvent *ev);
   void  FillHistogramsPair(AliDielectronPair *pair);
-    
+  void  FillHistogramsTracks(TObjArray **tracks);
+
   void  FillDebugTree();
   
   AliDielectron(const AliDielectron &c);
index dd9b03874d14fae19d095c2f487835cf3a849e42..f6aec4b2ec9238eaee5cf68d6a273e765d80b137 100644 (file)
@@ -60,6 +60,7 @@ AliDielectronCF::AliDielectronCF() :
   fStepForMCtruth(kFALSE),
   fStepForNoCutsMCmotherPid(kFALSE),
   fStepForAfterAllCuts(kTRUE),
+  fStepForPreFilter(kFALSE),
   fStepsForEachCut(kFALSE),
   fStepsForCutsIncreasing(kFALSE),
   fStepsForSignal(kTRUE),
@@ -96,6 +97,7 @@ AliDielectronCF::AliDielectronCF(const char* name, const char* title) :
   fStepForMCtruth(kFALSE),
   fStepForNoCutsMCmotherPid(kFALSE),
   fStepForAfterAllCuts(kTRUE),
+  fStepForPreFilter(kFALSE),
   fStepsForEachCut(kFALSE),
   fStepsForCutsIncreasing(kFALSE),
   fStepsForSignal(kTRUE),
@@ -233,6 +235,9 @@ void AliDielectronCF::InitialiseContainer(const AliAnalysisFilter& filter)
   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];
@@ -369,6 +374,20 @@ void AliDielectronCF::InitialiseContainer(const AliAnalysisFilter& filter)
     }
   }
 
+  //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));
   }
@@ -443,6 +462,7 @@ void AliDielectronCF::Fill(UInt_t mask, const AliDielectronPair *particle)
     }
   }
 
+
   //Steps for increasing cut match
   if (fStepsForCutsIncreasing&&fNCuts>2){
     for (Int_t iCut=1; iCut<fNCuts-1;++iCut) {
@@ -508,7 +528,26 @@ void AliDielectronCF::Fill(UInt_t mask, const AliDielectronPair *particle)
       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!!!");
   }
index d6b350823d25e121088679eb1d743b59ee144179..9c57ba657a74815f37fb1bd416236bf9e3bdb547 100644 (file)
@@ -42,6 +42,7 @@ public:
   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;           }
@@ -83,6 +84,7 @@ private:
   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 ...
index ba052d2ebae3c397503184ac9d2391c674e3640e..7006b5a87d2f398fe4b5ebaab07a9edaaa145d19 100644 (file)
@@ -395,11 +395,11 @@ TH1* AliDielectronCFdraw::Project(const Option_t* var, Int_t slice)
 }
 
 //________________________________________________________________
-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(":");
@@ -428,24 +428,24 @@ void AliDielectronCFdraw::DrawEfficiency(const char* varnames, const char* nomin
   
   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
@@ -454,7 +454,7 @@ void AliDielectronCFdraw::DrawEfficiency(Int_t var, const char* nominators, Int_
   
   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);
@@ -462,14 +462,14 @@ void AliDielectronCFdraw::DrawEfficiency(Int_t var, const char* nominators, Int_
 }
 
 //________________________________________________________________
-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);
@@ -477,14 +477,14 @@ void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, const char* nom
 }
 
 //________________________________________________________________
-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);
@@ -492,13 +492,13 @@ void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, Int_t var2, con
 }
 
 //________________________________________________________________
-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){
@@ -698,3 +698,26 @@ void AliDielectronCFdraw::Draw(const TObjArray *arr, const char* opt)
   }
   
 }
+
+//________________________________________________________________
+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;
+}
index 2f2e244c435b83872be23bdb5ef61052b6d292aa..50bd4aee9543276f1a1d53217a47093e4e0b2230 100644 (file)
@@ -66,13 +66,15 @@ public:
   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="");
index 2775723f6f2ced4974b4dd3feaeb52378f95f59d..c5bc833409460d3233d415c261b0c8fcdb890462 100644 (file)
@@ -50,6 +50,9 @@ AliDielectronSignalBase::AliDielectronSignalBase() :
   fFitMax(0),
   fRebin(1),
   fMethod(kLikeSign),
+  fScaleMin(0.),
+  fScaleMax(0.),
+  fScaleFactor(0.),
   fProcessed(kFALSE)
 {
   //
@@ -73,6 +76,9 @@ AliDielectronSignalBase::AliDielectronSignalBase(const char* name, const char* t
   fFitMax(0),
   fRebin(1),
   fMethod(kLikeSign),
+  fScaleMin(0.),
+  fScaleMax(0.),
+  fScaleFactor(0.),
   fProcessed(kFALSE)
 {
   //
@@ -88,6 +94,10 @@ AliDielectronSignalBase::~AliDielectronSignalBase()
   //
   if(fHistSignal) delete fHistSignal;
   if(fHistBackground) delete fHistBackground;
+  if (fHistDataPP) delete fHistDataPP;
+  if (fHistDataPM) delete fHistDataPM;
+  if (fHistDataMM) delete fHistDataMM;
+  
 }
 
 //______________________________________________
@@ -138,7 +148,7 @@ void AliDielectronSignalBase::Print(Option_t */*option*/) const
 }
 
 //______________________________________________
-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
@@ -146,9 +156,11 @@ void AliDielectronSignalBase::ScaleHistograms(TH1* histRaw, TH1* histBackground,
   
   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;
 }
index 58ddfccc752d41014f36a47e9e60dc92615671a6..50bac4ff0191af33bebaebc4625924373ed9cd74 100644 (file)
@@ -69,8 +69,11 @@ public:
   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;
 
@@ -102,16 +105,19 @@ protected:
 
   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()
index f25a0709281906a2b524f26cf617d463d0736969..099a921a3f587fb88d90b684beb11a3220f1e501 100644 (file)
@@ -104,6 +104,9 @@ void AliDielectronSignalExt::ProcessLS(TObjArray* const arrhist)
   fHistDataPP->Sumw2();
   fHistDataPM->Sumw2();
   fHistDataMM->Sumw2();
+  fHistDataPP->SetDirectory(0);
+  fHistDataPM->SetDirectory(0);
+  fHistDataMM->SetDirectory(0);
   
   // rebin the histograms
   if (fRebin>1) { 
@@ -115,10 +118,12 @@ void AliDielectronSignalExt::ProcessLS(TObjArray* const arrhist)
   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);
@@ -128,14 +133,20 @@ void AliDielectronSignalExt::ProcessLS(TObjArray* const arrhist)
 
     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));
@@ -180,8 +191,9 @@ void AliDielectronSignalExt::ProcessRotation(TObjArray* const arrhist)
     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.);
 
index d9241b2b9a1b9fbb3e93c5861b9bb4ec1bc135c3..0ef4c84a2d17afb44bb28df4afe6d5fcae3254f0 100644 (file)
@@ -45,6 +45,7 @@ const char* AliDielectronVarManager::fgkParticleNames[AliDielectronVarManager::k
   "Charge",
   "NclsITS",
   "NclsTPC",
+  "NclsTPCiter1",
   "NFclsTPC",
   "TPCsignalN",
   "TPCchi2PerCluster",
index cfcffbd4896ac470aede86d46e33b0b6f3eb3af7..01c097479a518f0e31737e7678202f52d01327cc 100644 (file)
@@ -76,6 +76,7 @@ public:
     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
@@ -267,6 +268,7 @@ inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle
   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
@@ -363,6 +365,7 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle
   // 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;
@@ -428,12 +431,34 @@ inline void AliDielectronVarManager::FillVarMCParticle(const AliMCParticle *part
   // 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();
 
@@ -453,13 +478,35 @@ inline void AliDielectronVarManager::FillVarAODMCParticle(const AliAODMCParticle
   // 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();
 
 
index 70e42b07814feea791f706a0f9171712dd7d0c52..0319e4752d18490f867b76cdd00a3fa3612ecad6 100644 (file)
@@ -200,7 +200,7 @@ void DrawUnbinned(){
 
 
   // 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;
@@ -208,14 +208,20 @@ void DrawUnbinned(){
   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);
@@ -380,128 +386,92 @@ for (Int_t i=0; i<5; ++i){
 
 */
 
-/*
-
-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)
 
 
@@ -542,17 +512,21 @@ Pair->Scan("EventInFile:File.GetString()","","colsize=1 col=3.d:100.s")
 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();
@@ -563,16 +537,8 @@ sig.Draw("samestat");
 
 
 //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);
index 3e9e04d82a36dc4036b28aad05385d343b909893..2d24597ae6685d8799fc8fcba8191b8e783dad91 100644 (file)
@@ -5,60 +5,86 @@
 #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
@@ -66,14 +92,15 @@ AliDielectronSignalBase *GetSignalLS(AliDielectronCFdraw &d, Int_t step, const c
   
   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);
   
@@ -82,7 +109,7 @@ AliDielectronSignalBase *GetSignalLS(AliDielectronCFdraw &d, Int_t step, const c
 }
 
 //_______________________________________
-AliDielectronSignalBase *GetSignalRot(AliDielectronCFdraw &d, Int_t step, const char* nameAdd)
+AliDielectronSignalBase *GetSignalRot(AliDielectronCFdraw &d, Int_t step)
 {
   //
   // Get Extracted signal from likesign method
@@ -90,7 +117,7 @@ AliDielectronSignalBase *GetSignalRot(AliDielectronCFdraw &d, Int_t step, const
   
   TObjArray *arr=new TObjArray;
   arr->SetOwner();
-
+  
   Int_t iType=AliDielectron::kEv1PM;
   d.SetRangeUser("PairType",iType,iType);
   arr->AddAt(d.Project("M",step),iType);
@@ -100,65 +127,287 @@ AliDielectronSignalBase *GetSignalRot(AliDielectronCFdraw &d, Int_t step, const
   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);
+}
diff --git a/PWG3/dielectron/macros/mcMinv_LHC10e2.root b/PWG3/dielectron/macros/mcMinv_LHC10e2.root
new file mode 100644 (file)
index 0000000..fa1a13f
Binary files /dev/null and b/PWG3/dielectron/macros/mcMinv_LHC10e2.root differ