1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 #include "AliMUONDigitCalibrator.h"
21 #include "AliMUONCalibrationData.h"
22 #include "AliMUONConstants.h"
23 #include "AliMUONData.h"
24 #include "AliMUONDigit.h"
25 #include "AliMUONVCalibParam.h"
26 #include "TClonesArray.h"
28 /// \class AliMUONDigitCalibrator
29 /// Class used to calibrate digits (either real or simulated ones).
31 /// The calibration consists of subtracting the pedestal
32 /// and multiplying by a gain, so that
33 /// Signal = (ADC-pedestal)*gain
35 /// Please note also that for the moment, if a digit lies on a dead channel
36 /// we remove this digit from the list of digits.
37 /// FIXME: this has to be revisited. By using the AliMUONDigit::fFlags we
38 /// should in principle flag a digit as bad w/o removing it, but this
39 /// then requires some changes in the cluster finder to deal with this extra
40 /// information correctly (e.g. to set a quality for the cluster if it contains
43 /// \author Laurent Aphecetche
47 ClassImp(AliMUONDigitCalibrator)
50 //_____________________________________________________________________________
51 AliMUONDigitCalibrator::AliMUONDigitCalibrator(AliMUONData* muonData,
52 AliMUONCalibrationData* calib)
53 : TTask("AliMUONDigitCalibrator","Subtract pedestal from digit charge"),
55 fCalibrationData(calib)
57 /// ctor. This class need the muonData to get access to the digit,
58 /// and the calibrationData to get access to calibration parameters.
61 //_____________________________________________________________________________
62 AliMUONDigitCalibrator::~AliMUONDigitCalibrator()
67 //_____________________________________________________________________________
69 AliMUONDigitCalibrator::Exec(Option_t*)
72 /// We loop on tracking chambers (i.e. we do nothing for trigger)
73 /// and for each digit in that chamber, we calibrate it :
74 /// a) if the corresponding channel is known to be bad, we set the signal to 0
75 /// (so that digit can be suppressed later on)
76 /// b) we then apply pedestal and gain corrections.
78 for ( Int_t ch = 0; ch < AliMUONConstants::NTrackingCh(); ++ch )
80 TClonesArray* digitArray = fData->Digits(ch);
81 Int_t nDigits = digitArray->GetEntriesFast();
82 for ( Int_t d = 0; d < nDigits; ++d )
85 static_cast<AliMUONDigit*>(digitArray->UncheckedAt(d));
87 // Very first check is whether this channel is known to be bad,
88 // in which case we set the signal to zero.
89 AliMUONVCalibParam* dead = static_cast<AliMUONVCalibParam*>
90 (fCalibrationData->DeadChannels(digit->DetElemId(),digit->ManuId()));
91 if ( dead && dead->ValueAsInt(digit->ManuChannel()) )
93 AliWarning(Form("Removing dead channel detElemId %d manuId %d "
94 "manuChannel %d",digit->DetElemId(),digit->ManuId(),
95 digit->ManuChannel()));
100 // If the channel is good, go on with the calibration itself.
102 AliMUONVCalibParam* pedestal = static_cast<AliMUONVCalibParam*>
103 (fCalibrationData->Pedestals(digit->DetElemId(),digit->ManuId()));
105 AliMUONVCalibParam* gain = static_cast<AliMUONVCalibParam*>
106 (fCalibrationData->Gains(digit->DetElemId(),digit->ManuId()));
110 AliFatal(Form("Got a null ped object for DE,manu=%d,%d",
111 digit->DetElemId(),digit->ManuId()));
116 AliFatal(Form("Got a null gain object for DE,manu=%d,%d",
117 digit->DetElemId(),digit->ManuId()));
120 Int_t manuChannel = digit->ManuChannel();
121 Float_t adc = digit->Signal();
122 Float_t padc = adc-pedestal->ValueAsFloat(manuChannel,0);
123 if ( padc < 3.0*pedestal->ValueAsFloat(manuChannel,1) )
127 Float_t charge = padc*gain->ValueAsFloat(manuChannel,0);
128 digit->SetSignal(charge);
129 Int_t saturation = gain->ValueAsInt(manuChannel,1);
130 if ( charge >= saturation )
132 digit->Saturated(kTRUE);