]>
Commit | Line | Data |
---|---|---|
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 | ||
16 | #include "AliMuonTrackCuts.h" | |
17 | ||
64647ced | 18 | #include "TMath.h" |
19 | #include "TList.h" | |
20 | #include "TArrayD.h" | |
21 | #include "TObjArray.h" | |
22 | #include "TObjString.h" | |
23 | #include "TFile.h" | |
24 | #include "TParameter.h" | |
25 | #include "TKey.h" | |
26 | #include "TVector3.h" | |
0f7e072e | 27 | #include "TSystem.h" |
64647ced | 28 | |
29 | #include "AliLog.h" | |
30 | #include "AliVParticle.h" | |
31 | #include "AliESDMuonTrack.h" | |
32 | #include "AliAODTrack.h" | |
ea4793e5 | 33 | #include "AliAnalysisManager.h" |
64647ced | 34 | |
75ef785b | 35 | /// \cond CLASSIMP |
36 | ClassImp(AliMuonTrackCuts) // Class implementation in ROOT context | |
37 | /// \endcond | |
38 | ||
64647ced | 39 | |
40 | //________________________________________________________________________ | |
41 | AliMuonTrackCuts::AliMuonTrackCuts() : | |
42 | AliAnalysisCuts(), | |
43 | fIsESD(kFALSE), | |
44 | fIsMC(kFALSE), | |
45 | fUseCustomParam(kFALSE), | |
0f7e072e | 46 | fSharpPtCut(kFALSE), |
64647ced | 47 | fParameters(TArrayD(kNParameters)) |
48 | { | |
49 | /// Default ctor. | |
50 | fParameters.Reset(); | |
51 | } | |
52 | ||
53 | //________________________________________________________________________ | |
54 | AliMuonTrackCuts::AliMuonTrackCuts(const char* name, const char* title, Bool_t isESD ) : | |
55 | AliAnalysisCuts(name, title), | |
56 | fIsESD(isESD), | |
57 | fIsMC(kFALSE), | |
58 | fUseCustomParam(kFALSE), | |
0f7e072e | 59 | fSharpPtCut(kFALSE), |
64647ced | 60 | fParameters(TArrayD(kNParameters)) |
61 | { | |
62 | /// Constructor | |
63 | fParameters.Reset(); | |
64 | SetDefaultFilterMask(); | |
65 | } | |
66 | ||
67 | ||
68 | //________________________________________________________________________ | |
69 | AliMuonTrackCuts::AliMuonTrackCuts(const AliMuonTrackCuts& obj) : | |
70 | AliAnalysisCuts(obj), | |
71 | fIsESD(obj.fIsESD), | |
72 | fIsMC(obj.fIsMC), | |
73 | fUseCustomParam(obj.fUseCustomParam), | |
0f7e072e | 74 | fSharpPtCut(obj.fSharpPtCut), |
64647ced | 75 | fParameters(obj.fParameters) |
76 | { | |
77 | /// Copy constructor | |
78 | } | |
79 | ||
80 | ||
d555a462 | 81 | //________________________________________________________________________ |
82 | AliMuonTrackCuts& AliMuonTrackCuts::operator=(const AliMuonTrackCuts& obj) | |
83 | { | |
84 | /// Assignment operator | |
85 | if ( this != &obj ) { | |
86 | AliAnalysisCuts::operator=(obj); | |
87 | fIsESD = obj.fIsESD; | |
88 | fIsMC = obj.fIsMC; | |
89 | fUseCustomParam = obj.fUseCustomParam; | |
0f7e072e | 90 | fSharpPtCut = obj.fSharpPtCut; |
d555a462 | 91 | fParameters = obj.fParameters; |
92 | } | |
93 | return *this; | |
94 | } | |
95 | ||
96 | ||
64647ced | 97 | //________________________________________________________________________ |
98 | AliMuonTrackCuts::~AliMuonTrackCuts() | |
99 | { | |
100 | /// Destructor | |
101 | } | |
102 | ||
103 | //________________________________________________________________________ | |
104 | Bool_t AliMuonTrackCuts::RunMatchesRange( Int_t runNumber, const Char_t* objName ) | |
105 | { | |
106 | /// Check if the object contains the run | |
107 | TString sname(objName); | |
108 | TObjArray* array = sname.Tokenize("_"); | |
109 | array->SetOwner(); | |
110 | Int_t runRange[2] = { -1, -1 }; | |
111 | if ( array->GetEntries() >= 3 ) { | |
112 | for ( Int_t irun=0; irun<2; ++irun ) { | |
113 | TString currRun = array->At(irun+1)->GetName(); | |
114 | if ( currRun.IsDigit() ) runRange[irun] = currRun.Atoi(); | |
115 | } | |
116 | } | |
117 | delete array; | |
118 | return ( runNumber >= runRange[0] && runNumber <= runRange[1]); | |
119 | } | |
120 | ||
121 | //________________________________________________________________________ | |
122 | void AliMuonTrackCuts::SetUseCustomParam( Bool_t useCustomParam, Int_t runNumber ) | |
123 | { | |
124 | /// Flag to select custom parameters | |
125 | /// It first searches the default parameters in OADB | |
126 | /// then disables the access to the OADB | |
127 | /// and allows to manually modify parameters | |
128 | ||
129 | if ( ! fUseCustomParam && useCustomParam ) SetRun(runNumber); | |
130 | fUseCustomParam = useCustomParam; | |
131 | } | |
132 | ||
133 | //________________________________________________________________________ | |
134 | Bool_t AliMuonTrackCuts::SetRun( Int_t runNumber ) | |
135 | { | |
136 | /// Get parameters from OADB for runNumber | |
137 | ||
138 | if ( fUseCustomParam ) return kFALSE; | |
139 | return StreamParameters(runNumber, -1); | |
140 | } | |
141 | ||
142 | ||
143 | //________________________________________________________________________ | |
144 | Bool_t AliMuonTrackCuts::StreamParameters( Int_t runNumber, Int_t runMax ) | |
145 | { | |
146 | if ( runMax > 0 ) { // Stream to OADB | |
147 | if ( ! fUseCustomParam ) { | |
148 | AliError("Users are not allowed to update OADB. Use SetUseCustomParam() instead"); | |
149 | return kFALSE; | |
150 | } | |
151 | } | |
152 | ||
d0e201a1 | 153 | TString filename = Form("%s/PWG/MUON/MuonTrackCuts.root",AliAnalysisManager::GetOADBPath()); |
64647ced | 154 | if ( fIsMC ) filename.ReplaceAll(".root", "_MC.root"); |
155 | ||
156 | TString parNames[kNParameters]; | |
157 | parNames[kMeanDcaX] = "MeanDcaX"; | |
158 | parNames[kMeanDcaY] = "MeanDcaY"; | |
159 | parNames[kMeanDcaZ] = "MeanDcaZ"; | |
160 | parNames[kMeanPCorr23] = "MeanPCorr23"; | |
161 | parNames[kMeanPCorr310] = "MeanPCorr310"; | |
162 | parNames[kSigmaPdca23] = "SigmaPdca23"; | |
163 | parNames[kSigmaPdca310] = "SigmaPdca310"; | |
164 | parNames[kNSigmaPdcaCut] = "NSigmaPdcaCut"; | |
165 | parNames[kChi2NormCut] = "Chi2NormCut"; | |
166 | parNames[kRelPResolution] = "RelPResolution"; | |
ea4793e5 | 167 | parNames[kSharpPtApt] = "SharpPtApt"; |
168 | parNames[kSharpPtLpt] = "SharpPtLpt"; | |
169 | parNames[kSharpPtHpt] = "SharpPtHpt"; | |
64647ced | 170 | |
171 | TObjArray* paramList = 0x0; | |
172 | ||
173 | if ( runMax < 0 ) { // Get from OADB | |
174 | TFile* file = TFile::Open(filename.Data(), "READ"); | |
175 | if ( ! file ) { | |
176 | AliError(Form("OADB file %s not found!", filename.Data())); | |
177 | return kFALSE; | |
178 | } | |
179 | ||
180 | TList* listOfKeys = file->GetListOfKeys(); | |
181 | TIter next(listOfKeys); | |
182 | TObject* key = 0x0; | |
183 | Bool_t foundMatch = kFALSE; | |
184 | TObject* defaultObj = 0x0; | |
185 | while ( ( key = next() ) ) { | |
186 | TString objName = key->GetName(); | |
187 | objName.ToUpper(); | |
188 | if ( RunMatchesRange(runNumber, objName.Data()) ) { | |
189 | paramList = static_cast<TObjArray*>(file->Get(key->GetName())); | |
190 | foundMatch = kTRUE; | |
191 | break; | |
192 | } | |
193 | if ( objName.Contains("DEFAULT") ) defaultObj = file->Get(key->GetName()); | |
194 | } | |
195 | ||
196 | if ( ! foundMatch ) { | |
197 | AliWarning("Run number not found in OADB: using default"); | |
198 | if ( defaultObj ) paramList = static_cast<TObjArray*>(defaultObj); | |
199 | else { | |
200 | file->Close(); | |
201 | AliError("Default parameters not found in OADB!"); | |
202 | return kFALSE; | |
203 | } | |
204 | } | |
205 | ||
206 | AliInfo(Form("Required run %i. Param. set: %s", runNumber, paramList->GetName())); | |
207 | ||
208 | for ( Int_t ipar=0; ipar<kNParameters; ++ipar ) { | |
209 | TParameter<Double_t>* param = static_cast<TParameter<Double_t>*>(paramList->FindObject(parNames[ipar].Data())); | |
210 | if ( ! param ) { | |
211 | AliWarning(Form("Parameter %s not set", parNames[ipar].Data())); | |
212 | continue; | |
213 | } | |
214 | fParameters[ipar] = param->GetVal(); | |
215 | } | |
216 | ||
217 | file->Close(); | |
218 | } | |
219 | else { | |
220 | if ( ! paramList ) { | |
221 | paramList = new TObjArray(kNParameters); | |
222 | paramList->SetOwner(); | |
223 | } | |
224 | for ( Int_t ipar=0; ipar<kNParameters; ++ipar ) { | |
225 | TParameter<Double_t>* param= new TParameter<Double_t>(parNames[ipar].Data(), fParameters[ipar]); | |
226 | paramList->AddAt(param, ipar); | |
227 | } | |
228 | ||
229 | TString paramListName = "MuonCuts_"; | |
230 | paramListName += ( runNumber < 0 ) ? "Default" : Form("%i_%i",runNumber, runMax); | |
231 | AliInfo(Form("Adding %s to file %s", paramListName.Data(), filename.Data())); | |
232 | paramList->SetName(paramListName.Data()); | |
233 | TFile* file = TFile::Open(filename.Data(), "UPDATE"); | |
234 | paramList->Write(paramListName.Data(), TObject::kSingleKey); | |
235 | file->Close(); | |
236 | delete paramList; | |
237 | } | |
238 | return kTRUE; | |
239 | } | |
240 | ||
241 | //________________________________________________________________________ | |
242 | Bool_t AliMuonTrackCuts::SetParameter(Int_t iparam, Float_t value) | |
243 | { | |
244 | /// Set parameter | |
245 | if ( fUseCustomParam ) { | |
246 | fParameters.SetAt(value, iparam); | |
247 | return kTRUE; | |
248 | } | |
249 | ||
250 | AliWarning("Parameters automatically taken from OADB. If you want to use with custom parameters, use SetUseCustomParam()"); | |
251 | return kFALSE; | |
252 | } | |
253 | ||
254 | ||
255 | //________________________________________________________________________ | |
256 | Bool_t AliMuonTrackCuts::IsSelected( TObject* obj ) | |
257 | { | |
258 | /// Track is selected | |
259 | UInt_t filterMask = GetFilterMask(); | |
260 | UInt_t selectionMask = GetSelectionMask(obj); | |
261 | ||
262 | return ( ( selectionMask & filterMask ) == filterMask ); | |
263 | } | |
264 | ||
265 | ||
266 | //________________________________________________________________________ | |
267 | UInt_t AliMuonTrackCuts::GetSelectionMask( const TObject* obj ) | |
268 | { | |
269 | /// Get selection mask | |
270 | ||
271 | const AliVParticle* track = static_cast<const AliVParticle*> ( obj ); | |
272 | ||
273 | UInt_t selectionMask = 0; | |
274 | ||
275 | Bool_t isMuon = ( fIsESD ) ? ((AliESDMuonTrack*)track)->ContainTrackerData() : ((AliAODTrack*)track)->IsMuonTrack(); | |
276 | ||
277 | if ( ! isMuon ) return selectionMask; | |
278 | ||
279 | Double_t eta = track->Eta(); | |
280 | if ( eta > -4. && eta < -2.5 ) selectionMask |= kMuEta; | |
281 | ||
282 | Double_t rAbsEnd = ( fIsESD ) ? ((AliESDMuonTrack*)track)->GetRAtAbsorberEnd() : ((AliAODTrack*)track)->GetRAtAbsorberEnd(); | |
283 | Double_t thetaAbsEndDeg = TMath::ATan( rAbsEnd / 505. ) * TMath::RadToDeg(); | |
284 | ||
285 | if ( thetaAbsEndDeg > 2. && thetaAbsEndDeg < 10. ) selectionMask |= kMuThetaAbs; | |
286 | ||
287 | Int_t matchTrig = ( fIsESD ) ? ((AliESDMuonTrack*)track)->GetMatchTrigger() : ((AliAODTrack*)track)->GetMatchTrigger(); | |
d555a462 | 288 | Int_t cutLevel[3] = {kMuMatchApt, kMuMatchLpt, kMuMatchHpt}; |
d555a462 | 289 | Double_t pt = track->Pt(); |
290 | for ( Int_t ilevel=0; ilevel<3; ilevel++ ) { | |
291 | if ( matchTrig < ilevel+1 ) break; | |
0f7e072e | 292 | if ( fSharpPtCut && pt < GetSharpPtCut(ilevel) ) break; |
d555a462 | 293 | selectionMask |= cutLevel[ilevel]; |
d555a462 | 294 | } |
64647ced | 295 | |
296 | Double_t chi2norm = ( fIsESD ) ? ((AliESDMuonTrack*)track)->GetNormalizedChi2() : ((AliAODTrack*)track)->Chi2perNDF(); | |
297 | if ( chi2norm < GetChi2NormCut() ) selectionMask |= kMuTrackChiSquare; | |
298 | ||
299 | TVector3 dcaAtVz = GetCorrectedDCA(track); | |
300 | Double_t pTotMean = GetAverageMomentum(track); | |
301 | ||
302 | Double_t pDca = pTotMean * dcaAtVz.Mag(); | |
303 | ||
304 | Double_t pTot = track->P(); | |
305 | ||
306 | // Momentum resolution only | |
307 | // The cut depends on the momentum resolution. In particular: | |
308 | // Sigma_pDCA = Sqrt( Sigma_pDCA_measured^2 + Sigma_p/p * pDCA) | |
309 | // The relative momentum distribution Sigma_p/p is estimated from the track Delta_p, | |
310 | // and from the error on sagitta Delta_s: | |
311 | // Delta_p/p = p*Delta_s/(1+p*Delta_s) | |
312 | // A cut at N sigmas requres a cut in N Delta_s, so | |
313 | // Sigma_p/p(N) = p*N*Delta_s/(1+p*N*Delta_s) | |
314 | //Double_t pResolutionEffect = pDca * pTot * GetRelPResolution() / ( 1. + GetNSigmaPdca() * GetRelPResolution()*pTot ); | |
315 | ||
316 | //Double_t pResolutionEffect = 0.4 * pTot; // Values used in 2010 data | |
317 | //Double_t pResolutionEffect = 0.32 * pTot; // Values in 2011 | |
318 | //Double_t sigmaPdca = GetSigmaPdca(rAbsEnd); | |
319 | //Double_t sigmaPdcaWithRes = TMath::Sqrt( sigmaPdca*sigmaPdca + pResolutionEffect*pResolutionEffect ); | |
320 | ||
321 | // Momentum resolution and slope resolution | |
322 | // Due to the momentum resolution, the measured momentum is biased | |
323 | // Since we want to keep as much signal as possible, we want to avoid | |
324 | // that a measured pxDCA is rejected since the momentum is overestimated | |
325 | // p_true = p_meas - Delta_p | |
326 | // p_true = p_meas - N*Delta_s*p_meas / (1+n*Delta_s*p_meas) | |
327 | // Hence: | |
328 | // p_true x DCA < N * Sigma_pDCA_meas => | |
329 | // p_meas x DCA < N * Sigma_pDCA_meas / ( 1 - N*Delta_s*p_meas / (1+n*Delta_s*p_meas)) | |
330 | // Finally the cut value has to be summed in quadrature with the error on DCA, | |
331 | // which is given by the slope resolution | |
332 | // 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) | |
333 | Double_t nrp = GetNSigmaPdca() * GetRelPResolution() * pTot; | |
334 | Double_t pResolutionEffect = GetSigmaPdca(rAbsEnd) / ( 1. - nrp / ( 1. + nrp ) ); | |
335 | Double_t slopeResolutionEffect = 535. * GetSlopeResolution() * pTot; | |
336 | ||
337 | Double_t sigmaPdcaWithRes = TMath::Sqrt( pResolutionEffect*pResolutionEffect + slopeResolutionEffect*slopeResolutionEffect ); | |
338 | ||
339 | if ( pDca < GetNSigmaPdca() * sigmaPdcaWithRes ) selectionMask |= kMuPdca; | |
d555a462 | 340 | |
341 | AliDebug(1, Form("Selection mask 0x%x\n", selectionMask)); | |
64647ced | 342 | |
343 | return selectionMask; | |
344 | } | |
345 | ||
346 | ||
347 | //________________________________________________________________________ | |
348 | Bool_t AliMuonTrackCuts::IsSelected( TList* /* list */) | |
349 | { | |
350 | /// Not implemented | |
351 | AliError("Function not implemented: Use IsSelected(TObject*)"); | |
352 | return kFALSE; | |
353 | } | |
354 | ||
355 | ||
356 | //________________________________________________________________________ | |
357 | Int_t AliMuonTrackCuts::GetThetaAbsBin ( Double_t rAtAbsEnd ) const | |
358 | { | |
359 | /// Get theta abs bin | |
360 | Double_t thetaAbsEndDeg = TMath::ATan( rAtAbsEnd / 505. ) * TMath::RadToDeg(); | |
361 | Int_t thetaAbsBin = ( thetaAbsEndDeg < 3. ) ? kThetaAbs23 : kThetaAbs310; | |
362 | return thetaAbsBin; | |
363 | } | |
364 | ||
365 | ||
366 | //________________________________________________________________________ | |
367 | TVector3 AliMuonTrackCuts::GetCorrectedDCA ( const AliVParticle* track ) const | |
368 | { | |
369 | /// Get corrected DCA | |
370 | ||
371 | Double_t vtxPos[3]; | |
372 | if ( fIsESD ) { | |
373 | vtxPos[0] = ((AliESDMuonTrack*)track)->GetNonBendingCoor(); | |
374 | vtxPos[1] = ((AliESDMuonTrack*)track)->GetBendingCoor(); | |
375 | vtxPos[2] = ((AliESDMuonTrack*)track)->GetZ(); | |
376 | } | |
377 | else ((AliAODTrack*)track)->GetXYZ(vtxPos); | |
378 | ||
379 | TVector3 vertex(vtxPos); | |
380 | ||
381 | TVector3 dcaTrack(0.,0., vtxPos[2]); | |
382 | dcaTrack.SetX( ( fIsESD ) ? ((AliESDMuonTrack*)track)->GetNonBendingCoorAtDCA() : ((AliAODTrack*)track)->XAtDCA() ); | |
383 | dcaTrack.SetY( ( fIsESD ) ? ((AliESDMuonTrack*)track)->GetBendingCoorAtDCA() : ((AliAODTrack*)track)->YAtDCA() ); | |
384 | ||
385 | TVector3 dcaAtVz = dcaTrack - vertex - GetMeanDCA(); | |
386 | ||
387 | return dcaAtVz; | |
388 | } | |
389 | ||
390 | //________________________________________________________________________ | |
391 | Double_t AliMuonTrackCuts::GetAverageMomentum ( const AliVParticle* track ) const | |
392 | { | |
393 | /// Get average momentum before and after the absorber | |
394 | ||
395 | Double_t pTotMean = 0.; | |
396 | ||
397 | Double_t pTot = track->P(); | |
398 | //if ( fIsESD ) pTotMean = 0.5 * ( pTot + ((AliESDMuonTrack*)track)->PUncorrected() ); | |
399 | if ( fIsESD ) pTotMean = ((AliESDMuonTrack*)track)->PUncorrected(); // Increased stability if using uncorrected value | |
400 | else { | |
401 | pTotMean = pTot - GetMeanPCorr(((AliAODTrack*)track)->GetRAtAbsorberEnd()); | |
402 | } | |
403 | ||
404 | return pTotMean; | |
405 | } | |
406 | ||
407 | ||
408 | //________________________________________________________________________ | |
409 | void AliMuonTrackCuts::SetMeanDCA ( Double_t xAtDca, Double_t yAtDca, Double_t zAtDca ) | |
410 | { | |
411 | /// Set mean DCA from track | |
412 | SetParameter(kMeanDcaX, xAtDca); | |
413 | SetParameter(kMeanDcaY, yAtDca); | |
414 | SetParameter(kMeanDcaZ, zAtDca); | |
415 | } | |
416 | ||
417 | //________________________________________________________________________ | |
418 | TVector3 AliMuonTrackCuts::GetMeanDCA () const | |
419 | { | |
420 | /// Get mean DCA from track | |
421 | return TVector3(fParameters[kMeanDcaX], fParameters[kMeanDcaY], fParameters[kMeanDcaZ]); | |
422 | } | |
423 | ||
424 | //________________________________________________________________________ | |
425 | void AliMuonTrackCuts::SetMeanPCorr ( Double_t pCorrThetaAbs23, Double_t pCorrThetaAbs310 ) | |
426 | { | |
427 | /// Set mean p correction | |
428 | SetParameter(kMeanPCorr23, pCorrThetaAbs23); | |
429 | SetParameter(kMeanPCorr310, pCorrThetaAbs310); | |
430 | } | |
431 | ||
432 | //________________________________________________________________________ | |
433 | Double_t AliMuonTrackCuts::GetMeanPCorr ( Double_t rAtAbsEnd ) const | |
434 | { | |
435 | /// Get mean p correction | |
436 | return fParameters[kMeanPCorr23+GetThetaAbsBin(rAtAbsEnd)]; | |
437 | } | |
438 | ||
439 | //________________________________________________________________________ | |
440 | void AliMuonTrackCuts::SetSigmaPdca ( Double_t sigmaThetaAbs23, Double_t sigmaThetaAbs310 ) | |
441 | { | |
442 | /// Set sigma pdca | |
443 | SetParameter(kSigmaPdca23, sigmaThetaAbs23); | |
444 | SetParameter(kSigmaPdca310, sigmaThetaAbs310); | |
445 | } | |
446 | ||
447 | //________________________________________________________________________ | |
448 | Double_t AliMuonTrackCuts::GetSigmaPdca ( Double_t rAtAbsEnd ) const | |
449 | { | |
450 | /// Get mean pdca | |
451 | return fParameters[kSigmaPdca23+GetThetaAbsBin(rAtAbsEnd)]; | |
452 | } | |
453 | ||
454 | //________________________________________________________________________ | |
455 | void AliMuonTrackCuts::SetNSigmaPdca ( Double_t nSigmas ) | |
456 | { | |
457 | /// Set N sigma pdca cut | |
458 | SetParameter(kNSigmaPdcaCut, nSigmas); | |
459 | } | |
460 | ||
461 | //________________________________________________________________________ | |
462 | Double_t AliMuonTrackCuts::GetNSigmaPdca () const | |
463 | { | |
464 | /// Get N sigma pdca cut | |
465 | return fParameters[kNSigmaPdcaCut]; | |
466 | } | |
467 | ||
468 | //________________________________________________________________________ | |
469 | void AliMuonTrackCuts::SetChi2NormCut ( Double_t chi2normCut ) | |
470 | { | |
471 | /// Set cut on normalized chi2 of tracks | |
472 | SetParameter(kChi2NormCut,chi2normCut); | |
473 | } | |
474 | ||
475 | //________________________________________________________________________ | |
476 | Double_t AliMuonTrackCuts::GetChi2NormCut () const | |
477 | { | |
478 | /// Get cut on normalized chi2 of tracks | |
479 | return fParameters[kChi2NormCut]; | |
480 | } | |
481 | ||
482 | //________________________________________________________________________ | |
483 | void AliMuonTrackCuts::SetRelPResolution ( Double_t relPResolution ) | |
484 | { | |
485 | /// Set relative momentum resolution | |
486 | SetParameter(kRelPResolution,relPResolution); | |
487 | } | |
488 | ||
489 | //________________________________________________________________________ | |
490 | Double_t AliMuonTrackCuts::GetRelPResolution () const | |
491 | { | |
492 | /// Get relative momentum resolution | |
493 | return fParameters[kRelPResolution]; | |
494 | } | |
495 | ||
496 | ||
497 | //________________________________________________________________________ | |
498 | void AliMuonTrackCuts::SetSlopeResolution ( Double_t slopeResolution ) | |
499 | { | |
500 | /// Set slope resolution | |
501 | SetParameter(kSlopeResolution,slopeResolution); | |
502 | } | |
503 | ||
504 | //________________________________________________________________________ | |
505 | Double_t AliMuonTrackCuts::GetSlopeResolution () const | |
506 | { | |
507 | /// Get slope resolution | |
508 | return fParameters[kSlopeResolution]; | |
509 | } | |
510 | ||
ea4793e5 | 511 | //________________________________________________________________________ |
512 | void AliMuonTrackCuts::SetSharpPtCut ( Int_t trigPtCut, Double_t ptCutValue ) | |
513 | { | |
514 | /// Set sharp tracker cut matching the trigger level | |
515 | /// trigPtCut can be 0 (Apt), 1 (Lpt) or 2 (Hpt) | |
516 | Int_t ipar = -1; | |
517 | switch ( trigPtCut ) { | |
518 | case 0: | |
519 | ipar = kSharpPtApt; | |
520 | break; | |
521 | case 1: | |
522 | ipar = kSharpPtLpt; | |
523 | break; | |
524 | case 2: | |
525 | ipar = kSharpPtHpt; | |
526 | break; | |
527 | default: | |
528 | AliError("Allowed values for trigPtCut are 0 (Apt), 1 (Lpt), 2 (Hpt)"); | |
529 | return; | |
530 | } | |
531 | SetParameter(ipar,ptCutValue); | |
532 | } | |
533 | ||
534 | //________________________________________________________________________ | |
535 | Double_t AliMuonTrackCuts::GetSharpPtCut ( Int_t trigPtCut, Bool_t warn ) const | |
536 | { | |
537 | /// Get sharp tracker cut matching the trigger level | |
538 | /// trigPtCut can be 0 (Apt), 1 (Lpt) or 2 (Hpt) | |
539 | if ( trigPtCut < 0 || trigPtCut > 2 ) { | |
540 | if ( warn ) AliError("Allowed values for trigPtCut are 0 (Apt), 1 (Lpt), 2 (Hpt)"); | |
541 | return 0.; | |
542 | } | |
543 | Int_t ipar = kSharpPtApt + trigPtCut; | |
544 | return fParameters[ipar]; | |
545 | } | |
546 | ||
64647ced | 547 | //________________________________________________________________________ |
548 | void AliMuonTrackCuts::SetDefaultFilterMask () | |
549 | { | |
550 | /// Standard cuts for single muon | |
551 | SetFilterMask ( kMuEta | kMuThetaAbs | kMuPdca | kMuMatchApt ); | |
552 | } | |
553 | ||
554 | //________________________________________________________________________ | |
555 | void AliMuonTrackCuts::Print(Option_t* option) const | |
556 | { | |
557 | // | |
558 | /// Print info | |
559 | // | |
560 | TString sopt(option); | |
561 | sopt.ToLower(); | |
562 | if ( sopt.IsNull() || sopt.Contains("*") || sopt.Contains("all") ) sopt = "mask param"; | |
563 | UInt_t filterMask = GetFilterMask(); | |
d555a462 | 564 | Int_t cutLevel[3] = {kMuMatchApt, kMuMatchLpt, kMuMatchHpt}; |
d555a462 | 565 | TString cutLevelName[3] = {"Apt", "Lpt", "Hpt"}; |
64647ced | 566 | if ( sopt.Contains("mask") ) { |
567 | printf(" *** Muon track filter mask: *** \n"); | |
568 | printf(" 0x%x\n", filterMask); | |
569 | if ( filterMask & kMuEta ) printf(" -4 < eta < -2.5\n"); | |
570 | if ( filterMask & kMuThetaAbs ) printf(" 2 < theta_abs < 10 deg\n"); | |
571 | if ( filterMask & kMuPdca ) printf(" pxDCA cut\n"); | |
d555a462 | 572 | for ( Int_t ilevel=0; ilevel<3; ilevel++ ) { |
0f7e072e | 573 | if ( filterMask & cutLevel[ilevel] ) { |
574 | printf(" match %s", cutLevelName[ilevel].Data()); | |
575 | if ( fSharpPtCut ) printf(" && sharp pt from tracker"); | |
576 | printf("\n"); | |
577 | } | |
d555a462 | 578 | } |
64647ced | 579 | if ( filterMask & kMuTrackChiSquare ) printf(" Chi2 cut on track\n"); |
580 | printf(" ******************** \n"); | |
581 | } | |
582 | if ( sopt.Contains("param") ) { | |
583 | printf(" *** Muon track parameter summary: ***\n"); | |
584 | printf(" Mean vertex DCA: (%g, %g, %g)\n", fParameters[kMeanDcaX], fParameters[kMeanDcaY], fParameters[kMeanDcaZ]); | |
585 | printf(" Mean p correction (GeV/c): theta2-3 = %g theta3-10 = %g\n", fParameters[kMeanPCorr23], fParameters[kMeanPCorr310]); | |
586 | printf(" Sigma p x DCA (cm x GeV/c): theta2-3 = %g theta3-10 = %g\n", fParameters[kSigmaPdca23], fParameters[kSigmaPdca310]); | |
587 | printf(" Cut p x DCA in units of sigma: %g\n", fParameters[kNSigmaPdcaCut]); | |
588 | printf(" Cut on track chi2/NDF: %g\n", fParameters[kChi2NormCut]); | |
589 | printf(" Momentum resolution: %g\n", fParameters[kRelPResolution]); | |
590 | printf(" Slope resolution: %g\n", fParameters[kSlopeResolution]); | |
ea4793e5 | 591 | printf(" Sharp pt cut: %g (Apt) %g (Lpt) %g (Hpt)\n", fParameters[kSharpPtApt], fParameters[kSharpPtLpt], fParameters[kSharpPtHpt]); |
64647ced | 592 | printf(" ********************************\n"); |
593 | } | |
594 | } |