]>
Commit | Line | Data |
---|---|---|
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 | ||
16 | #include "AliMuonPairCuts.h" | |
17 | ||
18 | #include "TMath.h" | |
19 | #include "TList.h" | |
20 | #include "TLorentzVector.h" | |
21 | #include "TArrayI.h" | |
22 | ||
23 | #include "AliLog.h" | |
24 | #include "AliVParticle.h" | |
25 | #include "AliInputEventHandler.h" | |
26 | ||
27 | /// \cond CLASSIMP | |
28 | ClassImp(AliMuonPairCuts) // Class implementation in ROOT context | |
29 | /// \endcond | |
30 | ||
31 | //________________________________________________________________________ | |
32 | AliMuonPairCuts::AliMuonPairCuts() : | |
33 | AliAnalysisCuts(), | |
34 | fMuonTrackCuts() | |
35 | { | |
36 | /// Default ctor. | |
37 | } | |
38 | ||
39 | //________________________________________________________________________ | |
40 | AliMuonPairCuts::AliMuonPairCuts(const char* name, const char* title) : | |
41 | AliAnalysisCuts(name, title), | |
42 | fMuonTrackCuts("muonTrackCutInPair","muonTrackCutInPair") | |
43 | { | |
44 | /// Constructor | |
45 | SetDefaultFilterMask(); | |
46 | } | |
47 | ||
48 | ||
49 | //________________________________________________________________________ | |
50 | AliMuonPairCuts::AliMuonPairCuts(const char* name, const char* title, const AliMuonTrackCuts& trackCuts) : | |
51 | AliAnalysisCuts(name, title), | |
52 | fMuonTrackCuts(trackCuts) | |
53 | { | |
54 | /// Test Constructor | |
55 | SetDefaultFilterMask(); | |
56 | } | |
57 | ||
58 | ||
59 | //________________________________________________________________________ | |
60 | AliMuonPairCuts::AliMuonPairCuts(const AliMuonPairCuts& obj) : | |
61 | AliAnalysisCuts(obj), | |
62 | fMuonTrackCuts(obj.fMuonTrackCuts) | |
63 | { | |
64 | /// Copy constructor | |
65 | } | |
66 | ||
67 | ||
68 | //________________________________________________________________________ | |
69 | AliMuonPairCuts& 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 | ||
80 | //________________________________________________________________________ | |
81 | AliMuonPairCuts::~AliMuonPairCuts() | |
82 | { | |
83 | /// Destructor | |
84 | } | |
85 | ||
86 | //________________________________________________________________________ | |
87 | Bool_t AliMuonPairCuts::SetRun ( const AliInputEventHandler* eventHandler ) | |
88 | { | |
89 | /// Get parameters from OADB for runNumber | |
90 | return fMuonTrackCuts.SetRun(eventHandler); | |
91 | } | |
92 | ||
93 | ||
94 | //________________________________________________________________________ | |
95 | Bool_t AliMuonPairCuts::IsSelected( TObject* /*obj*/ ) | |
96 | { | |
97 | /// Not implemented | |
98 | AliError("Requires a list of two AliVParticle"); | |
99 | return kFALSE; | |
100 | } | |
101 | ||
102 | //________________________________________________________________________ | |
103 | Bool_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 | ||
112 | //________________________________________________________________________ | |
113 | Bool_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 | ||
122 | ||
123 | //________________________________________________________________________ | |
124 | UInt_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 | //________________________________________________________________________ | |
139 | UInt_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 | //_____________________________________________________________________________ | |
182 | Double_t AliMuonPairCuts::MuonMass2() const | |
183 | { | |
184 | /// A usefull constant | |
185 | static Double_t m2 = 1.11636129640000012e-02; | |
186 | return m2; | |
187 | } | |
188 | ||
189 | ||
190 | //________________________________________________________________________ | |
191 | void AliMuonPairCuts::SetDefaultFilterMask () | |
192 | { | |
193 | /// Standard cuts for muon pair | |
194 | SetFilterMask ( kBothMuEta | kBothMuThetaAbs | kBothMuMatchLpt | kDimuUnlikeSign | kDimuRapidity ); | |
195 | } | |
196 | ||
197 | //________________________________________________________________________ | |
198 | void AliMuonPairCuts::SetIsMC ( Bool_t isMC ) | |
199 | { | |
200 | /// Set Is MC | |
201 | fMuonTrackCuts.SetIsMC(isMC); | |
202 | } | |
203 | ||
204 | //________________________________________________________________________ | |
205 | Bool_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() ) { | |
213 | matchTrackerPt1 = ( track1->Pt() >= fMuonTrackCuts.GetMuonTrackCutsParam().GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) ); | |
214 | matchTrackerPt2 = ( track2->Pt() >= fMuonTrackCuts.GetMuonTrackCutsParam().GetSharpPtCut(ptCutFromClass[0]-1,kFALSE) ); | |
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 | ||
226 | //________________________________________________________________________ | |
227 | void AliMuonPairCuts::Print(Option_t* option) const | |
228 | { | |
229 | // | |
230 | /// Print info | |
231 | // | |
232 | ||
233 | TString sopt(option); | |
234 | sopt.ToLower(); | |
235 | if ( sopt.IsNull() || sopt.Contains("*") || sopt.Contains("all") ) sopt += " pair trackparam trackmask"; | |
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"); | |
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"); | |
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 | } |