ROOT logo
/**************************************************************************
 * 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 "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"

/// \cond CLASSIMP
ClassImp(AliMuonTrackCuts) // Class implementation in ROOT context
/// \endcond


//________________________________________________________________________
AliMuonTrackCuts::AliMuonTrackCuts() :
  AliAnalysisCuts(),
  fIsMC(kFALSE),
  fUseCustomParam(kFALSE),
  fSharpPtCut(kFALSE),
  fAllowDefaultParams(kFALSE),
  fPassName(""),
  fOADBParam()
{
  /// Default ctor.
}

//________________________________________________________________________
AliMuonTrackCuts::AliMuonTrackCuts(const char* name, const char* title ) :
AliAnalysisCuts(name, title),
  fIsMC(kFALSE),
  fUseCustomParam(kFALSE),
  fSharpPtCut(kFALSE),
  fAllowDefaultParams(kFALSE),
  fPassName(""),
  fOADBParam("muonTrackCutsParam")
{
  /// Constructor
  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)
{
  /// Copy constructor
}


//________________________________________________________________________
AliMuonTrackCuts& AliMuonTrackCuts::operator=(const AliMuonTrackCuts& obj)
{
  /// Assignment operator
  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()
{
  /// Destructor
}

//________________________________________________________________________
void AliMuonTrackCuts::SetPassNumber ( Int_t passNumber )
{
  /// Set pass number (for backward compatibility)
  AliWarning("Obsolete: please use SetPassName instead");
  fPassName = Form("pass%i",passNumber);
}

//________________________________________________________________________
void AliMuonTrackCuts::SetCustomParamFromRun( Int_t runNumber, TString passName )
{
  /// It first searches the default parameters in OADB
  /// then disables the access to the OADB
  /// and allows to manually modify parameters
  
  if ( passName.IsNull() ) passName = fPassName;
  else fPassName = passName;
  ReadParamFromOADB ( runNumber, passName );
  fUseCustomParam = kTRUE;
  AliWarning ("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;
}

//________________________________________________________________________
void AliMuonTrackCuts::SetCustomParam ( const AliInputEventHandler* eventHandler )
{
  /// It tries to sets the parameters from the OADB
  /// for the current run, then gives the possiblity to the user
  /// to change them in his task
  
  Int_t runNumber = eventHandler->GetEvent()->GetRunNumber();
  TString passName = GuessPass(eventHandler);
  SetCustomParamFromRun( runNumber, passName );
}

//________________________________________________________________________
TString AliMuonTrackCuts::GuessPass ( const AliInputEventHandler* eventHandler )
{
  /// If pass not defined guess it from event handler
  
  TString passName = fPassName;
  if ( passName.IsNull() ) {
    // Pass number not set by user
    // First try to get it from data
    //    AliProdInfo prodInfo(eventHandler->GetUserInfo());
    //    if ( prodInfo.GetRecoPass() >= 0 ) {
    //      passNumber = prodInfo.GetRecoPass();
    //      AliInfo(Form("Getting pass number from prodInfo: pass%i", passNumber));
    //    }
    //    else {
    // If not found, try to guess it from data path
    passName = AliAnalysisMuonUtility::GetPassName(eventHandler);
    AliInfo(Form("Guessing pass name from path: %s", passName.Data()));
    //    }
  }
  return passName;
}

//________________________________________________________________________
Bool_t AliMuonTrackCuts::SetRun ( const AliInputEventHandler* eventHandler )
{
  /// Get parameters from OADB for current run
  
  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 )
{

  /// Read parameters from OADB
  
  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; // Coverity fix
    }

    // Search if there is a better tuned default for the considered period
    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 )
{
  /// Track is selected
  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 )
{
  /// Get selection mask
  
  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();
  
  // Momentum resolution only
  // The cut depends on the momentum resolution. In particular:
  // Sigma_pDCA = Sqrt( Sigma_pDCA_measured^2 + Sigma_p/p * pDCA)
  // The relative momentum distribution Sigma_p/p is estimated from the track Delta_p,
  // and from the error on sagitta Delta_s:
  // Delta_p/p = p*Delta_s/(1+p*Delta_s)
  // A cut at N sigmas requres a cut in N Delta_s, so
  // Sigma_p/p(N) = p*N*Delta_s/(1+p*N*Delta_s)
  //Double_t pResolutionEffect = pDca * pTot * GetRelPResolution() / ( 1. + GetNSigmaPdca() * GetRelPResolution()*pTot );
  
  //Double_t pResolutionEffect = 0.4 * pTot;  // Values used in 2010 data
  //Double_t pResolutionEffect = 0.32 * pTot; // Values in 2011
  //Double_t sigmaPdcaWithRes = TMath::Sqrt( sigmaPdca*sigmaPdca + pResolutionEffect*pResolutionEffect );
  
  // Momentum resolution and slope resolution 
  // Due to the momentum resolution, the measured momentum is biased
  // Since we want to keep as much signal as possible, we want to avoid
  // that a measured pxDCA is rejected since the momentum is overestimated
  // p_true = p_meas - Delta_p
  // p_true = p_meas - N*Delta_s*p_meas / (1+n*Delta_s*p_meas)
  // Hence:
  // p_true x DCA < N * Sigma_pDCA_meas =>
  // p_meas x DCA < N * Sigma_pDCA_meas / ( 1 - N*Delta_s*p_meas / (1+n*Delta_s*p_meas))
  // 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 = 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* /* list */)
{
  /// Not implemented
  AliError("Function not implemented: Use IsSelected(TObject*)");
  return kFALSE;
}


//________________________________________________________________________
Bool_t AliMuonTrackCuts::IsThetaAbs23 ( const AliVParticle* track ) const
{
  /// Check if theta_abs is smaller than 3 degrees
  return ( AliAnalysisMuonUtility::GetThetaAbsDeg(track) < 3. );
}


//________________________________________________________________________
TVector3 AliMuonTrackCuts::GetCorrectedDCA ( const AliVParticle* track ) const
{
  /// Get corrected DCA
  
  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
{
  /// Get average momentum before and after the absorber
  
  Double_t pTotMean = 0.;
  Double_t pTot = track->P();
  //if ( isESD ) pTotMean = 0.5 * ( pTot + ((AliESDMuonTrack*)track)->PUncorrected() );
  if ( ! AliAnalysisMuonUtility::IsAODTrack(track) ) pTotMean = ((AliESDMuonTrack*)track)->PUncorrected(); // Increased stability if using uncorrected value
  else {
    Double_t meanPcorr = IsThetaAbs23(track) ? fOADBParam.GetMeanPCorr23() : fOADBParam.GetMeanPCorr310();
    pTotMean = pTot - meanPcorr;
  }

  return pTotMean;
}


//________________________________________________________________________
void AliMuonTrackCuts::SetDefaultFilterMask ()
{
  /// Standard cuts for single muon
  SetFilterMask ( kMuEta | kMuThetaAbs | kMuPdca | kMuMatchApt );
}

//________________________________________________________________________
Bool_t AliMuonTrackCuts::TrackPtCutMatchTrigClass ( const AliVParticle* track, const TArrayI ptCutFromClass) const
{
  /// Check if track passes the trigger pt cut level used in the trigger class
  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
{
  //
  /// Print info
  //
  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();
}
 AliMuonTrackCuts.cxx:1
 AliMuonTrackCuts.cxx:2
 AliMuonTrackCuts.cxx:3
 AliMuonTrackCuts.cxx:4
 AliMuonTrackCuts.cxx:5
 AliMuonTrackCuts.cxx:6
 AliMuonTrackCuts.cxx:7
 AliMuonTrackCuts.cxx:8
 AliMuonTrackCuts.cxx:9
 AliMuonTrackCuts.cxx:10
 AliMuonTrackCuts.cxx:11
 AliMuonTrackCuts.cxx:12
 AliMuonTrackCuts.cxx:13
 AliMuonTrackCuts.cxx:14
 AliMuonTrackCuts.cxx:15
 AliMuonTrackCuts.cxx:16
 AliMuonTrackCuts.cxx:17
 AliMuonTrackCuts.cxx:18
 AliMuonTrackCuts.cxx:19
 AliMuonTrackCuts.cxx:20
 AliMuonTrackCuts.cxx:21
 AliMuonTrackCuts.cxx:22
 AliMuonTrackCuts.cxx:23
 AliMuonTrackCuts.cxx:24
 AliMuonTrackCuts.cxx:25
 AliMuonTrackCuts.cxx:26
 AliMuonTrackCuts.cxx:27
 AliMuonTrackCuts.cxx:28
 AliMuonTrackCuts.cxx:29
 AliMuonTrackCuts.cxx:30
 AliMuonTrackCuts.cxx:31
 AliMuonTrackCuts.cxx:32
 AliMuonTrackCuts.cxx:33
 AliMuonTrackCuts.cxx:34
 AliMuonTrackCuts.cxx:35
 AliMuonTrackCuts.cxx:36
 AliMuonTrackCuts.cxx:37
 AliMuonTrackCuts.cxx:38
 AliMuonTrackCuts.cxx:39
 AliMuonTrackCuts.cxx:40
 AliMuonTrackCuts.cxx:41
 AliMuonTrackCuts.cxx:42
 AliMuonTrackCuts.cxx:43
 AliMuonTrackCuts.cxx:44
 AliMuonTrackCuts.cxx:45
 AliMuonTrackCuts.cxx:46
 AliMuonTrackCuts.cxx:47
 AliMuonTrackCuts.cxx:48
 AliMuonTrackCuts.cxx:49
 AliMuonTrackCuts.cxx:50
 AliMuonTrackCuts.cxx:51
 AliMuonTrackCuts.cxx:52
 AliMuonTrackCuts.cxx:53
 AliMuonTrackCuts.cxx:54
 AliMuonTrackCuts.cxx:55
 AliMuonTrackCuts.cxx:56
 AliMuonTrackCuts.cxx:57
 AliMuonTrackCuts.cxx:58
 AliMuonTrackCuts.cxx:59
 AliMuonTrackCuts.cxx:60
 AliMuonTrackCuts.cxx:61
 AliMuonTrackCuts.cxx:62
 AliMuonTrackCuts.cxx:63
 AliMuonTrackCuts.cxx:64
 AliMuonTrackCuts.cxx:65
 AliMuonTrackCuts.cxx:66
 AliMuonTrackCuts.cxx:67
 AliMuonTrackCuts.cxx:68
 AliMuonTrackCuts.cxx:69
 AliMuonTrackCuts.cxx:70
 AliMuonTrackCuts.cxx:71
 AliMuonTrackCuts.cxx:72
 AliMuonTrackCuts.cxx:73
 AliMuonTrackCuts.cxx:74
 AliMuonTrackCuts.cxx:75
 AliMuonTrackCuts.cxx:76
 AliMuonTrackCuts.cxx:77
 AliMuonTrackCuts.cxx:78
 AliMuonTrackCuts.cxx:79
 AliMuonTrackCuts.cxx:80
 AliMuonTrackCuts.cxx:81
 AliMuonTrackCuts.cxx:82
 AliMuonTrackCuts.cxx:83
 AliMuonTrackCuts.cxx:84
 AliMuonTrackCuts.cxx:85
 AliMuonTrackCuts.cxx:86
 AliMuonTrackCuts.cxx:87
 AliMuonTrackCuts.cxx:88
 AliMuonTrackCuts.cxx:89
 AliMuonTrackCuts.cxx:90
 AliMuonTrackCuts.cxx:91
 AliMuonTrackCuts.cxx:92
 AliMuonTrackCuts.cxx:93
 AliMuonTrackCuts.cxx:94
 AliMuonTrackCuts.cxx:95
 AliMuonTrackCuts.cxx:96
 AliMuonTrackCuts.cxx:97
 AliMuonTrackCuts.cxx:98
 AliMuonTrackCuts.cxx:99
 AliMuonTrackCuts.cxx:100
 AliMuonTrackCuts.cxx:101
 AliMuonTrackCuts.cxx:102
 AliMuonTrackCuts.cxx:103
 AliMuonTrackCuts.cxx:104
 AliMuonTrackCuts.cxx:105
 AliMuonTrackCuts.cxx:106
 AliMuonTrackCuts.cxx:107
 AliMuonTrackCuts.cxx:108
 AliMuonTrackCuts.cxx:109
 AliMuonTrackCuts.cxx:110
 AliMuonTrackCuts.cxx:111
 AliMuonTrackCuts.cxx:112
 AliMuonTrackCuts.cxx:113
 AliMuonTrackCuts.cxx:114
 AliMuonTrackCuts.cxx:115
 AliMuonTrackCuts.cxx:116
 AliMuonTrackCuts.cxx:117
 AliMuonTrackCuts.cxx:118
 AliMuonTrackCuts.cxx:119
 AliMuonTrackCuts.cxx:120
 AliMuonTrackCuts.cxx:121
 AliMuonTrackCuts.cxx:122
 AliMuonTrackCuts.cxx:123
 AliMuonTrackCuts.cxx:124
 AliMuonTrackCuts.cxx:125
 AliMuonTrackCuts.cxx:126
 AliMuonTrackCuts.cxx:127
 AliMuonTrackCuts.cxx:128
 AliMuonTrackCuts.cxx:129
 AliMuonTrackCuts.cxx:130
 AliMuonTrackCuts.cxx:131
 AliMuonTrackCuts.cxx:132
 AliMuonTrackCuts.cxx:133
 AliMuonTrackCuts.cxx:134
 AliMuonTrackCuts.cxx:135
 AliMuonTrackCuts.cxx:136
 AliMuonTrackCuts.cxx:137
 AliMuonTrackCuts.cxx:138
 AliMuonTrackCuts.cxx:139
 AliMuonTrackCuts.cxx:140
 AliMuonTrackCuts.cxx:141
 AliMuonTrackCuts.cxx:142
 AliMuonTrackCuts.cxx:143
 AliMuonTrackCuts.cxx:144
 AliMuonTrackCuts.cxx:145
 AliMuonTrackCuts.cxx:146
 AliMuonTrackCuts.cxx:147
 AliMuonTrackCuts.cxx:148
 AliMuonTrackCuts.cxx:149
 AliMuonTrackCuts.cxx:150
 AliMuonTrackCuts.cxx:151
 AliMuonTrackCuts.cxx:152
 AliMuonTrackCuts.cxx:153
 AliMuonTrackCuts.cxx:154
 AliMuonTrackCuts.cxx:155
 AliMuonTrackCuts.cxx:156
 AliMuonTrackCuts.cxx:157
 AliMuonTrackCuts.cxx:158
 AliMuonTrackCuts.cxx:159
 AliMuonTrackCuts.cxx:160
 AliMuonTrackCuts.cxx:161
 AliMuonTrackCuts.cxx:162
 AliMuonTrackCuts.cxx:163
 AliMuonTrackCuts.cxx:164
 AliMuonTrackCuts.cxx:165
 AliMuonTrackCuts.cxx:166
 AliMuonTrackCuts.cxx:167
 AliMuonTrackCuts.cxx:168
 AliMuonTrackCuts.cxx:169
 AliMuonTrackCuts.cxx:170
 AliMuonTrackCuts.cxx:171
 AliMuonTrackCuts.cxx:172
 AliMuonTrackCuts.cxx:173
 AliMuonTrackCuts.cxx:174
 AliMuonTrackCuts.cxx:175
 AliMuonTrackCuts.cxx:176
 AliMuonTrackCuts.cxx:177
 AliMuonTrackCuts.cxx:178
 AliMuonTrackCuts.cxx:179
 AliMuonTrackCuts.cxx:180
 AliMuonTrackCuts.cxx:181
 AliMuonTrackCuts.cxx:182
 AliMuonTrackCuts.cxx:183
 AliMuonTrackCuts.cxx:184
 AliMuonTrackCuts.cxx:185
 AliMuonTrackCuts.cxx:186
 AliMuonTrackCuts.cxx:187
 AliMuonTrackCuts.cxx:188
 AliMuonTrackCuts.cxx:189
 AliMuonTrackCuts.cxx:190
 AliMuonTrackCuts.cxx:191
 AliMuonTrackCuts.cxx:192
 AliMuonTrackCuts.cxx:193
 AliMuonTrackCuts.cxx:194
 AliMuonTrackCuts.cxx:195
 AliMuonTrackCuts.cxx:196
 AliMuonTrackCuts.cxx:197
 AliMuonTrackCuts.cxx:198
 AliMuonTrackCuts.cxx:199
 AliMuonTrackCuts.cxx:200
 AliMuonTrackCuts.cxx:201
 AliMuonTrackCuts.cxx:202
 AliMuonTrackCuts.cxx:203
 AliMuonTrackCuts.cxx:204
 AliMuonTrackCuts.cxx:205
 AliMuonTrackCuts.cxx:206
 AliMuonTrackCuts.cxx:207
 AliMuonTrackCuts.cxx:208
 AliMuonTrackCuts.cxx:209
 AliMuonTrackCuts.cxx:210
 AliMuonTrackCuts.cxx:211
 AliMuonTrackCuts.cxx:212
 AliMuonTrackCuts.cxx:213
 AliMuonTrackCuts.cxx:214
 AliMuonTrackCuts.cxx:215
 AliMuonTrackCuts.cxx:216
 AliMuonTrackCuts.cxx:217
 AliMuonTrackCuts.cxx:218
 AliMuonTrackCuts.cxx:219
 AliMuonTrackCuts.cxx:220
 AliMuonTrackCuts.cxx:221
 AliMuonTrackCuts.cxx:222
 AliMuonTrackCuts.cxx:223
 AliMuonTrackCuts.cxx:224
 AliMuonTrackCuts.cxx:225
 AliMuonTrackCuts.cxx:226
 AliMuonTrackCuts.cxx:227
 AliMuonTrackCuts.cxx:228
 AliMuonTrackCuts.cxx:229
 AliMuonTrackCuts.cxx:230
 AliMuonTrackCuts.cxx:231
 AliMuonTrackCuts.cxx:232
 AliMuonTrackCuts.cxx:233
 AliMuonTrackCuts.cxx:234
 AliMuonTrackCuts.cxx:235
 AliMuonTrackCuts.cxx:236
 AliMuonTrackCuts.cxx:237
 AliMuonTrackCuts.cxx:238
 AliMuonTrackCuts.cxx:239
 AliMuonTrackCuts.cxx:240
 AliMuonTrackCuts.cxx:241
 AliMuonTrackCuts.cxx:242
 AliMuonTrackCuts.cxx:243
 AliMuonTrackCuts.cxx:244
 AliMuonTrackCuts.cxx:245
 AliMuonTrackCuts.cxx:246
 AliMuonTrackCuts.cxx:247
 AliMuonTrackCuts.cxx:248
 AliMuonTrackCuts.cxx:249
 AliMuonTrackCuts.cxx:250
 AliMuonTrackCuts.cxx:251
 AliMuonTrackCuts.cxx:252
 AliMuonTrackCuts.cxx:253
 AliMuonTrackCuts.cxx:254
 AliMuonTrackCuts.cxx:255
 AliMuonTrackCuts.cxx:256
 AliMuonTrackCuts.cxx:257
 AliMuonTrackCuts.cxx:258
 AliMuonTrackCuts.cxx:259
 AliMuonTrackCuts.cxx:260
 AliMuonTrackCuts.cxx:261
 AliMuonTrackCuts.cxx:262
 AliMuonTrackCuts.cxx:263
 AliMuonTrackCuts.cxx:264
 AliMuonTrackCuts.cxx:265
 AliMuonTrackCuts.cxx:266
 AliMuonTrackCuts.cxx:267
 AliMuonTrackCuts.cxx:268
 AliMuonTrackCuts.cxx:269
 AliMuonTrackCuts.cxx:270
 AliMuonTrackCuts.cxx:271
 AliMuonTrackCuts.cxx:272
 AliMuonTrackCuts.cxx:273
 AliMuonTrackCuts.cxx:274
 AliMuonTrackCuts.cxx:275
 AliMuonTrackCuts.cxx:276
 AliMuonTrackCuts.cxx:277
 AliMuonTrackCuts.cxx:278
 AliMuonTrackCuts.cxx:279
 AliMuonTrackCuts.cxx:280
 AliMuonTrackCuts.cxx:281
 AliMuonTrackCuts.cxx:282
 AliMuonTrackCuts.cxx:283
 AliMuonTrackCuts.cxx:284
 AliMuonTrackCuts.cxx:285
 AliMuonTrackCuts.cxx:286
 AliMuonTrackCuts.cxx:287
 AliMuonTrackCuts.cxx:288
 AliMuonTrackCuts.cxx:289
 AliMuonTrackCuts.cxx:290
 AliMuonTrackCuts.cxx:291
 AliMuonTrackCuts.cxx:292
 AliMuonTrackCuts.cxx:293
 AliMuonTrackCuts.cxx:294
 AliMuonTrackCuts.cxx:295
 AliMuonTrackCuts.cxx:296
 AliMuonTrackCuts.cxx:297
 AliMuonTrackCuts.cxx:298
 AliMuonTrackCuts.cxx:299
 AliMuonTrackCuts.cxx:300
 AliMuonTrackCuts.cxx:301
 AliMuonTrackCuts.cxx:302
 AliMuonTrackCuts.cxx:303
 AliMuonTrackCuts.cxx:304
 AliMuonTrackCuts.cxx:305
 AliMuonTrackCuts.cxx:306
 AliMuonTrackCuts.cxx:307
 AliMuonTrackCuts.cxx:308
 AliMuonTrackCuts.cxx:309
 AliMuonTrackCuts.cxx:310
 AliMuonTrackCuts.cxx:311
 AliMuonTrackCuts.cxx:312
 AliMuonTrackCuts.cxx:313
 AliMuonTrackCuts.cxx:314
 AliMuonTrackCuts.cxx:315
 AliMuonTrackCuts.cxx:316
 AliMuonTrackCuts.cxx:317
 AliMuonTrackCuts.cxx:318
 AliMuonTrackCuts.cxx:319
 AliMuonTrackCuts.cxx:320
 AliMuonTrackCuts.cxx:321
 AliMuonTrackCuts.cxx:322
 AliMuonTrackCuts.cxx:323
 AliMuonTrackCuts.cxx:324
 AliMuonTrackCuts.cxx:325
 AliMuonTrackCuts.cxx:326
 AliMuonTrackCuts.cxx:327
 AliMuonTrackCuts.cxx:328
 AliMuonTrackCuts.cxx:329
 AliMuonTrackCuts.cxx:330
 AliMuonTrackCuts.cxx:331
 AliMuonTrackCuts.cxx:332
 AliMuonTrackCuts.cxx:333
 AliMuonTrackCuts.cxx:334
 AliMuonTrackCuts.cxx:335
 AliMuonTrackCuts.cxx:336
 AliMuonTrackCuts.cxx:337
 AliMuonTrackCuts.cxx:338
 AliMuonTrackCuts.cxx:339
 AliMuonTrackCuts.cxx:340
 AliMuonTrackCuts.cxx:341
 AliMuonTrackCuts.cxx:342
 AliMuonTrackCuts.cxx:343
 AliMuonTrackCuts.cxx:344
 AliMuonTrackCuts.cxx:345
 AliMuonTrackCuts.cxx:346
 AliMuonTrackCuts.cxx:347
 AliMuonTrackCuts.cxx:348
 AliMuonTrackCuts.cxx:349
 AliMuonTrackCuts.cxx:350
 AliMuonTrackCuts.cxx:351
 AliMuonTrackCuts.cxx:352
 AliMuonTrackCuts.cxx:353
 AliMuonTrackCuts.cxx:354
 AliMuonTrackCuts.cxx:355
 AliMuonTrackCuts.cxx:356
 AliMuonTrackCuts.cxx:357
 AliMuonTrackCuts.cxx:358
 AliMuonTrackCuts.cxx:359
 AliMuonTrackCuts.cxx:360
 AliMuonTrackCuts.cxx:361
 AliMuonTrackCuts.cxx:362
 AliMuonTrackCuts.cxx:363
 AliMuonTrackCuts.cxx:364
 AliMuonTrackCuts.cxx:365
 AliMuonTrackCuts.cxx:366
 AliMuonTrackCuts.cxx:367
 AliMuonTrackCuts.cxx:368
 AliMuonTrackCuts.cxx:369
 AliMuonTrackCuts.cxx:370
 AliMuonTrackCuts.cxx:371
 AliMuonTrackCuts.cxx:372
 AliMuonTrackCuts.cxx:373
 AliMuonTrackCuts.cxx:374
 AliMuonTrackCuts.cxx:375
 AliMuonTrackCuts.cxx:376
 AliMuonTrackCuts.cxx:377
 AliMuonTrackCuts.cxx:378
 AliMuonTrackCuts.cxx:379
 AliMuonTrackCuts.cxx:380
 AliMuonTrackCuts.cxx:381
 AliMuonTrackCuts.cxx:382
 AliMuonTrackCuts.cxx:383
 AliMuonTrackCuts.cxx:384
 AliMuonTrackCuts.cxx:385
 AliMuonTrackCuts.cxx:386
 AliMuonTrackCuts.cxx:387
 AliMuonTrackCuts.cxx:388
 AliMuonTrackCuts.cxx:389
 AliMuonTrackCuts.cxx:390
 AliMuonTrackCuts.cxx:391
 AliMuonTrackCuts.cxx:392
 AliMuonTrackCuts.cxx:393
 AliMuonTrackCuts.cxx:394
 AliMuonTrackCuts.cxx:395
 AliMuonTrackCuts.cxx:396
 AliMuonTrackCuts.cxx:397
 AliMuonTrackCuts.cxx:398
 AliMuonTrackCuts.cxx:399
 AliMuonTrackCuts.cxx:400
 AliMuonTrackCuts.cxx:401
 AliMuonTrackCuts.cxx:402
 AliMuonTrackCuts.cxx:403
 AliMuonTrackCuts.cxx:404
 AliMuonTrackCuts.cxx:405
 AliMuonTrackCuts.cxx:406
 AliMuonTrackCuts.cxx:407
 AliMuonTrackCuts.cxx:408
 AliMuonTrackCuts.cxx:409
 AliMuonTrackCuts.cxx:410
 AliMuonTrackCuts.cxx:411
 AliMuonTrackCuts.cxx:412
 AliMuonTrackCuts.cxx:413
 AliMuonTrackCuts.cxx:414
 AliMuonTrackCuts.cxx:415
 AliMuonTrackCuts.cxx:416
 AliMuonTrackCuts.cxx:417
 AliMuonTrackCuts.cxx:418
 AliMuonTrackCuts.cxx:419
 AliMuonTrackCuts.cxx:420
 AliMuonTrackCuts.cxx:421
 AliMuonTrackCuts.cxx:422
 AliMuonTrackCuts.cxx:423
 AliMuonTrackCuts.cxx:424
 AliMuonTrackCuts.cxx:425
 AliMuonTrackCuts.cxx:426
 AliMuonTrackCuts.cxx:427
 AliMuonTrackCuts.cxx:428
 AliMuonTrackCuts.cxx:429
 AliMuonTrackCuts.cxx:430
 AliMuonTrackCuts.cxx:431
 AliMuonTrackCuts.cxx:432
 AliMuonTrackCuts.cxx:433
 AliMuonTrackCuts.cxx:434
 AliMuonTrackCuts.cxx:435
 AliMuonTrackCuts.cxx:436
 AliMuonTrackCuts.cxx:437