]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/muon/AliMuonTrackCuts.cxx
In AliMUONAlignment:
[u/mrichter/AliRoot.git] / PWG / muon / AliMuonTrackCuts.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
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
36ClassImp(AliMuonTrackCuts) // Class implementation in ROOT context
37/// \endcond
38
64647ced 39
40//________________________________________________________________________
41AliMuonTrackCuts::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//________________________________________________________________________
54AliMuonTrackCuts::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//________________________________________________________________________
69AliMuonTrackCuts::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//________________________________________________________________________
82AliMuonTrackCuts& 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//________________________________________________________________________
98AliMuonTrackCuts::~AliMuonTrackCuts()
99{
100 /// Destructor
101}
102
103//________________________________________________________________________
104Bool_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//________________________________________________________________________
122void 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//________________________________________________________________________
134Bool_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//________________________________________________________________________
144Bool_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//________________________________________________________________________
242Bool_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//________________________________________________________________________
256Bool_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//________________________________________________________________________
267UInt_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//________________________________________________________________________
348Bool_t AliMuonTrackCuts::IsSelected( TList* /* list */)
349{
350 /// Not implemented
351 AliError("Function not implemented: Use IsSelected(TObject*)");
352 return kFALSE;
353}
354
355
356//________________________________________________________________________
357Int_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//________________________________________________________________________
367TVector3 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//________________________________________________________________________
391Double_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//________________________________________________________________________
409void 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//________________________________________________________________________
418TVector3 AliMuonTrackCuts::GetMeanDCA () const
419{
420 /// Get mean DCA from track
421 return TVector3(fParameters[kMeanDcaX], fParameters[kMeanDcaY], fParameters[kMeanDcaZ]);
422}
423
424//________________________________________________________________________
425void 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//________________________________________________________________________
433Double_t AliMuonTrackCuts::GetMeanPCorr ( Double_t rAtAbsEnd ) const
434{
435 /// Get mean p correction
436 return fParameters[kMeanPCorr23+GetThetaAbsBin(rAtAbsEnd)];
437}
438
439//________________________________________________________________________
440void AliMuonTrackCuts::SetSigmaPdca ( Double_t sigmaThetaAbs23, Double_t sigmaThetaAbs310 )
441{
442 /// Set sigma pdca
443 SetParameter(kSigmaPdca23, sigmaThetaAbs23);
444 SetParameter(kSigmaPdca310, sigmaThetaAbs310);
445}
446
447//________________________________________________________________________
448Double_t AliMuonTrackCuts::GetSigmaPdca ( Double_t rAtAbsEnd ) const
449{
450 /// Get mean pdca
451 return fParameters[kSigmaPdca23+GetThetaAbsBin(rAtAbsEnd)];
452}
453
454//________________________________________________________________________
455void AliMuonTrackCuts::SetNSigmaPdca ( Double_t nSigmas )
456{
457 /// Set N sigma pdca cut
458 SetParameter(kNSigmaPdcaCut, nSigmas);
459}
460
461//________________________________________________________________________
462Double_t AliMuonTrackCuts::GetNSigmaPdca () const
463{
464 /// Get N sigma pdca cut
465 return fParameters[kNSigmaPdcaCut];
466}
467
468//________________________________________________________________________
469void AliMuonTrackCuts::SetChi2NormCut ( Double_t chi2normCut )
470{
471 /// Set cut on normalized chi2 of tracks
472 SetParameter(kChi2NormCut,chi2normCut);
473}
474
475//________________________________________________________________________
476Double_t AliMuonTrackCuts::GetChi2NormCut () const
477{
478 /// Get cut on normalized chi2 of tracks
479 return fParameters[kChi2NormCut];
480}
481
482//________________________________________________________________________
483void AliMuonTrackCuts::SetRelPResolution ( Double_t relPResolution )
484{
485 /// Set relative momentum resolution
486 SetParameter(kRelPResolution,relPResolution);
487}
488
489//________________________________________________________________________
490Double_t AliMuonTrackCuts::GetRelPResolution () const
491{
492 /// Get relative momentum resolution
493 return fParameters[kRelPResolution];
494}
495
496
497//________________________________________________________________________
498void AliMuonTrackCuts::SetSlopeResolution ( Double_t slopeResolution )
499{
500 /// Set slope resolution
501 SetParameter(kSlopeResolution,slopeResolution);
502}
503
504//________________________________________________________________________
505Double_t AliMuonTrackCuts::GetSlopeResolution () const
506{
507 /// Get slope resolution
508 return fParameters[kSlopeResolution];
509}
510
ea4793e5 511//________________________________________________________________________
512void 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//________________________________________________________________________
535Double_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//________________________________________________________________________
548void AliMuonTrackCuts::SetDefaultFilterMask ()
549{
550 /// Standard cuts for single muon
551 SetFilterMask ( kMuEta | kMuThetaAbs | kMuPdca | kMuMatchApt );
552}
553
554//________________________________________________________________________
555void 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}