]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Allow to store pass-dependent parameters for standard Muon track cuts in OADB (Diego)
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 4 Oct 2012 21:06:14 +0000 (21:06 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 4 Oct 2012 21:06:14 +0000 (21:06 +0000)
21 files changed:
OADB/PWG/MUON/MuonTrackCuts.root
OADB/PWG/MUON/MuonTrackCuts_MC.root
PWG/CMakelibPWGmuon.pkg
PWG/FLOW/Tasks/AliAnalysisTaskFlowEvent.cxx
PWG/FLOW/Tasks/AliFlowTrackCuts.h
PWG/PWGmuonLinkDef.h
PWG/muon/AliAnalysisMuonUtility.cxx
PWG/muon/AliAnalysisMuonUtility.h
PWG/muon/AliAnalysisTaskSEMuonsHF.cxx
PWG/muon/AliMuonEventCuts.cxx
PWG/muon/AliMuonEventCuts.h
PWG/muon/AliMuonPairCuts.cxx
PWG/muon/AliMuonPairCuts.h
PWG/muon/AliMuonTrackCuts.cxx
PWG/muon/AliMuonTrackCuts.h
PWG/muon/AliOADBMuonTrackCutsParam.cxx [new file with mode: 0644]
PWG/muon/AliOADBMuonTrackCutsParam.h [new file with mode: 0644]
PWG/muon/AliVAnalysisMuon.cxx
PWGPP/MUON/lite/AddTaskMuonCuts.C
PWGPP/MUON/lite/AliAnalysisTaskMuonCuts.cxx
PWGPP/MUON/lite/AliAnalysisTaskMuonQA.cxx

index 7348d7ba3d43dd5b668b429b24938973e5e6828b..a2677e430824cca43eed1f76d7ec00d378a57a43 100644 (file)
Binary files a/OADB/PWG/MUON/MuonTrackCuts.root and b/OADB/PWG/MUON/MuonTrackCuts.root differ
index b81735151dcaa0e1507ae4b7cd12976fbbc18b72..dc2a48bc49ca0b9f755dd2dd212b8efdf0513bff 100644 (file)
Binary files a/OADB/PWG/MUON/MuonTrackCuts_MC.root and b/OADB/PWG/MUON/MuonTrackCuts_MC.root differ
index 44baae15caaafa73347ad518ee94496afb9ff191..3066a9233de5faed613acd946cbb197946cdf575 100644 (file)
@@ -63,7 +63,8 @@ set ( SRCS
     muon/AliMergeableCollection.cxx 
     muon/AliVAnalysisMuon.cxx 
     muon/AliAnalysisTaskFlowSingleMu.cxx 
-    muon/AliAnalysisMuonUtility.cxx
+    muon/AliAnalysisMuonUtility.cxx 
+    muon/AliOADBMuonTrackCutsParam.cxx
     )
 
 string ( REPLACE ".cxx" ".h" HDRS "${SRCS}" )
index 1672f7c7fc53d9e7d5ad3d9d30c87be0fff826c7..63b53c0acfb3ec37473ef7f27311e0d3bac51509 100644 (file)
@@ -238,8 +238,8 @@ AliAnalysisTaskFlowEvent::~AliAnalysisTaskFlowEvent()
 void AliAnalysisTaskFlowEvent::NotifyRun()
 {
   //at the beginning of each new run
-  if (fCutsRP)   fCutsRP->SetRunsMuon(fCurrentRunNumber);  // XZhang 20120604
-  if (fCutsPOI) fCutsPOI->SetRunsMuon(fCurrentRunNumber);  // XZhang 20120604
+  if (fCutsRP)   fCutsRP->SetRunsMuon(fInputHandler);  // XZhang 20120604
+  if (fCutsPOI) fCutsPOI->SetRunsMuon(fInputHandler);  // XZhang 20120604
        AliESDEvent* fESD = dynamic_cast<AliESDEvent*> (InputEvent());
   if (!fESD) return;
 
@@ -493,9 +493,9 @@ void AliAnalysisTaskFlowEvent::UserExec(Option_t *)
       for(int iCand=0; iCand!=candidates->GetEntriesFast(); ++iCand ) {
         AliFlowCandidateTrack *cand = dynamic_cast<AliFlowCandidateTrack*>(candidates->At(iCand));
         if (!cand) continue;
-        //printf("  Checking at candidate %d with %d daughters: mass %f\n",iCand,cand->GetNDaughters(),cand->Mass());
+        //printf(" - Checking at candidate %d with %d daughters: mass %f\n",iCand,cand->GetNDaughters(),cand->Mass());
         for(int iDau=0; iDau!=cand->GetNDaughters(); ++iDau) {
-          //printf("     Daughter %d with fID %d", iDau, cand->GetIDDaughter(iDau) );
+          //printf("    - Daughter %d with fID %d", iDau, cand->GetIDDaughter(iDau) );
           for(int iRPs=0; iRPs!=fFlowEvent->NumberOfTracks(); ++iRPs ) {
             AliFlowTrack *iRP = dynamic_cast<AliFlowTrack*>(fFlowEvent->GetTrack( iRPs ));
             if (!iRP) continue;
index ffdb2015de5e0f0a3b45d60de329c8e037dd87d9..5273c5955d10cd9c9034480cdfcf4e3ead5c4150 100644 (file)
@@ -25,6 +25,7 @@ class AliVParticle;
 class AliMCParticle;
 class AliFlowTrack;
 class AliMCEvent;
+class AliInputEventHandler;
 class AliVEvent;
 class AliMultiplicity; 
 class AliAODTracklets;  // XZhang 20120615
@@ -115,7 +116,7 @@ class AliFlowTrackCuts : public AliFlowTrackSimpleCuts {
 
   void SetStandardMuonTrackCuts() { InitMuonCuts();     fMuonTrackCuts->SetDefaultFilterMask(); return; }  // XZhang 20120604
   void SetIsMuonMC(Bool_t isMC)   { InitMuonCuts();     fMuonTrackCuts->SetIsMC(isMC);          return; }  // XZhang 20120604
-  void SetRunsMuon( Int_t runN)   { if (fMuonTrackCuts) fMuonTrackCuts->SetRun(runN);           return; }  // XZhang 20120604
+  void SetRunsMuon( const AliInputEventHandler* eventHandler )   { if (fMuonTrackCuts) fMuonTrackCuts->SetRun(eventHandler); }  // XZhang 20120604
 
   Int_t GetMinNClustersTPC() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMinNClusterTPC();}
   Int_t GetMinNClustersITS() const {if (!fAliESDtrackCuts) return 0; return fAliESDtrackCuts->GetMinNClustersITS();}
index f5195b1067e5a1c7d62984d749732cbacde30848..4d14297ab228a21007322f43ce9425bcbb43bebf 100644 (file)
@@ -45,5 +45,6 @@
 #pragma link C++ class AliVAnalysisMuon+;
 #pragma link C++ class AliAnalysisTaskFlowSingleMu+;
 #pragma link C++ class AliAnalysisMuonUtility+;
+#pragma link C++ class AliOADBMuonTrackCutsParam+;
 #endif
 
index 0e640daf6f3fbe5709cb5b7ba28c0ca694bf77ab..3be03c3ca342a193ac1313b655a9f9ea9dd66b6c 100644 (file)
 #include "TAxis.h"
 #include "TMath.h"
 #include "TLorentzVector.h"
+#include "TFile.h"
 
 // STEER includes
+#include "AliInputEventHandler.h"
+#include "AliAODHeader.h"
 #include "AliAODEvent.h"
 #include "AliAODTrack.h"
+#include "AliAODMCHeader.h"
 #include "AliAODMCParticle.h"
 #include "AliMCEvent.h"
 #include "AliMCParticle.h"
 #include "AliESDEvent.h"
 #include "AliESDMuonTrack.h"
 #include "AliVVertex.h"
-#include "AliAODMCHeader.h"
 #include "AliLog.h"
 
 // CORRFW includes
@@ -364,6 +367,65 @@ AliVVertex* AliAnalysisMuonUtility::GetVertexSPD ( const AliVEvent* event )
 }
 
 
+//________________________________________________________________________
+Int_t AliAnalysisMuonUtility::GetPassNumber ( const AliInputEventHandler* eventHandler )
+{
+  /// Get pass number from event
+
+  // At present there is no straightforward way to get the pass number.
+  // The pass number is usually written in the path to the ESDs/AODs
+  // but this won't work for:
+  // - MC data (no pass info available)
+  // - local ESDs/AODs
+  
+  TString filePath = "";
+  const AliVEvent* event = eventHandler->GetEvent();  
+  if ( IsAODEvent(event) ) {
+    // In AODs, the header contains the path to the input ESD event
+    // However, sometimes there is not the FULL path of the ESDs.
+    // In that case we cannot extract the pass number.
+    // To increase the possibility of getting the pass number,
+    // try first to find the info in the AOD header
+    // (which is a priori safer because it works even on local copies of AODs)
+    // and if it does not work, directly check the path to the AOD
+    filePath = static_cast<const AliAODEvent*> (event)->GetHeader()->GetESDFileName();
+    Int_t passNumber = GetPassNumber(filePath.Data());
+    if ( passNumber < 0 ) AliWarningClass("Check again with the AOD path");
+    else return passNumber;
+  }
+  
+  filePath = eventHandler->GetTree()->GetCurrentFile()->GetName();
+  return GetPassNumber(filePath.Data());
+}
+
+
+//________________________________________________________________________
+Int_t AliAnalysisMuonUtility::GetPassNumber ( const char* str )
+{
+  //
+  /// Get pass number from string
+  //
+  
+  TString currName(str);
+  currName.ToUpper();
+  Int_t idx = currName.Index("PASS");
+  if ( idx >= 0 ) {
+    // Remove all of the words before PASS (and remove the word PASS itself)
+    currName.Remove(0,idx+4);
+    // Cut the word from the end untill only the digits are left
+    // (In this way we can extract the pass number even if it has more than one digit)
+    while ( ! currName.IsDigit() && currName.Length() > 0 ) {
+      currName.Remove(currName.Length()-1);
+    }
+    
+    if ( currName.Length() > 0 ) return currName.Atoi();
+  }
+  
+  AliWarningClass(Form("Cannot find pass number in: %s", str));
+  return -1;
+}
+
+
 //_______________________________________________________________________
 Bool_t AliAnalysisMuonUtility::SetSparseRange(AliCFGridSparse* gridSparse,
                                         Int_t ivar, TString labelName,
index d54ec64774dc6bf8b1b7e6e44eedf7b75c91ac7f..4608eea9f39d7b288f1847c82a1f52c100212747 100644 (file)
@@ -13,6 +13,7 @@
 #include "TString.h"
 
 class TLorentzVector;
+class AliInputEventHandler;
 class AliVEvent;
 class AliMCEvent;
 class AliVParticle;
@@ -72,6 +73,10 @@ class AliAnalysisMuonUtility : public TObject {
   // Transparently handle vertex
   static AliVVertex* GetVertexSPD ( const AliVEvent* event );
   
+  // Utilities for ESD/AOD
+  static Int_t GetPassNumber ( const AliInputEventHandler* eventHandler );
+  static Int_t GetPassNumber ( const char* str );
+  
   ClassDef(AliAnalysisMuonUtility, 0);
 };
 
index c421af502819f11c0024b928ba4b3068cac91eb5..c60f5f3627103d75c25bc23ff98d9aeab3bec8d0 100644 (file)
@@ -276,7 +276,7 @@ void AliAnalysisTaskSEMuonsHF::NotifyRun()
 {
   // Notify of the current run number
 
-  if (fCutsMuon) fCutsMuon->SetRun(fCurrentRunNumber);
-  if (fCutsDimu) fCutsDimu->SetRun(fCurrentRunNumber);
+  if (fCutsMuon) fCutsMuon->SetRun(fInputHandler);
+  if (fCutsDimu) fCutsDimu->SetRun(fInputHandler);
   return;
 }
index 058b1f25af1c63c43d8045a1d990f8491fbe97be..2ecf7318b0409f50e92f54d4ce05dff79fe50b2d 100644 (file)
@@ -17,7 +17,6 @@
 
 #include "TMath.h"
 #include "THashList.h"
-#include "TArrayD.h"
 #include "TObjArray.h"
 #include "TObjString.h"
 #include "TFile.h"
@@ -37,7 +36,6 @@
 #include "AliTimeStamp.h"
 
 #include "AliAnalysisMuonUtility.h"
-//#include "AliAnalysisManager.h"
 
 /// \cond CLASSIMP
 ClassImp(AliMuonEventCuts) // Class implementation in ROOT context
@@ -47,10 +45,10 @@ ClassImp(AliMuonEventCuts) // Class implementation in ROOT context
 //________________________________________________________________________
 AliMuonEventCuts::AliMuonEventCuts() :
   AliAnalysisCuts(),
-//fIsMC(kFALSE),
-//fUseCustomParam(kFALSE),
   fPhysicsSelectionMask(0),
-  fParameters(TArrayD(kNParameters)),
+  fVertexMinNContributors(0),
+  fVertexVzMin(0.),
+  fVertexVzMax(0.),
   fDefaultTrigClassPatterns(""),
   fSelectedTrigPattern(0x0),
   fRejectedTrigPattern(0x0),
@@ -61,16 +59,15 @@ AliMuonEventCuts::AliMuonEventCuts() :
   fSelectedTrigClassesInEvent(0x0)
 {
   /// Default ctor.
-  fParameters.Reset();
 }
 
 //________________________________________________________________________
 AliMuonEventCuts::AliMuonEventCuts(const char* name, const char* title ) :
 AliAnalysisCuts(name, title),
-  //fIsMC(kFALSE),
-  //fUseCustomParam(kFALSE),
-  fPhysicsSelectionMask(AliVEvent::kAny),
-  fParameters(TArrayD(kNParameters)),
+  fPhysicsSelectionMask(0),
+  fVertexMinNContributors(0),
+  fVertexVzMin(0.),
+  fVertexVzMax(0.),
   fDefaultTrigClassPatterns(""),
   fSelectedTrigPattern(new TObjArray()),
   fRejectedTrigPattern(new TObjArray()),
@@ -81,7 +78,6 @@ AliAnalysisCuts(name, title),
   fSelectedTrigClassesInEvent(new TObjArray())
 {
   /// Constructor
-  fParameters.Reset();
   SetDefaultParameters();
   SetDefaultFilterMask();
   SetDefaultTrigClassPatterns();
@@ -94,10 +90,10 @@ AliAnalysisCuts(name, title),
 //________________________________________________________________________
 AliMuonEventCuts::AliMuonEventCuts(const AliMuonEventCuts& obj) :
   AliAnalysisCuts(obj),
-  //fIsMC(obj.fIsMC),
-  //fUseCustomParam(obj.fUseCustomParam),
   fPhysicsSelectionMask(obj.fPhysicsSelectionMask),
-  fParameters(obj.fParameters),
+  fVertexMinNContributors(obj.fVertexMinNContributors),
+  fVertexVzMin(obj.fVertexVzMin),
+  fVertexVzMax(obj.fVertexVzMax),
   fDefaultTrigClassPatterns(obj.fDefaultTrigClassPatterns),
   fSelectedTrigPattern(obj.fSelectedTrigPattern),
   fRejectedTrigPattern(obj.fRejectedTrigPattern),
@@ -117,10 +113,10 @@ AliMuonEventCuts& AliMuonEventCuts::operator=(const AliMuonEventCuts& obj)
   /// Assignment operator
   if ( this != &obj ) { 
     AliAnalysisCuts::operator=(obj);
-    //fIsMC = obj.fIsMC;
-    //fUseCustomParam = obj.fUseCustomParam;
     fPhysicsSelectionMask = obj.fPhysicsSelectionMask;
-    fParameters = obj.fParameters;
+    fVertexMinNContributors = obj.fVertexMinNContributors,
+    fVertexVzMin = obj.fVertexVzMin;
+    fVertexVzMax = obj.fVertexVzMax;
     fDefaultTrigClassPatterns = obj.fDefaultTrigClassPatterns;
     fSelectedTrigPattern = obj.fSelectedTrigPattern;
     fRejectedTrigPattern = obj.fRejectedTrigPattern;
@@ -147,158 +143,6 @@ AliMuonEventCuts::~AliMuonEventCuts()
   delete fTimeStamp;
 }
 
-//________________________________________________________________________
-//Bool_t AliMuonEventCuts::RunMatchesRange( Int_t runNumber, const Char_t* objName ) const
-//{
-//  /// Check if the object contains the run
-//  TString sname(objName);
-//  TObjArray* array = sname.Tokenize("_");
-//  array->SetOwner();
-//  Int_t runRange[2] = { -1, -1 };
-//  if ( array->GetEntries() >= 3 ) {
-//    for ( Int_t irun=0; irun<2; ++irun ) {
-//      TString currRun = array->At(irun+1)->GetName();
-//      if ( currRun.IsDigit() ) runRange[irun] = currRun.Atoi();
-//    }
-//  }
-//  delete array;
-//  return ( runNumber >= runRange[0] && runNumber <= runRange[1]);
-//}
-//
-//________________________________________________________________________
-//void AliMuonEventCuts::SetUseCustomParam( Bool_t useCustomParam, Int_t runNumber  )
-//{
-//  /// Flag to select custom parameters
-//  /// It first searches the default parameters in OADB
-//  /// then disables the access to the OADB
-//  /// and allows to manually modify parameters
-//
-//  if ( ! fUseCustomParam && useCustomParam ) SetRun(runNumber);
-//  fUseCustomParam = useCustomParam;
-//}
-//
-//________________________________________________________________________
-//Bool_t AliMuonEventCuts::SetRun( Int_t runNumber )
-//{
-//  /// Get parameters from OADB for runNumber
-//  
-//  if ( fUseCustomParam ) return kFALSE;
-//  return StreamParameters(runNumber, -1);
-//}
-//
-//
-//________________________________________________________________________
-//Bool_t AliMuonEventCuts::StreamParameters( Int_t runNumber,  Int_t runMax )
-//{
-//  if ( runMax > 0 ) { // Stream to OADB
-//    if ( ! fUseCustomParam ) {
-//      AliError("Users are not allowed to update OADB. Use SetUseCustomParam() instead");
-//      return kFALSE;
-//    }
-//  }
-//
-//  TString filename = Form("%s/PWG/MUON/MuonEventCuts.root",AliAnalysisManager::GetOADBPath());
-//  if ( fIsMC ) filename.ReplaceAll(".root", "_MC.root");
-//
-//  TString parNames[kNParameters];
-//  parNames[kMeanDcaX]       = "MeanDcaX";
-//  parNames[kMeanDcaY]       = "MeanDcaY";
-//  parNames[kMeanDcaZ]       = "MeanDcaZ";
-//  parNames[kMeanPCorr23]    = "MeanPCorr23";
-//  parNames[kMeanPCorr310]   = "MeanPCorr310";
-//  parNames[kSigmaPdca23]    = "SigmaPdca23";
-//  parNames[kSigmaPdca310]   = "SigmaPdca310";
-//  parNames[kNSigmaPdcaCut]  = "NSigmaPdcaCut";
-//  parNames[kChi2NormCut]    = "Chi2NormCut";
-//  parNames[kRelPResolution] = "RelPResolution";
-//  parNames[kSharpPtApt]     = "SharpPtApt";
-//  parNames[kSharpPtLpt]     = "SharpPtLpt";
-//  parNames[kSharpPtHpt]     = "SharpPtHpt";
-//
-//  TObjArray* paramList = 0x0;
-//
-//  if ( runMax < 0 ) { // Get from OADB
-//    TFile* file = TFile::Open(filename.Data(), "READ");
-//    if ( ! file ) {
-//      AliError(Form("OADB file %s not found!", filename.Data()));
-//      return kFALSE;
-//    }
-//
-//    TList* listOfKeys = file->GetListOfKeys();
-//    TIter next(listOfKeys);
-//    TObject* key = 0x0;
-//    Bool_t foundMatch = kFALSE;
-//    TObject* defaultObj = 0x0;
-//    while ( ( key = next() ) ) {
-//      TString objName = key->GetName();
-//      objName.ToUpper();
-//      if ( RunMatchesRange(runNumber, objName.Data()) ) {
-//        paramList = static_cast<TObjArray*>(file->Get(key->GetName()));
-//        foundMatch = kTRUE;
-//        break;
-//      }
-//      if ( objName.Contains("DEFAULT") ) defaultObj = file->Get(key->GetName());
-//    }
-//
-//    if ( ! foundMatch ) {
-//      AliWarning("Run number not found in OADB: using default");
-//      if ( defaultObj ) paramList = static_cast<TObjArray*>(defaultObj);
-//      else {
-//        file->Close();
-//        AliError("Default parameters not found in OADB!");
-//        return kFALSE;
-//      }
-//    }
-//
-//    AliInfo(Form("Required run %i. Param. set: %s", runNumber, paramList->GetName()));
-//
-//    for ( Int_t ipar=0; ipar<kNParameters; ++ipar ) {
-//      TParameter<Double_t>* param = static_cast<TParameter<Double_t>*>(paramList->FindObject(parNames[ipar].Data()));
-//      if ( ! param ) {
-//        AliWarning(Form("Parameter %s not set", parNames[ipar].Data()));
-//        continue;
-//      }
-//      fParameters[ipar] = param->GetVal();
-//    }
-//
-//    file->Close();
-//  }
-//  else {
-//    if ( ! paramList ) {
-//      paramList = new TObjArray(kNParameters);
-//      paramList->SetOwner();
-//    }
-//    for ( Int_t ipar=0; ipar<kNParameters; ++ipar ) {
-//      TParameter<Double_t>* param= new TParameter<Double_t>(parNames[ipar].Data(), fParameters[ipar]);
-//      paramList->AddAt(param, ipar);
-//    }
-//
-//    TString paramListName = "EventCuts_";
-//    paramListName += ( runNumber < 0 ) ? "Default" : Form("%i_%i",runNumber, runMax);
-//    AliInfo(Form("Adding %s to file %s", paramListName.Data(), filename.Data()));
-//    paramList->SetName(paramListName.Data());
-//    TFile* file = TFile::Open(filename.Data(), "UPDATE");
-//    paramList->Write(paramListName.Data(), TObject::kSingleKey);
-//    file->Close();
-//    delete paramList;
-//  }
-//  return kTRUE;
-//}
-
-//________________________________________________________________________
-Bool_t AliMuonEventCuts::SetParameter(Int_t iparam, Float_t value)
-{
-  /// Set parameter
-//  if ( fUseCustomParam ) {
-    fParameters.SetAt(value, iparam);
-    return kTRUE;
-//  }
-//
-//  AliWarning("Parameters automatically taken from OADB. If you want to use with custom parameters, use SetUseCustomParam()");
-//  return kFALSE;
-}
-
-
 //________________________________________________________________________
 Bool_t AliMuonEventCuts::IsSelected( TObject* obj )
 {
@@ -458,7 +302,7 @@ void AliMuonEventCuts::SetTrigClassLevels ( TString pattern )
 }
 
 //________________________________________________________________________
-TArrayI AliMuonEventCuts::GetTrigClassPtCutLevel ( const TString trigClassName) const
+TArrayI AliMuonEventCuts::GetTrigClassPtCutLevel ( const TString trigClassName ) const
 {
   /// Get trigger class pt cut level for tracking/trigger matching
   TObject* obj = fAllSelectedTrigClasses->FindObject(trigClassName.Data());
@@ -540,10 +384,12 @@ void AliMuonEventCuts::BuildTriggerClasses ( const TString firedTrigClasses )
     fSelectedTrigClassesInEvent->AddLast(currTrig);
     
     if ( foundTrig ) continue;
-    AliInfo(Form("Adding %s (trig level %u) to considered trigger classes",trigName.Data(),trigLevel));
     TObjString* addTrig = new TObjString(trigName);
     addTrig->SetUniqueID(trigLevel);
     fAllSelectedTrigClasses->Add(addTrig);
+    TString trigLevelInfo = Form("trig level %i ", trigLevel & 0x3);
+    trigLevelInfo += ( trigLevel > 3 ) ? "di-muon" : "single-muon";
+    AliInfo(Form("Adding %s (%s) to considered trigger classes",trigName.Data(),trigLevelInfo.Data()));
   } // loop on trigger classes
   
   delete firedTrigClassesList;
@@ -638,8 +484,4 @@ void AliMuonEventCuts::Print(Option_t* option) const
     if ( filterMask & kGoodVertex )      printf("  SPD vertex with %i contributors && %g < Vz < %g\n", GetVertexMinNContributors(), GetVertexVzMin(), GetVertexVzMax());
     printf(" ******************** \n");
   }
-//  if ( sopt.Contains("param") ) {
-//    printf(" *** Muon track parameter summary: ***\n");
-//    printf(" ********************************\n");
-//  }
 }
index 533c8ee495bc15ed90d93d832bda77a8cf3a8885..7cea5a8d61d6781e46e3ce16d3a3bb8813d1ec06 100644 (file)
@@ -2,7 +2,6 @@
 #define ALIMUONEVENTCUTS_H
 
 #include "AliAnalysisCuts.h"
-#include "TArrayD.h"
 
 class AliVEvent;
 class AliVVertex;
@@ -36,13 +35,6 @@ class AliMuonEventCuts : public AliAnalysisCuts
   void SetDefaultFilterMask();
   void SetDefaultParameters();
   
-  enum {
-    kVertexMinNContributors,
-    kVertexVzMin,
-    kVertexVzMax,
-    kNParameters
-  };
-  
   // Handle trigger
   void SetTrigClassPatterns ( const TString pattern );
   /// Get default trigger class patterns
@@ -69,39 +61,29 @@ class AliMuonEventCuts : public AliAnalysisCuts
   
   
   /// Set minimum number of vertex contributors
-  void SetVertexMinNContributors ( const Int_t vertexMinNContributors ) { SetParameter(kVertexMinNContributors, (Double_t)vertexMinNContributors); }
+  void SetVertexMinNContributors ( const Int_t vertexMinNContributors ) { fVertexMinNContributors = vertexMinNContributors; }
   /// Get minimum number of vertex contributors
-  Int_t GetVertexMinNContributors () const { return (Int_t)fParameters[kVertexMinNContributors]; }
+  Int_t GetVertexMinNContributors () const { return fVertexMinNContributors; }
   /// Set Vz limits
-  void SetVertexVzLimits ( Double_t vzMin = -999., Double_t vzMax = 999. ) { SetParameter(kVertexVzMin, vzMin); SetParameter(kVertexVzMax, vzMax); }
+  void SetVertexVzLimits ( Double_t vzMin = -999., Double_t vzMax = 999. ) { fVertexVzMin = vzMin; fVertexVzMax = vzMax; }
   /// Get Vtx vz min
-  Double_t GetVertexVzMin () const { return fParameters[kVertexVzMin]; }
+  Double_t GetVertexVzMin () const { return fVertexVzMin; }
   /// Get Vtx vz max
-  Double_t GetVertexVzMax () const { return fParameters[kVertexVzMax]; }
-  
-  //Bool_t SetRun(Int_t runNumber);
-  //void SetUseCustomParam( Bool_t useCustomParam = kTRUE, Int_t runNumber = -1 );
-  //void SetIsMC(Bool_t isMC = kTRUE) { fIsMC = isMC; }
+  Double_t GetVertexVzMax () const { return fVertexVzMax; }
 
   void Print ( Option_t* option = "" ) const;
 
-  //Bool_t StreamParameters ( Int_t runNumber, Int_t maxRun );
-
  protected:
   
-  Bool_t SetParameter ( Int_t iparam, Float_t value );
   void BuildTriggerClasses ( const TString firedTrigClasses );
   Bool_t UpdateEvent( const AliVEvent* event );
   void SetDefaultTrigClassPatterns();
-  
-  //Bool_t RunMatchesRange ( Int_t runNumber, const Char_t* objName ) const;
-
-  //Bool_t fIsMC;             ///< Monte Carlo analysis
-  //Bool_t fUseCustomParam;   ///< Use custom parameters (do not search in OADB)
-  
+    
   UInt_t fPhysicsSelectionMask; ///< Physics selection mask
   
-  TArrayD fParameters;      ///< List of parameters
+  Int_t fVertexMinNContributors;  ///< Minimum number of SPD vertex contributors
+  Double_t fVertexVzMin;          ///< SPD vertex Vz min
+  Double_t fVertexVzMax;          ///< SPD vertex Vz max
   
   TString fDefaultTrigClassPatterns; ///< Default trigger class patterns
   TObjArray* fSelectedTrigPattern; ///< List of triggers to be kept
@@ -114,7 +96,7 @@ class AliMuonEventCuts : public AliAnalysisCuts
   AliTimeStamp* fTimeStamp; //!< current event time stamp
   TObjArray* fSelectedTrigClassesInEvent; //!< list of selected trigger classes in current event 
   
-  ClassDef(AliMuonEventCuts, 1); // Class for muon event filters
+  ClassDef(AliMuonEventCuts, 2); // Class for muon event filters
 };
 
 #endif
index 3340d8fd86a786fa51c748a082596275e77ef50e..df8d99c38db2b6dde0daa7e455666062002ec6e9 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "AliLog.h"
 #include "AliVParticle.h"
+#include "AliInputEventHandler.h"
 
 /// \cond CLASSIMP
 ClassImp(AliMuonPairCuts) // Class implementation in ROOT context
@@ -83,10 +84,10 @@ AliMuonPairCuts::~AliMuonPairCuts()
 }
 
 //________________________________________________________________________
-Bool_t AliMuonPairCuts::SetRun( Int_t runNumber )
+Bool_t AliMuonPairCuts::SetRun ( const AliInputEventHandler* eventHandler )
 {
   /// Get parameters from OADB for runNumber
-  return fMuonTrackCuts.SetRun(runNumber);
+  return fMuonTrackCuts.SetRun(eventHandler);
 }
 
 
@@ -199,8 +200,8 @@ Bool_t AliMuonPairCuts::TrackPtCutMatchTrigClass ( const AliVParticle* track1, c
   
   Bool_t matchTrackerPt1 = kTRUE, matchTrackerPt2 = kTRUE;
   if ( IsApplySharpPtCutInMatching() ) {
-    matchTrackerPt1 = ( track1->Pt() >= fMuonTrackCuts.GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
-    matchTrackerPt2 = ( track2->Pt() >= fMuonTrackCuts.GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
+    matchTrackerPt1 = ( track1->Pt() >= fMuonTrackCuts.GetMuonTrackCutsParam().GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
+    matchTrackerPt2 = ( track2->Pt() >= fMuonTrackCuts.GetMuonTrackCutsParam().GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
   }
   
   matchTrig1 = ( matchTrig1 && matchTrackerPt1 );
index fa77482e11dfab43b795b54357cfb7a09ee03c5d..222119d5e4b67a3d8b230b6b433fcc36223cfb25 100644 (file)
@@ -7,6 +7,7 @@
 class TList;
 class TVector3;
 class TArrayI;
+class AliInputEventHandler;
 
 class AliMuonPairCuts : public AliAnalysisCuts
 {
@@ -43,8 +44,8 @@ class AliMuonPairCuts : public AliAnalysisCuts
   
   void SetDefaultFilterMask();
 
-  Bool_t SetRun(Int_t runNumber);
-  void SetIsMC(Bool_t isMC = kTRUE);
+  Bool_t SetRun ( const AliInputEventHandler* eventHandler );
+  void SetIsMC ( Bool_t isMC = kTRUE );
 
   void Print ( Option_t* option = "" ) const;
   
index 6a022d852b1aad7b471dae79bbe1624760602d61..192c5f667125cc065edf7735e3543c1eaca86983 100644 (file)
 #include "AliLog.h"
 #include "AliVParticle.h"
 #include "AliESDMuonTrack.h"
-#include "AliAODTrack.h"
 #include "AliAnalysisManager.h"
+#include "AliInputEventHandler.h"
+#include "AliVEvent.h"
+
+#include "AliOADBContainer.h"
+
 #include "AliAnalysisMuonUtility.h"
 
 /// \cond CLASSIMP
@@ -45,10 +49,11 @@ AliMuonTrackCuts::AliMuonTrackCuts() :
   fIsMC(kFALSE),
   fUseCustomParam(kFALSE),
   fSharpPtCut(kFALSE),
-  fParameters(TArrayD(kNParameters))
+  fAllowDefaultParams(kFALSE),
+  fPassNumber(0),
+  fOADBParam()
 {
   /// Default ctor.
-  fParameters.Reset();
 }
 
 //________________________________________________________________________
@@ -57,10 +62,11 @@ AliAnalysisCuts(name, title),
   fIsMC(kFALSE),
   fUseCustomParam(kFALSE),
   fSharpPtCut(kFALSE),
-  fParameters(TArrayD(kNParameters))
+  fAllowDefaultParams(kFALSE),
+  fPassNumber(-1),
+  fOADBParam("muonTrackCutsParam")
 {
   /// Constructor
-  fParameters.Reset();
   SetDefaultFilterMask();
 }
 
@@ -71,7 +77,9 @@ AliMuonTrackCuts::AliMuonTrackCuts(const AliMuonTrackCuts& obj) :
   fIsMC(obj.fIsMC),
   fUseCustomParam(obj.fUseCustomParam),
   fSharpPtCut(obj.fSharpPtCut),
-  fParameters(obj.fParameters)
+  fAllowDefaultParams(obj.fAllowDefaultParams),
+  fPassNumber(obj.fPassNumber),
+  fOADBParam(obj.fOADBParam)
 {
   /// Copy constructor
 }
@@ -86,7 +94,9 @@ AliMuonTrackCuts& AliMuonTrackCuts::operator=(const AliMuonTrackCuts& obj)
     fIsMC = obj.fIsMC;
     fUseCustomParam = obj.fUseCustomParam;
     fSharpPtCut = obj.fSharpPtCut;
-    fParameters = obj.fParameters;
+    fAllowDefaultParams = obj.fAllowDefaultParams;
+    fPassNumber = obj.fPassNumber;
+    fOADBParam = obj.fOADBParam;
   }
   return *this;
 }
@@ -99,157 +109,113 @@ AliMuonTrackCuts::~AliMuonTrackCuts()
 }
 
 //________________________________________________________________________
-Bool_t AliMuonTrackCuts::RunMatchesRange( Int_t runNumber, const Char_t* objName ) const
-{
-  /// Check if the object contains the run
-  TString sname(objName);
-  TObjArray* array = sname.Tokenize("_");
-  array->SetOwner();
-  Int_t runRange[2] = { -1, -1 };
-  if ( array->GetEntries() >= 3 ) {
-    for ( Int_t irun=0; irun<2; ++irun ) {
-      TString currRun = array->At(irun+1)->GetName();
-      if ( currRun.IsDigit() ) runRange[irun] = currRun.Atoi();
-    }
-  }
-  delete array;
-  return ( runNumber >= runRange[0] && runNumber <= runRange[1]);
-}
-
-//________________________________________________________________________
-void AliMuonTrackCuts::SetUseCustomParam( Bool_t useCustomParam, Int_t runNumber  )
+void AliMuonTrackCuts::SetCustomParamFromRun( Int_t runNumber, Int_t passNumber )
 {
-  /// Flag to select custom parameters
   /// It first searches the default parameters in OADB
   /// then disables the access to the OADB
   /// and allows to manually modify parameters
 
-  if ( ! fUseCustomParam && useCustomParam ) SetRun(runNumber);
-  fUseCustomParam = useCustomParam;
+  if ( passNumber >= 0 ) fPassNumber = passNumber;
+  ReadParamFromOADB ( runNumber );
+  fUseCustomParam = kTRUE;
+  //AliWarning (Form("Setting parameters from run %i pass %i. From now on SetRun does NOTHING!!", runNumber, passNumber));
+  AliWarning (Form("From now on SetRun does NOTHING!!"));
+}
+
+
+//________________________________________________________________________
+AliOADBMuonTrackCutsParam* AliMuonTrackCuts::CustomParam ( )
+{
+  /// Returning the muon track cuts parameters (not const, so you can change the parameters)
+  /// CAVEAT: if you only want to Get the parameters, please use GetMuonTrackCutsParam()
+  /// If you want to modify the parameters, you need to call SetCustomParamFromRun at least once,
+  /// otherwise CustomParam returns a null pointer.
+  
+  if ( ! fUseCustomParam ) {
+    AliError("This method allows you to modify the paramaters.\nIf you only want to get them, please use GetMuonTrackCutsParam instead.\nOtherwise, please call at least once SetCustomParamFromRun.");
+    return 0x0;
+  }
+  return &fOADBParam;
 }
 
 //________________________________________________________________________
-Bool_t AliMuonTrackCuts::SetRun( Int_t runNumber )
+Bool_t AliMuonTrackCuts::SetRun ( const AliInputEventHandler* eventHandler )
 {
-  /// Get parameters from OADB for runNumber
+  /// Get parameters from OADB for current run
   
   if ( fUseCustomParam ) return kFALSE;
-  return StreamParameters(runNumber, -1);
+  Int_t runNumber = eventHandler->GetEvent()->GetRunNumber();
+  // First try to guess the pass from data
+  Int_t guessPassNumber = AliAnalysisMuonUtility::GetPassNumber(eventHandler);
+  if ( guessPassNumber >= 0 ) {
+    // If pass is found, it will be used instead of the one reuqested by the user
+    if ( fPassNumber >= 0 && fPassNumber != guessPassNumber ) AliWarning(Form("Using pass from data (pass%i) instead of the requested pass%i",guessPassNumber,fPassNumber));
+    fPassNumber = guessPassNumber;
+  }
+  return ReadParamFromOADB ( runNumber );
 }
 
 
 //________________________________________________________________________
-Bool_t AliMuonTrackCuts::StreamParameters( Int_t runNumber,  Int_t runMax )
+Bool_t AliMuonTrackCuts::ReadParamFromOADB ( Int_t runNumber )
 {
-  if ( runMax > 0 ) { // Stream to OADB
-    if ( ! fUseCustomParam ) {
-      AliError("Users are not allowed to update OADB. Use SetUseCustomParam() instead");
-      return kFALSE;
-    }
-  }
 
+  /// Read parameters from OADB
+  
+  if ( fPassNumber < 0 && ! fAllowDefaultParams ) AliFatal("Pass number not specified!");
+  
   TString filename = Form("%s/PWG/MUON/MuonTrackCuts.root",AliAnalysisManager::GetOADBPath());
   if ( fIsMC ) filename.ReplaceAll(".root", "_MC.root");
 
-  TString parNames[kNParameters];
-  parNames[kMeanDcaX]       = "MeanDcaX";
-  parNames[kMeanDcaY]       = "MeanDcaY";
-  parNames[kMeanDcaZ]       = "MeanDcaZ";
-  parNames[kMeanPCorr23]    = "MeanPCorr23";
-  parNames[kMeanPCorr310]   = "MeanPCorr310";
-  parNames[kSigmaPdca23]    = "SigmaPdca23";
-  parNames[kSigmaPdca310]   = "SigmaPdca310";
-  parNames[kNSigmaPdcaCut]  = "NSigmaPdcaCut";
-  parNames[kChi2NormCut]    = "Chi2NormCut";
-  parNames[kRelPResolution] = "RelPResolution";
-  parNames[kSharpPtApt]     = "SharpPtApt";
-  parNames[kSharpPtLpt]     = "SharpPtLpt";
-  parNames[kSharpPtHpt]     = "SharpPtHpt";
-
-  TObjArray* paramList = 0x0;
-
-  if ( runMax < 0 ) { // Get from OADB
-    TFile* file = TFile::Open(filename.Data(), "READ");
-    if ( ! file ) {
-      AliError(Form("OADB file %s not found!", filename.Data()));
-      return kFALSE;
-    }
-
-    TList* listOfKeys = file->GetListOfKeys();
-    TIter next(listOfKeys);
-    TObject* key = 0x0;
-    Bool_t foundMatch = kFALSE;
-    TObject* defaultObj = 0x0;
-    while ( ( key = next() ) ) {
-      TString objName = key->GetName();
-      objName.ToUpper();
-      if ( RunMatchesRange(runNumber, objName.Data()) ) {
-        paramList = static_cast<TObjArray*>(file->Get(key->GetName()));
-        foundMatch = kTRUE;
-        break;
-      }
-      if ( objName.Contains("DEFAULT") ) defaultObj = file->Get(key->GetName());
-    }
-
-    if ( ! foundMatch ) {
-      AliWarning("Run number not found in OADB: using default");
-      if ( defaultObj ) paramList = static_cast<TObjArray*>(defaultObj);
-      else {
-        file->Close();
-        AliError("Default parameters not found in OADB!");
-        return kFALSE;
-      }
-    }
-
-    AliInfo(Form("Required run %i. Param. set: %s", runNumber, paramList->GetName()));
+  TFile* file = TFile::Open(filename.Data(), "READ");
+  if ( ! file ) {
+    AliFatal(Form("OADB file %s not found!", filename.Data()));
+    return kFALSE;
+  }
 
-    for ( Int_t ipar=0; ipar<kNParameters; ++ipar ) {
-      TParameter<Double_t>* param = static_cast<TParameter<Double_t>*>(paramList->FindObject(parNames[ipar].Data()));
-      if ( ! param ) {
-        AliWarning(Form("Parameter %s not set", parNames[ipar].Data()));
-        continue;
-      }
-      fParameters[ipar] = param->GetVal();
+  // Search the container name to find the correct pass
+  AliOADBContainer* oadbContainer = 0x0;
+  Int_t foundPass = -999;
+  TList* listOfKeys = file->GetListOfKeys();
+  TIter next(listOfKeys);
+  TObject* key = 0x0;
+  // loop on keys
+  while ( ( key = next() ) ) {
+    Int_t currPass = AliAnalysisMuonUtility::GetPassNumber(key->GetName());
+    if ( ( fPassNumber < 0 ) ) {
+      if ( currPass < foundPass ) continue;
     }
-
-    file->Close();
+    else if ( currPass != fPassNumber ) continue;
+    oadbContainer = static_cast<AliOADBContainer*> (file->Get(key->GetName()));
+    foundPass = currPass;
+    if ( foundPass == fPassNumber ) break;
   }
-  else {
-    if ( ! paramList ) {
-      paramList = new TObjArray(kNParameters);
-      paramList->SetOwner();
-    }
-    for ( Int_t ipar=0; ipar<kNParameters; ++ipar ) {
-      TParameter<Double_t>* param= new TParameter<Double_t>(parNames[ipar].Data(), fParameters[ipar]);
-      paramList->AddAt(param, ipar);
-    }
-
-    TString paramListName = "MuonCuts_";
-    paramListName += ( runNumber < 0 ) ? "Default" : Form("%i_%i",runNumber, runMax);
-    AliInfo(Form("Adding %s to file %s", paramListName.Data(), filename.Data()));
-    paramList->SetName(paramListName.Data());
-    TFile* file = TFile::Open(filename.Data(), "UPDATE");
-    paramList->Write(paramListName.Data(), TObject::kSingleKey);
+  
+  if ( ! oadbContainer ) {
+    AliFatal(Form("Requested pass%i not found!", fPassNumber));
     file->Close();
-    delete paramList;
+    return kFALSE; // Not needed, but Coverity could complain
   }
-  return kTRUE;
-}
-
-//________________________________________________________________________
-Bool_t AliMuonTrackCuts::SetParameter(Int_t iparam, Double_t value)
-{
-  /// Set parameter
-  if ( fUseCustomParam ) {
-    fParameters.SetAt(value, iparam);
-    return kTRUE;
+  
+  if ( foundPass != fPassNumber ) AliWarning(Form("Requested pass%i not found: using pass%i", fPassNumber, foundPass));
+  
+  AliOADBMuonTrackCutsParam* currParams = static_cast<AliOADBMuonTrackCutsParam*> (oadbContainer->GetObject(runNumber, "default"));
+  Bool_t isDefault = oadbContainer->GetDefaultObject(currParams->GetName()) ? kTRUE : kFALSE;
+    
+  if ( isDefault ) {
+    if ( ! fAllowDefaultParams ) AliFatal(Form("Requested run %i not found in pass%i!", runNumber, foundPass));
+    else AliWarning(Form("Requested run %i not found in pass%i: using default", runNumber, foundPass));
   }
+    
+  fOADBParam = *currParams;
+  
+  file->Close();
 
-  AliWarning("Parameters automatically taken from OADB. If you want to use with custom parameters, use SetUseCustomParam()");
-  return kFALSE;
+  AliInfo(Form("Requested run %i pass %i. Param. set: %s (pass%i)", runNumber, fPassNumber, fOADBParam.GetName(), foundPass));
+  
+  return kTRUE;
 }
 
-
 //________________________________________________________________________
 Bool_t AliMuonTrackCuts::IsSelected( TObject* obj )
 {
@@ -284,11 +250,11 @@ UInt_t AliMuonTrackCuts::GetSelectionMask( const TObject* obj )
   Double_t pt = track->Pt();
   for ( Int_t ilevel=0; ilevel<3; ilevel++ ) {
     if ( matchTrig < ilevel+1 ) break;
-    if ( fSharpPtCut && pt < GetSharpPtCut(ilevel) ) break;
+    if ( fSharpPtCut && pt < fOADBParam.GetSharpPtCut(ilevel) ) break;
     selectionMask |= cutLevel[ilevel];
   }
 
-  if ( AliAnalysisMuonUtility::GetChi2perNDFtracker(track) < GetChi2NormCut() ) selectionMask |= kMuTrackChiSquare;
+  if ( AliAnalysisMuonUtility::GetChi2perNDFtracker(track) < fOADBParam.GetChi2NormCut() ) selectionMask |= kMuTrackChiSquare;
 
   TVector3 dcaAtVz = GetCorrectedDCA(track);
   Double_t pTotMean = GetAverageMomentum(track);
@@ -296,7 +262,8 @@ UInt_t AliMuonTrackCuts::GetSelectionMask( const TObject* obj )
   Double_t pDca = pTotMean * dcaAtVz.Mag();
     
   Double_t pTot = track->P();
-  Double_t rAbsEnd = AliAnalysisMuonUtility::GetRabs(track);
+  
+  Double_t sigmaPdca = IsThetaAbs23(track) ? fOADBParam.GetSigmaPdca23() : fOADBParam.GetSigmaPdca310();
   
   // Momentum resolution only
   // The cut depends on the momentum resolution. In particular:
@@ -310,7 +277,6 @@ UInt_t AliMuonTrackCuts::GetSelectionMask( const TObject* obj )
   
   //Double_t pResolutionEffect = 0.4 * pTot;  // Values used in 2010 data
   //Double_t pResolutionEffect = 0.32 * pTot; // Values in 2011
-  //Double_t sigmaPdca = GetSigmaPdca(rAbsEnd);
   //Double_t sigmaPdcaWithRes = TMath::Sqrt( sigmaPdca*sigmaPdca + pResolutionEffect*pResolutionEffect );
   
   // Momentum resolution and slope resolution 
@@ -325,13 +291,13 @@ UInt_t AliMuonTrackCuts::GetSelectionMask( const TObject* obj )
   // Finally the cut value has to be summed in quadrature with the error on DCA,
   // which is given by the slope resolution
   // p_meas x DCA < N * Sqrt( ( Sigma_pDCA_meas / ( 1 - N*Delta_s*p_meas / (1+n*Delta_s*p_meas)) )^2 + (distance * sigma_slope * p_meas )^2)
-  Double_t nrp = GetNSigmaPdca() * GetRelPResolution() * pTot;
-  Double_t pResolutionEffect = GetSigmaPdca(rAbsEnd) / ( 1. - nrp / ( 1. + nrp ) );
-  Double_t slopeResolutionEffect = 535. * GetSlopeResolution() * pTot;
+  Double_t nrp = fOADBParam.GetNSigmaPdca() * fOADBParam.GetRelPResolution() * pTot;
+  Double_t pResolutionEffect = sigmaPdca / ( 1. - nrp / ( 1. + nrp ) );
+  Double_t slopeResolutionEffect = 535. * fOADBParam.GetSlopeResolution() * pTot;
   
   Double_t sigmaPdcaWithRes = TMath::Sqrt( pResolutionEffect*pResolutionEffect + slopeResolutionEffect*slopeResolutionEffect );
   
-  if ( pDca < GetNSigmaPdca() * sigmaPdcaWithRes ) selectionMask |= kMuPdca;
+  if ( pDca < fOADBParam.GetNSigmaPdca() * sigmaPdcaWithRes ) selectionMask |= kMuPdca;
   
   AliDebug(1, Form("Selection mask 0x%x\n", selectionMask));
 
@@ -349,12 +315,10 @@ Bool_t AliMuonTrackCuts::IsSelected( TList* /* list */)
 
 
 //________________________________________________________________________
-Int_t AliMuonTrackCuts::GetThetaAbsBin ( Double_t rAtAbsEnd ) const
+Bool_t AliMuonTrackCuts::IsThetaAbs23 ( const AliVParticle* track ) const
 {
-  /// Get theta abs bin
-  Double_t thetaAbsEndDeg = TMath::ATan( rAtAbsEnd / 505. ) * TMath::RadToDeg();
-  Int_t thetaAbsBin = ( thetaAbsEndDeg < 3. ) ? kThetaAbs23 : kThetaAbs310;
-  return thetaAbsBin;
+  /// Check if theta_abs is smaller than 3 degrees
+  return ( AliAnalysisMuonUtility::GetThetaAbsDeg(track) < 3. );
 }
 
 
@@ -367,7 +331,7 @@ TVector3 AliMuonTrackCuts::GetCorrectedDCA ( const AliVParticle* track ) const
   
   TVector3 dcaTrack(AliAnalysisMuonUtility::GetXatDCA(track), AliAnalysisMuonUtility::GetYatDCA(track), AliAnalysisMuonUtility::GetZatDCA(track));
   
-  TVector3 dcaAtVz = dcaTrack - vertex - GetMeanDCA();
+  TVector3 dcaAtVz = dcaTrack - vertex - fOADBParam.GetMeanDCA();
 
   return dcaAtVz;
 }
@@ -382,139 +346,14 @@ Double_t AliMuonTrackCuts::GetAverageMomentum ( const AliVParticle* track ) cons
   //if ( isESD ) pTotMean = 0.5 * ( pTot + ((AliESDMuonTrack*)track)->PUncorrected() );
   if ( ! AliAnalysisMuonUtility::IsAODTrack(track) ) pTotMean = ((AliESDMuonTrack*)track)->PUncorrected(); // Increased stability if using uncorrected value
   else {
-    pTotMean = pTot - GetMeanPCorr(((AliAODTrack*)track)->GetRAtAbsorberEnd());
+    Double_t meanPcorr = IsThetaAbs23(track) ? fOADBParam.GetMeanPCorr23() : fOADBParam.GetMeanPCorr310();
+    pTotMean = pTot - meanPcorr;
   }
 
   return pTotMean;
 }
 
 
-//________________________________________________________________________
-void AliMuonTrackCuts::SetMeanDCA ( Double_t xAtDca, Double_t yAtDca, Double_t zAtDca )
-{
-    /// Set mean DCA from track
-  SetParameter(kMeanDcaX, xAtDca);
-  SetParameter(kMeanDcaY, yAtDca);
-  SetParameter(kMeanDcaZ, zAtDca);
-}
-
-//________________________________________________________________________
-TVector3 AliMuonTrackCuts::GetMeanDCA () const
-{ 
-    /// Get mean DCA from track
-  return TVector3(fParameters[kMeanDcaX], fParameters[kMeanDcaY], fParameters[kMeanDcaZ]);
-}
-
-//________________________________________________________________________
-void AliMuonTrackCuts::SetMeanPCorr ( Double_t pCorrThetaAbs23, Double_t pCorrThetaAbs310 )
-{
-  /// Set mean p correction
-  SetParameter(kMeanPCorr23, pCorrThetaAbs23);
-  SetParameter(kMeanPCorr310, pCorrThetaAbs310);
-}
-
-//________________________________________________________________________
-Double_t AliMuonTrackCuts::GetMeanPCorr ( Double_t rAtAbsEnd ) const
-{
-  /// Get mean p correction
-  return fParameters[kMeanPCorr23+GetThetaAbsBin(rAtAbsEnd)];
-}
-
-//________________________________________________________________________
-void AliMuonTrackCuts::SetSigmaPdca ( Double_t sigmaThetaAbs23, Double_t sigmaThetaAbs310 )
-{ 
-  /// Set sigma pdca
-  SetParameter(kSigmaPdca23, sigmaThetaAbs23);
-  SetParameter(kSigmaPdca310, sigmaThetaAbs310);
-}
-
-//________________________________________________________________________
-Double_t AliMuonTrackCuts::GetSigmaPdca ( Double_t rAtAbsEnd ) const
-{ 
-  /// Get mean pdca
-  return fParameters[kSigmaPdca23+GetThetaAbsBin(rAtAbsEnd)];
-}
-
-//________________________________________________________________________
-void AliMuonTrackCuts::SetNSigmaPdca ( Double_t nSigmas )
-{ 
-  /// Set N sigma pdca cut
-  SetParameter(kNSigmaPdcaCut, nSigmas);
-}
-
-//________________________________________________________________________
-Double_t AliMuonTrackCuts::GetNSigmaPdca () const
-{
-  /// Get N sigma pdca cut
-  return fParameters[kNSigmaPdcaCut];
-}
-
-//________________________________________________________________________
-void AliMuonTrackCuts::SetChi2NormCut ( Double_t chi2normCut )
-{
-  /// Set cut on normalized chi2 of tracks
-  SetParameter(kChi2NormCut,chi2normCut);
-}
-
-//________________________________________________________________________
-Double_t AliMuonTrackCuts::GetChi2NormCut () const
-{
-  /// Get cut on normalized chi2 of tracks
-  return fParameters[kChi2NormCut];
-}
-
-//________________________________________________________________________
-void AliMuonTrackCuts::SetRelPResolution ( Double_t relPResolution )
-{
-  /// Set relative momentum resolution
-  SetParameter(kRelPResolution,relPResolution);
-}
-
-//________________________________________________________________________
-Double_t AliMuonTrackCuts::GetRelPResolution () const
-{
-  /// Get relative momentum resolution
-  return fParameters[kRelPResolution];
-}
-
-
-//________________________________________________________________________
-void AliMuonTrackCuts::SetSlopeResolution ( Double_t slopeResolution )
-{
-  /// Set slope resolution
-  SetParameter(kSlopeResolution,slopeResolution);
-}
-
-//________________________________________________________________________
-Double_t AliMuonTrackCuts::GetSlopeResolution () const
-{
-  /// Get slope resolution
-  return fParameters[kSlopeResolution];
-}
-
-//________________________________________________________________________
-void AliMuonTrackCuts::SetSharpPtCut ( Double_t valueApt, Double_t valueLpt, Double_t valueHpt  )
-{
-  /// Set sharp tracker cut matching the trigger level
-
-  SetParameter(kSharpPtApt, valueApt);
-  SetParameter(kSharpPtLpt, valueLpt);
-  SetParameter(kSharpPtHpt, valueHpt);
-}
-
-//________________________________________________________________________
-Double_t AliMuonTrackCuts::GetSharpPtCut ( Int_t trigPtCut, Bool_t warn ) const
-{
-  /// Get sharp tracker cut matching the trigger level
-  /// trigPtCut can be 0 (Apt), 1 (Lpt) or 2 (Hpt)
-  if ( trigPtCut < 0 || trigPtCut > 2 ) {
-    if ( warn ) AliError("Allowed values for trigPtCut are 0 (Apt), 1 (Lpt), 2 (Hpt)");
-    return 0.;
-  }
-  Int_t ipar = kSharpPtApt + trigPtCut;
-  return fParameters[ipar];
-}
-
 //________________________________________________________________________
 void AliMuonTrackCuts::SetDefaultFilterMask ()
 {
@@ -529,7 +368,7 @@ Bool_t AliMuonTrackCuts::TrackPtCutMatchTrigClass ( const AliVParticle* track, c
   Int_t matchTrig = AliAnalysisMuonUtility::GetMatchTrigger(track);
   Bool_t matchTrackerPt = kTRUE;
   if ( IsApplySharpPtCutInMatching() ) {
-    matchTrackerPt = ( track->Pt() >= GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
+    matchTrackerPt = ( track->Pt() >= fOADBParam.GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
   }
   Bool_t passCut = ( ( matchTrig >= ptCutFromClass[0] ) && matchTrackerPt );
   AliDebug(1,Form("Class matchTrig %i %i  trackMatchTrig %i  trackPt %g (required %i)  passCut %i", ptCutFromClass[0], ptCutFromClass[1], matchTrig, track->Pt(), IsApplySharpPtCutInMatching(),passCut));
@@ -565,16 +404,5 @@ void AliMuonTrackCuts::Print(Option_t* option) const
     if ( filterMask & kMuTrackChiSquare ) printf("  Chi2 cut on track\n");
     printf(" ******************** \n");
   }
-  if ( sopt.Contains("param") ) {
-    printf(" *** Muon track parameter summary: ***\n");
-    printf("  Mean vertex DCA: (%g, %g, %g)\n", fParameters[kMeanDcaX], fParameters[kMeanDcaY], fParameters[kMeanDcaZ]);
-    printf("  Mean p correction (GeV/c): theta2-3 = %g  theta3-10 = %g\n", fParameters[kMeanPCorr23], fParameters[kMeanPCorr310]);
-    printf("  Sigma p x DCA (cm x GeV/c): theta2-3 = %g  theta3-10 = %g\n", fParameters[kSigmaPdca23], fParameters[kSigmaPdca310]);
-    printf("  Cut p x DCA in units of sigma: %g\n", fParameters[kNSigmaPdcaCut]);
-    printf("  Cut on track chi2/NDF: %g\n", fParameters[kChi2NormCut]);
-    printf("  Momentum resolution: %g\n", fParameters[kRelPResolution]);
-    printf("  Slope resolution: %g\n", fParameters[kSlopeResolution]);
-    printf("  Sharp pt cut: %g (Apt)  %g (Lpt)  %g (Hpt)\n", fParameters[kSharpPtApt], fParameters[kSharpPtLpt], fParameters[kSharpPtHpt]);
-    printf(" ********************************\n");
-  }
+  if ( sopt.Contains("param") ) fOADBParam.Print();
 }
index 9c2e109d4658d0d508955546911adeb1838e6df0..9e15c1979bfd8f25c19de6b880e973fd92159f11 100644 (file)
@@ -2,12 +2,13 @@
 #define ALIMUONTRACKCUTS_H
 
 #include "AliAnalysisCuts.h"
-#include "TArrayD.h"
+#include "AliOADBMuonTrackCutsParam.h"
 
-class AliVParticle;
 class TList;
-class TVector3;
 class TArrayI;
+class AliVParticle;
+class AliInputEventHandler;
+
 
 class AliMuonTrackCuts : public AliAnalysisCuts
 {
@@ -35,87 +36,45 @@ class AliMuonTrackCuts : public AliAnalysisCuts
   virtual Bool_t IsSelected ( TList* /*list */ );
   
   void SetDefaultFilterMask();
+  void SetPassNumber ( Int_t passNumber ) { fPassNumber = passNumber; }
+  void SetIsMC ( Bool_t isMC = kTRUE ) { fIsMC = isMC; }
+  void SetAllowDefaultParams ( Bool_t allowDefaultParams = kTRUE ) { fAllowDefaultParams = allowDefaultParams; }
+  void SetCustomParamFromRun ( Int_t runNumber = -1, Int_t passNumber = -1 );
+  
+  /// Get pass number
+  Int_t GetPassNumber () const { return fPassNumber; }
 
-  Bool_t SetRun(Int_t runNumber);
-  void SetUseCustomParam( Bool_t useCustomParam = kTRUE, Int_t runNumber = -1 );
-  void SetIsMC(Bool_t isMC = kTRUE) { fIsMC = isMC; }
-
+  Bool_t SetRun ( const AliInputEventHandler* eventHandler );
+  
   void Print ( Option_t* option = "" ) const;
   
   Bool_t TrackPtCutMatchTrigClass ( const AliVParticle* track, const TArrayI ptCutFromClass) const;
 
   TVector3 GetCorrectedDCA ( const AliVParticle* track ) const;
   Double_t GetAverageMomentum ( const AliVParticle* track ) const;
+  Bool_t IsThetaAbs23 ( const AliVParticle* track ) const;
 
-  enum {
-    kThetaAbs23,   ///< Theta_abs between 2 and 3 degrees
-    kThetaAbs310,  ///< Theta_abs between 3 and 10 degrees
-    kNthetaAbs     ///< Number of theta abs bins
-  };
-
-  // Parameters
-  enum {
-    kMeanDcaX,        ///< Average track DCA_x
-    kMeanDcaY,        ///< Average track DCA_y
-    kMeanDcaZ,        ///< Average track DCA_z
-    kMeanPCorr23,     ///< Average momentum correction in 2-3 deg
-    kMeanPCorr310,    ///< Average momentum correction in 3-10 deg
-    kSigmaPdca23,     ///< Sigma_PxDCA in 2-3 deg
-    kSigmaPdca310,    ///< Sigma_PxDCA in 3-10 deg
-    kNSigmaPdcaCut,   ///< Cut value in units of sigma_PxDCA
-    kChi2NormCut,     ///< Cut on the normalized chi2 of track
-    kRelPResolution,  ///< Relative momentum resolution
-    kSlopeResolution, ///< Slope resolution
-    kSharpPtApt,      ///< Sharp tracker pt cut for Apt
-    kSharpPtLpt,      ///< Sharp tracker pt cut for Lpt
-    kSharpPtHpt,      ///< Sharp tracker pt cut for Hpt
-    kNParameters      ///< Total number of parameters
-  };
-
-  void SetMeanDCA ( Double_t xAtDca, Double_t yAtDca, Double_t zAtDca = 0.);
-  TVector3 GetMeanDCA () const;
-
-  void SetMeanPCorr ( Double_t pCorrThetaAbs23, Double_t pCorrThetaAbs310 ); 
-  Double_t GetMeanPCorr ( Double_t rAtAbsEnd ) const;
-
-  void SetSigmaPdca ( Double_t sigmaThetaAbs23, Double_t sigmaThetaAbs310 );
-  Double_t GetSigmaPdca ( Double_t rAtAbsEnd ) const;
-
-  void SetNSigmaPdca ( Double_t nSigmas );
-  Double_t GetNSigmaPdca () const;
-
-  void SetChi2NormCut ( Double_t chi2normCut );
-  Double_t GetChi2NormCut () const;
-  
-  void SetRelPResolution ( Double_t relPResolution );
-  Double_t GetRelPResolution () const;
-  
-  void SetSlopeResolution ( Double_t slopeResolution );
-  Double_t GetSlopeResolution () const;
-  
-  void SetSharpPtCut ( Double_t valueApt, Double_t valueLpt, Double_t valueHpt );
-  Double_t GetSharpPtCut ( Int_t trigPtCut, Bool_t warn = kTRUE ) const;
-
-  Bool_t StreamParameters ( Int_t runNumber, Int_t maxRun );
-  
   /// Apply also sharp pt cut when matching with trigger
   void ApplySharpPtCutInMatching ( Bool_t sharpPtCut = kTRUE ) { fSharpPtCut = sharpPtCut; }
   /// Get flag to apply the sharp pt cut when matching with trigger
   Bool_t IsApplySharpPtCutInMatching () const { return fSharpPtCut; }
+  
+  /// Get track cuts param (you're not supposed to modify its content
+  const AliOADBMuonTrackCutsParam GetMuonTrackCutsParam () const { return fOADBParam; };
+  AliOADBMuonTrackCutsParam* CustomParam ();
 
  private:
   
-  Int_t GetThetaAbsBin ( Double_t rAtAbsEnd ) const;
-  Bool_t SetParameter ( Int_t iparam, Double_t value );
-  Bool_t RunMatchesRange ( Int_t runNumber, const Char_t* objName ) const;
-
-  Bool_t fIsMC;             ///< Monte Carlo analysis
-  Bool_t fUseCustomParam;   ///< Use custom parameters (do not search in OADB)
-  Bool_t fSharpPtCut;       ///< Flag to apply sharp pt cut in track-trigger matching
+  Bool_t ReadParamFromOADB ( Int_t runNumber );
 
-  TArrayD fParameters;      ///< List of parameters
+  Bool_t fIsMC;               ///< Monte Carlo analysis
+  Bool_t fUseCustomParam;     ///< Use custom parameters (do not search in OADB)
+  Bool_t fSharpPtCut;         ///< Flag to apply sharp pt cut in track-trigger matching
+  Bool_t fAllowDefaultParams; ///< Flag to allow default parameters from OADB
+  Int_t fPassNumber;          ///< Pass number
+  AliOADBMuonTrackCutsParam fOADBParam; ///< Track param in OADB
 
-  ClassDef(AliMuonTrackCuts, 3); // Class for muon track filters
+  ClassDef(AliMuonTrackCuts, 4); // Class for muon track filters
 };
  
 #endif
diff --git a/PWG/muon/AliOADBMuonTrackCutsParam.cxx b/PWG/muon/AliOADBMuonTrackCutsParam.cxx
new file mode 100644 (file)
index 0000000..8dd67ce
--- /dev/null
@@ -0,0 +1,284 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+#include "AliOADBMuonTrackCutsParam.h"
+
+#include "TVector3.h"
+
+#include "AliLog.h"
+
+using namespace std;
+
+ClassImp(AliOADBMuonTrackCutsParam)
+
+
+//________________________________________________________________________
+AliOADBMuonTrackCutsParam::AliOADBMuonTrackCutsParam () :
+TNamed("AliOADBMuonTrackCutsParam", "OADB object for Muon track cuts"),
+fMeanDcaX(0.),
+fMeanDcaY(0.),
+fMeanDcaZ(0.),
+fMeanPCorr23(0.),
+fMeanPCorr310(0.),
+fSigmaPdca23(0.),
+fSigmaPdca310(0.),
+fNSigmaPdcaCut(0.),
+fChi2NormCut(0.),
+fRelPResolution(0.),
+fSlopeResolution(0.),
+fSharpPtApt(0.),
+fSharpPtLpt(0.),
+fSharpPtHpt(0.)
+{
+  // default ctor
+}
+
+
+//________________________________________________________________________
+AliOADBMuonTrackCutsParam::AliOADBMuonTrackCutsParam ( const char* name ) :
+TNamed(name, "OADB object for Muon track cuts"),
+fMeanDcaX(0.),
+fMeanDcaY(0.),
+fMeanDcaZ(0.),
+fMeanPCorr23(0.),
+fMeanPCorr310(0.),
+fSigmaPdca23(0.),
+fSigmaPdca310(0.),
+fNSigmaPdcaCut(0.),
+fChi2NormCut(0.),
+fRelPResolution(0.),
+fSlopeResolution(0.),
+fSharpPtApt(0.),
+fSharpPtLpt(0.),
+fSharpPtHpt(0.)
+{
+  // ctor, better use this one
+}
+
+
+//________________________________________________________________________
+AliOADBMuonTrackCutsParam::~AliOADBMuonTrackCutsParam()
+{
+  // dtor
+}
+
+//________________________________________________________________________
+AliOADBMuonTrackCutsParam::AliOADBMuonTrackCutsParam ( const AliOADBMuonTrackCutsParam& other ) :
+TNamed ( other ),
+fMeanDcaX ( other.fMeanDcaX ),
+fMeanDcaY ( other.fMeanDcaY ),
+fMeanDcaZ ( other.fMeanDcaZ ),
+fMeanPCorr23 ( other.fMeanPCorr23 ),
+fMeanPCorr310 ( other.fMeanPCorr310 ),
+fSigmaPdca23 ( other.fSigmaPdca23 ),
+fSigmaPdca310 ( other.fSigmaPdca310 ),
+fNSigmaPdcaCut ( other.fNSigmaPdcaCut ),
+fChi2NormCut ( other.fChi2NormCut ),
+fRelPResolution ( other.fRelPResolution ),
+fSlopeResolution ( other.fSlopeResolution ),
+fSharpPtApt ( other.fSharpPtApt ),
+fSharpPtLpt ( other.fSharpPtLpt ),
+fSharpPtHpt ( other.fSharpPtHpt )
+{
+// Copy ctor  
+}
+
+
+//________________________________________________________________________
+AliOADBMuonTrackCutsParam& AliOADBMuonTrackCutsParam::operator=(const AliOADBMuonTrackCutsParam& other)
+{
+  //Assignment operator
+  if ( &other == this ) return *this;
+  TNamed::operator=(other);
+
+  fMeanDcaX = other.fMeanDcaX;
+  fMeanDcaY = other.fMeanDcaY;
+  fMeanDcaZ = other.fMeanDcaZ;
+  fMeanPCorr23 = other.fMeanPCorr23;
+  fMeanPCorr310 = other.fMeanPCorr310;
+  fSigmaPdca23 = other.fSigmaPdca23;
+  fSigmaPdca310 = other.fSigmaPdca310;
+  fNSigmaPdcaCut = other.fNSigmaPdcaCut;
+  fChi2NormCut = other.fChi2NormCut;
+  fRelPResolution = other.fRelPResolution;
+  fSlopeResolution = other.fSlopeResolution;
+  fSharpPtApt = other.fSharpPtApt;
+  fSharpPtLpt = other.fSharpPtLpt;
+  fSharpPtHpt = other.fSharpPtHpt;
+
+  return *this;
+}
+
+//________________________________________________________________________
+void AliOADBMuonTrackCutsParam::SetMeanDCA ( Double_t xAtDca, Double_t yAtDca, Double_t zAtDca )
+{
+  /// Set mean DCA from track
+  fMeanDcaX = xAtDca;
+  fMeanDcaY = yAtDca;
+  fMeanDcaZ = zAtDca;
+}
+
+//________________________________________________________________________
+TVector3 AliOADBMuonTrackCutsParam::GetMeanDCA () const
+{ 
+  /// Get mean DCA from track
+  return TVector3 ( fMeanDcaX, fMeanDcaY, fMeanDcaZ );
+}
+
+
+//________________________________________________________________________
+void AliOADBMuonTrackCutsParam::SetMeanPCorr ( Double_t pCorrThetaAbs23, Double_t pCorrThetaAbs310 )
+{
+  /// Set mean p correction
+  fMeanPCorr23 = pCorrThetaAbs23;
+  fMeanPCorr310 = pCorrThetaAbs310;
+}
+
+//________________________________________________________________________
+Double_t AliOADBMuonTrackCutsParam::GetMeanPCorr23 ( ) const
+{
+  /// Get mean p correction in 2<theta_abs<3 deg
+  return fMeanPCorr23;
+}
+
+//________________________________________________________________________
+Double_t AliOADBMuonTrackCutsParam::GetMeanPCorr310 ( ) const
+{
+  /// Get mean p correction in 3<theta_abs<10 deg
+  return fMeanPCorr310;
+}
+
+//________________________________________________________________________
+void AliOADBMuonTrackCutsParam::SetSigmaPdca ( Double_t sigmaThetaAbs23, Double_t sigmaThetaAbs310 )
+{ 
+  /// Set sigma pdca
+  fSigmaPdca23 = sigmaThetaAbs23;
+  fSigmaPdca310 = sigmaThetaAbs310;
+}
+
+//________________________________________________________________________
+Double_t AliOADBMuonTrackCutsParam::GetSigmaPdca23 ( ) const
+{ 
+  /// Get mean pdca in 2<theta_abs<3 deg
+  return fSigmaPdca23;
+}
+
+//________________________________________________________________________
+Double_t AliOADBMuonTrackCutsParam::GetSigmaPdca310 ( ) const
+{ 
+  /// Get mean pdca in 3<theta_abs<10 deg
+  return fSigmaPdca310;
+}
+
+//________________________________________________________________________
+void AliOADBMuonTrackCutsParam::SetNSigmaPdca ( Double_t nSigmas )
+{ 
+  /// Set N sigma pdca cut
+  fNSigmaPdcaCut = nSigmas;
+}
+
+//________________________________________________________________________
+Double_t AliOADBMuonTrackCutsParam::GetNSigmaPdca () const
+{
+  /// Get N sigma pdca cut
+  return fNSigmaPdcaCut;
+}
+
+//________________________________________________________________________
+void AliOADBMuonTrackCutsParam::SetChi2NormCut ( Double_t chi2normCut )
+{
+  /// Set cut on normalized chi2 of tracks
+  fChi2NormCut = chi2normCut;
+}
+
+//________________________________________________________________________
+Double_t AliOADBMuonTrackCutsParam::GetChi2NormCut () const
+{
+  /// Get cut on normalized chi2 of tracks
+  return fChi2NormCut;
+}
+
+//________________________________________________________________________
+void AliOADBMuonTrackCutsParam::SetRelPResolution ( Double_t relPResolution )
+{
+  /// Set relative momentum resolution
+  fRelPResolution = relPResolution;
+}
+
+//________________________________________________________________________
+Double_t AliOADBMuonTrackCutsParam::GetRelPResolution () const
+{
+  /// Get relative momentum resolution
+  return fRelPResolution;
+}
+
+
+//________________________________________________________________________
+void AliOADBMuonTrackCutsParam::SetSlopeResolution ( Double_t slopeResolution )
+{
+  /// Set slope resolution
+  fSlopeResolution = slopeResolution;
+}
+
+//________________________________________________________________________
+Double_t AliOADBMuonTrackCutsParam::GetSlopeResolution () const
+{
+  /// Get slope resolution
+  return fSlopeResolution;
+}
+
+//________________________________________________________________________
+void AliOADBMuonTrackCutsParam::SetSharpPtCut ( Double_t valueApt, Double_t valueLpt, Double_t valueHpt  )
+{
+  /// Set sharp tracker cut matching the trigger level
+  
+  fSharpPtApt = valueApt;
+  fSharpPtLpt = valueLpt;
+  fSharpPtHpt = valueHpt;
+}
+
+//________________________________________________________________________
+Double_t AliOADBMuonTrackCutsParam::GetSharpPtCut ( Int_t trigPtCut, Bool_t warn ) const
+{
+  /// Get sharp tracker cut matching the trigger level
+  /// trigPtCut can be 0 (Apt), 1 (Lpt) or 2 (Hpt)
+  switch ( trigPtCut ) {
+  case 0:
+    return fSharpPtApt;
+  case 1:
+    return fSharpPtLpt;
+  case 2:
+    return fSharpPtHpt;
+  }
+  
+  if ( warn ) AliError("Allowed values for trigPtCut are 0 (Apt), 1 (Lpt), 2 (Hpt)");
+  return 0.;
+}
+
+//________________________________________________________________________
+void AliOADBMuonTrackCutsParam::Print ( Option_t* /*option*/ ) const
+{
+  /// Print info
+  printf(" *** Muon track parameter summary: ***\n");
+  printf("  Mean vertex DCA: (%g, %g, %g)\n", fMeanDcaX, fMeanDcaY, fMeanDcaZ);
+  printf("  Mean p correction (GeV/c): theta2-3 = %g  theta3-10 = %g\n", fMeanPCorr23, fMeanPCorr310);
+  printf("  Sigma p x DCA (cm x GeV/c): theta2-3 = %g  theta3-10 = %g\n", fSigmaPdca23, fSigmaPdca310);
+  printf("  Cut p x DCA in units of sigma: %g\n", fNSigmaPdcaCut);
+  printf("  Cut on track chi2/NDF: %g\n", fChi2NormCut);
+  printf("  Momentum resolution: %g\n", fRelPResolution);
+  printf("  Slope resolution: %g\n", fSlopeResolution);
+  printf("  Sharp pt cut: %g (Apt)  %g (Lpt)  %g (Hpt)\n", fSharpPtApt, fSharpPtLpt, fSharpPtHpt);
+  printf(" ********************************\n");
+}
diff --git a/PWG/muon/AliOADBMuonTrackCutsParam.h b/PWG/muon/AliOADBMuonTrackCutsParam.h
new file mode 100644 (file)
index 0000000..fc144bf
--- /dev/null
@@ -0,0 +1,76 @@
+#ifndef AliOADBMuonTrackCutsParam_H
+#define AliOADBMuonTrackCutsParam_H
+/* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+//-------------------------------------------------------------------------
+//     OADB interface for the Muon track cuts
+//     Author: Diego Stocco
+//    
+// This class contains the parameters needed to configure the
+// muon track cuts
+// -------------------------------------------------------------------------
+
+#include <TNamed.h>
+
+class TVector3;
+
+class AliOADBMuonTrackCutsParam : public TNamed {
+
+ public :
+  AliOADBMuonTrackCutsParam ();
+  AliOADBMuonTrackCutsParam ( const char* name );
+  virtual ~AliOADBMuonTrackCutsParam ();
+  AliOADBMuonTrackCutsParam ( const AliOADBMuonTrackCutsParam& other ); 
+  AliOADBMuonTrackCutsParam& operator = ( const AliOADBMuonTrackCutsParam& other );
+  
+  void SetMeanDCA ( Double_t xAtDca, Double_t yAtDca, Double_t zAtDca = 0. );
+  TVector3 GetMeanDCA () const;
+  
+  void SetMeanPCorr ( Double_t pCorrThetaAbs23, Double_t pCorrThetaAbs310 ); 
+  Double_t GetMeanPCorr23 ( ) const;
+  Double_t GetMeanPCorr310 ( ) const;
+  
+  void SetSigmaPdca ( Double_t sigmaThetaAbs23, Double_t sigmaThetaAbs310 );
+  Double_t GetSigmaPdca23 ( ) const;
+  Double_t GetSigmaPdca310 ( ) const;
+  
+  void SetNSigmaPdca ( Double_t nSigmas );
+  Double_t GetNSigmaPdca () const;
+  
+  void SetChi2NormCut ( Double_t chi2normCut );
+  Double_t GetChi2NormCut () const;
+  
+  void SetRelPResolution ( Double_t relPResolution );
+  Double_t GetRelPResolution () const;
+  
+  void SetSlopeResolution ( Double_t slopeResolution );
+  Double_t GetSlopeResolution () const;
+  
+  void SetSharpPtCut ( Double_t valueApt, Double_t valueLpt, Double_t valueHpt );
+  Double_t GetSharpPtCut ( Int_t trigPtCut, Bool_t warn = kTRUE ) const;
+  
+  void Print ( Option_t* option = "" ) const;
+
+ private :
+  Double_t fMeanDcaX;        ///< Average track DCA_x
+  Double_t fMeanDcaY;        ///< Average track DCA_y
+  Double_t fMeanDcaZ;        ///< Average track DCA_z
+  Double_t fMeanPCorr23;     ///< Average momentum correction in 2-3 deg
+  Double_t fMeanPCorr310;    ///< Average momentum correction in 3-10 deg
+  Double_t fSigmaPdca23;     ///< Sigma_PxDCA in 2-3 deg
+  Double_t fSigmaPdca310;    ///< Sigma_PxDCA in 3-10 deg
+  Double_t fNSigmaPdcaCut;   ///< Cut value in units of sigma_PxDCA
+  Double_t fChi2NormCut;     ///< Cut on the normalized chi2 of track
+  Double_t fRelPResolution;  ///< Relative momentum resolution
+  Double_t fSlopeResolution; ///< Slope resolution
+  Double_t fSharpPtApt;      ///< Sharp tracker pt cut for Apt
+  Double_t fSharpPtLpt;      ///< Sharp tracker pt cut for Lpt
+  Double_t fSharpPtHpt;      ///< Sharp tracker pt cut for Hpt
+  
+  ClassDef(AliOADBMuonTrackCutsParam, 1);
+};
+
+#endif
index bee6e34f84a46b5142f8fe93d1c7b91f6c5dff61..cec8bd8c40362a23589b63fdc9be41ebae4dc80d 100644 (file)
@@ -241,8 +241,8 @@ void AliVAnalysisMuon::FinishTaskOutput()
 void AliVAnalysisMuon::NotifyRun()
 {
   /// Set run number for cuts
-  if ( fMuonTrackCuts ) fMuonTrackCuts->SetRun(fCurrentRunNumber);
-  if ( fMuonPairCuts ) fMuonPairCuts->SetRun(fCurrentRunNumber);
+  if ( fMuonTrackCuts ) fMuonTrackCuts->SetRun(fInputHandler);
+  if ( fMuonPairCuts ) fMuonPairCuts->SetRun(fInputHandler);
 }
 
 //___________________________________________________________________________
index 876f7cea8117f1eabdd264624bf5ae4333a87a99..8461814ffb71b34bea25d214c57e4577404b3ad5 100644 (file)
@@ -37,7 +37,8 @@ AliAnalysisTaskMuonCuts* AddTaskMuonCuts(Bool_t isMC = kFALSE)
   // Create cuts
   AliMuonTrackCuts* muonTrackCuts = new AliMuonTrackCuts("TestStandardMuonTrackCuts", "TestStandardMuonTrackCuts");
   muonTrackCuts->SetIsMC(isMC);
-  muonTrackCuts->SetUseCustomParam(kTRUE);
+  muonTrackCuts->SetAllowDefaultParams();
+  muonTrackCuts->SetCustomParamFromRun();
 
   // Create task
   AliAnalysisTaskMuonCuts *muonCutsAnalysisTask = new AliAnalysisTaskMuonCuts("MuonCutsTask", *muonTrackCuts);
index e1feda5829409f690c87555ead45eab53cebaf71..b53a3f4ba4465025b103e9e955afca67d2359932 100644 (file)
@@ -200,7 +200,7 @@ void AliAnalysisTaskMuonCuts::ProcessEvent(TString physSel, const TObjArray& sel
   Int_t nTracks = AliAnalysisMuonUtility::GetNTracks(InputEvent());
   for (Int_t itrack = 0; itrack < nTracks; itrack++) {
     track = AliAnalysisMuonUtility::GetTrack(itrack, InputEvent());
-    fMuonTrackCuts->SetNSigmaPdca(1.e10);
+    fMuonTrackCuts->CustomParam()->SetNSigmaPdca(1.e10);
     if ( ! fMuonTrackCuts->IsSelected(track) ) continue;
 
     Double_t thetaAbsEndDeg = AliAnalysisMuonUtility::GetThetaAbsDeg(track);
@@ -213,7 +213,8 @@ void AliAnalysisTaskMuonCuts::ProcessEvent(TString physSel, const TObjArray& sel
     Double_t dca = dcaAtVz.Mag();
     Double_t pDca = pTotMean * dca;
 
-    Double_t chi2 = pDca / fMuonTrackCuts->GetSigmaPdca(AliAnalysisMuonUtility::GetRabs(track)) ;
+    Double_t sigmaPdca = fMuonTrackCuts->IsThetaAbs23(track) ? fMuonTrackCuts->GetMuonTrackCutsParam().GetSigmaPdca23() : fMuonTrackCuts->GetMuonTrackCutsParam().GetSigmaPdca310();
+    Double_t chi2 = pDca / sigmaPdca;
     chi2 *= chi2;
     Double_t chiProb = TMath::Prob(chi2, 2);
 
@@ -243,7 +244,7 @@ void AliAnalysisTaskMuonCuts::ProcessEvent(TString physSel, const TObjArray& sel
     } // loop on selected trigger classes
 
     for ( Int_t isigma=0; isigma<fSigmaCuts.GetSize(); ++isigma) {
-      fMuonTrackCuts->SetNSigmaPdca(fSigmaCuts[isigma]);
+      fMuonTrackCuts->CustomParam()->SetNSigmaPdca(fSigmaCuts[isigma]);
       if ( ! fMuonTrackCuts->IsSelected(track) ) continue;
       for ( Int_t itrig=0; itrig<selectTrigClasses.GetEntries(); ++itrig ) {
         TString trigClassName = ((TObjString*)selectTrigClasses.At(itrig))->GetString();
@@ -421,10 +422,10 @@ void AliAnalysisTaskMuonCuts::Terminate(Option_t *) {
   //////////////
   // Fit pDCA //
   //////////////
-  Double_t nSigmaCut = fMuonTrackCuts->GetNSigmaPdca(); //6.;
-  Double_t sigmaMeasCut[2] = { fMuonTrackCuts->GetSigmaPdca(505.*TMath::Tan(2.5 * TMath::DegToRad())), fMuonTrackCuts->GetSigmaPdca(505.*TMath::Tan(4.5 * TMath::DegToRad()))}; //{99., 54.}; //{120., 63.};
-  Double_t relPResolution = fMuonTrackCuts->GetRelPResolution(); //4.5e-4; //6.e-3;//8.e-4;
-  Double_t angleResolution = 535.*fMuonTrackCuts->GetSlopeResolution(); //6.e-4;
+  Double_t nSigmaCut = fMuonTrackCuts->GetMuonTrackCutsParam().GetNSigmaPdca(); //6.;
+  Double_t sigmaMeasCut[2] = { fMuonTrackCuts->GetMuonTrackCutsParam().GetSigmaPdca23(), fMuonTrackCuts->GetMuonTrackCutsParam().GetSigmaPdca310()}; //{99., 54.}; //{120., 63.};
+  Double_t relPResolution = fMuonTrackCuts->GetMuonTrackCutsParam().GetRelPResolution(); //4.5e-4; //6.e-3;//8.e-4;
+  Double_t angleResolution = 535.*fMuonTrackCuts->GetMuonTrackCutsParam().GetSlopeResolution(); //6.e-4;
   Double_t pMinCut = 0.1;
   Double_t pMaxCut =  800.;
   const Int_t kNCutFuncs = 2;
index 9da1d84647543f018e4b8b0425d8209ba865e4e2..c3728fc67a71872e83edf739eb82ff9274e4d83d 100644 (file)
@@ -45,6 +45,7 @@
 #include "AliCounterCollection.h"
 
 // PWG includes
+#include "AliAnalysisMuonUtility.h"
 #include "AliMuonTrackCuts.h"
 
 using std::cout;
@@ -113,6 +114,7 @@ AliAnalysisTaskMuonQA::AliAnalysisTaskMuonQA(const char *name) :
   DefineOutput(5,TObjArray::Class());
   
   fTrackCuts->SetFilterMask(AliMuonTrackCuts::kMuEta | AliMuonTrackCuts::kMuThetaAbs | AliMuonTrackCuts::kMuPdca );
+  fTrackCuts->SetAllowDefaultParams(kTRUE);
 }
 
 //________________________________________________________________________
@@ -136,7 +138,7 @@ AliAnalysisTaskMuonQA::~AliAnalysisTaskMuonQA()
 void AliAnalysisTaskMuonQA::NotifyRun()
 {
   /// Notify run
-  fTrackCuts->SetRun(fCurrentRunNumber);
+  fTrackCuts->SetRun(fInputHandler);
 }