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 "AliMuonPairCuts.h"

#include "TMath.h"
#include "TList.h"
#include "TLorentzVector.h"
#include "TArrayI.h"

#include "AliLog.h"
#include "AliVParticle.h"
#include "AliInputEventHandler.h"

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

//________________________________________________________________________
AliMuonPairCuts::AliMuonPairCuts() :
  AliAnalysisCuts(),
  fMuonTrackCuts()
{
  /// Default ctor.
}

//________________________________________________________________________
AliMuonPairCuts::AliMuonPairCuts(const char* name, const char* title) :
AliAnalysisCuts(name, title),
fMuonTrackCuts("muonTrackCutInPair","muonTrackCutInPair")
{
  /// Constructor
  SetDefaultFilterMask();
}


//________________________________________________________________________
AliMuonPairCuts::AliMuonPairCuts(const char* name, const char* title, const AliMuonTrackCuts& trackCuts) :
AliAnalysisCuts(name, title),
fMuonTrackCuts(trackCuts)
{
  /// Test Constructor
  SetDefaultFilterMask();
}


//________________________________________________________________________
AliMuonPairCuts::AliMuonPairCuts(const AliMuonPairCuts& obj) :
  AliAnalysisCuts(obj),
  fMuonTrackCuts(obj.fMuonTrackCuts)
{
  /// Copy constructor
}


//________________________________________________________________________
AliMuonPairCuts& AliMuonPairCuts::operator=(const AliMuonPairCuts& obj)
{
  /// Assignment operator
  if ( this != &obj ) { 
    AliAnalysisCuts::operator=(obj);
    fMuonTrackCuts = obj.fMuonTrackCuts;
  }
  return *this;
}


//________________________________________________________________________
AliMuonPairCuts::~AliMuonPairCuts()
{
  /// Destructor
}

//________________________________________________________________________
Bool_t AliMuonPairCuts::SetRun ( const AliInputEventHandler* eventHandler )
{
  /// Get parameters from OADB for runNumber
  return fMuonTrackCuts.SetRun(eventHandler);
}


//________________________________________________________________________
Bool_t AliMuonPairCuts::IsSelected( TObject* /*obj*/ )
{
  /// Not implemented
  AliError("Requires a list of two AliVParticle");
  return kFALSE;
}

//________________________________________________________________________
Bool_t AliMuonPairCuts::IsSelected( TList* list )
{
  /// Pair is selected
  UInt_t filterMask = GetFilterMask();
  UInt_t selectionMask = GetSelectionMask(list);
  
  return ( ( selectionMask & filterMask ) == filterMask );
}

//________________________________________________________________________
Bool_t AliMuonPairCuts::IsSelected( TObject* track1, TObject* track2 )
{
  /// Pair is selected
  UInt_t filterMask = GetFilterMask();
  UInt_t selectionMask = GetSelectionMask(track1, track2);
  
  return ( ( selectionMask & filterMask ) == filterMask );
}


//________________________________________________________________________
UInt_t AliMuonPairCuts::GetSelectionMask( const TObject* obj )
{
  /// Get selection mask (overloaded function)
  const TList* list = static_cast<const TList*> ( obj );
  if ( list->GetEntries() < 2 ) {
    AliError("Requires a list of two AliVParticle");
    return 0;
  }

  return GetSelectionMask(list->At(0), list->At(1));

}


//________________________________________________________________________
UInt_t AliMuonPairCuts::GetSelectionMask( const TObject* track1, const TObject* track2 )
{
  /// Get selection mask from AliVParticles
  
  UInt_t selectionMask = 0;
    
  UInt_t maskTrack1 = fMuonTrackCuts.GetSelectionMask(track1);
  UInt_t maskTrack2 = fMuonTrackCuts.GetSelectionMask(track2);
  
  UInt_t maskAND = maskTrack1 & maskTrack2;
  UInt_t maskOR = maskTrack1 | maskTrack2;
  if ( maskAND & AliMuonTrackCuts::kMuEta ) selectionMask |= kBothMuEta;
  if ( maskAND & AliMuonTrackCuts::kMuThetaAbs ) selectionMask |= kBothMuThetaAbs;
  if ( maskAND & AliMuonTrackCuts::kMuPdca ) selectionMask |= kBothMuPdca;
  if ( maskAND & AliMuonTrackCuts::kMuTrackChiSquare ) selectionMask |= kBothMuTrackChiSquare;
  if ( maskAND & AliMuonTrackCuts::kMuMatchApt ) selectionMask |= kBothMuMatchApt;
  if ( maskAND & AliMuonTrackCuts::kMuMatchLpt ) selectionMask |= kBothMuMatchLpt;
  if ( maskAND & AliMuonTrackCuts::kMuMatchHpt ) selectionMask |= kBothMuMatchHpt;
  if ( maskOR & AliMuonTrackCuts::kMuMatchApt ) selectionMask |= kOneMuMatchApt;
  if ( maskOR & AliMuonTrackCuts::kMuMatchLpt ) selectionMask |= kOneMuMatchLpt;
  if ( maskOR & AliMuonTrackCuts::kMuMatchHpt ) selectionMask |= kOneMuMatchHpt;
  
  TLorentzVector vec[2];
  Double_t chargeProduct = 1.;
  for ( Int_t itrack=0; itrack<2; ++itrack ) {
    const AliVParticle* track = static_cast<const AliVParticle*> ( ( itrack == 0 ) ? track1 : track2 );
    chargeProduct *= track->Charge();
    Double_t trackP = track->P();
    Double_t energy = TMath::Sqrt(trackP*trackP + MuonMass2());
    vec[itrack].SetPxPyPzE(track->Px(), track->Py(), track->Pz(), energy);
  }
  
  if ( chargeProduct < 0. ) selectionMask |= kDimuUnlikeSign;
  
  TLorentzVector vecPair = vec[0] + vec[1];
  Double_t rapidity = vecPair.Rapidity();
  if ( rapidity > -4. && rapidity < -2.5 ) selectionMask |= kDimuRapidity; 
  
  return selectionMask;
}


//_____________________________________________________________________________
Double_t AliMuonPairCuts::MuonMass2() const
{
  /// A usefull constant
  static Double_t m2 = 1.11636129640000012e-02;
  return m2;
}


//________________________________________________________________________
void AliMuonPairCuts::SetDefaultFilterMask ()
{
  /// Standard cuts for muon pair
  SetFilterMask ( kBothMuEta | kBothMuThetaAbs | kBothMuMatchLpt | kDimuUnlikeSign | kDimuRapidity );
}  

//________________________________________________________________________
void AliMuonPairCuts::SetIsMC ( Bool_t isMC )
{
  /// Set Is MC
  fMuonTrackCuts.SetIsMC(isMC);
}

//________________________________________________________________________
Bool_t AliMuonPairCuts::TrackPtCutMatchTrigClass ( const AliVParticle* track1, const AliVParticle* track2, const TArrayI ptCutFromClass ) const
{
  /// Check if track pair passes the trigger pt cut level used in the trigger class
  Bool_t matchTrig1 = fMuonTrackCuts.TrackPtCutMatchTrigClass(track1, ptCutFromClass);
  Bool_t matchTrig2 = fMuonTrackCuts.TrackPtCutMatchTrigClass(track2, ptCutFromClass);
  
  Bool_t matchTrackerPt1 = kTRUE, matchTrackerPt2 = kTRUE;
  if ( IsApplySharpPtCutInMatching() ) {
    matchTrackerPt1 = ( track1->Pt() >= fMuonTrackCuts.GetMuonTrackCutsParam().GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
    matchTrackerPt2 = ( track2->Pt() >= fMuonTrackCuts.GetMuonTrackCutsParam().GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
  }
  
  matchTrig1 = ( matchTrig1 && matchTrackerPt1 );
  matchTrig2 = ( matchTrig2 && matchTrackerPt2 );
  
  Bool_t passCut = ( ptCutFromClass[1]>0 ) ? ( matchTrig1 && matchTrig2 ) : ( matchTrig1 || matchTrig2 );

  AliDebug(1,Form("Class matchTrig %i %i  trackMatchTrig %i %i trackPt %g %g (required %i)  passCut %i", ptCutFromClass[0], ptCutFromClass[1], matchTrig1, matchTrig2, track1->Pt(), track2->Pt(), IsApplySharpPtCutInMatching(),passCut));
  return passCut;
}

//________________________________________________________________________
void AliMuonPairCuts::Print(Option_t* option) const
{
  //
  /// Print info
  //
  
  TString sopt(option);
  sopt.ToLower();
  if ( sopt.IsNull() || sopt.Contains("*") || sopt.Contains("all") ) sopt += " pair trackparam trackmask";
  if ( sopt.Contains("pair") ) {
    UInt_t filterMask = GetFilterMask();
    printf(" *** Muon pair filter mask: *** \n");
    printf("  0x%x\n", filterMask);
    if ( filterMask & kBothMuEta ) printf("  mu1 && mu2 pass eta cut\n");
    if ( filterMask & kBothMuThetaAbs ) printf("  mu1 && mu2 pass theta_abs cut\n");
    if ( filterMask & kBothMuPdca ) printf("  mu1 && mu2 pass pxDCA cut\n");
    if ( filterMask & kBothMuTrackChiSquare ) printf("  Chi2 cut on track\n");
    if ( filterMask & kBothMuMatchApt ) printf("  mu1 && mu2 match Apt\n");
    if ( filterMask & kBothMuMatchLpt ) printf("  mu1 && mu2 match Lpt\n");
    if ( filterMask & kBothMuMatchHpt ) printf("  mu1 && mu2 match Hpt\n");
    if ( filterMask & kOneMuMatchApt ) printf("  mu1 || mu2 match Apt\n");
    if ( filterMask & kOneMuMatchLpt ) printf("  mu1 || mu2 match Lpt\n");
    if ( filterMask & kOneMuMatchHpt ) printf("  mu1 || mu2 match Hpt\n");
    if ( filterMask & kDimuUnlikeSign ) printf("  Unlike sign\n");
    if ( filterMask & kDimuRapidity ) printf("  -4 < y_{mumu} < -2.5\n");
    printf(" ******************** \n");
  }
  
  if ( sopt.Contains("track") )
    fMuonTrackCuts.Print(sopt.Data());
}
 AliMuonPairCuts.cxx:1
 AliMuonPairCuts.cxx:2
 AliMuonPairCuts.cxx:3
 AliMuonPairCuts.cxx:4
 AliMuonPairCuts.cxx:5
 AliMuonPairCuts.cxx:6
 AliMuonPairCuts.cxx:7
 AliMuonPairCuts.cxx:8
 AliMuonPairCuts.cxx:9
 AliMuonPairCuts.cxx:10
 AliMuonPairCuts.cxx:11
 AliMuonPairCuts.cxx:12
 AliMuonPairCuts.cxx:13
 AliMuonPairCuts.cxx:14
 AliMuonPairCuts.cxx:15
 AliMuonPairCuts.cxx:16
 AliMuonPairCuts.cxx:17
 AliMuonPairCuts.cxx:18
 AliMuonPairCuts.cxx:19
 AliMuonPairCuts.cxx:20
 AliMuonPairCuts.cxx:21
 AliMuonPairCuts.cxx:22
 AliMuonPairCuts.cxx:23
 AliMuonPairCuts.cxx:24
 AliMuonPairCuts.cxx:25
 AliMuonPairCuts.cxx:26
 AliMuonPairCuts.cxx:27
 AliMuonPairCuts.cxx:28
 AliMuonPairCuts.cxx:29
 AliMuonPairCuts.cxx:30
 AliMuonPairCuts.cxx:31
 AliMuonPairCuts.cxx:32
 AliMuonPairCuts.cxx:33
 AliMuonPairCuts.cxx:34
 AliMuonPairCuts.cxx:35
 AliMuonPairCuts.cxx:36
 AliMuonPairCuts.cxx:37
 AliMuonPairCuts.cxx:38
 AliMuonPairCuts.cxx:39
 AliMuonPairCuts.cxx:40
 AliMuonPairCuts.cxx:41
 AliMuonPairCuts.cxx:42
 AliMuonPairCuts.cxx:43
 AliMuonPairCuts.cxx:44
 AliMuonPairCuts.cxx:45
 AliMuonPairCuts.cxx:46
 AliMuonPairCuts.cxx:47
 AliMuonPairCuts.cxx:48
 AliMuonPairCuts.cxx:49
 AliMuonPairCuts.cxx:50
 AliMuonPairCuts.cxx:51
 AliMuonPairCuts.cxx:52
 AliMuonPairCuts.cxx:53
 AliMuonPairCuts.cxx:54
 AliMuonPairCuts.cxx:55
 AliMuonPairCuts.cxx:56
 AliMuonPairCuts.cxx:57
 AliMuonPairCuts.cxx:58
 AliMuonPairCuts.cxx:59
 AliMuonPairCuts.cxx:60
 AliMuonPairCuts.cxx:61
 AliMuonPairCuts.cxx:62
 AliMuonPairCuts.cxx:63
 AliMuonPairCuts.cxx:64
 AliMuonPairCuts.cxx:65
 AliMuonPairCuts.cxx:66
 AliMuonPairCuts.cxx:67
 AliMuonPairCuts.cxx:68
 AliMuonPairCuts.cxx:69
 AliMuonPairCuts.cxx:70
 AliMuonPairCuts.cxx:71
 AliMuonPairCuts.cxx:72
 AliMuonPairCuts.cxx:73
 AliMuonPairCuts.cxx:74
 AliMuonPairCuts.cxx:75
 AliMuonPairCuts.cxx:76
 AliMuonPairCuts.cxx:77
 AliMuonPairCuts.cxx:78
 AliMuonPairCuts.cxx:79
 AliMuonPairCuts.cxx:80
 AliMuonPairCuts.cxx:81
 AliMuonPairCuts.cxx:82
 AliMuonPairCuts.cxx:83
 AliMuonPairCuts.cxx:84
 AliMuonPairCuts.cxx:85
 AliMuonPairCuts.cxx:86
 AliMuonPairCuts.cxx:87
 AliMuonPairCuts.cxx:88
 AliMuonPairCuts.cxx:89
 AliMuonPairCuts.cxx:90
 AliMuonPairCuts.cxx:91
 AliMuonPairCuts.cxx:92
 AliMuonPairCuts.cxx:93
 AliMuonPairCuts.cxx:94
 AliMuonPairCuts.cxx:95
 AliMuonPairCuts.cxx:96
 AliMuonPairCuts.cxx:97
 AliMuonPairCuts.cxx:98
 AliMuonPairCuts.cxx:99
 AliMuonPairCuts.cxx:100
 AliMuonPairCuts.cxx:101
 AliMuonPairCuts.cxx:102
 AliMuonPairCuts.cxx:103
 AliMuonPairCuts.cxx:104
 AliMuonPairCuts.cxx:105
 AliMuonPairCuts.cxx:106
 AliMuonPairCuts.cxx:107
 AliMuonPairCuts.cxx:108
 AliMuonPairCuts.cxx:109
 AliMuonPairCuts.cxx:110
 AliMuonPairCuts.cxx:111
 AliMuonPairCuts.cxx:112
 AliMuonPairCuts.cxx:113
 AliMuonPairCuts.cxx:114
 AliMuonPairCuts.cxx:115
 AliMuonPairCuts.cxx:116
 AliMuonPairCuts.cxx:117
 AliMuonPairCuts.cxx:118
 AliMuonPairCuts.cxx:119
 AliMuonPairCuts.cxx:120
 AliMuonPairCuts.cxx:121
 AliMuonPairCuts.cxx:122
 AliMuonPairCuts.cxx:123
 AliMuonPairCuts.cxx:124
 AliMuonPairCuts.cxx:125
 AliMuonPairCuts.cxx:126
 AliMuonPairCuts.cxx:127
 AliMuonPairCuts.cxx:128
 AliMuonPairCuts.cxx:129
 AliMuonPairCuts.cxx:130
 AliMuonPairCuts.cxx:131
 AliMuonPairCuts.cxx:132
 AliMuonPairCuts.cxx:133
 AliMuonPairCuts.cxx:134
 AliMuonPairCuts.cxx:135
 AliMuonPairCuts.cxx:136
 AliMuonPairCuts.cxx:137
 AliMuonPairCuts.cxx:138
 AliMuonPairCuts.cxx:139
 AliMuonPairCuts.cxx:140
 AliMuonPairCuts.cxx:141
 AliMuonPairCuts.cxx:142
 AliMuonPairCuts.cxx:143
 AliMuonPairCuts.cxx:144
 AliMuonPairCuts.cxx:145
 AliMuonPairCuts.cxx:146
 AliMuonPairCuts.cxx:147
 AliMuonPairCuts.cxx:148
 AliMuonPairCuts.cxx:149
 AliMuonPairCuts.cxx:150
 AliMuonPairCuts.cxx:151
 AliMuonPairCuts.cxx:152
 AliMuonPairCuts.cxx:153
 AliMuonPairCuts.cxx:154
 AliMuonPairCuts.cxx:155
 AliMuonPairCuts.cxx:156
 AliMuonPairCuts.cxx:157
 AliMuonPairCuts.cxx:158
 AliMuonPairCuts.cxx:159
 AliMuonPairCuts.cxx:160
 AliMuonPairCuts.cxx:161
 AliMuonPairCuts.cxx:162
 AliMuonPairCuts.cxx:163
 AliMuonPairCuts.cxx:164
 AliMuonPairCuts.cxx:165
 AliMuonPairCuts.cxx:166
 AliMuonPairCuts.cxx:167
 AliMuonPairCuts.cxx:168
 AliMuonPairCuts.cxx:169
 AliMuonPairCuts.cxx:170
 AliMuonPairCuts.cxx:171
 AliMuonPairCuts.cxx:172
 AliMuonPairCuts.cxx:173
 AliMuonPairCuts.cxx:174
 AliMuonPairCuts.cxx:175
 AliMuonPairCuts.cxx:176
 AliMuonPairCuts.cxx:177
 AliMuonPairCuts.cxx:178
 AliMuonPairCuts.cxx:179
 AliMuonPairCuts.cxx:180
 AliMuonPairCuts.cxx:181
 AliMuonPairCuts.cxx:182
 AliMuonPairCuts.cxx:183
 AliMuonPairCuts.cxx:184
 AliMuonPairCuts.cxx:185
 AliMuonPairCuts.cxx:186
 AliMuonPairCuts.cxx:187
 AliMuonPairCuts.cxx:188
 AliMuonPairCuts.cxx:189
 AliMuonPairCuts.cxx:190
 AliMuonPairCuts.cxx:191
 AliMuonPairCuts.cxx:192
 AliMuonPairCuts.cxx:193
 AliMuonPairCuts.cxx:194
 AliMuonPairCuts.cxx:195
 AliMuonPairCuts.cxx:196
 AliMuonPairCuts.cxx:197
 AliMuonPairCuts.cxx:198
 AliMuonPairCuts.cxx:199
 AliMuonPairCuts.cxx:200
 AliMuonPairCuts.cxx:201
 AliMuonPairCuts.cxx:202
 AliMuonPairCuts.cxx:203
 AliMuonPairCuts.cxx:204
 AliMuonPairCuts.cxx:205
 AliMuonPairCuts.cxx:206
 AliMuonPairCuts.cxx:207
 AliMuonPairCuts.cxx:208
 AliMuonPairCuts.cxx:209
 AliMuonPairCuts.cxx:210
 AliMuonPairCuts.cxx:211
 AliMuonPairCuts.cxx:212
 AliMuonPairCuts.cxx:213
 AliMuonPairCuts.cxx:214
 AliMuonPairCuts.cxx:215
 AliMuonPairCuts.cxx:216
 AliMuonPairCuts.cxx:217
 AliMuonPairCuts.cxx:218
 AliMuonPairCuts.cxx:219
 AliMuonPairCuts.cxx:220
 AliMuonPairCuts.cxx:221
 AliMuonPairCuts.cxx:222
 AliMuonPairCuts.cxx:223
 AliMuonPairCuts.cxx:224
 AliMuonPairCuts.cxx:225
 AliMuonPairCuts.cxx:226
 AliMuonPairCuts.cxx:227
 AliMuonPairCuts.cxx:228
 AliMuonPairCuts.cxx:229
 AliMuonPairCuts.cxx:230
 AliMuonPairCuts.cxx:231
 AliMuonPairCuts.cxx:232
 AliMuonPairCuts.cxx:233
 AliMuonPairCuts.cxx:234
 AliMuonPairCuts.cxx:235
 AliMuonPairCuts.cxx:236
 AliMuonPairCuts.cxx:237
 AliMuonPairCuts.cxx:238
 AliMuonPairCuts.cxx:239
 AliMuonPairCuts.cxx:240
 AliMuonPairCuts.cxx:241
 AliMuonPairCuts.cxx:242
 AliMuonPairCuts.cxx:243
 AliMuonPairCuts.cxx:244
 AliMuonPairCuts.cxx:245
 AliMuonPairCuts.cxx:246
 AliMuonPairCuts.cxx:247
 AliMuonPairCuts.cxx:248
 AliMuonPairCuts.cxx:249
 AliMuonPairCuts.cxx:250
 AliMuonPairCuts.cxx:251
 AliMuonPairCuts.cxx:252
 AliMuonPairCuts.cxx:253
 AliMuonPairCuts.cxx:254
 AliMuonPairCuts.cxx:255
 AliMuonPairCuts.cxx:256
 AliMuonPairCuts.cxx:257