muon/AliMergeableCollection.cxx
muon/AliVAnalysisMuon.cxx
muon/AliAnalysisTaskFlowSingleMu.cxx
- muon/AliAnalysisMuonUtility.cxx
+ muon/AliAnalysisMuonUtility.cxx
+ muon/AliOADBMuonTrackCutsParam.cxx
)
string ( REPLACE ".cxx" ".h" HDRS "${SRCS}" )
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;
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;
class AliMCParticle;
class AliFlowTrack;
class AliMCEvent;
+class AliInputEventHandler;
class AliVEvent;
class AliMultiplicity;
class AliAODTracklets; // XZhang 20120615
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();}
#pragma link C++ class AliVAnalysisMuon+;
#pragma link C++ class AliAnalysisTaskFlowSingleMu+;
#pragma link C++ class AliAnalysisMuonUtility+;
+#pragma link C++ class AliOADBMuonTrackCutsParam+;
#endif
#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
}
+//________________________________________________________________________
+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,
#include "TString.h"
class TLorentzVector;
+class AliInputEventHandler;
class AliVEvent;
class AliMCEvent;
class AliVParticle;
// 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);
};
{
// 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;
}
#include "TMath.h"
#include "THashList.h"
-#include "TArrayD.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TFile.h"
#include "AliTimeStamp.h"
#include "AliAnalysisMuonUtility.h"
-//#include "AliAnalysisManager.h"
/// \cond CLASSIMP
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),
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()),
fSelectedTrigClassesInEvent(new TObjArray())
{
/// Constructor
- fParameters.Reset();
SetDefaultParameters();
SetDefaultFilterMask();
SetDefaultTrigClassPatterns();
//________________________________________________________________________
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),
/// 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;
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 )
{
}
//________________________________________________________________________
-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());
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;
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");
-// }
}
#define ALIMUONEVENTCUTS_H
#include "AliAnalysisCuts.h"
-#include "TArrayD.h"
class AliVEvent;
class AliVVertex;
void SetDefaultFilterMask();
void SetDefaultParameters();
- enum {
- kVertexMinNContributors,
- kVertexVzMin,
- kVertexVzMax,
- kNParameters
- };
-
// Handle trigger
void SetTrigClassPatterns ( const TString pattern );
/// Get default trigger class patterns
/// 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
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
#include "AliLog.h"
#include "AliVParticle.h"
+#include "AliInputEventHandler.h"
/// \cond CLASSIMP
ClassImp(AliMuonPairCuts) // Class implementation in ROOT context
}
//________________________________________________________________________
-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);
}
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 );
class TList;
class TVector3;
class TArrayI;
+class AliInputEventHandler;
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;
#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
fIsMC(kFALSE),
fUseCustomParam(kFALSE),
fSharpPtCut(kFALSE),
- fParameters(TArrayD(kNParameters))
+ fAllowDefaultParams(kFALSE),
+ fPassNumber(0),
+ fOADBParam()
{
/// Default ctor.
- fParameters.Reset();
}
//________________________________________________________________________
fIsMC(kFALSE),
fUseCustomParam(kFALSE),
fSharpPtCut(kFALSE),
- fParameters(TArrayD(kNParameters))
+ fAllowDefaultParams(kFALSE),
+ fPassNumber(-1),
+ fOADBParam("muonTrackCutsParam")
{
/// Constructor
- fParameters.Reset();
SetDefaultFilterMask();
}
fIsMC(obj.fIsMC),
fUseCustomParam(obj.fUseCustomParam),
fSharpPtCut(obj.fSharpPtCut),
- fParameters(obj.fParameters)
+ fAllowDefaultParams(obj.fAllowDefaultParams),
+ fPassNumber(obj.fPassNumber),
+ fOADBParam(obj.fOADBParam)
{
/// Copy constructor
}
fIsMC = obj.fIsMC;
fUseCustomParam = obj.fUseCustomParam;
fSharpPtCut = obj.fSharpPtCut;
- fParameters = obj.fParameters;
+ fAllowDefaultParams = obj.fAllowDefaultParams;
+ fPassNumber = obj.fPassNumber;
+ fOADBParam = obj.fOADBParam;
}
return *this;
}
}
//________________________________________________________________________
-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 )
{
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);
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:
//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
// 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));
//________________________________________________________________________
-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. );
}
TVector3 dcaTrack(AliAnalysisMuonUtility::GetXatDCA(track), AliAnalysisMuonUtility::GetYatDCA(track), AliAnalysisMuonUtility::GetZatDCA(track));
- TVector3 dcaAtVz = dcaTrack - vertex - GetMeanDCA();
+ TVector3 dcaAtVz = dcaTrack - vertex - fOADBParam.GetMeanDCA();
return dcaAtVz;
}
//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 ()
{
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));
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();
}
#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
{
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
--- /dev/null
+/**************************************************************************
+ * 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");
+}
--- /dev/null
+#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
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);
}
//___________________________________________________________________________
// 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);
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);
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);
} // 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();
//////////////
// 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;
#include "AliCounterCollection.h"
// PWG includes
+#include "AliAnalysisMuonUtility.h"
#include "AliMuonTrackCuts.h"
using std::cout;
DefineOutput(5,TObjArray::Class());
fTrackCuts->SetFilterMask(AliMuonTrackCuts::kMuEta | AliMuonTrackCuts::kMuThetaAbs | AliMuonTrackCuts::kMuPdca );
+ fTrackCuts->SetAllowDefaultParams(kTRUE);
}
//________________________________________________________________________
void AliAnalysisTaskMuonQA::NotifyRun()
{
/// Notify run
- fTrackCuts->SetRun(fCurrentRunNumber);
+ fTrackCuts->SetRun(fInputHandler);
}