#include "AliMUONDigitCalibrator.h"
+#include "AliCDBEntry.h"
+#include "AliCDBManager.h"
#include "AliLog.h"
#include "AliMUONCalibrationData.h"
+#include "AliMUONConstants.h"
#include "AliMUONLogger.h"
#include "AliMUONPadStatusMaker.h"
#include "AliMUONPadStatusMapMaker.h"
const Int_t AliMUONDigitCalibrator::fgkInjectionGain(3);
//_____________________________________________________________________________
-AliMUONDigitCalibrator::AliMUONDigitCalibrator(const AliMUONCalibrationData& calib,
- const AliMUONRecoParam* recoParams,
- const char* calibMode)
+AliMUONDigitCalibrator::AliMUONDigitCalibrator(Int_t runNumber)
: TObject(),
fLogger(new AliMUONLogger(20000)),
fStatusMaker(0x0),
fCapacitances(0x0),
fNumberOfBadPads(0),
fNumberOfPads(0),
-fChargeSigmaCut(0)
+fChargeSigmaCut(0),
+fMask(0)
{
/// ctor
- Ctor(calibMode,calib,recoParams);
+ AliMUONRecoParam* recoParam(0x0);
+
+ AliCDBEntry* e = AliCDBManager::Instance()->Get("MUON/Calib/RecoParam",runNumber);
+ if (e)
+ {
+ TObject* o = e->GetObject();
+ if ( o->IsA() == TObjArray::Class() )
+ {
+ TObjArray* a = static_cast<TObjArray*>(o);
+// a->SetOwner(kTRUE); // FIXME: this should be done but somehow makes the reco crash at the end at cleaning stage... investigate why ?
+ TIter next(a);
+ AliMUONRecoParam* p;
+ while ( ( p = static_cast<AliMUONRecoParam*>(next()) ))
+ {
+ if ( p->IsDefault()) recoParam = p;
+ }
+ }
+ else
+ {
+ recoParam = static_cast<AliMUONRecoParam*>(o);
+ }
+ }
+ if (!recoParam)
+ {
+ AliError("Cannot get the recoParam. Failing");
+ return;
+ }
+
+ // OK. Now get all we need and work...
+
+ AliMUONCalibrationData calib(runNumber);
+
+ Ctor(calib,recoParam,kFALSE);
}
//_____________________________________________________________________________
AliMUONDigitCalibrator::AliMUONDigitCalibrator(const AliMUONCalibrationData& calib,
- const char* calibMode)
+ const AliMUONRecoParam* recoParams)
+: TObject(),
+fLogger(new AliMUONLogger(20000)),
+fStatusMaker(0x0),
+fStatusMapMaker(0x0),
+fPedestals(0x0),
+fGains(0x0),
+fApplyGains(0),
+fCapacitances(0x0),
+fNumberOfBadPads(0),
+fNumberOfPads(0),
+fChargeSigmaCut(0),
+fMask(0)
+{
+ /// ctor
+
+ Ctor(calib,recoParams);
+}
+
+//_____________________________________________________________________________
+AliMUONDigitCalibrator::AliMUONDigitCalibrator(const AliMUONCalibrationData& calib, int /*b*/)
: TObject(),
fLogger(new AliMUONLogger(20000)),
fStatusMaker(0x0),
fCapacitances(0x0),
fNumberOfBadPads(0),
fNumberOfPads(0),
-fChargeSigmaCut(0)
+fChargeSigmaCut(0),
+fMask(0)
{
/// ctor
- Ctor(calibMode,calib,0x0);
+ Ctor(calib,0x0);
}
//_____________________________________________________________________________
void
-AliMUONDigitCalibrator::Ctor(const char* calibMode,
- const AliMUONCalibrationData& calib,
- const AliMUONRecoParam* recoParams)
+AliMUONDigitCalibrator::Ctor(const AliMUONCalibrationData& calib,
+ const AliMUONRecoParam* recoParams,
+ Bool_t deferredInitialization)
{
/// designated ctor
- TString cMode(calibMode);
+ TString cMode("NOGAIN");
+ if (recoParams) cMode=recoParams->GetCalibrationMode();
cMode.ToUpper();
if ( cMode == "NOGAIN" )
}
else
{
- AliError(Form("Invalid calib mode = %s. Will use NOGAIN instead",calibMode));
+ AliError(Form("Invalid calib mode = %s. Will use NOGAIN instead",cMode.Data()));
fApplyGains = fgkNoGain;
}
fChargeSigmaCut = 3.0;
- Int_t mask(0x8080); // reject pads where ped *or* hv are missing
+ fMask = 0x8080; // reject pads where ped *or* hv are missing
if ( recoParams )
{
// if we have reco params, we use limits and cuts from there :
- fStatusMaker->SetHVSt12Limits(recoParams->HVSt12LowLimit(),recoParams->HVSt12HighLimit());
- fStatusMaker->SetHVSt345Limits(recoParams->HVSt345LowLimit(),recoParams->HVSt345HighLimit());
- fStatusMaker->SetPedMeanLimits(recoParams->PedMeanLowLimit(),recoParams->PedMeanHighLimit());
- fStatusMaker->SetPedSigmaLimits(recoParams->PedSigmaLowLimit(),recoParams->PedSigmaHighLimit());
- fStatusMaker->SetGainA1Limits(recoParams->GainA1LowLimit(),recoParams->GainA1HighLimit());
- fStatusMaker->SetGainA2Limits(recoParams->GainA2LowLimit(),recoParams->GainA2HighLimit());
- fStatusMaker->SetGainThresLimits(recoParams->GainThresLowLimit(),recoParams->GainThresHighLimit());
-
- mask = recoParams->PadGoodnessMask();
+ fStatusMaker->SetLimits(*recoParams);
+
+ fMask = recoParams->PadGoodnessMask();
//WARNING : getting this mask wrong is a very effective way of getting
//no digits at all out of this class ;-)
fChargeSigmaCut = recoParams->ChargeSigmaCut();
}
+ else
+ {
+ fLogger->Log("No RecoParam available");
+ fLogger->Log(Form("SigmaCut=%e",fChargeSigmaCut));
+ }
- Bool_t deferredInitialization = kTRUE;
-
- fStatusMapMaker = new AliMUONPadStatusMapMaker(*fStatusMaker,mask,deferredInitialization);
+ fStatusMapMaker = new AliMUONPadStatusMapMaker(*fStatusMaker,fMask,deferredInitialization);
fPedestals = calib.Pedestals();
AliMUONDigitCalibrator::~AliMUONDigitCalibrator()
{
/// dtor.
+
+ if ( fNumberOfPads > 0 )
+ {
+ if ( fStatusMaker )
+ {
+ fStatusMaker->Report(fMask);
+ }
+
+ AliInfo("Summary of messages:");
+
+ fLogger->Print();
+
+ AliInfo(Form("We have seen %g pads, and rejected %g (%7.2f %%)",
+ fNumberOfPads,fNumberOfBadPads,
+ ( fNumberOfPads > 0 ) ? fNumberOfBadPads*100.0/fNumberOfPads : 0 ));
+ }
+
delete fStatusMaker;
delete fStatusMapMaker;
-
- AliInfo("Summary of messages:");
- fLogger->Print();
-
- AliInfo(Form("We have seen %g pads, and rejected %g (%7.2f %%)",
- fNumberOfPads,fNumberOfBadPads,
- ( fNumberOfPads > 0 ) ? fNumberOfBadPads*100.0/fNumberOfPads : 0 ));
-
delete fLogger;
}
}
digit->Calibrated(kTRUE);
+ digit->ChargeInFC(kTRUE);
Float_t charge(0.0);
Int_t statusMap;
Bool_t ok = IsValidDigit(digit->DetElemId(),digit->ManuId(),digit->ManuChannel(),&statusMap);
digit->SetStatusMap(statusMap);
-
+
if (ok)
{
charge = CalibrateDigit(digit->DetElemId(),digit->ManuId(),digit->ManuChannel(),
}
else
{
- AliDebug(3,Form("Rejecting the pad DE %4d MANU %4d CH %2d ADC %6d STATUSMAP %x STATUS %s",
- digit->DetElemId(),digit->ManuId(),digit->ManuChannel(),
- digit->ADC(),statusMap,
- fStatusMaker->AsString(fStatusMaker->PadStatus(digit->DetElemId(),digit->ManuId(),digit->ManuChannel())).Data()));
-
- ++fNumberOfBadPads;
-
+ ++fNumberOfBadPads;
}
digit->SetCharge(charge);
digit->Saturated(isSaturated);
+
}
}
{
/// Calibrate one digit
+ /// Return the digit charge, in fC
-
+ if ( nsigmas < 0 )
+ {
+ nsigmas = fChargeSigmaCut;
+ }
+
+ fLogger->Log(Form("ChargeSigmaCut used = %e",nsigmas));
+
AliMUONVCalibParam* pedestal = static_cast<AliMUONVCalibParam*>
(fPedestals->FindObject(detElemId,manuId));
// Gain (mV/fC) = 1/(a0*capa) with a0~1.25 and capa~0.2
Float_t charge(0);
- Float_t capa(0.2); // capa = 0.2 and a0 = 1.25
- Float_t a0(1.25); // is equivalent to gain = 4 mV/fC
- Float_t a1(0);
- Float_t adc2mv(0.61); // 1 ADC channel = 0.61 mV
- Float_t injGain(4); // By default the gain is set to 4 mV/fC
-
+ Float_t capa(AliMUONConstants::DefaultCapa()); // capa = 0.2 and a0 = 1.25
+ Float_t a0(AliMUONConstants::DefaultA0()); // is equivalent to gain = 4 mV/fC
+ Float_t a1(0);
+ Float_t adc2mv(AliMUONConstants::DefaultADC2MV()); // 1 ADC channel = 0.61 mV
+ Float_t injGain(4); // By default the gain is set to 4 mV/fC
+ //
+ // Note that the ChargeMax (for one pad) is roughly 4096 * 0.61 mV/channel / 4 mV/fC = 625 fC
+
if ( fApplyGains == fgkGain || fApplyGains == fgkInjectionGain )
{
Int_t serialNumber
{
capa = param->ValueAsFloat(manuChannel,0);
injGain = param->ValueAsFloat(manuChannel,1);
+ if ( injGain < 0 )
+ {
+ fLogger->Log(Form("injGain is %e < 0 for serialNumber=%d",injGain,serialNumber));
+ return 0.0;
+ }
}
else
{
- // If capa not found in the OCDB we use default value
+ // If capa not found in the OCDB we exit
fLogger->Log(Form("No capa (injGain) found for serialNumber=%d",serialNumber));
return 0.0;
}
}
}
- return charge;
+ return ( charge > 0.0 ? charge : 0.0 );
}
//_____________________________________________________________________________
{
/// Check if a given pad is ok or not.
+ // initialize the statusmap to dead by default
+ if (statusMap) *statusMap = AliMUONPadStatusMapMaker::SelfDeadMask();
+
// First a protection against bad input parameters
AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
if (!de) return kFALSE; // not existing DE
// ok, now we have a valid channel number, so let's see if that pad
// behaves or not ;-)
- Int_t sm = fStatusMapMaker->StatusMap(detElemId,manuId,manuChannel);
+ Int_t sm = StatusMap(detElemId,manuId,manuChannel);
if (statusMap) *statusMap = sm;