]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONRecoParam.cxx
In MUONTRK*da:
[u/mrichter/AliRoot.git] / MUON / AliMUONRecoParam.cxx
CommitLineData
3304fa09 1/**************************************************************************
2* Copyright(c) 1998-2007, 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
bf4d93eb 16// $Id$
3304fa09 17
18//-----------------------------------------------------------------------------
19/// \class AliMUONRecoParam
20///
21/// Class with MUON reconstruction parameters
22///
23/// \author Philippe Pillot
24//-----------------------------------------------------------------------------
25
26
27
28#include "AliMUONRecoParam.h"
ad3c6eda 29#include "AliMUONPadStatusMaker.h"
3304fa09 30
ad3c6eda 31#include "AliRecoParam.h"
3304fa09 32#include "AliLog.h"
33
34#include <Riostream.h>
35
36ClassImp(AliMUONRecoParam)
37
38
39//_____________________________________________________________________________
40AliMUONRecoParam::AliMUONRecoParam()
15d30ed4 41: AliDetectorRecoParam(),
3304fa09 42 fClusteringMode("MLEM"),
43 fTrackingMode("KALMAN"),
44 fMinBendingMomentum(0.),
45 fMaxBendingMomentum(0.),
9bf6860b 46 fMaxNonBendingSlope(0.),
9f093251 47 fMaxBendingSlope(0.),
3304fa09 48 fNonBendingVertexDispersion(0.),
49 fBendingVertexDispersion(0.),
50 fMaxNonBendingDistanceToTrack(0.),
51 fMaxBendingDistanceToTrack(0.),
52 fSigmaCutForTracking(0.),
53 fSigmaCutForImprovement(0.),
fda59e58 54 fSigmaCutForTrigger(0.),
b5270f21 55 fStripCutForTrigger(0.),
56 fMaxStripAreaForTrigger(0.),
3304fa09 57 fMaxNormChi2MatchTrigger(0.),
0a18ba02 58 fPercentOfFullClusterInESD(10.),
38bcf0ef 59 fCombinedClusterTrackReco(kFALSE),
3304fa09 60 fTrackAllTracks(kFALSE),
61 fRecoverTracks(kFALSE),
62 fMakeTrackCandidatesFast(kFALSE),
9bf6860b 63 fMakeMoreTrackCandidates(kFALSE),
3304fa09 64 fComplementTracks(kFALSE),
65 fImproveTracks(kFALSE),
0a18ba02 66 fUseSmoother(kFALSE),
de98fdc9 67 fSaveFullClusterInESD(kTRUE),
9bf6860b 68 fCalibrationMode("NOGAIN"),
004a9ccd 69 fBypassSt45(0),
170f4046 70 fPadGoodnessMask(0),
c59f70b9 71 fChargeSigmaCut(4.0),
89c8d66d 72 fRemoveConnectedTracksInSt12(kFALSE),
73 fMaxTriggerTracks(0),
6b191dea 74 fMaxTrackCandidates(0),
75 fSelectTrackOnSlope(kFALSE)
3304fa09 76{
77 /// Constructor
78
ad3c6eda 79 SetNameTitle("Dummy","Dummy");
80 SetDefaultLimits();
3304fa09 81}
82
83//_____________________________________________________________________________
84AliMUONRecoParam::~AliMUONRecoParam()
85{
86 /// Destructor
87}
88
004a9ccd 89//_____________________________________________________________________________
90void
91AliMUONRecoParam::BypassSt45(Bool_t st4, Bool_t st5)
92{
93 /// Set the bypass status
94
95 if ( st4 && st5 ) fBypassSt45 = 45;
96 else if ( st4 ) fBypassSt45 = 4;
97 else if ( st5 ) fBypassSt45 = 5;
98 else fBypassSt45 = 0;
99}
100
9bf6860b 101//_____________________________________________________________________________
102Option_t*
103AliMUONRecoParam::GetCalibrationMode() const
104{
105 /// Return the calibration mode. Can be :
106 /// NOGAIN : only do pedestal subtraction
107 /// GAIN : do pedestal subtraction, and apply gain correction, but with a
108 /// single capacitance value for all channels
109 /// GAINCONSTANTCAPA : as GAIN, but with a channel-dependent capacitance value
110
111 return fCalibrationMode.Data();
112}
113
3304fa09 114//_____________________________________________________________________________
115AliMUONRecoParam *AliMUONRecoParam::GetLowFluxParam()
116{
117 /// Return default reconstruction parameters for low flux environment
118
119 AliMUONRecoParam *param = new AliMUONRecoParam();
120 param->SetLowFluxParam();
121
122 return param;
123}
124
125//_____________________________________________________________________________
126AliMUONRecoParam *AliMUONRecoParam::GetHighFluxParam()
127{
128 /// Return default reconstruction parameters for high flux environment
129
130 AliMUONRecoParam *param = new AliMUONRecoParam();
131 param->SetHighFluxParam();
132
133 return param;
134}
135
0e894e58 136//_____________________________________________________________________________
137AliMUONRecoParam *AliMUONRecoParam::GetCosmicParam()
138{
139 /// Return default reconstruction parameters for high flux environment
140
141 AliMUONRecoParam *param = new AliMUONRecoParam();
142 param->SetCosmicParam();
143
144 return param;
145}
146
3304fa09 147//_____________________________________________________________________________
148void AliMUONRecoParam::SetLowFluxParam()
149{
150 /// Set reconstruction parameters for low flux environment
151
ad3c6eda 152 SetNameTitle("Low Flux","Low Flux");
153 SetEventSpecie(AliRecoParam::kLowMult);
9bf6860b 154 fMinBendingMomentum = 1.;
3304fa09 155 fMaxBendingMomentum = 3000.;
9bf6860b 156 fMaxNonBendingSlope = 0.3;
9f093251 157 fMaxBendingSlope = 0.4;
6b191dea 158 fSelectTrackOnSlope = kFALSE;
159 fNonBendingVertexDispersion = 70.;
160 fBendingVertexDispersion = 70.;
9bf6860b 161 fMaxNonBendingDistanceToTrack = 1.;
162 fMaxBendingDistanceToTrack = 1.;
3304fa09 163 fSigmaCutForTracking = 6.;
164 fSigmaCutForImprovement = 5.;
fda59e58 165 fSigmaCutForTrigger = 8.;
b5270f21 166 fStripCutForTrigger = 1.;
167 fMaxStripAreaForTrigger = 3.;
3304fa09 168 fMaxNormChi2MatchTrigger = 16.;
6cac085d 169 fCombinedClusterTrackReco = kFALSE;
3304fa09 170 fTrackAllTracks = kTRUE;
171 fRecoverTracks = kTRUE;
172 fMakeTrackCandidatesFast = kFALSE;
9bf6860b 173 fMakeMoreTrackCandidates = kFALSE;
3304fa09 174 fComplementTracks = kTRUE;
175 fImproveTracks = kTRUE;
c59f70b9 176 fRemoveConnectedTracksInSt12 = kTRUE;
3304fa09 177 fUseSmoother = kTRUE;
35be7ed7 178 for (Int_t iCh = 0; iCh < 10; iCh++) {
179 fUseChamber[iCh] = kTRUE;
180 fDefaultNonBendingReso[iCh] = 0.144;
181 fDefaultBendingReso[iCh] = 0.01;
182 }
9bf6860b 183 for (Int_t iSt = 0; iSt < 5; iSt++) fRequestStation[iSt] = kTRUE;
004a9ccd 184 fBypassSt45 = 0;
89c8d66d 185 fMaxTriggerTracks = 100;
186 fMaxTrackCandidates = 10000;
3304fa09 187
188}
189
190//_____________________________________________________________________________
191void AliMUONRecoParam::SetHighFluxParam()
192{
193 /// Set reconstruction parameters for high flux environment
194
ad3c6eda 195 SetNameTitle("High Flux","High Flux");
196 SetEventSpecie(AliRecoParam::kHighMult);
9bf6860b 197 fMinBendingMomentum = 1.;
3304fa09 198 fMaxBendingMomentum = 3000.;
9bf6860b 199 fMaxNonBendingSlope = 0.3;
9f093251 200 fMaxBendingSlope = 0.4;
6b191dea 201 fSelectTrackOnSlope = kFALSE;
202 fNonBendingVertexDispersion = 70.;
203 fBendingVertexDispersion = 70.;
9bf6860b 204 fMaxNonBendingDistanceToTrack = 1.;
205 fMaxBendingDistanceToTrack = 1.;
3304fa09 206 fSigmaCutForTracking = 6.;
207 fSigmaCutForImprovement = 5.;
fda59e58 208 fSigmaCutForTrigger = 8.;
b5270f21 209 fStripCutForTrigger = 1.;
210 fMaxStripAreaForTrigger = 3.;
3304fa09 211 fMaxNormChi2MatchTrigger = 16.;
6cac085d 212 fCombinedClusterTrackReco = kFALSE;
3304fa09 213 fTrackAllTracks = kTRUE;
214 fRecoverTracks = kTRUE;
215 fMakeTrackCandidatesFast = kFALSE;
9bf6860b 216 fMakeMoreTrackCandidates = kFALSE;
3304fa09 217 fComplementTracks = kTRUE;
218 fImproveTracks = kTRUE;
c59f70b9 219 fRemoveConnectedTracksInSt12 = kFALSE;
3304fa09 220 fUseSmoother = kTRUE;
35be7ed7 221 for (Int_t iCh = 0; iCh < 10; iCh++) {
222 fUseChamber[iCh] = kTRUE;
223 fDefaultNonBendingReso[iCh] = 0.144;
224 fDefaultBendingReso[iCh] = 0.01;
225 }
9bf6860b 226 for (Int_t iSt = 0; iSt < 5; iSt++) fRequestStation[iSt] = kTRUE;
004a9ccd 227 fBypassSt45 = 0;
89c8d66d 228 fMaxTriggerTracks = 100;
229 fMaxTrackCandidates = 10000;
3304fa09 230
231}
232
0e894e58 233//_____________________________________________________________________________
234void AliMUONRecoParam::SetCosmicParam()
235{
236 /// Set reconstruction parameters for high flux environment
237
ad3c6eda 238 SetNameTitle("Cosmic","Cosmic");
239 SetEventSpecie(AliRecoParam::kCosmic);
0e894e58 240 fMinBendingMomentum = 1.;
241 fMaxBendingMomentum = 10000000.;
6b191dea 242 fMaxNonBendingSlope = 0.4;
243 fMaxBendingSlope = 0.5;
244 fSelectTrackOnSlope = kTRUE;
245 fNonBendingVertexDispersion = 200.;
246 fBendingVertexDispersion = 200.;
247 fMaxNonBendingDistanceToTrack = 1.;
248 fMaxBendingDistanceToTrack = 1.;
89c8d66d 249 fSigmaCutForTracking = 7.;
250 fSigmaCutForImprovement = 7.;
0e894e58 251 fSigmaCutForTrigger = 8.;
54355f2c 252 fStripCutForTrigger = 1.5;
253 fMaxStripAreaForTrigger = 3.;
0e894e58 254 fMaxNormChi2MatchTrigger = 16.;
255 fPercentOfFullClusterInESD = 100.;
256 fCombinedClusterTrackReco = kFALSE;
257 fTrackAllTracks = kTRUE;
258 fRecoverTracks = kTRUE;
259 fMakeTrackCandidatesFast = kFALSE;
260 fMakeMoreTrackCandidates = kFALSE;
261 fComplementTracks = kTRUE;
262 fImproveTracks = kTRUE;
c59f70b9 263 fRemoveConnectedTracksInSt12 = kTRUE;
0e894e58 264 fUseSmoother = kTRUE;
265 fSaveFullClusterInESD = kTRUE;
35be7ed7 266 for (Int_t iCh = 0; iCh < 10; iCh++) {
267 fUseChamber[iCh] = kTRUE;
89c8d66d 268 fDefaultNonBendingReso[iCh] = 0.4;
269 fDefaultBendingReso[iCh] = 0.4;
35be7ed7 270 }
0e894e58 271 for (Int_t iSt = 0; iSt < 5; iSt++) fRequestStation[iSt] = kTRUE;
004a9ccd 272 fBypassSt45 = 0;
2b8a1212 273 fPadGoodnessMask = 0xC00BE80;
89c8d66d 274 fMaxTriggerTracks = 100;
275 fMaxTrackCandidates = 10000;
0e894e58 276
277}
278
c59f70b9 279//_____________________________________________________________________________
280UInt_t
281AliMUONRecoParam::RequestedStationMask() const
282{
283 /// Get the mask of the requested station, i.e. an integer where
284 /// bit n is set to one if the station n was requested
285
286 UInt_t m(0);
287
288 for ( Int_t i = 0; i < 5; ++i )
289 {
290 if ( RequestStation(i) ) m |= ( 1 << i );
291 }
292 return m;
293}
294
3304fa09 295//_____________________________________________________________________________
296void AliMUONRecoParam::Print(Option_t *option) const
297{
298 /// print reconstruction parameters
299 /// if option = FULL then print also unused parameters
300
4348af6f 301 cout<<endl<<"\t------MUON Reconstruction parameters ("<<GetName()<<")------"<<endl;
ad3c6eda 302
303 if (IsDefault()) cout<<"\t\t*** Parameters used by default ***"<<endl;
3304fa09 304
de98fdc9 305 cout<<Form("Calibration mode = %s",fCalibrationMode.Data())<<endl;
3304fa09 306 cout<<Form("Clustering mode = %s",fClusteringMode.Data())<<endl;
3304fa09 307 cout<<Form("Tracking mode = %s",fTrackingMode.Data())<<endl;
9bf6860b 308
004a9ccd 309 TString bypass;
310
311 if ( BypassSt45() )
312 {
313 bypass = "stations 4 and 5";
314 }
315 else if ( BypassSt4() )
316 {
317 bypass = "station 4";
318 }
319 else if ( BypassSt5() )
320 {
321 bypass = "station 5";
322 }
323
324 if (bypass.Length()) cout << "Will bypass " << bypass.Data() << " (replacing real clusters by generated ones from trigger tracks)" << endl;
3304fa09 325
15d30ed4 326 if (fCombinedClusterTrackReco) cout<<"Combined cluster/track reconstruction: ON"<<endl;
327 else cout<<"Combined cluster/track reconstruction: OFF"<<endl;
38bcf0ef 328
0a18ba02 329 if (fSaveFullClusterInESD) cout<<Form("Save all cluster info in ESD for %5.2f %% of events",fPercentOfFullClusterInESD)<<endl;
330 else cout<<"Save partial cluster info in ESD"<<endl;
9bdbee64 331
6b191dea 332 cout<<"Selection of track candidates:"<<endl;
333 if (fSelectTrackOnSlope) cout<<Form("\t- Non-bending slope < %5.2f",fMaxNonBendingSlope)<<endl;
334 else cout<<"\t- Impact parameter < 3 * vertex dispersion in the non-bending direction"<<endl;
335 cout<<Form("\t- if B!=0: Bending momentum > %5.2f",fMinBendingMomentum)<<endl;
336 if (fSelectTrackOnSlope) cout<<Form("\t if B==0: Bending slope < %5.2f",fMaxBendingSlope)<<endl;
337 else cout<<"\t if B==0: Impact parameter < 3 * vertex dispersion in the bending direction"<<endl;
9f093251 338
6b191dea 339 cout<<Form("Vertex dispersion (used to estimate initial bending momentum resolution) = (%5.2f,%5.2f)",fNonBendingVertexDispersion,fBendingVertexDispersion)<<endl;
3304fa09 340
341 cout<<Form("Maximum distance to track = (%5.2f,%5.2f)",fMaxNonBendingDistanceToTrack,fMaxBendingDistanceToTrack)<<endl;
342
343 cout<<Form("Sigma cut for tracking = %5.2f",fSigmaCutForTracking)<<endl;
fda59e58 344
345 cout<<Form("Sigma cut for trigger hit pattern = %5.2f",fSigmaCutForTrigger)<<endl;
b5270f21 346
347 cout<<Form("Cut in strips for trigger chamber efficiency = %5.2f",fStripCutForTrigger)<<endl;
348
349 cout<<Form("Max search area in strips for trigger chamber efficiency = %5.2f",fMaxStripAreaForTrigger)<<endl;
350
3304fa09 351 if (fTrackAllTracks) cout<<"Track all the possible candidates"<<endl;
352 else cout<<"Track only the best candidates"<<endl;
353
354 if (strstr(option,"FULL")) {
355 cout<<"Make track candidates assuming linear propagation between stations 4 and 5: ";
356 if (fMakeTrackCandidatesFast) cout<<"ON"<<endl;
357 else cout<<"OFF"<<endl;
358 } else if (fMakeTrackCandidatesFast)
359 cout<<"Make track candidates assuming linear propagation between stations 4 and 5"<<endl;
360
9bf6860b 361 if (strstr(option,"FULL")) {
362 cout<<"Make track candidates starting from 1 cluster in each of the stations 4 and 5: ";
363 if (fMakeMoreTrackCandidates) cout<<"ON"<<endl;
364 else cout<<"OFF"<<endl;
365 } else if (fMakeMoreTrackCandidates)
366 cout<<"Make track candidates starting from 1 cluster in each of the stations 4 and 5"<<endl;
367
3304fa09 368 if (strstr(option,"FULL")) {
369 cout<<"Try to recover tracks getting lost during tracking: ";
370 if (fRecoverTracks) cout<<"ON"<<endl;
371 else cout<<"OFF"<<endl;
372 } else if (fRecoverTracks)
373 cout<<"Try to recover tracks getting lost during tracking"<<endl;
374
375 if (strstr(option,"FULL")) {
376 cout<<"Try to complete the reconstructed tracks by adding missing clusters: ";
377 if (fComplementTracks) cout<<"ON"<<endl;
378 else cout<<"OFF"<<endl;
379 } else if (fComplementTracks)
380 cout<<"Try to complete the reconstructed tracks by adding missing clusters"<<endl;
381
382 if (strstr(option,"FULL")) {
383 cout<<"Try to improve the reconstructed tracks by removing bad clusters: ";
384 if (fImproveTracks) cout<<Form("ON (sigma cut = %5.2f)",fSigmaCutForImprovement)<<endl;
385 else cout<<"OFF"<<endl;
386 } else if (fImproveTracks)
387 cout<<Form("Try to improve the reconstructed tracks by removing bad clusters (sigma cut = %5.2f)",fSigmaCutForImprovement)<<endl;
388
c59f70b9 389 if (fRemoveConnectedTracksInSt12) cout<<"Remove tracks sharing one cluster or more in any station"<<endl;
390 else cout<<"Remove tracks sharing one cluster or more in stations 3, 4 and 5"<<endl;
391
3304fa09 392 if (strstr(option,"FULL")) {
393 cout<<"Use smoother to compute final track parameters, etc, at each cluster (used for Kalman tracking only): ";
394 if (fUseSmoother) cout<<"ON"<<endl;
395 else cout<<"OFF"<<endl;
396 } else if (fUseSmoother)
397 cout<<"Use smoother to compute final track parameters, etc, at each cluster"<<endl;
398
399 cout<<Form("Maximum normalized chi2 of tracking/trigger track matching = %5.2f",fMaxNormChi2MatchTrigger)<<endl;
400
9bf6860b 401 Bool_t discardedCh = kFALSE;
402 Int_t ch = 0;
403 do {
404 if (!UseChamber(ch)) {
405 if (!discardedCh) {
406 cout<<"Discarded chambers(1..): "<<ch+1;
407 discardedCh = kTRUE;
408 }
409 else cout<<" "<<ch+1;
410 }
411 } while (++ch < 10);
412 if (discardedCh) cout<<endl;
413
414 Bool_t discardedSt = kFALSE;
415 Int_t st = 0;
416 do {
417 if (!RequestStation(st)) {
418 if (!discardedSt) {
419 cout<<"Not requested stations(1..): "<<st+1;
420 discardedSt = kTRUE;
421 }
422 else cout<<" "<<st+1;
423 }
424 } while (++st < 5);
425 if (discardedSt) cout<<endl;
426
35be7ed7 427 cout << Form("Pad goodness policy mask is 0x%x",PadGoodnessMask()) << endl;
428 cout << "Which means we reject pads having the condition = " <<
429 AliMUONPadStatusMaker::AsCondition(PadGoodnessMask()).Data() << endl;
430
431 cout << "The pad limits we are using are :" << endl;
432
433 cout << Form("%5.0f <= HVSt12 <= %5.0f Volts",HVSt12LowLimit(),HVSt12HighLimit()) << endl;
434 cout << Form("%5.0f <= HVSt345 <= %5.0f Volts",HVSt345LowLimit(),HVSt345HighLimit()) << endl;
435 cout << Form("%7.2f <= Pedestal mean <= %7.2f",PedMeanLowLimit(),PedMeanHighLimit()) << endl;
436 cout << Form("%7.2f <= Pedestal sigma <= %7.2f",PedSigmaLowLimit(),PedSigmaHighLimit()) << endl;
437 cout << Form("%e <= Gain linear term <= %e",GainA1LowLimit(),GainA1HighLimit()) << endl;
438 cout << Form("%e <= Gain quadratic term <= %e",GainA2LowLimit(),GainA2HighLimit()) << endl;
439 cout << Form("%5.0f <= Gain threshold term <= %5.0f",GainThresLowLimit(),GainThresHighLimit()) << endl;
170f4046 440
441 cout << Form("And we cut on charge >= %7.2f x ( pedestal sigma ) ",ChargeSigmaCut()) << endl;
442
35be7ed7 443 cout << "chamber non bending resolution = |";
444 for (Int_t iCh = 0; iCh < 10; iCh++) cout << Form(" %6.3f |",fDefaultNonBendingReso[iCh]);
445 cout << endl;
446 cout << "chamber bending resolution = |";
447 for (Int_t iCh = 0; iCh < 10; iCh++) cout << Form(" %6.3f |",fDefaultBendingReso[iCh]);
448 cout << endl;
89c8d66d 449 cout<<Form("maximum number of trigger tracks above which the tracking is cancelled = %d",fMaxTriggerTracks)<<endl;
450 cout<<Form("maximum number of track candidates above which the tracking abort = %d",fMaxTrackCandidates)<<endl;
35be7ed7 451
4348af6f 452 cout<<"\t-----------------------------------------------------"<<endl<<endl;
3304fa09 453
454}
455
004a9ccd 456//_____________________________________________________________________________
457void
458AliMUONRecoParam::SetDefaultLimits()
459{
460 /// Set the default limits and pad goodness policy
461
462 fHVSt12Limits[0]=1500;
463 fHVSt12Limits[1]=2000;
464
465 fHVSt345Limits[0]=1500;
466 fHVSt345Limits[1]=2000;
467
468 fPedMeanLimits[0] = 50;
469 fPedMeanLimits[1] = 1024;
470
89c8d66d 471 fPedSigmaLimits[0] = 0.6;
004a9ccd 472 fPedSigmaLimits[1] = 100;
473
474 fGainA1Limits[0] = 0.1;
475 fGainA1Limits[1] = 10;
476
477 fGainA2Limits[0] = -1E30;
478 fGainA2Limits[1] = 1E30;
479
480 fGainThresLimits[0] = 0;
481 fGainThresLimits[1] = 4095;
482
2b8a1212 483 fPadGoodnessMask = 0x8008080; // Ped is missing | HV is missing | killed
484
170f4046 485
486 fChargeSigmaCut = 4.0;
004a9ccd 487}
488