]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Improvements (Jens Wiechula); AliDielectronCFdraw still produces a warning.
authorandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 12 Mar 2010 18:39:09 +0000 (18:39 +0000)
committerandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 12 Mar 2010 18:39:09 +0000 (18:39 +0000)
PWG3/dielectron/AliDielectron.cxx
PWG3/dielectron/AliDielectron.h
PWG3/dielectron/AliDielectronCF.cxx
PWG3/dielectron/AliDielectronCFdraw.cxx
PWG3/dielectron/AliDielectronCFdraw.h
PWG3/dielectron/AliDielectronMC.cxx
PWG3/dielectron/AliDielectronMC.h
PWG3/dielectron/AliDielectronPair.cxx
PWG3/dielectron/AliDielectronPair.h
PWG3/dielectron/AliDielectronVarCuts.h
PWG3/dielectron/AliDielectronVarManager.cxx

index c4dd961d3a3f3b8f58a0e305b51b4ea740ca2400..e95e953f6648f5f1cbd3150003c9a7291e353e37 100644 (file)
@@ -191,7 +191,6 @@ void AliDielectron::ProcessMC()
   //loop over all MC data and Fill the CF container if it exist
   if (!fCfManagerPair) return;
   fCfManagerPair->SetPdgMother(fPdgMother);
-  
   AliDielectronMC *dieMC=AliDielectronMC::Instance();
   for (Int_t ipart=0; ipart<dieMC->GetNMCTracks();++ipart){
     //TODO: MC truth cut properly!!!
@@ -290,6 +289,7 @@ void AliDielectron::FillPairArrays(Int_t arr1, Int_t arr2) {
       candidate->SetTracks(static_cast<AliVTrack*>(fTracks[arr1].UncheckedAt(itrack1)), 11,
                            static_cast<AliVTrack*>(fTracks[arr2].UncheckedAt(itrack2)), 11);
       candidate->SetType(pairIndex);
+      candidate->SetLabel(AliDielectronMC::Instance()->GetLabelMotherWithPdg(candidate,fPdgMother));
 
       //pair cuts
       UInt_t cutMask=fPairFilter.IsSelected(candidate);
index a20b016095e1be3168089de9f2384f9a9c9654d0..c3c625038b5dc0c7a621ce8a4aaa87b275b3e65d 100644 (file)
@@ -45,8 +45,6 @@ public:
   
   void Process(AliVEvent *ev1, AliVEvent *ev2=0);
 
-  void  FillHistograms(const AliVEvent *ev);
-  
   const AliAnalysisFilter& GetEventFilter() const { return fEventFilter; }
   const AliAnalysisFilter& GetTrackFilter() const { return fTrackFilter; }
   const AliAnalysisFilter& GetPairFilter()  const { return fPairFilter;  }
@@ -113,6 +111,8 @@ private:
 
   void ProcessMC();
   
+  void  FillHistograms(const AliVEvent *ev);
+  
   AliDielectron(const AliDielectron &c);
   AliDielectron &operator=(const AliDielectron &c);
   
index 7a0dc7730c4a88e6dc56ff26570bdcb60d2ff73c..e377cffa4bf6c7adda2037b8bea8fe7015ec1284 100644 (file)
@@ -158,8 +158,8 @@ void AliDielectronCF::InitialiseContainer(const AliAnalysisFilter& filter)
   if (fStepForNoCutsMCmotherPid) ++fNSteps;
   if (fStepForAfterAllCuts) fNSteps+=2;
   
-  if (fStepsForEachCut&&fNCuts>1)        fNSteps+=(2*fNCuts);     //one step for each cut + MC truth
-  if (fStepsForCutsIncreasing&&fNCuts>2) fNSteps+=(2*(fNCuts-2)); //one step for the increasing cuts + MC truth
+  if (fStepsForEachCut&&fNCuts>1)        fNSteps+=(2*fNCuts);     //one step for each cut + Signal (MC)
+  if (fStepsForCutsIncreasing&&fNCuts>2) fNSteps+=(2*(fNCuts-2)); //one step for the increasing cuts + Signal (MC)
                                                       // e.g. cut2&cut3, cut2&cut3&cut4
   fNSteps+=(2*fNStepMasks);                            // cuts for the additional cut masks
   // create the container
@@ -224,7 +224,7 @@ void AliDielectronCF::InitialiseContainer(const AliAnalysisFilter& filter)
 
   //before cuts (MC truth)
   if (fStepForNoCutsMCmotherPid){
-    fCfContainer->SetStepTitle(step++,"No cuts (MC mother)");
+    fCfContainer->SetStepTitle(step++,"No cuts (Signal)");
   }
   
   //After All cuts
@@ -232,7 +232,7 @@ void AliDielectronCF::InitialiseContainer(const AliAnalysisFilter& filter)
   if (fStepForAfterAllCuts){
     cutName="All Cuts"; //TODO: User GetTitle???
     fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut
-    cutName+=" (MC truth)";
+    cutName+=" (Signal)";
     fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut with MC truth
   }
 
@@ -241,7 +241,7 @@ void AliDielectronCF::InitialiseContainer(const AliAnalysisFilter& filter)
     for (Int_t iCut=0; iCut<fNCuts;++iCut) {
       cutName=filter.GetCuts()->At(iCut)->GetName(); //TODO: User GetTitle???
       fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut
-      cutName+=" (MC mother)";
+      cutName+=" (Signal)";
       fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut with MC truth
     }
   }
@@ -253,7 +253,7 @@ void AliDielectronCF::InitialiseContainer(const AliAnalysisFilter& filter)
       cutName+="&";
       cutName+=filter.GetCuts()->At(iCut)->GetName();
       fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut
-      cutName+=" (MC mother)";
+      cutName+=" (Signal)";
       fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut with MC truth
     }
   }
@@ -273,7 +273,7 @@ void AliDielectronCF::InitialiseContainer(const AliAnalysisFilter& filter)
       }
     }
     fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut
-    cutName+=" (MC mother)";
+    cutName+=" (Signal)";
     fCfContainer->SetStepTitle(step++, cutName.Data()); //Step for the cut with MC truth
   }
 
@@ -394,7 +394,7 @@ void AliDielectronCF::FillMC(const TObject *particle)
   Double_t valuesPair[AliDielectronVarManager::kNMaxValues];
   AliDielectronVarManager::Fill(particle,valuesPair);
   
-  //TODO: temporary solution, set manually the pair type to 1: mixed e+-
+  //TODO: temporary solution, set manually the pair type to 1: unlikesign SE
   valuesPair[AliDielectronVarManager::kPairType]=1;
   
   for (Int_t iVar=0; iVar<fNVars; ++iVar){
@@ -407,9 +407,14 @@ void AliDielectronCF::FillMC(const TObject *particle)
     AliVParticle *d2=0x0;
     AliDielectronMC::Instance()->GetDaughters(particle,d1,d2);
     Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues];
-    AliDielectronVarManager::Fill(d1,valuesLeg1);
     Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues];
-    AliDielectronVarManager::Fill(d2,valuesLeg2);
+    if (d1->Pt()>d2->Pt()){
+      AliDielectronVarManager::Fill(d1,valuesLeg1);
+      AliDielectronVarManager::Fill(d2,valuesLeg2);
+    } else {
+      AliDielectronVarManager::Fill(d2,valuesLeg1);
+      AliDielectronVarManager::Fill(d1,valuesLeg2);
+    }
     
     for (Int_t iVar=0; iVar<fNVarsLeg; ++iVar){
       Int_t var=fVariablesLeg[iVar];
index 4deb36dd3b50aece1e43355015e4b47ab14ec76c..5224839ad3bac9b6a84b9d96234c4d9cb0890698 100644 (file)
@@ -34,6 +34,7 @@
 #include <TObjArray.h>
 #include <TKey.h>
 #include <TList.h>
+#include <TClass.h>
 #include <TObject.h>
 #include <TFile.h>
 #include <TString.h>
@@ -44,6 +45,8 @@
 #include <TH3.h>
 #include <TPad.h>
 #include <TCanvas.h>
+#include <TLegend.h>
+#include <AliCFEffGrid.h>
 
 #include <AliLog.h>
 
@@ -53,7 +56,8 @@ ClassImp(AliDielectronCFdraw)
 
 AliDielectronCFdraw::AliDielectronCFdraw() :
   TNamed(),
-  fCfContainer(0x0)
+  fCfContainer(0x0),
+  fEffGrid(0x0)
 {
   //
   // Ctor
@@ -63,7 +67,8 @@ AliDielectronCFdraw::AliDielectronCFdraw() :
 //________________________________________________________________
 AliDielectronCFdraw::AliDielectronCFdraw(const char*name, const char* title) :
   TNamed(name,title),
-  fCfContainer(0x0)
+  fCfContainer(0x0),
+  fEffGrid(0x0)
 {
   //
   // Named Ctor
@@ -71,6 +76,30 @@ AliDielectronCFdraw::AliDielectronCFdraw(const char*name, const char* title) :
   
 }
 
+//________________________________________________________________
+AliDielectronCFdraw::AliDielectronCFdraw(AliCFContainer *cont) :
+  TNamed(cont->GetName(), cont->GetTitle()),
+  fCfContainer(cont),
+  fEffGrid(new AliCFEffGrid("eff","eff",*cont))
+{
+  //
+  // directly set the CF container
+  //
+
+}
+
+//________________________________________________________________
+AliDielectronCFdraw::AliDielectronCFdraw(const char* filename) :
+  TNamed(),
+  fCfContainer(0x0),
+  fEffGrid(0x0)
+{
+  //
+  // get CF container(s) from file 'filename'
+  //
+  SetCFContainers(filename);
+}
+
 //________________________________________________________________
 void AliDielectronCFdraw::SetCFContainers(const TSeqCollection *arr)
 {
@@ -104,6 +133,8 @@ void AliDielectronCFdraw::SetCFContainers(const TSeqCollection *arr)
       ++istep;
     }
   }
+  if (fEffGrid) delete fEffGrid;
+  fEffGrid=new AliCFEffGrid("eff","eff",*fCfContainer);
 }
 
 //________________________________________________________________
@@ -119,10 +150,16 @@ void AliDielectronCFdraw::SetCFContainers(const char* filename)
   if (entries==0) return;
   
   TKey *k=(TKey*)l->At(0);
-  TSeqCollection *arr=dynamic_cast<TSeqCollection*>(k->ReadObj());
-  if (!arr) return;
-  
-  SetCFContainers(arr);
+  if (!k) return;
+  TObject *o=k->ReadObj();
+  if (o->IsA()->InheritsFrom(TSeqCollection::Class())){
+    TSeqCollection *arr=static_cast<TSeqCollection*>(o);
+    SetCFContainers(arr);
+  } else if (o->IsA()==AliCFContainer::Class()){
+    fCfContainer=static_cast<AliCFContainer*>(o);
+    if (fEffGrid) delete fEffGrid;
+    fEffGrid=new AliCFEffGrid("eff","eff",*fCfContainer);
+  }
 }
 
 //________________________________________________________________
@@ -213,10 +250,10 @@ void AliDielectronCFdraw::Draw(const Option_t* varnames, const char* slices, con
     Draw(ivar[0],slices,opt);
     break;
   case 2:
-    Draw(ivar[0],ivar[1],slices,opt);
+    Draw(ivar[1],ivar[0],slices,opt);
     break;
   case 3:
-    Draw(ivar[0],ivar[1],ivar[2],slices,opt);
+    Draw(ivar[2],ivar[1],ivar[0],slices,opt);
     break;
   }
   delete arrVars;
@@ -236,7 +273,7 @@ void AliDielectronCFdraw::Draw(Int_t var, const char* opt, const char* slices)
 
   const Int_t ndim=1;
   Int_t vars[ndim]={var};
-  TObjArray *arr=CollectHistos(ndim,vars,slices);
+  TObjArray *arr=CollectHistosProj(ndim,vars,slices);
   Draw(arr,opt);
   delete arr; 
 }
@@ -249,7 +286,7 @@ void AliDielectronCFdraw::Draw(Int_t var0, Int_t var1, const char* opt, const ch
   //
   const Int_t ndim=2;
   Int_t vars[ndim]={var0,var1};
-  TObjArray *arr=CollectHistos(ndim,vars,slices);
+  TObjArray *arr=CollectHistosProj(ndim,vars,slices);
   Draw(arr,opt);
   delete arr;
 }
@@ -262,51 +299,169 @@ void AliDielectronCFdraw::Draw(Int_t var0, Int_t var1, Int_t var2, const char* o
   //
   const Int_t ndim=3;
   Int_t vars[ndim]={var0,var1,var2};
-  TObjArray *arr=CollectHistos(ndim,vars,slices);
+  TObjArray *arr=CollectHistosProj(ndim,vars,slices);
   Draw(arr,opt);
   delete arr;
 }
 
 //________________________________________________________________
-void AliDielectronCFdraw::Draw(const TObjArray *arr, const char* opt)
+TObjArray* AliDielectronCFdraw::CollectHistosProj(Int_t dim, Int_t *vars, const char* slices)
 {
   //
-  // draw all objects in arr
+  // Collect histos with 'dim'ension of the 'slices' separated by one of "':;'"
+  // in a TObjArray and return it
   //
-  TString optStr(opt);
-  optStr.ToLower();
-  Bool_t drawSame=optStr.Contains("same");
-  optStr.ReplaceAll("same","");
-  if (!gPad) new TCanvas;
-  TCanvas *c=gPad->GetCanvas();
-  c->Clear();
-  if (!drawSame){
-    //optimised division
-    Int_t nPads = arr->GetEntries();
-    Int_t nCols = (Int_t)TMath::Ceil( TMath::Sqrt(nPads) );
-    Int_t nRows = (Int_t)TMath::Ceil( (Double_t)nPads/(Double_t)nCols );
-    c->Divide(nCols,nRows);
-    for (Int_t i=0; i<nPads; ++i){
-      c->cd(i+1);
-      arr->UncheckedAt(i)->Draw(optStr.Data());
+  TObjArray *arr=TString(slices).Tokenize(",:;");
+  TObjArray *arrHists=0x0;
+  if (arr->GetEntriesFast()==0){
+    // all slices in case of 0 entries
+    arrHists=new TObjArray(fCfContainer->GetNStep());
+    for (Int_t istep=0; istep<fCfContainer->GetNStep(); ++istep){
+      TH1 *hproj=Project(dim,vars,istep);
+      hproj->SetName(fCfContainer->GetStepTitle(istep));
+      arrHists->Add(hproj);
+    }
+  } else {
+    arrHists=new TObjArray(arr->GetEntriesFast());
+    TIter next(arr);
+    TObjString *ostr=0x0;
+    while ( (ostr=static_cast<TObjString*>(next())) ) {
+      Int_t istep=ostr->GetString().Atoi();
+      TH1 *hproj=Project(dim,vars,istep);
+      hproj->SetName(fCfContainer->GetStepTitle(istep));
+      arrHists->Add(hproj);
+    }
+  }
+  delete arr;
+
+  return arrHists;
+}
+
+//________________________________________________________________
+TH1* AliDielectronCFdraw::Project(Int_t ndim, Int_t *vars, Int_t slice)
+{
+  //
+  // Do an nim projection
+  //
+  switch (ndim){
+  case 1:
+    return fCfContainer->Project(vars[0],slice);
+    break;
+  case 2:
+    return fCfContainer->Project(vars[0],vars[1],slice);
+    break;
+  case 3:
+    return fCfContainer->Project(vars[0],vars[1],vars[2],slice);
+    break;
+  }
+  return 0x0;
+}
+
+//________________________________________________________________
+void AliDielectronCFdraw::DrawEfficiency(const char* varnames, const char* nominators, 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 ',:;'
+  //
+  
+  TObjArray *arrVars=TString(varnames).Tokenize(":");
+  Int_t entries=arrVars->GetEntriesFast();
+  if (entries<1||entries>3){
+    AliError("Wrong number of variables, supported are 1 - 3 dimensions");
+    delete arrVars;
+    return;
+  }
+  
+  TIter next(arrVars);
+  TObjString *ostr=0x0;
+  Int_t ivar[3]={-1,-1,-1};
+  for (Int_t i=0; i<entries; ++i){
+    ostr=static_cast<TObjString*>(next());
+    if (ostr->GetString().IsDigit()){
+      ivar[i]=ostr->GetString().Atoi();
+    } else {
+      ivar[i]=fCfContainer->GetVar(ostr->GetName());
     }
   }
+  
+  switch (entries){
+  case 1:
+    DrawEfficiency(ivar[0],nominators, denominator,opt);
+    break;
+  case 2:
+    DrawEfficiency(ivar[1],ivar[0], nominators, denominator,opt);
+    break;
+  case 3:
+    DrawEfficiency(ivar[2],ivar[1],ivar[0],nominators, denominator,opt);
+    break;
+  }
+  delete arrVars;
+}
+
+//________________________________________________________________
+void AliDielectronCFdraw::DrawEfficiency(Int_t var, const char* nominators, Int_t denominator, const char* opt)
+{
+  //
+  // Draw Efficiencies for all nominators
+  // nominators 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
+  // are drawn in each sub pad
+  //
+  
+  const Int_t ndim=1;
+  Int_t vars[ndim]={var};
+  TObjArray *arr=CollectHistosEff(ndim,vars,nominators,denominator);
+  Draw(arr,opt);
+  delete arr;
+}
+
+//________________________________________________________________
+void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, const char* nominators, Int_t denominator, const char* opt)
+{
+  //
+  // Draw 2D case
+  //
+  const Int_t ndim=2;
+  Int_t vars[ndim]={var0,var1};
+  TObjArray *arr=CollectHistosEff(ndim,vars,nominators,denominator);
+  Draw(arr,opt);
+  delete arr;
+}
+
+//________________________________________________________________
+void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, Int_t var2, const char* nominators, Int_t denominator, const char* opt)
+{
+  //
+  // Draw 3D case
+  //
+  const Int_t ndim=3;
+  Int_t vars[ndim]={var0,var1,var2};
+  TObjArray *arr=CollectHistosEff(ndim,vars,nominators,denominator);
+  Draw(arr,opt);
+  delete arr;
 }
 
 //________________________________________________________________
-TObjArray* AliDielectronCFdraw::CollectHistos(Int_t dim, Int_t *vars, const char* slices)
+TObjArray* AliDielectronCFdraw::CollectHistosEff(Int_t dim, Int_t *vars, const char* nominators, Int_t denominator)
 {
   //
   // Collect histos with 'dim'ension of the 'slices' separated by one of "':;'"
   // in a TObjArray and return it
   //
-  TObjArray *arr=TString(slices).Tokenize(",:;");
+  TObjArray *arr=TString(nominators).Tokenize(",:;");
   TObjArray *arrHists=0x0;
   if (arr->GetEntriesFast()==0){
     // all slices in case of 0 entries
     arrHists=new TObjArray(fCfContainer->GetNStep());
     for (Int_t istep=0; istep<fCfContainer->GetNStep(); ++istep){
-      arrHists->Add(Project(dim,vars,istep));
+      fEffGrid->CalculateEfficiency(istep,denominator);
+      TH1 *hproj=ProjectEff(dim,vars);
+      Float_t eff=fEffGrid->GetAverage();
+      hproj->SetName(Form("%s (%f)",fCfContainer->GetStepTitle(istep),eff));
+      arrHists->Add(hproj);
     }
   } else {
     arrHists=new TObjArray(arr->GetEntriesFast());
@@ -314,31 +469,89 @@ TObjArray* AliDielectronCFdraw::CollectHistos(Int_t dim, Int_t *vars, const char
     TObjString *ostr=0x0;
     while ( (ostr=static_cast<TObjString*>(next())) ) {
       Int_t istep=ostr->GetString().Atoi();
-      arrHists->Add(Project(dim,vars,istep));
+      fEffGrid->CalculateEfficiency(istep,denominator);
+      TH1 *hproj=ProjectEff(dim,vars);
+      Float_t eff=fEffGrid->GetAverage();
+      hproj->SetName(Form("%s (%f)",fCfContainer->GetStepTitle(istep),eff));
+      arrHists->Add(hproj);
     }
   }
   delete arr;
-
+  
   return arrHists;
 }
 
 //________________________________________________________________
-TH1* AliDielectronCFdraw::Project(Int_t ndim, Int_t *vars, Int_t slice)
+TH1* AliDielectronCFdraw::ProjectEff(Int_t ndim, Int_t *vars)
 {
   //
   // Do an nim projection
   //
   switch (ndim){
   case 1:
-    return fCfContainer->Project(vars[0],slice);
+    return fEffGrid->Project(vars[0]);
     break;
   case 2:
-    return fCfContainer->Project(vars[0],vars[1],slice);
+    return fEffGrid->Project(vars[0],vars[1]);
     break;
   case 3:
-    return fCfContainer->Project(vars[0],vars[1],vars[2],slice);
+    return fEffGrid->Project(vars[0],vars[1],vars[2]);
     break;
   }
   return 0x0;
 }
 
+//________________________________________________________________
+void AliDielectronCFdraw::Draw(const TObjArray *arr, const char* opt)
+{
+  //
+  // draw all objects in arr
+  //
+  TString optStr(opt);
+  optStr.ToLower();
+  Bool_t drawSame=optStr.Contains("same");
+  Bool_t optLeg=optStr.Contains("leg");
+  optStr.ReplaceAll("same","");
+  
+  if (!gPad) new TCanvas;
+  
+  Int_t nPads = arr->GetEntriesFast();
+  if (nPads==0) return;
+  
+  if (nPads==1){
+    arr->UncheckedAt(0)->Draw(optStr.Data());
+    return;
+  }
+  
+  TCanvas *c=gPad->GetCanvas();
+  c->Clear();
+  
+  
+  if (!drawSame){
+    //optimised division
+    Int_t nCols = (Int_t)TMath::Ceil( TMath::Sqrt(nPads) );
+    Int_t nRows = (Int_t)TMath::Ceil( (Double_t)nPads/(Double_t)nCols );
+    c->Divide(nCols,nRows);
+    for (Int_t i=0; i<nPads; ++i){
+      c->cd(i+1);
+      arr->UncheckedAt(i)->Draw(optStr.Data());
+    }
+  } else {
+    TLegend *leg=0;
+    if (optLeg) leg=new TLegend(.8,.3,.99,.9);
+    for (Int_t i=0; i<nPads; ++i){
+      if (i==1) optStr+="same";
+      TH1 *hist=static_cast<TH1*>(arr->UncheckedAt(i));
+      hist->SetLineColor(i+1);
+      hist->SetMarkerColor(i+1);
+      hist->Draw(optStr.Data());
+      if (leg) leg->AddEntry(hist,hist->GetName(),"lp");
+    }
+    if (leg){
+      leg->SetFillColor(10);
+      leg->SetY1(.9-nPads*.05);
+      leg->Draw();
+    }
+  }
+  
+}
index e79c5b64eecb682bb9e16b0d3d023267d310c8c1..2dc04d2cb5620d37a441d52e88824745eccaf293 100644 (file)
@@ -26,6 +26,7 @@
 
 class TObjArray;
 class TSeqCollection;
+class AliCFEffGrid;
 class TH1;
 
 class AliCFContainer;
@@ -34,7 +35,11 @@ class AliDielectronCFdraw : public TNamed {
 public:
   AliDielectronCFdraw();
   AliDielectronCFdraw(const char* name, const char* title);
-
+  AliDielectronCFdraw(AliCFContainer *cont);
+  AliDielectronCFdraw(const char* filename);
+  
+  virtual ~AliDielectronCFdraw() {;}
+  
   void SetCFContainer(AliCFContainer * const container) {fCfContainer=container;}
   void SetCFContainers(const TSeqCollection *arr);
 
@@ -49,18 +54,30 @@ public:
   void UnsetRangeUser(const char* varname, const char* slices="");
 
 //   virtual void Draw(const Option_t* /*option*/ = "") {;}
+  //Draw Projections
   void Draw(const Option_t* varnames, const char* opt="", const char* slices="");
   void Draw(Int_t var, const char* opt="", const char* slices="");
   void Draw(Int_t var0, Int_t var1, const char* opt="", const char* slices="");
   void Draw(Int_t var0, Int_t var1, Int_t var2, const char* opt="", const char* slices="");
-  void Draw(const TObjArray *arr, const char* opt="");
-  
-  TObjArray* CollectHistos(Int_t dim, Int_t *vars, const char* slices);
+
+  TObjArray* CollectHistosProj(Int_t dim, Int_t *vars, const char* slices);
   TH1* Project(Int_t ndim, Int_t *vars, Int_t slice);
+
+  //Draw efficiencies
+  void DrawEfficiency(const char* varnames, const char* nominators, Int_t denominator=0, const char* opt="sameleg");
+  void DrawEfficiency(Int_t var, const char* nominators, Int_t denominator=0, const char* opt="sameleg");
+  void DrawEfficiency(Int_t var0, Int_t var1, const char* nominators, Int_t denominator=0, const char* opt="sameleg");
+  void DrawEfficiency(Int_t var0, Int_t var1, Int_t var2, const char* nominators, Int_t denominator=0, const char* opt="sameleg");
+  
+  TObjArray* CollectHistosEff(Int_t dim, Int_t *vars, const char* nominators, Int_t denominator);
+  TH1* ProjectEff(Int_t ndim, Int_t *vars);
+  
   
+  void Draw(const TObjArray *arr, const char* opt="");
 private:
   AliCFContainer *fCfContainer;                     // CF container
-
+  AliCFEffGrid   *fEffGrid;                         // Efficiency calculation
+  
   AliDielectronCFdraw(const AliDielectronCFdraw &c);
   AliDielectronCFdraw &operator=(const AliDielectronCFdraw &c);
   
index 6ba008e179b8a2868a51a7ee500fc900ac325799..625bd827583e5105c146aa92bc7bf7523a61569d 100644 (file)
@@ -363,65 +363,69 @@ Bool_t AliDielectronMC::IsMCMotherToEEaod(const AliAODMCParticle *particle, Int_
 }
 
 //____________________________________________________________
-Bool_t AliDielectronMC::IsMotherPdg(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother)
+Int_t AliDielectronMC::GetLabelMotherWithPdg(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother)
 {
   //
   // test if mother of particle 1 and 2 has pdgCode pdgMother and is the same;
   //
-  if (!fMCEvent) return kFALSE;
+  if (!fMCEvent) return -1;
   
-  if (fAnaType==kESD) return IsMotherPdgESD(particle1, particle2, pdgMother);
-  else if (fAnaType==kAOD) return IsMotherPdgAOD(particle1, particle2, pdgMother);
+  if (fAnaType==kESD) return GetLabelMotherWithPdgESD(particle1, particle2, pdgMother);
+  else if (fAnaType==kAOD) return GetLabelMotherWithPdgAOD(particle1, particle2, pdgMother);
   
-  return kFALSE;
+  return -1;
 }
 
 //____________________________________________________________
-Bool_t AliDielectronMC::IsMotherPdgESD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother)
+Int_t AliDielectronMC::GetLabelMotherWithPdgESD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother)
 {
   //
-  // test if mother of particle 1 and 2 has pdgCode pdgMother and is the same;
+  // test if mother of particle 1 and 2 has pdgCode +-11 (electron),
+  //    have the same mother and the mother had pdg code pdgMother
   // ESD case
   //
   
   AliMCParticle *mcPart1=static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(particle1->GetLabel()));
   AliMCParticle *mcPart2=static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(particle2->GetLabel()));
   
-  if (!mcPart1||!mcPart2) return kFALSE;
+  if (!mcPart1||!mcPart2) return -1;
   
   Int_t lblMother1=mcPart1->GetMother();
   Int_t lblMother2=mcPart2->GetMother();
   
   AliMCParticle *mcMother1=static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(lblMother1));
-  if (!mcMother1) return kFALSE;
-  if (lblMother1!=lblMother2) return kFALSE;
-  if (mcMother1->PdgCode()!=pdgMother) return kFALSE;
+  if (!mcMother1) return -1;
+  if (lblMother1!=lblMother2) return -1;
+  if (TMath::Abs(mcPart1->PdgCode())!=11) return -1;
+  if (mcMother1->PdgCode()!=pdgMother) return -1;
   
-  return kTRUE;
+  return lblMother1;
 }
 
 //____________________________________________________________
-Bool_t AliDielectronMC::IsMotherPdgAOD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother)
+Int_t AliDielectronMC::GetLabelMotherWithPdgAOD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother)
 {
   //
-  // test if mother of particle 1 and 2 has pdgCode pdgMother and is the same;
+  // test if mother of particle 1 and 2 has pdgCode +-11 (electron),
+  //    have the same mother and the mother had pdg code pdgMother
   // AOD case
   //
   AliAODMCParticle *mcPart1=static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(particle1->GetLabel()));
   AliAODMCParticle *mcPart2=static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(particle2->GetLabel()));
   
-  if (!mcPart1||!mcPart2) return kFALSE;
+  if (!mcPart1||!mcPart2) return -1;
   
   Int_t lblMother1=mcPart1->GetMother();
   Int_t lblMother2=mcPart2->GetMother();
   
   AliAODMCParticle *mcMother1=static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(lblMother1));
   
-  if (!mcMother1) return kFALSE;
-  if (lblMother1!=lblMother2) return kFALSE;
-  if (mcMother1->GetPdgCode()!=pdgMother) return kFALSE;
+  if (!mcMother1) return -1;
+  if (lblMother1!=lblMother2) return -1;
+  if (TMath::Abs(mcPart1->GetPdgCode())!=11) return -1;
+  if (mcMother1->GetPdgCode()!=pdgMother) return -1;
   
-  return kTRUE;
+  return lblMother1;
 }
 
 //____________________________________________________________
index cc0edef124e247ec65a1043f5ece8bfb7e33dd9a..fdf5ae930c423395ce71f7b6e357def850fc2dcc 100644 (file)
@@ -51,10 +51,13 @@ public:
   Bool_t ConnectMCEvent();
   Bool_t UpdateStack();
 
-  Bool_t IsMotherPdg(const TObject* particle, Int_t pdgMother);
+  Bool_t IsMotherPdg(const AliDielectronPair* pair, Int_t pdgMother);
   Bool_t IsMotherPdg(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
   Bool_t IsMCMotherToEE(const AliVParticle *particle, Int_t pdgMother);
   
+  Int_t GetLabelMotherWithPdg(const AliDielectronPair* pair, Int_t pdgMother);
+  Int_t GetLabelMotherWithPdg(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
+  
   AliVParticle* GetMCTrackFromMCEvent(AliVParticle *track);   // return MC track directly from MC event
   AliVParticle* GetMCTrackFromMCEvent(Int_t _itrk);           // return MC track directly from MC event
   TParticle* GetMCTrackFromStack(AliESDtrack* _track);        // return MC track from stack
@@ -78,20 +81,26 @@ private:
   Bool_t IsMCMotherToEEesd(const AliMCParticle *particle, Int_t pdgMother);
   Bool_t IsMCMotherToEEaod(const AliAODMCParticle *particle, Int_t pdgMother);
 
-  Bool_t IsMotherPdgESD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
-  Bool_t IsMotherPdgAOD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
+  Int_t GetLabelMotherWithPdgESD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
+  Int_t GetLabelMotherWithPdgAOD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
   
   ClassDef(AliDielectronMC, 0)
 };
 
-inline Bool_t AliDielectronMC::IsMotherPdg(const TObject* particle, Int_t pdgMother)
+//
+// inline functions
+//
+inline Bool_t AliDielectronMC::IsMotherPdg(const AliDielectronPair* pair, Int_t pdgMother)
 {
-  //
-  //
-  //
-  if (particle->IsA()!=AliDielectronPair::Class()) return kFALSE;
-  const AliDielectronPair *pair=static_cast<const AliDielectronPair*>(particle);
   return IsMotherPdg(pair->GetFirstDaughter(),pair->GetSecondDaughter(),pdgMother);
 }
+//___________________________________________________________
+inline Bool_t AliDielectronMC::IsMotherPdg(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother){
+  return GetLabelMotherWithPdg(particle1,particle2,pdgMother)>=0;
+}
+//___________________________________________________________
+inline Int_t AliDielectronMC::GetLabelMotherWithPdg(const AliDielectronPair* pair, Int_t pdgMother){
+  return GetLabelMotherWithPdg(pair->GetFirstDaughter(),pair->GetSecondDaughter(),pdgMother);
+}
 
 #endif 
index 882ead33f39a81c21c5fb86691b5ac51e95278d9..96d3e228965fc9bc4aa2c97ee3cf5a8bf693c8b5 100644 (file)
@@ -28,6 +28,7 @@ ClassImp(AliDielectronPair)
 AliDielectronPair::AliDielectronPair() :
   fOpeningAngle(-1),
   fType(-1),
+  fLabel(-1),
   fPair(),
   fRefD1(),
   fRefD2()
@@ -43,6 +44,7 @@ AliDielectronPair::AliDielectronPair(AliVTrack * const particle1, Int_t pid1,
                                      AliVTrack * const particle2, Int_t pid2, Char_t type) :
   fOpeningAngle(-1),
   fType(type),
+  fLabel(-1),
   fPair(),
   fRefD1(),
   fRefD2()
@@ -77,8 +79,13 @@ void AliDielectronPair::SetTracks(AliVTrack * const particle1, Int_t pid1,
   fPair.AddDaughter(kf1);
   fPair.AddDaughter(kf2);
   
-  fRefD1 = particle1;
-  fRefD2 = particle2;
+  if (particle1->Pt()>particle2->Pt()){
+    fRefD1 = particle1;
+    fRefD2 = particle2;
+  } else {
+    fRefD1 = particle2;
+    fRefD2 = particle1;
+  }
 
   fOpeningAngle=kf1.GetAngle(kf2);
 }
index 93883a3134614a8ae04c7e099cf5074ed21e7a2e..64a496150da10f7d32b940698e8f2544201cacd0 100644 (file)
@@ -71,33 +71,37 @@ public:
   virtual Double_t Y()  const  { return TLorentzVector(Px(),Py(),Pz(),E()).Rapidity();}
   
   virtual Short_t Charge() const    { return fPair.GetQ();}
-  virtual Int_t   GetLabel() const  { return -1; }  //TODO: check
+  virtual Int_t   GetLabel() const  { return fLabel;      }
   // PID
   virtual const Double_t *PID() const { return 0;} //TODO: check
-
+  // Dummy
+  Int_t PdgCode() const {return 0;}
+  
   Double_t OpeningAngle() const { return fOpeningAngle; }
 
   UChar_t GetType() const { return fType; }
   void SetType(Char_t type) { fType=type; }
+
+  void SetLabel(Int_t label) {fLabel=label;}
   // internal KF particle
   const AliKFParticle& GetKFParticle() const { return fPair; }
 
   // daughter references
   AliVParticle* GetFirstDaughter()   const { return dynamic_cast<AliVParticle*>(fRefD1.GetObject()); }
   AliVParticle* GetSecondDaughter()  const { return dynamic_cast<AliVParticle*>(fRefD2.GetObject()); }
-  // Dummy
-  Int_t PdgCode() const {return 0;}
+
   
 private:
   Double_t fOpeningAngle; // opening angle of the pair
-  Char_t  fType;         // type of the pair e.g. like sign SE, unlike sign SE, ... see AliDielectron
-
+  Char_t   fType;         // type of the pair e.g. like sign SE, unlike sign SE, ... see AliDielectron
+  Int_t    fLabel;        // MC label
+  
   AliKFParticle fPair;   // KF particle internally used for pair calculation
 
   TRef fRefD1;           // Reference to first daughter
   TRef fRefD2;           // Reference to second daughter
   
-  ClassDef(AliDielectronPair,1)
+  ClassDef(AliDielectronPair,2)
 };
 
 #endif
index 199083ad47c4d52392ad1542ab60c57765101044..61e46dcef24981138f09987df81d0d88c0553747 100644 (file)
@@ -35,7 +35,8 @@ public:
   virtual ~AliDielectronVarCuts();
   //TODO: make copy constructor and assignment operator public
   void AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, Double_t max);
-
+  void AddCut(AliDielectronVarManager::ValueTypes type, Double_t value);
+  
   // setters
   void    SetCutOnMCtruth(Bool_t mc=kTRUE) { fCutOnMCtruth=mc; }
   void    SetCutType(CutType type)         { fCutType=type;    }
@@ -86,6 +87,14 @@ private:
 //
 //Inline functions
 //
+inline void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t value)
+{
+  //
+  // Set cut in a small delta around value
+  //
+  const Double_t kDelta=1e-20;
+  AddCut(type,value-kDelta,value+kDelta);
+}
 
 #endif
 
index b8247a5c0f6504ae5f7851626237e8ce7a11dc93..e6dc32cf288b0de5e953bb5e9e5a5be09b00c06c 100644 (file)
@@ -54,9 +54,9 @@ const char* AliDielectronVarManager::fgkParticleNames[AliDielectronVarManager::k
   "ImpactParZ",
   "TrackLength",
   "PdgCode",
-  "P from InnerParam",
-  "TPC signal",
-  "TPC nSigma Electrons",
+  "P_InnerParam",
+  "TPC_signal",
+  "TPC_nSigma_Electrons",
   //
   "Chi2NDF",
   "DecayLength",