#include "AliMuonTrackCuts.h"
#include "TMath.h"
#include "TList.h"
#include "TArrayD.h"
#include "TArrayI.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TFile.h"
#include "TParameter.h"
#include "TKey.h"
#include "TVector3.h"
#include "TSystem.h"
#include "AliLog.h"
#include "AliVParticle.h"
#include "AliESDMuonTrack.h"
#include "AliAnalysisManager.h"
#include "AliInputEventHandler.h"
#include "AliVEvent.h"
#include "AliProdInfo.h"
#include "AliOADBContainer.h"
#include "AliAnalysisMuonUtility.h"
ClassImp(AliMuonTrackCuts)
AliMuonTrackCuts::AliMuonTrackCuts() :
AliAnalysisCuts(),
fIsMC(kFALSE),
fUseCustomParam(kFALSE),
fSharpPtCut(kFALSE),
fAllowDefaultParams(kFALSE),
fPassName(""),
fOADBParam()
{
}
AliMuonTrackCuts::AliMuonTrackCuts(const char* name, const char* title ) :
AliAnalysisCuts(name, title),
fIsMC(kFALSE),
fUseCustomParam(kFALSE),
fSharpPtCut(kFALSE),
fAllowDefaultParams(kFALSE),
fPassName(""),
fOADBParam("muonTrackCutsParam")
{
SetDefaultFilterMask();
}
AliMuonTrackCuts::AliMuonTrackCuts(const AliMuonTrackCuts& obj) :
AliAnalysisCuts(obj),
fIsMC(obj.fIsMC),
fUseCustomParam(obj.fUseCustomParam),
fSharpPtCut(obj.fSharpPtCut),
fAllowDefaultParams(obj.fAllowDefaultParams),
fPassName(obj.fPassName),
fOADBParam(obj.fOADBParam)
{
}
AliMuonTrackCuts& AliMuonTrackCuts::operator=(const AliMuonTrackCuts& obj)
{
if ( this != &obj ) {
AliAnalysisCuts::operator=(obj);
fIsMC = obj.fIsMC;
fUseCustomParam = obj.fUseCustomParam;
fSharpPtCut = obj.fSharpPtCut;
fAllowDefaultParams = obj.fAllowDefaultParams;
fPassName = obj.fPassName;
fOADBParam = obj.fOADBParam;
}
return *this;
}
AliMuonTrackCuts::~AliMuonTrackCuts()
{
}
void AliMuonTrackCuts::SetPassNumber ( Int_t passNumber )
{
AliWarning("Obsolete: please use SetPassName instead");
fPassName = Form("pass%i",passNumber);
}
void AliMuonTrackCuts::SetCustomParamFromRun( Int_t runNumber, TString passName )
{
if ( passName.IsNull() ) passName = fPassName;
else fPassName = passName;
ReadParamFromOADB ( runNumber, passName );
fUseCustomParam = kTRUE;
AliWarning ("From now on SetRun does NOTHING!!");
}
AliOADBMuonTrackCutsParam* AliMuonTrackCuts::CustomParam ( )
{
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;
}
void AliMuonTrackCuts::SetCustomParam ( const AliInputEventHandler* eventHandler )
{
Int_t runNumber = eventHandler->GetEvent()->GetRunNumber();
TString passName = GuessPass(eventHandler);
SetCustomParamFromRun( runNumber, passName );
}
TString AliMuonTrackCuts::GuessPass ( const AliInputEventHandler* eventHandler )
{
TString passName = fPassName;
if ( passName.IsNull() ) {
passName = AliAnalysisMuonUtility::GetPassName(eventHandler);
AliInfo(Form("Guessing pass name from path: %s", passName.Data()));
}
return passName;
}
Bool_t AliMuonTrackCuts::SetRun ( const AliInputEventHandler* eventHandler )
{
if ( fUseCustomParam ) return kFALSE;
Int_t runNumber = eventHandler->GetEvent()->GetRunNumber();
TString passName = GuessPass(eventHandler);
return ReadParamFromOADB ( runNumber, passName );
}
Bool_t AliMuonTrackCuts::ReadParamFromOADB ( Int_t runNumber, TString passName )
{
if ( passName.IsNull() && ! fAllowDefaultParams ) AliFatal("Pass name not specified! Please provide one or allow for default parameters");
TString filename = Form("%s/PWG/MUON/MuonTrackCuts.root",AliAnalysisManager::GetOADBPath());
TFile* file = TFile::Open(filename.Data(), "READ");
if ( ! file ) {
AliFatal(Form("OADB file %s not found!", filename.Data()));
return kFALSE;
}
TString containerName = "MuonTrackCutsParam_data";
if ( fIsMC ) containerName.ReplaceAll("_data", "_MC");
TString defaultName = "default";
AliOADBContainer* oadbContainer = static_cast<AliOADBContainer*>(file->Get(containerName.Data()));
if ( ! oadbContainer ) {
AliFatal(Form("OADB container %s not found in %s!", containerName.Data(), filename.Data()));
return kFALSE;
}
AliOADBMuonTrackCutsParam* param = static_cast<AliOADBMuonTrackCutsParam*>(oadbContainer->GetObject(runNumber,defaultName.Data(),passName));
TString paramName = param->GetName();
if ( paramName == "default" ) {
if ( ! fAllowDefaultParams ) {
AliFatal(Form("Requested run %i not found in %s! Please check your pass name or allow default parameters", runNumber, passName.Data()));
return kFALSE;
}
containerName.Append("_def");
oadbContainer = static_cast<AliOADBContainer*>(file->Get(containerName.Data()));
param = static_cast<AliOADBMuonTrackCutsParam*>(oadbContainer->GetObject(runNumber,defaultName.Data(),passName));
AliWarning(Form("Requested run %i not found in %s: using %s", runNumber, passName.Data(), param->GetName()));
}
fOADBParam = *param;
file->Close();
AliInfo(Form("Requested run %i in pass %s. Param. set: %s", runNumber, passName.Data(), fOADBParam.GetName()));
return kTRUE;
}
Bool_t AliMuonTrackCuts::IsSelected( TObject* obj )
{
UInt_t filterMask = GetFilterMask();
UInt_t selectionMask = GetSelectionMask(obj);
AliDebug(1, Form("IsMuon %i selected %i mask 0x%x", AliAnalysisMuonUtility::IsMuonTrack(static_cast<AliVParticle*>(obj)), ( selectionMask & filterMask ) == filterMask, selectionMask ));
return ( ( selectionMask & filterMask ) == filterMask );
}
UInt_t AliMuonTrackCuts::GetSelectionMask( const TObject* obj )
{
const AliVParticle* track = static_cast<const AliVParticle*> ( obj );
UInt_t selectionMask = 0;
if ( ! AliAnalysisMuonUtility::IsMuonTrack(track) ) return selectionMask;
Double_t eta = track->Eta();
if ( eta > -4. && eta < -2.5 ) selectionMask |= kMuEta;
Double_t thetaAbsEndDeg = AliAnalysisMuonUtility::GetThetaAbsDeg(track);
if ( thetaAbsEndDeg > 2. && thetaAbsEndDeg < 10. ) selectionMask |= kMuThetaAbs;
Int_t matchTrig = AliAnalysisMuonUtility::GetMatchTrigger(track);
Int_t cutLevel[3] = {kMuMatchApt, kMuMatchLpt, kMuMatchHpt};
Double_t pt = track->Pt();
for ( Int_t ilevel=0; ilevel<3; ilevel++ ) {
if ( matchTrig < ilevel+1 ) break;
if ( fSharpPtCut && pt < fOADBParam.GetSharpPtCut(ilevel) ) break;
selectionMask |= cutLevel[ilevel];
}
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 sigmaPdca = IsThetaAbs23(track) ? fOADBParam.GetSigmaPdca23() : fOADBParam.GetSigmaPdca310();
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 < fOADBParam.GetNSigmaPdca() * sigmaPdcaWithRes ) selectionMask |= kMuPdca;
AliDebug(1, Form("Selection mask 0x%x\n", selectionMask));
return selectionMask;
}
Bool_t AliMuonTrackCuts::IsSelected( TList* )
{
AliError("Function not implemented: Use IsSelected(TObject*)");
return kFALSE;
}
Bool_t AliMuonTrackCuts::IsThetaAbs23 ( const AliVParticle* track ) const
{
return ( AliAnalysisMuonUtility::GetThetaAbsDeg(track) < 3. );
}
TVector3 AliMuonTrackCuts::GetCorrectedDCA ( const AliVParticle* track ) const
{
TVector3 vertex(AliAnalysisMuonUtility::GetXatVertex(track), AliAnalysisMuonUtility::GetYatVertex(track), AliAnalysisMuonUtility::GetZatVertex(track));
TVector3 dcaTrack(AliAnalysisMuonUtility::GetXatDCA(track), AliAnalysisMuonUtility::GetYatDCA(track), AliAnalysisMuonUtility::GetZatDCA(track));
TVector3 dcaAtVz = dcaTrack - vertex - fOADBParam.GetMeanDCA();
return dcaAtVz;
}
Double_t AliMuonTrackCuts::GetAverageMomentum ( const AliVParticle* track ) const
{
Double_t pTotMean = 0.;
Double_t pTot = track->P();
if ( ! AliAnalysisMuonUtility::IsAODTrack(track) ) pTotMean = ((AliESDMuonTrack*)track)->PUncorrected();
else {
Double_t meanPcorr = IsThetaAbs23(track) ? fOADBParam.GetMeanPCorr23() : fOADBParam.GetMeanPCorr310();
pTotMean = pTot - meanPcorr;
}
return pTotMean;
}
void AliMuonTrackCuts::SetDefaultFilterMask ()
{
SetFilterMask ( kMuEta | kMuThetaAbs | kMuPdca | kMuMatchApt );
}
Bool_t AliMuonTrackCuts::TrackPtCutMatchTrigClass ( const AliVParticle* track, const TArrayI ptCutFromClass) const
{
Int_t matchTrig = AliAnalysisMuonUtility::GetMatchTrigger(track);
Bool_t matchTrackerPt = kTRUE;
if ( IsApplySharpPtCutInMatching() ) {
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));
return passCut;
}
void AliMuonTrackCuts::Print(Option_t* option) const
{
TString sopt(option);
sopt.ToLower();
if ( sopt.IsNull() || sopt.Contains("*") || sopt.Contains("all") ) sopt = "mask param";
UInt_t filterMask = GetFilterMask();
Int_t cutLevel[3] = {kMuMatchApt, kMuMatchLpt, kMuMatchHpt};
TString cutLevelName[3] = {"Apt", "Lpt", "Hpt"};
if ( sopt.Contains("mask") ) {
printf(" *** Muon track filter mask: *** \n");
printf(" 0x%x\n", filterMask);
if ( filterMask & kMuEta ) printf(" -4 < eta < -2.5\n");
if ( filterMask & kMuThetaAbs ) printf(" 2 < theta_abs < 10 deg\n");
if ( filterMask & kMuPdca ) printf(" pxDCA cut\n");
for ( Int_t ilevel=0; ilevel<3; ilevel++ ) {
if ( filterMask & cutLevel[ilevel] ) {
printf(" match %s", cutLevelName[ilevel].Data());
if ( fSharpPtCut ) printf(" && sharp pt from tracker");
printf("\n");
}
}
if ( filterMask & kMuTrackChiSquare ) printf(" Chi2 cut on track\n");
printf(" ******************** \n");
}
if ( sopt.Contains("param") ) fOADBParam.Print();
}