X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=MUON%2FAliMUONPadStatusMaker.cxx;h=f4936b5571ea0d0284efb8e280c5bca9d32602db;hb=2d2b680b3ff2b6c96d861f8b60b75ab10cace8e0;hp=8fa756c024da280db9cba0511eee9d675840d89f;hpb=0a2fe39039b9fe9e7bb394cefcbd1dfbf04845b1;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONPadStatusMaker.cxx b/MUON/AliMUONPadStatusMaker.cxx index 8fa756c024d..f4936b5571e 100644 --- a/MUON/AliMUONPadStatusMaker.cxx +++ b/MUON/AliMUONPadStatusMaker.cxx @@ -26,23 +26,25 @@ #include "AliMUONPadStatusMaker.h" -#include "AliQAv1.h" - #include "AliMUON2DMap.h" #include "AliMUON2DStoreValidator.h" #include "AliMUONCalibParamNI.h" #include "AliMUONCalibrationData.h" +#include "AliMUONLogger.h" +#include "AliMUONRecoParam.h" #include "AliMUONStringIntMap.h" +#include "AliMUONTrackerData.h" #include "AliMUONVCalibParam.h" -#include "AliMUONVTrackerData.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" @@ -75,76 +77,25 @@ fHVSt12Limits(0,5000), fHVSt345Limits(0,5000), fPedMeanLimits(0,4095), fPedSigmaLimits(0,4095), -fManuOccupancyLimits(0,0.1), +fManuOccupancyLimits(0,1.0), +fBuspatchOccupancyLimits(0,1.0), +fDEOccupancyLimits(0,1.0), fStatus(new AliMUON2DMap(true)), -fHV(new TExMap), +fHV(0x0), fPedestals(calibData.Pedestals()), fGains(calibData.Gains()), -fTrackerData(0x0), -fKillMap(calibData.KillMap()) +fTrackerData(0x0) { /// ctor - AliDebug(1,Form("ped store %s gain store %s", - fPedestals->ClassName(), - fGains->ClassName())); - - TString qaFileName(AliQAv1::GetQADataFileName("MUON",calibData.RunNumber())); - - // search the QA file in memory first. - TFile* f = static_cast(gROOT->GetListOfFiles()->FindObject(qaFileName.Data())); - - if (!f) - { - // then tries to open it - if ( gSystem->AccessPathName(qaFileName.Data()) == kFALSE ) - { - f = TFile::Open(qaFileName.Data()); - if ( f ) - { - AliDebug(1,Form("Got %s from disk",qaFileName.Data())); - } - } - } - else - { - AliDebug(1,Form("Got %s from memory",qaFileName.Data())); - } - - if (f) + if ( calibData.OccupancyMap() ) { - TDirectory* d = gDirectory; - - f->cd("MUON/Raws"); - - TIter next(gDirectory->GetListOfKeys()); - TKey* key; - - while ( ( key = static_cast(next()) ) && !fTrackerData ) - { - TString name(key->GetName()); - - if ( name.Contains("CALZ") ) - { - fTrackerData = dynamic_cast(key->ReadObj()); - } - - } - - gDirectory = d; - - if ( fTrackerData ) - { - AliInfo(Form("Will make a cut on MANU occupancy from TrackerData=%s",fTrackerData->GetName())); - } - else - { - AliWarning(Form("Found a QA file = %s, but could not get the expected TrackerData in there... (probably not a serious problem though)", - f->GetName())); - } - } - else + /// create a tracker data from the occupancy map + fTrackerData = new AliMUONTrackerData("OCC","OCC",*(calibData.OccupancyMap())); + } + if ( calibData.HV() ) { - AliWarning("Did not find QA file, so will not use manu occupancy as a criteria"); + /// Only create the fHV internal store if there are some HV values available + fHV = new TExMap; } } @@ -152,8 +103,10 @@ fKillMap(calibData.KillMap()) AliMUONPadStatusMaker::~AliMUONPadStatusMaker() { /// dtor. + delete fStatus; delete fHV; + delete fTrackerData; } //_____________________________________________________________________________ @@ -162,12 +115,17 @@ AliMUONPadStatusMaker::AsString(Int_t status) { /// return a human readable version of the integer status + if ( status == 0 ) + { + return "Brave New World"; + } + Int_t pedStatus; Int_t gainStatus; Int_t hvStatus; - Int_t otherStatus; + Int_t occStatus; - DecodeStatus(status,pedStatus,hvStatus,gainStatus,otherStatus); + DecodeStatus(status,pedStatus,hvStatus,gainStatus,occStatus); TString s; @@ -193,9 +151,12 @@ AliMUONPadStatusMaker::AsString(Int_t status) if ( hvStatus & kHVSwitchOFF ) s+="& HV has switch OFF "; if ( hvStatus & kHVMissing ) s+="& HV is missing "; - if ( otherStatus & kManuOccupancyTooHigh ) s+="& manu occupancy too high "; - if ( otherStatus & kManuOccupancyTooLow ) s+="& manu occupancy too low "; - if ( otherStatus & kKilled ) s+="& killed"; + if ( occStatus & kManuOccupancyTooHigh ) s+="& manu occupancy too high "; + if ( occStatus & kManuOccupancyTooLow ) s+="& manu occupancy too low "; + if ( occStatus & kBusPatchOccupancyTooHigh ) s+="& bus patch occupancy too high "; + if ( occStatus & kBusPatchOccupancyTooLow ) s+="& bus patch occupancy too low "; + if ( occStatus & kDEOccupancyTooHigh ) s+="& DE occupancy too high "; + if ( occStatus & kDEOccupancyTooLow ) s+="& DE occupancy too low "; if ( s[0] == '&' ) s[0] = ' '; @@ -220,13 +181,13 @@ Int_t AliMUONPadStatusMaker::BuildStatus(Int_t pedStatus, Int_t hvStatus, Int_t gainStatus, - Int_t otherStatus) + Int_t occStatus) { /// Build a complete status from specific parts (ped,hv,gain) return ( hvStatus & 0xFF ) | ( ( pedStatus & 0xFF ) << 8 ) | ( ( gainStatus & 0xFF ) << 16 ) | - ( ( otherStatus & 0xFF ) << 24 ) ; + ( ( occStatus & 0xFF ) << 24 ) ; } //_____________________________________________________________________________ @@ -235,11 +196,11 @@ AliMUONPadStatusMaker::DecodeStatus(Int_t status, Int_t& pedStatus, Int_t& hvStatus, Int_t& gainStatus, - Int_t& otherStatus) + Int_t& occStatus) { /// Decode complete status into specific parts (ped,hv,gain) - otherStatus = ( status & 0xFF000000 ) >> 24; + occStatus = ( status & 0xFF000000 ) >> 24; gainStatus = ( status & 0xFF0000 ) >> 16; pedStatus = ( status & 0xFF00 ) >> 8; hvStatus = (status & 0xFF); @@ -258,7 +219,9 @@ AliMUONPadStatusMaker::HVSt12Status(Int_t detElemId, Int_t sector, /// and the switch). /// Returns false if hv switch changed during the run. - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) + + if (!fHV) return kFALSE; Bool_t error = kFALSE; hvChannelTooLow = kFALSE; @@ -312,6 +275,49 @@ AliMUONPadStatusMaker::HVSt12Status(Int_t detElemId, Int_t sector, return error; } +//_____________________________________________________________________________ +Float_t +AliMUONPadStatusMaker::SwitchValue(const TObjArray& dcsArray) +{ + /// Loop over the dcs value for a single switch to decide whether + /// we should consider it on or off + + // we'll count the number of ON/OFF for this pad, to insure + // consistency (i.e. if status changed during the run, we should + // at least notify this fact ;-) and hope it's not the norm) + Int_t nTrue(0); + Int_t nFalse(0); + TIter next(&dcsArray); + AliDCSValue* val; + + while ( ( val = static_cast(next()) ) ) + { + if ( val->GetBool() ) + { + ++nTrue; + } + else + { + ++nFalse; + } + } + + if ( (nTrue>0 && nFalse>0) ) + { + // change of state during the run, consider it off + return 0.0; + } + + if ( nFalse ) + { + /// switch = FALSE means the HV was flowding up to the PCB. + /// i.e. switch = FALSE = ON + return 1.0; + } + + return 0.0; +} + //_____________________________________________________________________________ Bool_t AliMUONPadStatusMaker::HVSt345Status(Int_t detElemId, Int_t pcbIndex, @@ -325,7 +331,9 @@ AliMUONPadStatusMaker::HVSt345Status(Int_t detElemId, Int_t pcbIndex, /// Returns false if something goes wrong (in particular if /// hv switch changed during the run). - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) + + if (!fHV) return kFALSE; Bool_t error = kFALSE; hvChannelTooLow = kFALSE; @@ -396,34 +404,8 @@ AliMUONPadStatusMaker::HVSt345Status(Int_t detElemId, Int_t pcbIndex, } else { - // we'll count the number of ON/OFF for this pad, to insure - // consistency (i.e. if status changed during the run, we should - // at least notify this fact ;-) and hope it's not the norm) - Int_t nTrue(0); - Int_t nFalse(0); - TIter next(values); - AliDCSValue* val; - - while ( ( val = static_cast(next()) ) ) - { - if ( val->GetBool() ) - { - ++nTrue; - } - else - { - ++nFalse; - } - } - - if ( (nTrue>0 && nFalse>0) ) - { - AliWarning(Form("Status of HV Switch %s changed during this run nTrue=%d nFalse=%d! Will consider it OFF", - hvSwitch.Data(),nTrue,nFalse)); - error = kTRUE; - } - - if ( nFalse ) hvSwitchON = kFALSE; + Float_t sv = SwitchValue(*values); + if ( sv < 0.99 ) hvSwitchON = kFALSE; } } return error; @@ -435,9 +417,9 @@ AliMUONPadStatusMaker::HVStatus(Int_t detElemId, Int_t manuId) const { /// Get HV status of one manu - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) - if ( !fkCalibrationData.HV() ) return kMissing; + if ( !fHV ) return kMissing; Long_t lint = fHV->GetValue(AliMpManuUID::BuildUniqueID(detElemId,manuId)); @@ -528,16 +510,9 @@ AliMUONPadStatusMaker::ComputeStatus(Int_t detElemId, Int_t manuId) const AliMUONVCalibParam* gains = static_cast(fGains->FindObject(detElemId,manuId)); - AliMUONVCalibParam* kill(0x0); - - if ( fKillMap ) - { - kill = static_cast(fKillMap->FindObject(detElemId,manuId)); - } - Int_t hvStatus = HVStatus(detElemId,manuId); - Int_t otherStatus = OtherStatus(detElemId,manuId); + Int_t occStatus = OccupancyStatus(detElemId,manuId); for ( Int_t manuChannel = 0; manuChannel < param->Size(); ++manuChannel ) { @@ -578,12 +553,7 @@ AliMUONPadStatusMaker::ComputeStatus(Int_t detElemId, Int_t manuId) const gainStatus = kGainMissing; } - if ( kill && (kill->ValueAsInt(manuChannel,0) > 0) ) - { - otherStatus |= kKilled; - } - - Int_t status = BuildStatus(pedStatus,hvStatus,gainStatus,otherStatus); + Int_t status = BuildStatus(pedStatus,hvStatus,gainStatus,occStatus); param->SetValueAsIntFast(manuChannel,0,status); } @@ -593,22 +563,52 @@ AliMUONPadStatusMaker::ComputeStatus(Int_t detElemId, Int_t manuId) const //_____________________________________________________________________________ Int_t -AliMUONPadStatusMaker::OtherStatus(Int_t detElemId, Int_t manuId) const +AliMUONPadStatusMaker::OccupancyStatus(Int_t detElemId, Int_t manuId) const { /// Get the "other" status for a given manu + + Int_t rv(0); + if ( fTrackerData ) { - Double_t occ = fTrackerData->Manu(detElemId,manuId,2); - if ( occ < fManuOccupancyLimits.X() ) + const Int_t occIndex = 2; + + Double_t occ = fTrackerData->DetectionElement(detElemId,occIndex); + + if ( occ <= fDEOccupancyLimits.X() ) { - return kManuOccupancyTooLow; + rv |= kDEOccupancyTooLow; + } + else if ( occ > fDEOccupancyLimits.Y() ) + { + rv |= kDEOccupancyTooHigh; + } + + Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId,manuId); + + occ = fTrackerData->BusPatch(busPatchId,occIndex); + + if ( occ <= fBuspatchOccupancyLimits.X() ) + { + rv |= kBusPatchOccupancyTooLow; + } + else if ( occ > fBuspatchOccupancyLimits.Y() ) + { + rv |= kBusPatchOccupancyTooHigh; } - if ( occ > fManuOccupancyLimits.Y() ) + + occ = fTrackerData->Manu(detElemId,manuId,occIndex); + + if ( occ <= fManuOccupancyLimits.X() ) + { + rv |= kManuOccupancyTooLow; + } + else if ( occ > fManuOccupancyLimits.Y() ) { - return kManuOccupancyTooHigh; + rv |= kManuOccupancyTooHigh; } } - return 0; + return rv; } //_____________________________________________________________________________ @@ -621,7 +621,7 @@ AliMUONPadStatusMaker::PadStatus(Int_t detElemId, Int_t manuId) const if (!param) { // not already there, so compute it now - AliCodeTimerAuto("ComputeStatus"); + AliCodeTimerAuto("ComputeStatus",0); param = ComputeStatus(detElemId,manuId); } return param; @@ -649,7 +649,7 @@ AliMUONPadStatusMaker::SetHVStatus(Int_t detElemId, Int_t index, Int_t status) c /// Assign status to all manus in a given HV "zone" (defined by index, meaning /// is different thing from St12 and St345) - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId); @@ -661,3 +661,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("",0); + + 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 ( mask && ( status & mask) ) // note that if mask == 0, all pads are good... + { + ++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; + } + +} +