]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/muon/AliAnalysisMuMu.cxx
Transition PWG3 --> PWGHF
[u/mrichter/AliRoot.git] / PWG3 / muon / AliAnalysisMuMu.cxx
diff --git a/PWG3/muon/AliAnalysisMuMu.cxx b/PWG3/muon/AliAnalysisMuMu.cxx
deleted file mode 100644 (file)
index 4b630b4..0000000
+++ /dev/null
@@ -1,837 +0,0 @@
-#include "AliAnalysisMuMu.h"
-
-#include "AliAnalysisManager.h"
-#include "AliCounterCollection.h"
-#include "AliHistogramCollection.h"
-#include "AliLog.h"
-#include "AliLog.h"
-#include "Riostream.h"
-#include "TCanvas.h"
-#include "TDatabasePDG.h"
-#include "TH1.h"
-#include "TH2.h"
-#include "THashList.h"
-#include "TList.h"
-#include "TMath.h"
-#include "TObjString.h"
-#include "TPaveText.h"
-#include "TROOT.h"
-#include <algorithm>
-
-//
-// AliAnalysisMuMu : base class for mu pairs analysis 
-//
-// Mainly invariant mass (for J/psi and Upsilon) but also 
-// some single control histograms.
-//
-// This base class contains common things for ESD-based
-// and AOD-based analysis
-//
-// The output contains an AliHistogramCollection and
-// an AliCounterCollection
-//
-// author: L. Aphecetche (Subatech)
-//
-
-ClassImp(AliAnalysisMuMu)
-
-namespace
-{
-  Int_t GetNbins(Double_t xmin, Double_t xmax, Double_t xstep)
-  {
-    if ( TMath::AreEqualRel(xstep,0.0,1E-9) ) return 1;
-    
-    return TMath::Nint(TMath::Abs((xmax-xmin)/xstep));
-  }  
-}
-
-//_____________________________________________________________________________
-AliAnalysisMuMu* AliAnalysisMuMu::Create(const char* inputDataType, TList* triggerClassesToConsider)
-{
-  /// Create the right implementation depending on intputDataType
-  
-  TString sinputDataType(inputDataType);
-  sinputDataType.ToUpper();
-  
-  if ( sinputDataType != "AOD" && sinputDataType != "ESD" ) 
-  {
-    AliErrorClass(Form("Unknown input data type : %s",inputDataType));
-    return 0x0;
-  }
-  
-  return reinterpret_cast<AliAnalysisMuMu*>(gROOT->ProcessLineFast(Form("new AliAnalysisMuMuFrom%s((TList*)%p)",
-                                                                        sinputDataType.Data(),
-                                                                        triggerClassesToConsider)));
-}
-
-//_____________________________________________________________________________
-AliAnalysisMuMu* AliAnalysisMuMu::Create(const char* inputDataType, Bool_t aa)
-{
-  /// Create the right implementation depending on intputDataType
-
-  TString sinputDataType(inputDataType);
-  sinputDataType.ToUpper();
-  
-  if ( sinputDataType != "AOD" && sinputDataType != "ESD" ) 
-  {
-    AliErrorClass(Form("Unknown input data type : %s",inputDataType));
-    return 0x0;
-  }
-  
-  return reinterpret_cast<AliAnalysisMuMu*>(gROOT->ProcessLineFast(Form("new AliAnalysisMuMuFrom%s(%d)",
-                                                                        sinputDataType.Data(),aa)));
-}
-
-//_____________________________________________________________________________
-AliAnalysisMuMu::AliAnalysisMuMu() : AliAnalysisTaskSE("AliAnalysisMuMu"),
-fHistogramCollection(0),
-fOutput(0),
-fTriggerClasses(0),
-fEventCounters(0),
-fIsFromESD(kFALSE),
-fSingleTrackCutNames(0x0),
-fPairTrackCutNames(0x0),
-fCentralityLimits(),
-fCentralityNames(0x0),
-fGlobalEventSelectionNames(0x0),
-fAA(kFALSE),
-fIsDynamicTriggerClasses(kFALSE)
-{
-  /// default ctor
-}
-
-//_____________________________________________________________________________
-AliAnalysisMuMu::AliAnalysisMuMu(Bool_t fromESD, Bool_t aa) 
-: AliAnalysisTaskSE(Form("AliAnalysisMuMu-from%s",fromESD ? "ESD":"AOD")),
-fHistogramCollection(0),
-fOutput(0),
-fTriggerClasses(new THashList),
-fEventCounters(0),
-fIsFromESD(fromESD),
-fSingleTrackCutNames(0x0),
-fPairTrackCutNames(0x0),
-fCentralityLimits(),
-fCentralityNames(new TObjArray),
-fGlobalEventSelectionNames(0x0),
-fAA(aa),
-fIsDynamicTriggerClasses(kTRUE)
-{
-  /// Constructor
-  /// The list of triggers to be considered will be updated on the fly
-  /// (see method AddTriggerClasses)
-  
-  fTriggerClasses->SetOwner(kTRUE);
-  
-  DefineOutput(1, TList::Class());
-  
-  DefineCentralityClasses();  
-
-}
-
-//_____________________________________________________________________________
-AliAnalysisMuMu::AliAnalysisMuMu(Bool_t fromESD, TList* triggerClasses)
-: AliAnalysisTaskSE(Form("AliAnalysisMuMu-from%s",fromESD ? "ESD":"AOD")),
-fHistogramCollection(0),
-fOutput(0),
-fTriggerClasses(new THashList),
-fEventCounters(0),
-fIsFromESD(fromESD),
-fSingleTrackCutNames(0x0),
-fPairTrackCutNames(0x0),
-fCentralityLimits(),
-fCentralityNames(new TObjArray),
-fGlobalEventSelectionNames(0x0),
-fAA(kFALSE),
-fIsDynamicTriggerClasses(kFALSE)
-{
-  /// Constructor with a predefined list of triggers to consider
-
-  fTriggerClasses->SetOwner(kTRUE);
-  
-  DefineOutput(1, TList::Class());
-  
-  TObjString* tname;
-  TIter next(triggerClasses);
-  
-  while ( ( tname = static_cast<TObjString*>(next()) ) )
-  {
-    fTriggerClasses->Add(new TObjString(*tname));
-    if ( tname->String().BeginsWith("CMB") )
-    {
-      fAA = kTRUE;
-    }
-  }
-  
-  DefineCentralityClasses();  
-}
-
-//_____________________________________________________________________________
-AliAnalysisMuMu::~AliAnalysisMuMu()
-{
-  /// dtor
-  delete fTriggerClasses;
-  delete fSingleTrackCutNames;
-  delete fPairTrackCutNames;
-  if(fOutput && ! AliAnalysisManager::GetAnalysisManager()->IsProofMode()) 
-  {
-    delete fOutput;     
-  }
-  delete fCentralityNames;
-  delete fGlobalEventSelectionNames;
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::AddGlobalEventSelection(const char* name)
-{
-  /// Add a name to the list of global event event selection ones.
-  
-  if (!fGlobalEventSelectionNames)
-  {
-    fGlobalEventSelectionNames = new TObjArray;
-    fGlobalEventSelectionNames->SetOwner(kTRUE);
-  }
-  fGlobalEventSelectionNames->Add(new TObjString(name));
-}
-                                  
-//_____________________________________________________________________________
-UInt_t AliAnalysisMuMu::CodePairCutMask(UInt_t maskForOneOrBothTrack, UInt_t maskForTrackPair) const
-{
-  /// Encode two masks (obviously each one should be 16 bits only) into one 
-  
-  return ( ( maskForOneOrBothTrack << 16 ) | maskForTrackPair );
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::DecodePairCutMask(UInt_t code, UInt_t& maskForOneOrBothTrack, UInt_t& maskForTrackPair) const
-{
-  /// Decode the pair cut mask
-  maskForOneOrBothTrack = ( ( code & 0xFFFF0000 ) >> 16 );
-  maskForTrackPair = ( code & 0xFFFF );
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::DefineCentralityClasses()
-{
-  /// Define the default centrality classes that will be used.
-  
-  if ( fAA ) 
-  {
-    fCentralityLimits.push_back(10.0);
-    fCentralityLimits.push_back(20.0);
-    fCentralityLimits.push_back(30.0);
-    fCentralityLimits.push_back(40.0);
-    fCentralityLimits.push_back(50.0);
-    fCentralityLimits.push_back(60.0);
-    fCentralityLimits.push_back(70.0);
-    fCentralityLimits.push_back(80.0);
-    fCentralityLimits.push_back(90.0);
-  }
-//  fCentralityLimits.push_back(100.0);
-  
-  for ( std::vector<double>::size_type i = 0; i < fCentralityLimits.size(); ++i )
-  {
-    Double_t limit = fCentralityLimits[i];
-    fCentralityNames->Add(new TObjString(CentralityName(limit)));
-  }
-  
-  fCentralityNames->Add(new TObjString(DefaultCentralityName()));
-  fCentralityNames->SetOwner(kTRUE);
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::AddTriggerClasses(const char* triggerlist)
-{
-  /// Given a list of trigger names (triggerlist) separated by spaces
-  /// add those which we don't know yet (selecting only the few ones
-  /// we're interested in, e.g CINT* CMU* CMB*
-  ///
-  
-  TString slist(triggerlist);
-  
-  TObjArray* a = slist.Tokenize(" ");
-  TObjString* s;
-  TIter next(a);
-  
-  while ( ( s = static_cast<TObjString*>(next()) ) )
-  {
-    TString trigger(s->String());
-    Bool_t add(kFALSE);
-    
-    if ( trigger.BeginsWith("CMB") && trigger.Contains("-B-") ) add = kTRUE;
-    if ( trigger.BeginsWith("CINT") && trigger.Contains("-B-") && !trigger.Contains("WU") ) add = kTRUE;
-    if ( trigger.BeginsWith("CMU") && trigger.Contains("-B-") ) add = kTRUE;
-    
-    if ( trigger.BeginsWith("CMUP") ) add = kFALSE;
-    
-    if ( add && !fTriggerClasses->FindObject(trigger.Data()) )
-    {
-      AliInfo(Form("Adding %s to considered trigger classes",trigger.Data()));
-      fTriggerClasses->Add(new TObjString(trigger));
-    }
-    
-  }
-  
-  delete a;  
-}
-                                  
-//_____________________________________________________________________________
-void AliAnalysisMuMu::AddPairCut(const char* cutName, UInt_t maskForOneOrBothTrack, UInt_t maskForTrackPair)
-{
-  /// Add a cut for a pair.
-  /// maskForOneOrBothTrack is the mask of cuts that at least one track must satisfy
-  /// maskForTrackPair is the mask of cuts that *both* tracks must satisfy.
-  /// if maskForTrackPair is 0, then no (extra) condition is applied to the pair
-  
-  if ( !fPairTrackCutNames ) 
-  {
-    fPairTrackCutNames = new TObjArray;
-    fPairTrackCutNames->SetOwner(kTRUE);
-  }
-  TObjString* oname = new TObjString(Form("p%s",cutName));
-  if ( !maskForTrackPair ) maskForTrackPair = maskForOneOrBothTrack;
-  oname->SetUniqueID(CodePairCutMask(maskForOneOrBothTrack,maskForTrackPair));
-  fPairTrackCutNames->Add(oname);
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::AddSingleCut(const char* name, UInt_t mask)
-{
-  /// Add a cut for single tracks
-  if ( !fSingleTrackCutNames ) 
-  {
-    fSingleTrackCutNames = new TObjArray;
-    fSingleTrackCutNames->SetOwner(kTRUE);
-  }
-  TObjString* oname = new TObjString(Form("s%s",name));
-  oname->SetUniqueID(mask);
-  fSingleTrackCutNames->Add(oname);
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::BeautifyHistos()
-{
-  /// Put the titles, marker sizes, color, etc...
-  
-  TIter next(fHistogramCollection->CreateIterator());
-  TH1* h;
-  
-  while ( ( h = static_cast<TH1*>(next()) ) )
-  {
-    TString name(h->GetName());
-    
-    if ( name.Contains("Plus") ) 
-    {
-      h->SetMarkerStyle(kFullCircle);
-      h->SetMarkerColor(kBlue);
-      h->SetLineColor(kBlue);        
-    }
-    else
-    {
-      h->SetMarkerStyle(kOpenCircle);
-      h->SetMarkerColor(kRed);
-      h->SetLineColor(kRed);        
-    }      
-  }
-}
-
-//_____________________________________________________________________________
-void 
-AliAnalysisMuMu::CreateSingleHisto(const char* physics,
-                                   const char* triggerClassName,
-                                   const char* hname, const char* htitle, 
-                                   Int_t nbinsx, Double_t xmin, Double_t xmax,
-                                   Int_t nbinsy, Double_t ymin, Double_t ymax) const
-{  
-  /// Append histograms for single track to our histogram collection
-  CreateHisto(fSingleTrackCutNames,physics,triggerClassName,hname,htitle,
-              nbinsx,xmin,xmax,nbinsy,ymin,ymax);
-}
-
-//_____________________________________________________________________________
-void 
-AliAnalysisMuMu::CreatePairHisto(const char* physics,
-                                 const char* triggerClassName,
-                                 const char* hname, const char* htitle, 
-                                 Int_t nbinsx, Double_t xmin, Double_t xmax,
-                                 Int_t nbinsy, Double_t ymin, Double_t ymax) const
-{
-  /// Append histograms for track pairs to our histogram collection
-
-  CreateHisto(fPairTrackCutNames,physics,triggerClassName,hname,htitle,
-              nbinsx,xmin,xmax,nbinsy,ymin,ymax);
-}
-
-//_____________________________________________________________________________
-void 
-AliAnalysisMuMu::CreateEventHisto(const char* physics,
-                                  const char* triggerClassName,
-                                  const char* hname, const char* htitle, 
-                                  Int_t nbinsx, Double_t xmin, Double_t xmax,
-                                  Int_t nbinsy, Double_t ymin, Double_t ymax) const
-{
-  /// Append histograms at the event level
-  
-  TIter next(fCentralityNames);
-  TObjString* cent;
-  
-  while ( ( cent = static_cast<TObjString*>(next()) ) )
-  {
-    TH1* h(0x0);
-    
-    if ( nbinsy > 0 )
-    {  
-      h = new TH2F(hname,htitle,nbinsx,xmin,xmax,nbinsy,ymin,ymax);
-    }
-    else
-    {
-      h = new TH1F(hname,htitle,nbinsx,xmin,xmax);
-    }
-    
-    fHistogramCollection->Adopt(physics,triggerClassName,cent->String().Data(),h); 
-  }
-}
-
-//_____________________________________________________________________________
-void 
-AliAnalysisMuMu::CreateHisto(TObjArray* array,
-                             const char* physics,
-                             const char* triggerClassName,
-                             const char* hname, const char* htitle, 
-                             Int_t nbinsx, Double_t xmin, Double_t xmax,
-                             Int_t nbinsy, Double_t ymin, Double_t ymax) const
-{
-  /// Create a bunch of histograms for all centralities
-  /// FIXME: have a way to specify the histo precision (i.e. F vs I vs S ...)
-  
-  TIter next(array);
-  TObjString* tcn;
-  while ( ( tcn = static_cast<TObjString*>(next()) ) )
-  {
-    TIter nextCent(fCentralityNames);
-    TObjString* cent;
-    
-    while ( ( cent = static_cast<TObjString*>(nextCent()) ) )
-    {
-      TH1* h(0x0);
-    
-      if ( nbinsy > 0 )
-      {  
-        h = new TH2F(hname,htitle,nbinsx,xmin,xmax,nbinsy,ymin,ymax);
-      }
-      else
-      {
-        h = new TH1F(hname,htitle,nbinsx,xmin,xmax);
-      }
-    
-      fHistogramCollection->Adopt(physics,triggerClassName,cent->String().Data(),tcn->String().Data(),h);
-    }
-  }      
-}
-
-//_____________________________________________________________________________
-const char* 
-AliAnalysisMuMu::DefaultCentralityName() const
-{
-  /// Get default centrality name
-  if ( fAA ) return "CENTX";
-  else return "PP";
-}
-
-//_____________________________________________________________________________
-const char* 
-AliAnalysisMuMu::CentralityName(Double_t centrality) const
-{
-  /// Get centrality name corresponding to the floating ^point value
-  
-  if ( centrality > 0 && centrality <= 100.0 ) 
-  {
-    return Form("CENT%02d",TMath::Nint(centrality));
-  }
-  else
-  {
-    return DefaultCentralityName();
-  }
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::AssertHistogramCollection(const char* physics, const char* triggerClassName)
-{
-  // insure that a given set of histogram is created
-  TH1* test = fHistogramCollection->Histo(physics,triggerClassName,DefaultCentralityName(),"Zvertex");
-  if (!test) FillHistogramCollection(physics,triggerClassName);
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::FillHistogramCollection(const char* physics, const char* triggerClassName)
-{
-  /// Actually create the histograms for phyics/triggerClassName
-  
-  AliDebug(1,Form("(%s,%s)",physics,triggerClassName));
-  
-  Double_t ptMin = 0;
-  Double_t ptMax = 50;
-  Int_t nbinsPt = GetNbins(ptMin,ptMax,0.25);
-  Double_t pMin = 0;
-  Double_t pMax = 300;
-  Int_t nbinsP = GetNbins(pMin,pMax,1.0);
-  Double_t etaMin = -6;
-  Double_t etaMax = 1;
-  Int_t nbinsEta = GetNbins(etaMin,etaMax,0.1);
-  
-  CreateSingleHisto(physics,triggerClassName,"PtEtaMuPlus", "#mu+ P_{T} distribution vs Eta", nbinsEta,etaMin,etaMax, nbinsPt,ptMin,ptMax);
-  CreateSingleHisto(physics,triggerClassName,"PtEtaMuMinus", "#mu- P_{T} distribution vs Eta",nbinsEta,etaMin,etaMax, nbinsPt,ptMin,ptMax);
-  
-  CreateSingleHisto(physics,triggerClassName,"PEtaMuPlus", "#mu+ P distribution",nbinsEta,etaMin,etaMax,nbinsP,pMin,pMax);
-  CreateSingleHisto(physics,triggerClassName,"PEtaMuMinus", "#mu- P distribution",nbinsEta,etaMin,etaMax,nbinsP,pMin,pMax);  
-
-  Double_t chi2min = 0;
-  Double_t chi2max = 20;
-  Int_t nbinchi2 = GetNbins(chi2min,chi2max,0.1);
-  
-  CreateSingleHisto(physics, triggerClassName, "Chi2MuPlus", "chisquare per NDF #mu+", nbinchi2, chi2min, chi2max);
-  CreateSingleHisto(physics, triggerClassName, "Chi2MuMinus", "chisquare per NDF #mu-", nbinchi2, chi2min, chi2max);
-    
-  Double_t minvMin = 0;
-  Double_t minvMax = 16;
-  Int_t nMinvBins = GetNbins(minvMin,minvMax,0.05);
-  
-  CreatePairHisto(physics,triggerClassName,"MinvUSPt", "#mu+#mu- inv. mass vs Pt",nbinsPt,ptMin,ptMax,nMinvBins,minvMin,minvMax);
-  CreatePairHisto(physics,triggerClassName,"MinvPPPt", "#mu+#mu+ inv. mass vs Pt",nbinsPt,ptMin,ptMax,nMinvBins,minvMin,minvMax);
-  CreatePairHisto(physics,triggerClassName,"MinvMMPt", "#mu-#mu- inv. mass vs Pt",nbinsPt,ptMin,ptMax,nMinvBins,minvMin,minvMax);
-
-  
-  Double_t xmin = -40;
-  Double_t xmax = +40;
-  Int_t nbins = GetNbins(xmin,xmax,0.5);
-  
-  CreateEventHisto(physics,triggerClassName,"Zvertex","z vertex",nbins,xmin,xmax);  
-
-  xmin = -5;
-  xmax = 5;
-  nbins = GetNbins(xmin,xmax,0.01);
-
-  CreateEventHisto(physics,triggerClassName,"Xvertex","x vertex",nbins,xmin,xmax);  
-  CreateEventHisto(physics,triggerClassName,"Yvertex","y vertex",nbins,xmin,xmax);  
-  CreateEventHisto(physics,triggerClassName,"YXvertex","y vs x vertex",nbins,xmin,xmax,
-                   nbins,xmin,xmax);  
-  
-  if (!fIsFromESD)
-  {
-    
-    CreateEventHisto(physics,triggerClassName,"PileUpZvertex","pileup z vertex",nbins,xmin,xmax);  
-    
-    CreateEventHisto(physics,triggerClassName,"PileUpXvertex","pileup x vertex",nbins,xmin,xmax);  
-    CreateEventHisto(physics,triggerClassName,"PileUpYvertex","pileup y vertex",nbins,xmin,xmax);  
-    
-    CreateEventHisto(physics,triggerClassName,"PileUpYXvertex","pileup y vs x vertex",nbins,xmin,xmax,
-                     nbins,xmin,xmax);  
-    
-  }
-  CreateEventHisto(physics,triggerClassName,"Nevents","number of events",2,-0.5,1.5);  
-
-  xmin = 0;
-  xmax = 3564;
-  nbins = GetNbins(xmin,xmax,1.0);
-  
-  CreateEventHisto(physics,triggerClassName,"BCX","bunch-crossing ids",nbins,xmin-0.5,xmax-0.5);
-  
-  xmin = -200;
-  xmax = +200;
-  nbins = GetNbins(xmin,xmax,1.0);
-  
-  CreateSingleHisto(physics,triggerClassName,"XYdcaMuPlus","#mu+ DCA non bending vs bending;dcaY;dcaX",nbins,xmin,xmax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"XYdcaMuMinus","#mu- DCA non bending vs bending;dcaY;dcaX",nbins,xmin,xmax,nbins,xmin,xmax);  
-  
-  xmin = 0;
-  xmax = 300;
-  nbins = GetNbins(xmin,xmax,1.0);
-  
-  CreateSingleHisto(physics,triggerClassName,"dcaP23MuPlus","#mu+ DCA vs P for 2-3 degrees;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"dcaP23MuMinus","#mu- DCA vs P for 2-3 degrees;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"dcaP310MuPlus","#mu+ DCA vs P for 3-10 degrees;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"dcaP310MuMinus","#mu- DCA vs P for 3-10 degrees;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-
-  CreateSingleHisto(physics,triggerClassName,"dcaPwPtCut23MuPlus","#mu+ DCA vs P for 2-3 degrees with Pt Cut;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"dcaPwPtCut23MuMinus","#mu- DCA vs P for 2-3 degrees with Pt Cut;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"dcaPwPtCut310MuPlus","#mu+ DCA vs P for 3-10 degrees with Pt Cut;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"dcaPwPtCut310MuMinus","#mu- DCA vs P for 3-10 degrees with Pt Cut;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  
-  xmin = 0;
-  xmax = 20000;
-  nbins = GetNbins(xmin,xmax,100.0);
-  
-  CreateSingleHisto(physics,triggerClassName,"PDCAcorrP23MuPlus","#mu+ PxDCAcorr vs P for 2-3 degrees;P (GeV/c);P.DCA (GeV.cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"PDCAcorrP23MuMinus","#mu- PxDCAcorr  vs P for 2-3 degrees;P (GeV/c);P.DCA (GeV.cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"PDCAcorrP310MuPlus","#mu+ PxDCAcorr  vs P for 3-10 degrees;P (GeV/c);P.DCA (GeV.cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"PDCAcorrP310MuMinus","#mu- PxDCAcorr  vs P for 3-10 degrees;P (GeV/c);P.DCA (GeV.cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-
-  CreateSingleHisto(physics,triggerClassName,"PDCAcutP23MuPlus","#mu+ PxDCAcut vs P for 2-3 degrees;P (GeV/c);P.DCA (GeV.cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"PDCAcutP23MuMinus","#mu- PxDCAcut  vs P for 2-3 degrees;P (GeV/c);P.DCA (GeV.cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"PDCAcutP310MuPlus","#mu+ PxDCAcut  vs P for 3-10 degrees;P (GeV/c);P.DCA (GeV.cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  CreateSingleHisto(physics,triggerClassName,"PDCAcutP310MuMinus","#mu- PxDCAcut  vs P for 3-10 degrees;P (GeV/c);P.DCA (GeV.cm)",nbinsP,pMin,pMax,nbins,xmin,xmax);  
-  
-  
-  if ( fIsFromESD ) 
-  {
-    xmin = -80;
-    xmax = 80;
-    nbins = GetNbins(xmin,xmax,0.1);
-    CreateEventHisto(physics,triggerClassName,"V0Time","Mean Time V0C versus V0A;Time V0A (ns);Time V0C (ns)",nbins,xmin,xmax,nbins,xmin,xmax);
-    
-    xmin = 0;
-    xmax = 20000;
-    nbins = GetNbins(xmin,xmax,10);
-    
-    CreateEventHisto(physics,triggerClassName,"V0Amplitude","V0Amult+V0Cmult",nbins,xmin,xmax);
-  }
-  
-  if ( fAA ) 
-  {
-    Double_t* vbins = new Double_t[fCentralityLimits.size()+1];
-  
-    vbins[0] = 0.0;
-    
-    for ( std::vector<double>::size_type i = 0; i < fCentralityLimits.size(); ++i ) 
-    {  
-      vbins[i+1] = fCentralityLimits[i];
-    }
-    
-    TH1* h = new TH1F("Centrality","Centrality",fCentralityLimits.size(),vbins);
-    
-    delete[] vbins;
-    
-    fHistogramCollection->Adopt(physics,triggerClassName,h);                                                              
-
-  }
-  
-  xmin = 0;
-  xmax = 5000;
-  nbins = GetNbins(xmin,xmax,10);
-  
-  CreateEventHisto(physics,triggerClassName,"Tracklets","Number of tracklets",nbins,xmin,xmax);
-  
-}
-
-
-//_____________________________________________________________________________
-Double_t AliAnalysisMuMu::MuonMass2() const
-{
-  /// A usefull constant
-  static Double_t m2 = 1.11636129640000012e-02; // using a constant here as the line below is a problem for CINT...
-//  static Double_t m2 = TDatabasePDG::Instance()->GetParticle("mu-")->Mass()*TDatabasePDG::Instance()->GetParticle("mu-")->Mass();
-  return m2;
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::FinishTaskOutput()
-{
-  /// prune empty histograms BEFORE mergin, in order to save some bytes...
-  
-  if ( fHistogramCollection )
-  {
-    UInt_t size = fHistogramCollection->EstimateSize(kFALSE);
-    
-    AliInfo(Form("size before prune histograms = %5.1f MB",size/1024.0/1024.0));
-    
-    fHistogramCollection->PruneEmptyHistograms();  
-
-    AliInfo(Form("size after prune histograms = %5.1f MB",size/1024.0/1024.0));
-
-  }
-}
-
-//_____________________________________________________________________________
-TH1* AliAnalysisMuMu::Histo(const char* physics, const char* triggerClassName, const char* histoname)
-{
-  /// Get one histo back
-  return fHistogramCollection ? fHistogramCollection->Histo(physics,triggerClassName,histoname) : 0x0;
-}
-
-//_____________________________________________________________________________
-TH1* AliAnalysisMuMu::Histo(const char* physics, const char* histoname)
-{
-  /// Get one histo back
-  return fHistogramCollection ? fHistogramCollection->Histo(physics,histoname) : 0x0;
-}
-
-//_____________________________________________________________________________
-TH1* AliAnalysisMuMu::Histo(const char* physics,
-                            const char* triggerClassName, 
-                            const char* what,
-                            const char* histoname)
-{
-  /// Get one histo back
-  return fHistogramCollection ? fHistogramCollection->Histo(physics,triggerClassName,what,histoname) : 0x0;
-}
-
-//_____________________________________________________________________________
-TH1* AliAnalysisMuMu::Histo(const char* physics,
-                            const char* triggerClassName, 
-                            const char* cent,
-                            const char* what,
-                            const char* histoname)
-{
-  /// Get one histo back
-
-  return fHistogramCollection ? fHistogramCollection->Histo(physics,triggerClassName,cent,what,histoname) : 0x0;
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::NotifyRun()
-{
-  /// Called at each change of run ?
-  AliInfo(Form("Run %09d File %s",fCurrentRunNumber,CurrentFileName()));
-}
-
-//_____________________________________________________________________________
-void 
-AliAnalysisMuMu::Print(Option_t* /*opt*/) const
-{
-  /// Print the definition of this analysis
-  
-  cout << ClassName() << " - " << GetName() << " - " << ( fAA ? "PbPb mode" : "pp mode" ) << endl;
-  
-  if  ( !fSingleTrackCutNames || !fSingleTrackCutNames )
-  {
-    cout << "No single track cut defined yet" << endl;    
-  }
-  else
-  {
-    TIter next(fSingleTrackCutNames);
-    TObjString* str;
-    
-    while ( ( str = static_cast<TObjString*>(next()) ) )
-    {
-      cout << Form("SINGLE CUT %20s MASK %x",str->String().Data(),str->GetUniqueID()) << endl;
-    }
-  }
-  
-  if  ( !fPairTrackCutNames || !fPairTrackCutNames )
-  {
-    cout << "No track pair cut defined yet" << endl;    
-  }
-  else
-  {
-    TIter next2(fPairTrackCutNames);
-    TObjString* str;
-
-    while ( ( str = static_cast<TObjString*>(next2()) ) )
-    {
-      UInt_t single(0);
-      UInt_t pair(0);
-      DecodePairCutMask(str->GetUniqueID(),single,pair);
-      
-      cout << Form("PAIR   CUT %20s UID %x SINGLE MASK %x PAIR MASK %x",str->String().Data(),str->GetUniqueID(),single,pair) << endl;
-    }
-  }
-  
-  if ( !fTriggerClasses || !fTriggerClasses->First() ) 
-  {
-    cout << "No trigger classes defined yet" << endl;
-  }
-  else
-  {
-    cout << "Trigger classes that will be considered:" << endl;
-    TIter next(fTriggerClasses);
-    TObjString* s;
-    
-    while ( ( s = static_cast<TObjString*>(next()) ) )
-    {
-      cout << s->String().Data() << endl;
-    }
-  }
-}
-
-//_____________________________________________________________________________
-void
-AliAnalysisMuMu::Terminate(Option_t *)
-{
-  /// Called once at the end of the query
-  /// Just a simple printout of the stat we analyse and how many histograms
-  /// we got
-  
-  fOutput = dynamic_cast<TList*>(GetOutputData(1));
-  
-  if (!fOutput) return;
-  
-  fHistogramCollection = dynamic_cast<AliHistogramCollection*>(fOutput->FindObject("mumu"));
-  
-  if (!fHistogramCollection)
-  {
-    AliError("Could not find back histogram collection in output...");
-    return;
-  }
-  
-  fHistogramCollection->PruneEmptyHistograms();
-
-  UInt_t size2 = fHistogramCollection->EstimateSize();
-
-  AliInfo(Form("size after prune histograms = %5.1f MB",size2/1024.0/1024.0));
-  
-  BeautifyHistos();
-
-  fHistogramCollection->Print("*Minv*");
-  
-  fEventCounters = dynamic_cast<AliCounterCollection*>(fOutput->FindObject("eventCounters"));
-  
-  if (!fEventCounters)
-  {
-    AliError("Could not find back counters in output...");
-    return;
-  }
-  
-  fEventCounters->Print();
-}
-
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::UserExec(Option_t* opt)
-{
-  /// Executed at each event
-  
-  MuUserExec(opt);
-  
-  // Post output data.
-  PostData(1, fOutput);      
-}
-
-//_____________________________________________________________________________
-void AliAnalysisMuMu::UserCreateOutputObjects()
-{
-  // Create histograms
-  // Called once
-  
-  fTriggerClasses->Print();  
-  
-  fOutput = new TList;
-  fOutput->SetOwner(kTRUE);
-  
-  fHistogramCollection = new AliHistogramCollection("mumu");
-  
-  fOutput->Add(fHistogramCollection);  
-  
-  // initialize event counters
-  fEventCounters = new AliCounterCollection("eventCounters");
-
-  TIter nextGSN(fGlobalEventSelectionNames);
-  TObjString* str;
-  TString eventRubric;
-  while ( ( str = static_cast<TObjString*>(nextGSN()) ) )
-  {
-    if ( eventRubric.Length() > 0 ) eventRubric += "/"; 
-    eventRubric += str->String();
-  }
-  
-  fEventCounters->AddRubric("event", eventRubric.Data());
-  
-  fEventCounters->AddRubric("trigger", 100);
-  
-  fEventCounters->AddRubric("run", 1000000);
-  
-  fEventCounters->Init();
-  
-  fOutput->Add(fEventCounters);  
-  
-  // Post output data.
-  PostData(1, fOutput);      
-}