X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONDigitCalibrator.cxx;h=41c3ceecbc6745534e550d2c4e8c5c7f9a94a220;hb=b1fea14f4c91213151537f91ffdd7189de82447b;hp=f37f4d873fc9ca34c4eb8caf4ea9f62657c7d9da;hpb=66cdf5b356ddec79996c44150fae1a3b8755e933;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONDigitCalibrator.cxx b/MUON/AliMUONDigitCalibrator.cxx index f37f4d873fc..41c3ceecbc6 100644 --- a/MUON/AliMUONDigitCalibrator.cxx +++ b/MUON/AliMUONDigitCalibrator.cxx @@ -17,6 +17,8 @@ #include "AliMUONDigitCalibrator.h" +#include "AliCDBEntry.h" +#include "AliCDBManager.h" #include "AliLog.h" #include "AliMUONCalibrationData.h" #include "AliMUONLogger.h" @@ -64,6 +66,57 @@ const Int_t AliMUONDigitCalibrator::fgkGainConstantCapa(1); const Int_t AliMUONDigitCalibrator::fgkGain(2); const Int_t AliMUONDigitCalibrator::fgkInjectionGain(3); +//_____________________________________________________________________________ +AliMUONDigitCalibrator::AliMUONDigitCalibrator(Int_t runNumber, const char* calibMode) +: 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 + + 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(o); + TIter next(a); + AliMUONRecoParam* p; + while ( ( p = static_cast(next()) )) + { + if ( p->IsDefault()) recoParam = p; + } + } + else + { + recoParam = static_cast(o); + } + } + if (!recoParam) + { + AliError("Cannot get the recoParam. Failing"); + return; + } + + // OK. Now get all we need and work... + + AliMUONCalibrationData calib(runNumber); + + Ctor(calibMode,calib,recoParam,kFALSE); +} + //_____________________________________________________________________________ AliMUONDigitCalibrator::AliMUONDigitCalibrator(const AliMUONCalibrationData& calib, const AliMUONRecoParam* recoParams, @@ -78,7 +131,8 @@ fApplyGains(0), fCapacitances(0x0), fNumberOfBadPads(0), fNumberOfPads(0), -fChargeSigmaCut(0) +fChargeSigmaCut(0), +fMask(0) { /// ctor @@ -98,7 +152,8 @@ fApplyGains(0), fCapacitances(0x0), fNumberOfBadPads(0), fNumberOfPads(0), -fChargeSigmaCut(0) +fChargeSigmaCut(0), +fMask(0) { /// ctor @@ -109,7 +164,8 @@ fChargeSigmaCut(0) void AliMUONDigitCalibrator::Ctor(const char* calibMode, const AliMUONCalibrationData& calib, - const AliMUONRecoParam* recoParams) + const AliMUONRecoParam* recoParams, + Bool_t deferredInitialization) { /// designated ctor @@ -153,37 +209,34 @@ AliMUONDigitCalibrator::Ctor(const char* calibMode, 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(); fGains = calib.Gains(); // we get gains whatever the calibMode is, in order // to get the saturation value... - if ( fApplyGains == fgkGain ) + if ( fApplyGains == fgkGain || fApplyGains == fgkInjectionGain ) { fCapacitances = calib.Capacitances(); } @@ -193,16 +246,25 @@ AliMUONDigitCalibrator::Ctor(const char* calibMode, 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; } @@ -247,13 +309,7 @@ AliMUONDigitCalibrator::Calibrate(AliMUONVDigitStore& digitStore) } 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); @@ -269,8 +325,15 @@ AliMUONDigitCalibrator::CalibrateDigit(Int_t detElemId, Int_t manuId, Int_t manu { /// 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 (fPedestals->FindObject(detElemId,manuId)); @@ -305,7 +368,9 @@ AliMUONDigitCalibrator::CalibrateDigit(Int_t detElemId, Int_t manuId, Int_t manu 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 - + // + // 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 @@ -317,10 +382,15 @@ AliMUONDigitCalibrator::CalibrateDigit(Int_t detElemId, Int_t manuId, Int_t manu { 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; } @@ -373,7 +443,7 @@ AliMUONDigitCalibrator::CalibrateDigit(Int_t detElemId, Int_t manuId, Int_t manu } } - return charge; + return ( charge > 0.0 ? charge : 0.0 ); } //_____________________________________________________________________________