]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/muon/AliMuonPairCuts.cxx
Updates on single muon HF analysis (Shuang)
[u/mrichter/AliRoot.git] / PWG / muon / AliMuonPairCuts.cxx
CommitLineData
64647ced 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
75ef785b 16#include "AliMuonPairCuts.h"
17
64647ced 18#include "TMath.h"
19#include "TList.h"
20#include "TLorentzVector.h"
ebba9ef0 21#include "TArrayI.h"
64647ced 22
23#include "AliLog.h"
24#include "AliVParticle.h"
68e9b988 25#include "AliInputEventHandler.h"
64647ced 26
64647ced 27/// \cond CLASSIMP
28ClassImp(AliMuonPairCuts) // Class implementation in ROOT context
29/// \endcond
30
31//________________________________________________________________________
32AliMuonPairCuts::AliMuonPairCuts() :
33 AliAnalysisCuts(),
34 fMuonTrackCuts()
35{
36 /// Default ctor.
37}
38
39//________________________________________________________________________
a12dc5da 40AliMuonPairCuts::AliMuonPairCuts(const char* name, const char* title) :
41AliAnalysisCuts(name, title),
42fMuonTrackCuts("muonTrackCutInPair","muonTrackCutInPair")
64647ced 43{
44 /// Constructor
45 SetDefaultFilterMask();
46}
47
48
49//________________________________________________________________________
50AliMuonPairCuts::AliMuonPairCuts(const char* name, const char* title, const AliMuonTrackCuts& trackCuts) :
51AliAnalysisCuts(name, title),
52fMuonTrackCuts(trackCuts)
53{
54 /// Test Constructor
55 SetDefaultFilterMask();
56}
57
58
64647ced 59//________________________________________________________________________
60AliMuonPairCuts::AliMuonPairCuts(const AliMuonPairCuts& obj) :
61 AliAnalysisCuts(obj),
62 fMuonTrackCuts(obj.fMuonTrackCuts)
63{
64 /// Copy constructor
65}
66
67
d555a462 68//________________________________________________________________________
69AliMuonPairCuts& AliMuonPairCuts::operator=(const AliMuonPairCuts& obj)
70{
71 /// Assignment operator
72 if ( this != &obj ) {
73 AliAnalysisCuts::operator=(obj);
74 fMuonTrackCuts = obj.fMuonTrackCuts;
75 }
76 return *this;
77}
78
79
64647ced 80//________________________________________________________________________
81AliMuonPairCuts::~AliMuonPairCuts()
82{
83 /// Destructor
84}
85
86//________________________________________________________________________
68e9b988 87Bool_t AliMuonPairCuts::SetRun ( const AliInputEventHandler* eventHandler )
64647ced 88{
89 /// Get parameters from OADB for runNumber
68e9b988 90 return fMuonTrackCuts.SetRun(eventHandler);
64647ced 91}
92
93
94//________________________________________________________________________
95Bool_t AliMuonPairCuts::IsSelected( TObject* /*obj*/ )
96{
97 /// Not implemented
98 AliError("Requires a list of two AliVParticle");
99 return kFALSE;
100}
101
102//________________________________________________________________________
103Bool_t AliMuonPairCuts::IsSelected( TList* list )
104{
105 /// Pair is selected
106 UInt_t filterMask = GetFilterMask();
107 UInt_t selectionMask = GetSelectionMask(list);
108
109 return ( ( selectionMask & filterMask ) == filterMask );
110}
111
260e4dda 112//________________________________________________________________________
113Bool_t AliMuonPairCuts::IsSelected( TObject* track1, TObject* track2 )
114{
115 /// Pair is selected
116 UInt_t filterMask = GetFilterMask();
117 UInt_t selectionMask = GetSelectionMask(track1, track2);
118
119 return ( ( selectionMask & filterMask ) == filterMask );
120}
121
64647ced 122
123//________________________________________________________________________
124UInt_t AliMuonPairCuts::GetSelectionMask( const TObject* obj )
125{
126 /// Get selection mask (overloaded function)
127 const TList* list = static_cast<const TList*> ( obj );
128 if ( list->GetEntries() < 2 ) {
129 AliError("Requires a list of two AliVParticle");
130 return 0;
131 }
132
133 return GetSelectionMask(list->At(0), list->At(1));
134
135}
136
137
138//________________________________________________________________________
139UInt_t AliMuonPairCuts::GetSelectionMask( const TObject* track1, const TObject* track2 )
140{
141 /// Get selection mask from AliVParticles
142
143 UInt_t selectionMask = 0;
144
145 UInt_t maskTrack1 = fMuonTrackCuts.GetSelectionMask(track1);
146 UInt_t maskTrack2 = fMuonTrackCuts.GetSelectionMask(track2);
147
148 UInt_t maskAND = maskTrack1 & maskTrack2;
149 UInt_t maskOR = maskTrack1 | maskTrack2;
150 if ( maskAND & AliMuonTrackCuts::kMuEta ) selectionMask |= kBothMuEta;
151 if ( maskAND & AliMuonTrackCuts::kMuThetaAbs ) selectionMask |= kBothMuThetaAbs;
152 if ( maskAND & AliMuonTrackCuts::kMuPdca ) selectionMask |= kBothMuPdca;
153 if ( maskAND & AliMuonTrackCuts::kMuTrackChiSquare ) selectionMask |= kBothMuTrackChiSquare;
154 if ( maskAND & AliMuonTrackCuts::kMuMatchApt ) selectionMask |= kBothMuMatchApt;
155 if ( maskAND & AliMuonTrackCuts::kMuMatchLpt ) selectionMask |= kBothMuMatchLpt;
156 if ( maskAND & AliMuonTrackCuts::kMuMatchHpt ) selectionMask |= kBothMuMatchHpt;
157 if ( maskOR & AliMuonTrackCuts::kMuMatchApt ) selectionMask |= kOneMuMatchApt;
158 if ( maskOR & AliMuonTrackCuts::kMuMatchLpt ) selectionMask |= kOneMuMatchLpt;
159 if ( maskOR & AliMuonTrackCuts::kMuMatchHpt ) selectionMask |= kOneMuMatchHpt;
160
161 TLorentzVector vec[2];
162 Double_t chargeProduct = 1.;
163 for ( Int_t itrack=0; itrack<2; ++itrack ) {
164 const AliVParticle* track = static_cast<const AliVParticle*> ( ( itrack == 0 ) ? track1 : track2 );
165 chargeProduct *= track->Charge();
166 Double_t trackP = track->P();
167 Double_t energy = TMath::Sqrt(trackP*trackP + MuonMass2());
168 vec[itrack].SetPxPyPzE(track->Px(), track->Py(), track->Pz(), energy);
169 }
170
171 if ( chargeProduct < 0. ) selectionMask |= kDimuUnlikeSign;
172
173 TLorentzVector vecPair = vec[0] + vec[1];
174 Double_t rapidity = vecPair.Rapidity();
175 if ( rapidity > -4. && rapidity < -2.5 ) selectionMask |= kDimuRapidity;
176
177 return selectionMask;
178}
179
180
181//_____________________________________________________________________________
182Double_t AliMuonPairCuts::MuonMass2() const
183{
184 /// A usefull constant
76f86d1c 185 static Double_t m2 = 1.11636129640000012e-02;
64647ced 186 return m2;
187}
188
189
190//________________________________________________________________________
191void AliMuonPairCuts::SetDefaultFilterMask ()
192{
193 /// Standard cuts for muon pair
194 SetFilterMask ( kBothMuEta | kBothMuThetaAbs | kBothMuMatchLpt | kDimuUnlikeSign | kDimuRapidity );
195}
196
197//________________________________________________________________________
198void AliMuonPairCuts::SetIsMC ( Bool_t isMC )
199{
200 /// Set Is MC
201 fMuonTrackCuts.SetIsMC(isMC);
202}
203
ebba9ef0 204//________________________________________________________________________
205Bool_t AliMuonPairCuts::TrackPtCutMatchTrigClass ( const AliVParticle* track1, const AliVParticle* track2, const TArrayI ptCutFromClass ) const
206{
207 /// Check if track pair passes the trigger pt cut level used in the trigger class
208 Bool_t matchTrig1 = fMuonTrackCuts.TrackPtCutMatchTrigClass(track1, ptCutFromClass);
209 Bool_t matchTrig2 = fMuonTrackCuts.TrackPtCutMatchTrigClass(track2, ptCutFromClass);
210
211 Bool_t matchTrackerPt1 = kTRUE, matchTrackerPt2 = kTRUE;
212 if ( IsApplySharpPtCutInMatching() ) {
68e9b988 213 matchTrackerPt1 = ( track1->Pt() >= fMuonTrackCuts.GetMuonTrackCutsParam().GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
214 matchTrackerPt2 = ( track2->Pt() >= fMuonTrackCuts.GetMuonTrackCutsParam().GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) );
ebba9ef0 215 }
216
217 matchTrig1 = ( matchTrig1 && matchTrackerPt1 );
218 matchTrig2 = ( matchTrig2 && matchTrackerPt2 );
219
220 Bool_t passCut = ( ptCutFromClass[1]>0 ) ? ( matchTrig1 && matchTrig2 ) : ( matchTrig1 || matchTrig2 );
221
222 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));
223 return passCut;
224}
225
64647ced 226//________________________________________________________________________
227void AliMuonPairCuts::Print(Option_t* option) const
228{
229 //
230 /// Print info
231 //
232
233 TString sopt(option);
234 sopt.ToLower();
76f86d1c 235 if ( sopt.IsNull() || sopt.Contains("*") || sopt.Contains("all") ) sopt += " pair trackparam trackmask";
64647ced 236 if ( sopt.Contains("pair") ) {
237 UInt_t filterMask = GetFilterMask();
238 printf(" *** Muon pair filter mask: *** \n");
239 printf(" 0x%x\n", filterMask);
240 if ( filterMask & kBothMuEta ) printf(" mu1 && mu2 pass eta cut\n");
241 if ( filterMask & kBothMuThetaAbs ) printf(" mu1 && mu2 pass theta_abs cut\n");
242 if ( filterMask & kBothMuPdca ) printf(" mu1 && mu2 pass pxDCA cut\n");
243 if ( filterMask & kBothMuTrackChiSquare ) printf(" Chi2 cut on track\n");
244 if ( filterMask & kBothMuMatchApt ) printf(" mu1 && mu2 match Apt\n");
245 if ( filterMask & kBothMuMatchLpt ) printf(" mu1 && mu2 match Lpt\n");
246 if ( filterMask & kBothMuMatchHpt ) printf(" mu1 && mu2 match Hpt\n");
89f8af70 247 if ( filterMask & kOneMuMatchApt ) printf(" mu1 || mu2 match Apt\n");
248 if ( filterMask & kOneMuMatchLpt ) printf(" mu1 || mu2 match Lpt\n");
249 if ( filterMask & kOneMuMatchHpt ) printf(" mu1 || mu2 match Hpt\n");
64647ced 250 if ( filterMask & kDimuUnlikeSign ) printf(" Unlike sign\n");
251 if ( filterMask & kDimuRapidity ) printf(" -4 < y_{mumu} < -2.5\n");
252 printf(" ******************** \n");
253 }
254
255 if ( sopt.Contains("track") )
256 fMuonTrackCuts.Print(sopt.Data());
257}