From: laphecet Date: Mon, 29 Jun 2009 17:09:33 +0000 (+0000) Subject: Fixing the rejection based on the occupancies, which was clearly not properly implemented X-Git-Url: http://git.uio.no/git/?a=commitdiff_plain;h=411a502a2733d1aee9ced42f94c526e84ebf067a;p=u%2Fmrichter%2FAliRoot.git Fixing the rejection based on the occupancies, which was clearly not properly implemented --- diff --git a/MUON/AliMUONDigitCalibrator.cxx b/MUON/AliMUONDigitCalibrator.cxx index 38a7b9a8f30..459eab0481f 100644 --- a/MUON/AliMUONDigitCalibrator.cxx +++ b/MUON/AliMUONDigitCalibrator.cxx @@ -78,7 +78,8 @@ fApplyGains(0), fCapacitances(0x0), fNumberOfBadPads(0), fNumberOfPads(0), -fChargeSigmaCut(0) +fChargeSigmaCut(0), +fMask(0) { /// ctor @@ -98,7 +99,8 @@ fApplyGains(0), fCapacitances(0x0), fNumberOfBadPads(0), fNumberOfPads(0), -fChargeSigmaCut(0) +fChargeSigmaCut(0), +fMask(0) { /// ctor @@ -153,21 +155,15 @@ 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 ;-) @@ -176,7 +172,7 @@ AliMUONDigitCalibrator::Ctor(const char* calibMode, Bool_t deferredInitialization = kTRUE; - fStatusMapMaker = new AliMUONPadStatusMapMaker(*fStatusMaker,mask,deferredInitialization); + fStatusMapMaker = new AliMUONPadStatusMapMaker(*fStatusMaker,fMask,deferredInitialization); fPedestals = calib.Pedestals(); @@ -193,16 +189,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 +252,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); diff --git a/MUON/AliMUONDigitCalibrator.h b/MUON/AliMUONDigitCalibrator.h index 9ee49b24c56..7aa0cc5c7cd 100644 --- a/MUON/AliMUONDigitCalibrator.h +++ b/MUON/AliMUONDigitCalibrator.h @@ -74,13 +74,14 @@ private: Double_t fNumberOfBadPads; //!< # of times we've rejected a bad pad Double_t fNumberOfPads; //!< # of pads we've seen Double_t fChargeSigmaCut; //!< number of sigmas to cut on + UInt_t fMask; //!< mask used to cut bad channels static const Int_t fgkNoGain; //!< do not apply gain calib at all static const Int_t fgkGainConstantCapa; //!< apply gain (from OCDB) with constant capa static const Int_t fgkGain; //!< apply gain and capa (from OCDB) static const Int_t fgkInjectionGain; //!< apply injection gain (from OCDB) - ClassDef(AliMUONDigitCalibrator,9) // Calibrate raw digit + ClassDef(AliMUONDigitCalibrator,10) // Calibrate raw digit }; #endif diff --git a/MUON/AliMUONPadStatusMaker.cxx b/MUON/AliMUONPadStatusMaker.cxx index 2fa5c262d1e..97a7d1b648b 100644 --- a/MUON/AliMUONPadStatusMaker.cxx +++ b/MUON/AliMUONPadStatusMaker.cxx @@ -30,17 +30,21 @@ #include "AliMUON2DStoreValidator.h" #include "AliMUONCalibParamNI.h" #include "AliMUONCalibrationData.h" +#include "AliMUONLogger.h" +#include "AliMUONRecoParam.h" #include "AliMUONStringIntMap.h" -#include "AliMUONVCalibParam.h" #include "AliMUONTrackerData.h" +#include "AliMUONVCalibParam.h" #include "AliMpArea.h" #include "AliMpArrayI.h" +#include "AliMpCDB.h" #include "AliMpConstants.h" #include "AliMpDDLStore.h" #include "AliMpDEManager.h" #include "AliMpDetElement.h" #include "AliMpDCSNamer.h" +#include "AliMpManuIterator.h" #include "AliMpManuUID.h" #include "AliCDBEntry.h" @@ -74,7 +78,7 @@ fHVSt345Limits(0,5000), fPedMeanLimits(0,4095), fPedSigmaLimits(0,4095), fManuOccupancyLimits(0,1.0), -fBusPatchOccupancyLimits(0,1.0), +fBuspatchOccupancyLimits(0,1.0), fDEOccupancyLimits(0,1.0), fStatus(new AliMUON2DMap(true)), fHV(new TExMap), @@ -83,22 +87,19 @@ fGains(calibData.Gains()), fTrackerData(0x0) { /// ctor - AliDebug(1,Form("ped store %s gain store %s", - fPedestals->ClassName(), - fGains->ClassName())); - if ( calibData.OccupancyMap() ) { - AliInfo("Will use occupancy map to cut, if so required in AliMUONRecoParam"); /// create a tracker data from the occupancy map fTrackerData = new AliMUONTrackerData("OCC","OCC",*(calibData.OccupancyMap())); - } + } + } //_____________________________________________________________________________ AliMUONPadStatusMaker::~AliMUONPadStatusMaker() { /// dtor. + delete fStatus; delete fHV; delete fTrackerData; @@ -557,11 +558,11 @@ AliMUONPadStatusMaker::OccupancyStatus(Int_t detElemId, Int_t manuId) const occ = fTrackerData->BusPatch(busPatchId,occIndex); - if ( occ <= fBusPatchOccupancyLimits.X() ) + if ( occ <= fBuspatchOccupancyLimits.X() ) { rv |= kBusPatchOccupancyTooLow; } - else if ( occ > fBusPatchOccupancyLimits.Y() ) + else if ( occ > fBuspatchOccupancyLimits.Y() ) { rv |= kBusPatchOccupancyTooHigh; } @@ -630,3 +631,80 @@ AliMUONPadStatusMaker::SetHVStatus(Int_t detElemId, Int_t index, Int_t status) c fHV->Add(AliMpManuUID::BuildUniqueID(detElemId,manuId),status + 1); } } + +//_____________________________________________________________________________ +void +AliMUONPadStatusMaker::SetLimits(const AliMUONRecoParam& recoParams) +{ + /// Set the limits from the recoparam + + SetHVSt12Limits(recoParams.HVSt12LowLimit(),recoParams.HVSt12HighLimit()); + SetHVSt345Limits(recoParams.HVSt345LowLimit(),recoParams.HVSt345HighLimit()); + + SetPedMeanLimits(recoParams.PedMeanLowLimit(),recoParams.PedMeanHighLimit()); + SetPedSigmaLimits(recoParams.PedSigmaLowLimit(),recoParams.PedSigmaHighLimit()); + + SetGainA1Limits(recoParams.GainA1LowLimit(),recoParams.GainA1HighLimit()); + SetGainA2Limits(recoParams.GainA2LowLimit(),recoParams.GainA2HighLimit()); + SetGainThresLimits(recoParams.GainThresLowLimit(),recoParams.GainThresHighLimit()); + + SetManuOccupancyLimits(recoParams.ManuOccupancyLowLimit(),recoParams.ManuOccupancyHighLimit()); + SetBuspatchOccupancyLimits(recoParams.BuspatchOccupancyLowLimit(),recoParams.BuspatchOccupancyHighLimit()); + SetDEOccupancyLimits(recoParams.DEOccupancyLowLimit(),recoParams.DEOccupancyHighLimit()); +} + +//_____________________________________________________________________________ +void +AliMUONPadStatusMaker::Report(UInt_t mask) +{ + /// Report the number of bad pads, according to the mask, + /// and the various reasons why they are bad (with occurence rates) + + AliInfo(""); + AliCodeTimerAuto(""); + + AliMUONLogger log(1064008); + + Int_t nBadPads(0); + Int_t nPads(0); + + AliMpManuIterator it; + + Int_t detElemId, manuId; + + while ( it.Next(detElemId,manuId) ) + { + AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId); + + for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i ) + { + if ( de->IsConnectedChannel(manuId,i) ) + { + ++nPads; + + Int_t status = PadStatus(detElemId,manuId,i); + + if ( ( status & mask) || (!mask && status) ) + { + ++nBadPads; + log.Log(AsString(status)); + } + } + } + } + + TString msg; + Int_t ntimes; + + cout << Form("According to mask %x (human readable form below) %6d pads are bad (over a total of %6d, i.e. %7.2f %%)", + mask,nBadPads,nPads,nPads ? nBadPads*100.0/nPads : 0.0) << endl; + cout << AliMUONPadStatusMaker::AsCondition(mask) << endl; + cout << "--------" << endl; + + while ( log.Next(msg,ntimes) ) + { + cout << Form("The message (%120s) occured %15d times (%7.4f %%)",msg.Data(),ntimes,ntimes*100.0/nPads) << endl; + } + +} + diff --git a/MUON/AliMUONPadStatusMaker.h b/MUON/AliMUONPadStatusMaker.h index 6181b40edf1..fc62a331d3f 100644 --- a/MUON/AliMUONPadStatusMaker.h +++ b/MUON/AliMUONPadStatusMaker.h @@ -21,6 +21,7 @@ class TExMap; class AliMUONCalibrationData; +class AliMUONRecoParam; class AliMUONVCalibParam; class AliMUONVTrackerData; class AliMUONVStore; @@ -97,6 +98,20 @@ public: void SetManuOccupancyLimits(float low, float high) { fManuOccupancyLimits.Set(low,high); } /// Get manu occupancy limits TVector2 ManuOccupancyLimits() const { return fManuOccupancyLimits; } + + /// Set Low and High bus patch occupancy limits + void SetBuspatchOccupancyLimits(float low, float high) { fBuspatchOccupancyLimits.Set(low,high); } + /// Get bus patch occupancy limits + TVector2 BuspatchOccupancyLimits() const { return fBuspatchOccupancyLimits; } + + /// Set Low and High DE occupancy limits + void SetDEOccupancyLimits(float low, float high) { fDEOccupancyLimits.Set(low,high); } + /// Get DE occupancy limits + TVector2 DEOccupancyLimits() const { return fDEOccupancyLimits; } + + void SetLimits(const AliMUONRecoParam& recoParams); + + void Report(UInt_t mask); private: /// Not implemented @@ -200,7 +215,7 @@ private: TVector2 fPedSigmaLimits; //!< Low and High threshold for pedestal sigma TVector2 fManuOccupancyLimits; //!< Low and High manu occupancy limits - TVector2 fBusPatchOccupancyLimits; //!< Low and High buspatch occupancy limits + TVector2 fBuspatchOccupancyLimits; //!< Low and High buspatch occupancy limits TVector2 fDEOccupancyLimits; //!< Low and High DE occupancy limits AliMUONVStore* fStatus; //!< statuses of the pads diff --git a/MUON/AliMUONReconstructor.cxx b/MUON/AliMUONReconstructor.cxx index ad85be65841..42caec75ad8 100644 --- a/MUON/AliMUONReconstructor.cxx +++ b/MUON/AliMUONReconstructor.cxx @@ -166,8 +166,8 @@ AliMUONReconstructor::~AliMUONReconstructor() delete fDigitStore; delete fTransformer; delete fTriggerCircuit; - delete fCalibrationData; delete fDigitCalibrator; + delete fCalibrationData; delete fClusterServer; delete fTriggerStore; delete fTrackStore; diff --git a/MUON/MUONStatusMap.C b/MUON/MUONStatusMap.C index b7c99409e58..7b6b8d8126c 100644 --- a/MUON/MUONStatusMap.C +++ b/MUON/MUONStatusMap.C @@ -24,8 +24,10 @@ #if !defined(__CINT__) || defined(__MAKECINT__) #include "AliCDBManager.h" #include "AliMUONCalibrationData.h" +#include "AliMUONLogger.h" #include "AliMUONPadStatusMaker.h" #include "AliMUONPadStatusMapMaker.h" +#include "AliMUONRecoParam.h" #include "AliMUONVCalibParam.h" #include "AliMUONVStore.h" #include "AliMpCDB.h" @@ -36,77 +38,37 @@ #include "Riostream.h" #endif -void FindBad(AliMUONPadStatusMaker& statusMaker, Int_t mask, Int_t& nBadPads, Int_t& nPads) -{ - AliMpManuIterator it; +//AliMUONVStore* MUONStatusMap(const TString& cdbStorage = "alien://folder=/alice/data/2009/OCDB", +AliMUONVStore* MUONStatusMap(const TString& cdbStorage = "local://$ALICE_ROOT/OCDB", + Int_t runNumber=67138, Bool_t statusOnly=kTRUE) +{ + + AliMUONRecoParam* recoParam = AliMUONRecoParam::GetCosmicParam(); - nBadPads = nPads = 0; + AliMpCDB::LoadAll2(); - Int_t detElemId; - Int_t manuId; + AliCDBManager* man = AliCDBManager::Instance(); - while ( it.Next(detElemId,manuId) ) - { - Bool_t bad(kFALSE); - - AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId); - - Int_t nb(0); - Int_t n(0); - - for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i ) - { - if ( de->IsConnectedChannel(manuId,i) ) - { - ++n; - ++nPads; - Int_t status = statusMaker.PadStatus(detElemId,manuId,i); - if ( ( status & mask) || (!mask && status) ) - { - bad = kTRUE; - ++nBadPads; - ++nb; - } - } - } - - if (bad) - { - cout << Form("DE %4d ManuId %4d %2d bad pads over %2d pads", - detElemId,manuId,nb,n) << endl; - } - } -} + man->SetDefaultStorage(cdbStorage.Data()); + +// man->SetSpecificStorage("MUON/Calib/OccupancyMap","local://$ALICE_ROOT/OCDB"); +// man->SetSpecificStorage("MUON/Calib/OccupancyMap","alien://folder=/alice/cern.ch/user/l/laphecet/OCDB"); +// man->SetSpecificStorage("MUON/Calib/RejectList","alien://folder=/alice/cern.ch/user/l/laphecet/OCDB"); +// man->SetSpecificStorage("MUON/Align/Data","alien://folder=/alice/cern.ch/user/l/laphecet/OCDB"); -AliMUONVStore* MUONStatusMap(const TString& cdbStorage = "local://$ALICE_ROOT/OCDB", - Int_t runNumber=0, Bool_t statusOnly=kFALSE, - Int_t mask=0x8080) -{ - AliCDBManager::Instance()->SetDefaultStorage(cdbStorage.Data()); - AliCDBManager::Instance()->SetRun(runNumber); +// man->SetRun(runNumber); - AliMpCDB::LoadDDLStore(); - AliMUONCalibrationData cd(runNumber); AliMUONPadStatusMaker statusMaker(cd); -// statusMaker.SetPedMeanLimits(50,200); -// statusMaker.SetPedSigmaLimits(0.5,2); + statusMaker.SetLimits(*recoParam); - Int_t nbad; - Int_t ntotal; + delete recoParam; - FindBad(statusMaker,mask,nbad,ntotal); - - if (ntotal<=0) - { - cout << "Error : got no pad at all ?!" << endl; - return 0x0; - } + UInt_t mask = recoParam->PadGoodnessMask(); - cout << Form("Nbad = %6d over %6d pads (%7.2f %%)", - nbad,ntotal,100.0*nbad/ntotal) << endl; + statusMaker.Report(mask); if ( statusOnly ) return statusMaker.StatusStore();