1 /**************************************************************************
2 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //-----------------------------------------------------------------------------
19 /// \class AliMUONRecoParam
21 /// Class with MUON reconstruction parameters
23 /// \author Philippe Pillot
24 //-----------------------------------------------------------------------------
28 #include "AliMUONRecoParam.h"
29 #include "AliMUONPadStatusMaker.h"
31 #include "AliRecoParam.h"
34 #include "AliCDBManager.h"
35 #include "AliCDBEntry.h"
37 #include <Riostream.h>
39 ClassImp(AliMUONRecoParam)
42 //_____________________________________________________________________________
43 AliMUONRecoParam::AliMUONRecoParam()
44 : AliDetectorRecoParam(),
45 fClusteringMode("MLEM"),
46 fTrackingMode("KALMAN"),
47 fMinBendingMomentum(0.),
48 fMaxBendingMomentum(0.),
49 fMaxNonBendingSlope(0.),
51 fNonBendingVertexDispersion(0.),
52 fBendingVertexDispersion(0.),
53 fMaxNonBendingDistanceToTrack(0.),
54 fMaxBendingDistanceToTrack(0.),
55 fSigmaCutForTracking(0.),
56 fSigmaCutForImprovement(0.),
57 fSigmaCutForTrigger(0.),
58 fStripCutForTrigger(0.),
59 fMaxStripAreaForTrigger(0.),
60 fMaxNormChi2MatchTrigger(0.),
61 fPercentOfFullClusterInESD(10.),
62 fCombinedClusterTrackReco(kFALSE),
63 fTrackAllTracks(kFALSE),
64 fRecoverTracks(kFALSE),
65 fMakeTrackCandidatesFast(kFALSE),
66 fMakeMoreTrackCandidates(kFALSE),
67 fComplementTracks(kFALSE),
68 fImproveTracks(kFALSE),
70 fSaveFullClusterInESD(kTRUE),
71 fCalibrationMode("NOGAIN"),
75 fRemoveConnectedTracksInSt12(kFALSE),
77 fMaxTrackCandidates(0),
78 fSelectTrackOnSlope(kFALSE),
79 fMissingPadFractionLimit(-1),
80 fFractionOfBuspatchOutsideOccupancyLimit(0),
81 fAverageNoisePadCharge(0.22875),
82 fClusterChargeCut(2.0),
83 fEventSizeSoftLimit(35.0),
84 fEventSizeHardLimit(45.0),
90 SetNameTitle("Dummy","Dummy");
91 for (Int_t iCh = 0; iCh < 10; iCh++) {
92 fUseChamber[iCh] = kTRUE;
93 fDefaultNonBendingReso[iCh] = 0.;
94 fDefaultBendingReso[iCh] = 0.;
96 for (Int_t iSt = 0; iSt < 5; iSt++) fRequestStation[iSt] = kTRUE;
100 //_____________________________________________________________________________
101 AliMUONRecoParam::~AliMUONRecoParam()
106 //_____________________________________________________________________________
108 AliMUONRecoParam::BypassSt45(Bool_t st4, Bool_t st5)
110 /// Set the bypass status
112 if ( st4 && st5 ) fBypassSt45 = 45;
113 else if ( st4 ) fBypassSt45 = 4;
114 else if ( st5 ) fBypassSt45 = 5;
115 else fBypassSt45 = 0;
118 //_____________________________________________________________________________
120 AliMUONRecoParam::GetCalibrationMode() const
122 /// Return the calibration mode. Can be :
123 /// NOGAIN : only do pedestal subtraction
124 /// GAIN : do pedestal subtraction, and apply gain correction, but with a
125 /// single capacitance value for all channels
126 /// INJECTIONGAIN : as GAIN, but with gain values taken as EMELEC factory values
127 /// GAINCONSTANTCAPA : as GAIN, but with a channel-dependent capacitance value
129 return fCalibrationMode.Data();
132 //_____________________________________________________________________________
133 AliMUONRecoParam *AliMUONRecoParam::GetLowFluxParam()
135 /// Return default reconstruction parameters for low flux environment
137 AliMUONRecoParam *param = new AliMUONRecoParam();
138 param->SetLowFluxParam();
143 //_____________________________________________________________________________
144 AliMUONRecoParam *AliMUONRecoParam::GetHighFluxParam()
146 /// Return default reconstruction parameters for high flux environment
148 AliMUONRecoParam *param = new AliMUONRecoParam();
149 param->SetHighFluxParam();
154 //_____________________________________________________________________________
155 AliMUONRecoParam *AliMUONRecoParam::GetCosmicParam()
157 /// Return default reconstruction parameters for high flux environment
159 AliMUONRecoParam *param = new AliMUONRecoParam();
160 param->SetCosmicParam();
165 //_____________________________________________________________________________
166 AliMUONRecoParam *AliMUONRecoParam::GetCalibrationParam()
168 /// Return default (dummy) reconstruction parameters for calibration environment
170 AliMUONRecoParam *param = new AliMUONRecoParam();
171 param->SetCalibrationParam();
177 //_____________________________________________________________________________
178 void AliMUONRecoParam::SetLowFluxParam()
180 /// Set reconstruction parameters for low flux environment
182 SetNameTitle("Low Flux","Low Flux");
183 SetEventSpecie(AliRecoParam::kLowMult);
184 fMinBendingMomentum = 0.8;
185 fMaxBendingMomentum = 1.e10;
186 fMaxNonBendingSlope = 0.3;
187 fMaxBendingSlope = 0.4;
188 fSelectTrackOnSlope = kFALSE;
189 fNonBendingVertexDispersion = 70.;
190 fBendingVertexDispersion = 70.;
191 fMaxNonBendingDistanceToTrack = 1.;
192 fMaxBendingDistanceToTrack = 1.;
193 fSigmaCutForTracking = 6.;
194 fSigmaCutForImprovement = 5.;
195 fSigmaCutForTrigger = 4.;
196 fStripCutForTrigger = 1.;
197 fMaxStripAreaForTrigger = 3.;
198 fMaxNormChi2MatchTrigger = fSigmaCutForTrigger * fSigmaCutForTrigger;
199 fCombinedClusterTrackReco = kFALSE;
200 fTrackAllTracks = kTRUE;
201 fRecoverTracks = kTRUE;
202 fMakeTrackCandidatesFast = kFALSE;
203 fMakeMoreTrackCandidates = kFALSE;
204 fComplementTracks = kTRUE;
205 fImproveTracks = kTRUE;
206 fRemoveConnectedTracksInSt12 = kFALSE;
207 fUseSmoother = kTRUE;
208 for (Int_t iCh = 0; iCh < 10; iCh++) {
209 fUseChamber[iCh] = kTRUE;
210 fDefaultNonBendingReso[iCh] = 0.144;
211 fDefaultBendingReso[iCh] = 0.01;
213 for (Int_t iSt = 0; iSt < 5; iSt++) fRequestStation[iSt] = kTRUE;
215 fMaxTriggerTracks = 100;
216 fMaxTrackCandidates = 10000;
219 //_____________________________________________________________________________
220 void AliMUONRecoParam::SetHighFluxParam()
222 /// Set reconstruction parameters for high flux environment
224 SetNameTitle("High Flux","High Flux");
225 SetEventSpecie(AliRecoParam::kHighMult);
226 fMinBendingMomentum = 0.8;
227 fMaxBendingMomentum = 1.e10;
228 fMaxNonBendingSlope = 0.3;
229 fMaxBendingSlope = 0.4;
230 fSelectTrackOnSlope = kFALSE;
231 fNonBendingVertexDispersion = 70.;
232 fBendingVertexDispersion = 70.;
233 fMaxNonBendingDistanceToTrack = 1.;
234 fMaxBendingDistanceToTrack = 1.;
235 fSigmaCutForTracking = 6.;
236 fSigmaCutForImprovement = 5.;
237 fSigmaCutForTrigger = 4.;
238 fStripCutForTrigger = 1.;
239 fMaxStripAreaForTrigger = 3.;
240 fMaxNormChi2MatchTrigger = fSigmaCutForTrigger * fSigmaCutForTrigger;
241 fCombinedClusterTrackReco = kFALSE;
242 fTrackAllTracks = kTRUE;
243 fRecoverTracks = kTRUE;
244 fMakeTrackCandidatesFast = kFALSE;
245 fMakeMoreTrackCandidates = kFALSE;
246 fComplementTracks = kTRUE;
247 fImproveTracks = kTRUE;
248 fRemoveConnectedTracksInSt12 = kFALSE;
249 fUseSmoother = kTRUE;
250 for (Int_t iCh = 0; iCh < 10; iCh++) {
251 fUseChamber[iCh] = kTRUE;
252 fDefaultNonBendingReso[iCh] = 0.144;
253 fDefaultBendingReso[iCh] = 0.01;
255 for (Int_t iSt = 0; iSt < 5; iSt++) fRequestStation[iSt] = kTRUE;
257 fMaxTriggerTracks = 100;
258 fMaxTrackCandidates = 10000;
261 //_____________________________________________________________________________
262 void AliMUONRecoParam::SetCosmicParam()
264 /// Set reconstruction parameters for high flux environment
266 SetNameTitle("Cosmic","Cosmic");
267 SetEventSpecie(AliRecoParam::kCosmic);
268 fMinBendingMomentum = 0.8;
269 fMaxBendingMomentum = 1.e10;
270 fMaxNonBendingSlope = 0.3;
271 fMaxBendingSlope = 0.4;
272 fSelectTrackOnSlope = kTRUE;
273 fNonBendingVertexDispersion = 170.;
274 fBendingVertexDispersion = 170.;
275 fMaxNonBendingDistanceToTrack = 1.;
276 fMaxBendingDistanceToTrack = 1.;
277 fSigmaCutForTracking = 7.;
278 fSigmaCutForImprovement = 6.;
279 fSigmaCutForTrigger = 4.;
280 fStripCutForTrigger = 1.5;
281 fMaxStripAreaForTrigger = 3.;
282 fMaxNormChi2MatchTrigger = fSigmaCutForTrigger * fSigmaCutForTrigger;
283 fPercentOfFullClusterInESD = 100.;
284 fCombinedClusterTrackReco = kFALSE;
285 fTrackAllTracks = kTRUE;
286 fRecoverTracks = kTRUE;
287 fMakeTrackCandidatesFast = kFALSE;
288 fMakeMoreTrackCandidates = kFALSE;
289 fComplementTracks = kTRUE;
290 fImproveTracks = kTRUE;
291 fRemoveConnectedTracksInSt12 = kTRUE;
292 fUseSmoother = kTRUE;
293 fSaveFullClusterInESD = kTRUE;
294 for (Int_t iCh = 0; iCh < 10; iCh++) {
295 fUseChamber[iCh] = kTRUE;
296 fDefaultNonBendingReso[iCh] = 0.4;
297 fDefaultBendingReso[iCh] = 0.4;
299 fRequestStation[0] = kTRUE;
300 fRequestStation[1] = kTRUE;
301 fRequestStation[2] = kTRUE;
302 fRequestStation[3] = kTRUE;
303 fRequestStation[4] = kTRUE;
305 fPadGoodnessMask = 0x400BE80; // Ped Mean is Zero | Ped Mean Too Low | Ped Mean Too High | Ped Sigma Too Low | Ped Sigma Too High | Ped is missing | HV is missing | manu occupancy too high
306 fMaxTriggerTracks = 100;
307 fMaxTrackCandidates = 10000;
309 SetPedMeanLimits(20, 700);
310 SetManuOccupancyLimits(-1.,0.01); // reject manu above occ=1%
312 SetBuspatchOccupancyLimits(-1,0.05);
313 SetFractionOfBuspatchOutsideOccupancyLimit(0.10); // 10 %
317 //_____________________________________________________________________________
318 void AliMUONRecoParam::SetCalibrationParam()
320 /// Set (dummy) reconstruction parameters for calibration environment
322 SetNameTitle("Calibration","Calibration");
323 SetEventSpecie(AliRecoParam::kCalib);
325 fPedMeanLimits[0] = 5000;
326 fPedMeanLimits[1] = 0;
328 fPadGoodnessMask = 0x8C00; // Pedestal is missing | is too low | too high
332 //_____________________________________________________________________________
334 AliMUONRecoParam::RequestedStationMask() const
336 /// Get the mask of the requested station, i.e. an integer where
337 /// bit n is set to one if the station n was requested
341 for ( Int_t i = 0; i < 5; ++i )
343 if ( RequestStation(i) ) m |= ( 1 << i );
348 //_____________________________________________________________________________
349 void AliMUONRecoParam::Print(Option_t *option) const
351 /// print reconstruction parameters
352 /// if option = FULL then print also unused parameters
354 cout<<endl<<"\t------MUON Reconstruction parameters ("<<GetName()<<")------"<<endl;
356 if (IsDefault()) cout<<"\t\t*** Parameters used by default ***"<<endl;
358 cout << "Event Specie=" << GetEventSpecie() << endl;
360 cout<<Form("Calibration mode = %s",fCalibrationMode.Data())<<endl;
361 cout<<Form("Clustering mode = %s",fClusteringMode.Data())<<endl;
362 cout<<Form("Tracking mode = %s",fTrackingMode.Data())<<endl;
368 bypass = "stations 4 and 5";
370 else if ( BypassSt4() )
372 bypass = "station 4";
374 else if ( BypassSt5() )
376 bypass = "station 5";
379 if (bypass.Length()) cout << "Will bypass " << bypass.Data() << " (replacing real clusters by generated ones from trigger tracks)" << endl;
381 if (fCombinedClusterTrackReco) cout<<"Combined cluster/track reconstruction: ON"<<endl;
382 else cout<<"Combined cluster/track reconstruction: OFF"<<endl;
384 if (fSaveFullClusterInESD) cout<<Form("Save all cluster info in ESD for %5.2f %% of events",fPercentOfFullClusterInESD)<<endl;
385 else cout<<"Save partial cluster info in ESD"<<endl;
387 cout<<"Selection of track candidates:"<<endl;
388 if (fSelectTrackOnSlope) cout<<Form("\t- Non-bending slope < %5.2f",fMaxNonBendingSlope)<<endl;
389 else cout<<"\t- Impact parameter < 3 * vertex dispersion in the non-bending direction"<<endl;
390 cout<<Form("\t- if B!=0: Bending momentum > %5.2f",fMinBendingMomentum)<<endl;
391 if (fSelectTrackOnSlope) cout<<Form("\t if B==0: Bending slope < %5.2f",fMaxBendingSlope)<<endl;
392 else cout<<"\t if B==0: Impact parameter < 3 * vertex dispersion in the bending direction"<<endl;
394 cout<<Form("Vertex dispersion (used to estimate initial bending momentum resolution) = (%5.2f,%5.2f)",fNonBendingVertexDispersion,fBendingVertexDispersion)<<endl;
396 cout<<Form("Maximum distance to track = (%5.2f,%5.2f)",fMaxNonBendingDistanceToTrack,fMaxBendingDistanceToTrack)<<endl;
398 cout<<Form("Sigma cut for tracking = %5.2f",fSigmaCutForTracking)<<endl;
400 cout<<Form("Sigma cut for trigger hit pattern = %5.2f",fSigmaCutForTrigger)<<endl;
402 cout<<Form("Cut in strips for trigger chamber efficiency = %5.2f",fStripCutForTrigger)<<endl;
404 cout<<Form("Max search area in strips for trigger chamber efficiency = %5.2f",fMaxStripAreaForTrigger)<<endl;
406 if (fTrackAllTracks) cout<<"Track all the possible candidates"<<endl;
407 else cout<<"Track only the best candidates"<<endl;
409 if (strstr(option,"FULL")) {
410 cout<<"Make track candidates assuming linear propagation between stations 4 and 5: ";
411 if (fMakeTrackCandidatesFast) cout<<"ON"<<endl;
412 else cout<<"OFF"<<endl;
413 } else if (fMakeTrackCandidatesFast)
414 cout<<"Make track candidates assuming linear propagation between stations 4 and 5"<<endl;
416 if (strstr(option,"FULL")) {
417 cout<<"Make track candidates starting from 1 cluster in each of the stations 4 and 5: ";
418 if (fMakeMoreTrackCandidates) cout<<"ON"<<endl;
419 else cout<<"OFF"<<endl;
420 } else if (fMakeMoreTrackCandidates)
421 cout<<"Make track candidates starting from 1 cluster in each of the stations 4 and 5"<<endl;
423 if (strstr(option,"FULL")) {
424 cout<<"Try to recover tracks getting lost during tracking: ";
425 if (fRecoverTracks) cout<<"ON"<<endl;
426 else cout<<"OFF"<<endl;
427 } else if (fRecoverTracks)
428 cout<<"Try to recover tracks getting lost during tracking"<<endl;
430 if (strstr(option,"FULL")) {
431 cout<<"Try to complete the reconstructed tracks by adding missing clusters: ";
432 if (fComplementTracks) cout<<"ON"<<endl;
433 else cout<<"OFF"<<endl;
434 } else if (fComplementTracks)
435 cout<<"Try to complete the reconstructed tracks by adding missing clusters"<<endl;
437 if (strstr(option,"FULL")) {
438 cout<<"Try to improve the reconstructed tracks by removing bad clusters: ";
439 if (fImproveTracks) cout<<Form("ON (sigma cut = %5.2f)",fSigmaCutForImprovement)<<endl;
440 else cout<<"OFF"<<endl;
441 } else if (fImproveTracks)
442 cout<<Form("Try to improve the reconstructed tracks by removing bad clusters (sigma cut = %5.2f)",fSigmaCutForImprovement)<<endl;
444 if (fRemoveConnectedTracksInSt12) cout<<"Remove tracks sharing one cluster or more in any station"<<endl;
445 else cout<<"Remove tracks sharing one cluster or more in stations 3, 4 and 5"<<endl;
447 if (strstr(option,"FULL")) {
448 cout<<"Use smoother to compute final track parameters, etc, at each cluster (used for Kalman tracking only): ";
449 if (fUseSmoother) cout<<"ON"<<endl;
450 else cout<<"OFF"<<endl;
451 } else if (fUseSmoother)
452 cout<<"Use smoother to compute final track parameters, etc, at each cluster"<<endl;
454 cout<<Form("Maximum normalized chi2 of tracking/trigger track matching = %5.2f",fMaxNormChi2MatchTrigger)<<endl;
456 Bool_t discardedCh = kFALSE;
459 if (!UseChamber(ch)) {
461 cout<<"Discarded chambers(1..): "<<ch+1;
464 else cout<<" "<<ch+1;
467 if (discardedCh) cout<<endl;
469 Bool_t discardedSt = kFALSE;
472 if (!RequestStation(st)) {
474 cout<<"Not requested stations(1..): "<<st+1;
477 else cout<<" "<<st+1;
480 if (discardedSt) cout<<endl;
482 cout << Form("Pad goodness policy mask is 0x%x",PadGoodnessMask()) << endl;
483 cout << "Which means we reject pads having the condition = " <<
484 AliMUONPadStatusMaker::AsCondition(PadGoodnessMask()).Data() << endl;
486 cout << "The pad limits we are using are :" << endl;
488 for ( int ichamber = 0; ichamber < 10; ++ichamber )
490 cout << Form("HV Ch %d must be >= %5.2f",ichamber,HVLimit(ichamber)) << endl;
493 cout << Form("%7.2f <= Pedestal mean <= %7.2f",PedMeanLowLimit(),PedMeanHighLimit()) << endl;
494 cout << Form("%7.2f <= Pedestal sigma <= %7.2f",PedSigmaLowLimit(),PedSigmaHighLimit()) << endl;
495 cout << Form("%e <= Gain linear term <= %e",GainA1LowLimit(),GainA1HighLimit()) << endl;
496 cout << Form("%e <= Gain quadratic term <= %e",GainA2LowLimit(),GainA2HighLimit()) << endl;
497 cout << Form("%5.0f <= Gain threshold term <= %5.0f",GainThresLowLimit(),GainThresHighLimit()) << endl;
499 cout << Form("And we cut on charge >= %7.2f x ( pedestal sigma ) ",ChargeSigmaCut()) << endl;
501 cout << "Occupancy limits are :" << endl;
503 cout << Form("%e <= Manu occupancy < %7.2f",ManuOccupancyLowLimit(),ManuOccupancyHighLimit()) << endl;
504 cout << Form("%e <= Buspatch occupancy < %7.2f",BuspatchOccupancyLowLimit(),BuspatchOccupancyHighLimit()) << endl;
505 cout << Form("%e <= DE occupancy < %7.2f",DEOccupancyLowLimit(),DEOccupancyHighLimit()) << endl;
507 cout << "'QAChecker' limits" << endl;
508 cout << Form("FractionOfBuspatchOutsideOccupancyLimit = %5.2f %%",FractionOfBuspatchOutsideOccupancyLimit()*100.0) << endl;
509 cout << Form("Event size limit = %5.2f KB/event (soft) and %5.2f KB/event (hard)",fEventSizeSoftLimit,fEventSizeHardLimit) << endl;
510 if ( fTokenLostLimit > 0 )
512 cout << Form("We tolerate up to %5.2f %% token lost errors per event",fTokenLostLimit) << endl;
516 cout << "We dot not tolerate any token lost error !" << endl;
519 cout << "chamber non bending resolution = |";
520 for (Int_t iCh = 0; iCh < 10; iCh++) cout << Form(" %6.3f |",fDefaultNonBendingReso[iCh]);
522 cout << "chamber bending resolution = |";
523 for (Int_t iCh = 0; iCh < 10; iCh++) cout << Form(" %6.3f |",fDefaultBendingReso[iCh]);
525 cout<<Form("maximum number of trigger tracks above which the tracking is cancelled = %d",fMaxTriggerTracks)<<endl;
526 cout<<Form("maximum number of track candidates above which the tracking is abandonned = %d",fMaxTrackCandidates)<<endl;
528 cout << Form("The average noise pad charge is assumed to be %7.2f fC",AverageNoisePadCharge()) << endl;
529 cout << Form("and clusters below %5.2f times this noise charge (i.e. %7.2f fC) are discarded",
530 ClusterChargeCut(),ClusterChargeCut()*AverageNoisePadCharge()) << endl;
531 cout << Form("Note that LowestPadCharge is then %7.2f fC",LowestPadCharge()) << endl;
535 cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
536 cout << "!!! WILL TRY TO RECOVER CORRUPTED RAW DATA !!!" << endl;
537 cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
539 cout<<"\t-----------------------------------------------------"<<endl<<endl;
543 //_____________________________________________________________________________
545 AliMUONRecoParam::SetHVLimit(Int_t chamberId, Double_t value)
547 /// Set the HV limit for a given chamber (or all chambers
550 if ( chamberId == -1 )
552 for ( Int_t i = 0; i < 10; ++i )
557 else if ( chamberId >= 0 && chamberId < 10 )
559 fHVLimit[chamberId]=value;
563 AliError(Form("chamberId = %d is not a valid chamberId",chamberId));
567 //_____________________________________________________________________________
568 Double_t AliMUONRecoParam::HVLimit(Int_t chamberId) const
570 /// Get the HV limit for a given chamber
571 if ( chamberId >= 0 && chamberId < 10 )
573 return fHVLimit[chamberId];
575 AliError(Form("chamberId = %d is not a valid chamberId",chamberId));
580 //_____________________________________________________________________________
582 AliMUONRecoParam::SetDefaultLimits()
584 /// Set the default limits and pad goodness policy
586 fHVSt12Limits[0]=1500; // kept for backward compatibility only
587 fHVSt12Limits[1]=2000; // kept for backward compatibility only
588 fHVSt345Limits[0]=1500; // kept for backward compatibility only
589 fHVSt345Limits[1]=2000; // kept for backward compatibility only
591 SetHVLimit(-1,1600); // this one is the real HV limit used now
593 fPedMeanLimits[0] = 20;
594 fPedMeanLimits[1] = 1024;
596 fPedSigmaLimits[0] = 0.6;
597 fPedSigmaLimits[1] = 100;
599 fGainA1Limits[0] = 0.1;
600 fGainA1Limits[1] = 10;
602 fGainA2Limits[0] = -1E30;
603 fGainA2Limits[1] = 1E30;
605 fGainThresLimits[0] = 0;
606 fGainThresLimits[1] = 4095;
608 fPadGoodnessMask = 0x8080; // Ped is missing | HV is missing
610 fManuOccupancyLimits[0] = -1.0;
611 fManuOccupancyLimits[1] = 1.0;
613 fBuspatchOccupancyLimits[0] = 1E-6;
614 fBuspatchOccupancyLimits[1] = 1.0;
616 fDEOccupancyLimits[0] = -1.0;
617 fDEOccupancyLimits[1] = 1.0;
619 fMissingPadFractionLimit = -1; // DEPRECATED
620 fFractionOfBuspatchOutsideOccupancyLimit = 0.05; // 5 %
622 ChargeSigmaCut(4.0); // pad with charge < 4.0 x sigma will be removed (where sigma is the actual noise of that very pad, i.e. not the average)
624 AverageNoisePadCharge(0.22875); // 0.22875 coulombs ~ 1.5 ADC channels
626 ClusterChargeCut(2.0); // will cut cluster below 2.0 x LowestPadCharge()
628 SetEventSizeLimits(35.0,45.0);
630 SetTokenLostLimit(0.0);
632 fTryRecover = kFALSE;
636 //-----------------------------------------------------------------------
638 AliMUONRecoParam::Create(const char* settings)
640 /// Create pre-defined recoparam array, according to settings.
641 /// settings is case-insensitive.
643 /// Currently defined are :
649 /// LowFlux (default)
652 /// LowFlux (modified to reconstruct real p-p data)
655 /// LowFlux (modified to reconstruct realistic p-p simulation)
658 AliMUONRecoParam* param(0x0);
660 AliRecoParam::EventSpecie_t defaultParam = AliRecoParam::kLowMult;
662 TString stype(settings);
665 if ( stype == "cosmics" )
667 // set parameters for cosmic runs
668 param = AliMUONRecoParam::GetCosmicParam();
669 defaultParam = AliRecoParam::kCosmic;
671 else if ( stype == "ppideal" )
673 // set default lowFlux parameters
674 param = AliMUONRecoParam::GetLowFluxParam();
676 else if ( stype == "ppreal" || stype == "pprealsim" || stype == "pprealnofield" )
678 // common parameters for p-p data and realistic p-p simu
679 param = AliMUONRecoParam::GetLowFluxParam();
680 param->SaveFullClusterInESD(kTRUE, 100.);
681 for (Int_t iCh=0; iCh<10; iCh++)
683 param->SetDefaultNonBendingReso(iCh,0.4);
684 param->SetDefaultBendingReso(iCh,0.4);
686 param->SetSigmaCutForTracking(7.);
687 param->SetStripCutForTrigger(1.5);
688 param->SetSigmaCutForTrigger(6.);
689 param->ImproveTracks(kTRUE, 6.);
690 param->SetPedMeanLimits(20, 700);
691 param->SetManuOccupancyLimits(-1.,0.01);
692 param->SetBuspatchOccupancyLimits(-1.,0.01);
693 param->SetFractionOfBuspatchOutsideOccupancyLimit(0.05); // 5 %
694 param->SetEventSizeLimits(45., 65.);
696 // specific parameters for p-p data or realistic p-p simu
697 if ( stype == "ppreal" || stype == "pprealnofield" )
699 param->SetPadGoodnessMask(0x400BE9B);
703 param->SetPadGoodnessMask(0x8080);
706 if ( stype == "pprealnofield" )
708 param->TryRecover(kTRUE);
711 else if ( stype == "pbpbreal" || stype == "pbpbrealsim" )
713 // common parameters for Pb-Pb data and realistic Pb-Pb simu
714 param = AliMUONRecoParam::GetHighFluxParam();
715 defaultParam = AliRecoParam::kHighMult;
716 param->SaveFullClusterInESD(kTRUE, 100.);
717 for (Int_t iCh=0; iCh<10; iCh++)
719 param->SetDefaultNonBendingReso(iCh,0.2);
720 param->SetDefaultBendingReso(iCh,0.2);
722 param->SetSigmaCutForTracking(5.);
723 param->SetStripCutForTrigger(1.5);
724 param->SetSigmaCutForTrigger(4.);
725 param->ImproveTracks(kTRUE, 4.);
726 param->SetPedMeanLimits(20, 700);
727 param->SetManuOccupancyLimits(-1.,0.01);
728 param->SetBuspatchOccupancyLimits(-1.,0.01);
729 param->SetFractionOfBuspatchOutsideOccupancyLimit(0.05); // 5 %
730 param->SetEventSizeLimits(100., 150.);
732 // specific parameters for Pb-Pb data or realistic Pb-Pb simu
733 if ( stype == "pbpbreal" )
735 param->SetPadGoodnessMask(0x400BE9B);
739 param->SetPadGoodnessMask(0x8080);
744 AliErrorClass("Unknown settings !");
748 TObjArray* recoParams = new TObjArray;
750 recoParams->AddLast(param);
752 // set (dummy) parameters for calibration runs
753 param = AliMUONRecoParam::GetCalibrationParam();
754 recoParams->AddLast(param);
756 // set parameters for Pb-Pb runs
757 // param = AliMUONRecoParam::GetHighFluxParam();
758 // recoParams.AddLast(param);
760 // identify default parameters (exit if identification failed)
761 Bool_t defaultIsSet = kFALSE;
762 TIter next(recoParams);
763 while ( (param = static_cast<AliMUONRecoParam*>(next())) )
765 if (param->GetEventSpecie() == defaultParam)
767 param->SetAsDefault();
768 defaultIsSet = kTRUE;
770 param->Print("FULL");
775 AliErrorClass("The default reconstruction parameters are not set! Exiting...");
782 //______________________________________________________________________________
784 AliMUONRecoParam::Show(Int_t runNumber, const char* ocdb)
786 /// Show what we have in the designated OCDB for that run, as far as RecoParams are concerned
788 AliCDBManager::Instance()->SetDefaultStorage(ocdb);
789 AliCDBManager::Instance()->SetRun(runNumber);
791 AliCDBEntry* entry = AliCDBManager::Instance()->Get("MUON/Calib/RecoParam");
795 TObject* o = entry->GetObject();
797 if ( o->IsA() == TObjArray::Class() )
799 TObjArray* array = static_cast<TObjArray*>(o);
800 for ( Int_t i = 0; i <= array->GetLast(); ++i )
802 AliDetectorRecoParam* p = static_cast<AliDetectorRecoParam*>(array->At(i));
803 cout << Form("array[%d]=%s %s %s",i,
804 p ? p->ClassName() : "",
805 p ? AliRecoParam::GetEventSpecieName(AliRecoParam::Convert(p->GetEventSpecie())) :"",
806 p ? ( p->IsDefault() ? "default" : "") : "" ) << endl;
808 cout << "=========== dumps below ====== " << endl;
810 for ( Int_t i = 0; i <= array->GetLast(); ++i )
812 AliDetectorRecoParam* p = static_cast<AliDetectorRecoParam*>(array->At(i));
813 if ( p ) p->Print("");