X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONPadStatusMaker.cxx;h=d8327532f24b662d230cfa3ccc715d802abc6ec0;hb=dca193e62097e0fc043da9f51e4b5aa81ce01202;hp=a26026130f8bbda58796ef9fde602337e7384c67;hpb=9044498fdd6b9394991d6e16f1c66dc8f45565a8;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONPadStatusMaker.cxx b/MUON/AliMUONPadStatusMaker.cxx index a26026130f8..d8327532f24 100644 --- a/MUON/AliMUONPadStatusMaker.cxx +++ b/MUON/AliMUONPadStatusMaker.cxx @@ -15,48 +15,51 @@ // $Id$ +//----------------------------------------------------------------------------- /// \class AliMUONPadStatusMaker /// /// Make a 2DStore of pad statuses, using different sources of information, /// like pedestal values, gain values, and HV values. /// /// \author Laurent Aphecetche +//----------------------------------------------------------------------------- #include "AliMUONPadStatusMaker.h" +#include "AliQA.h" + #include "AliMUON2DMap.h" #include "AliMUON2DStoreValidator.h" #include "AliMUONCalibParamNI.h" #include "AliMUONCalibrationData.h" -#include "AliMUONHVNamer.h" -#include "AliMUONObjectPair.h" +#include "AliMUONStringIntMap.h" #include "AliMUONVCalibParam.h" -#include "AliMUONVDataIterator.h" +#include "AliMUONVTrackerData.h" + #include "AliMpArea.h" -#include "AliMpDEIterator.h" +#include "AliMpArrayI.h" +#include "AliMpConstants.h" +#include "AliMpDDLStore.h" #include "AliMpDEManager.h" -#include "AliMpIntPair.h" -#include "AliMpManuList.h" -#include "AliMpMotifMap.h" -#include "AliMpMotifPosition.h" -#include "AliMpPCB.h" -#include "AliMpPad.h" -#include "AliMpSector.h" -#include "AliMpSectorSegmentation.h" -#include "AliMpSegmentation.h" -#include "AliMpSlat.h" -#include "AliMpSlatSegmentation.h" -#include "AliMpStationType.h" -#include "AliMpVPadIterator.h" +#include "AliMpDetElement.h" +#include "AliMpHVNamer.h" +#include "AliMpManuUID.h" + #include "AliCDBEntry.h" #include "AliCDBManager.h" +#include "AliCodeTimer.h" #include "AliDCSValue.h" #include "AliLog.h" + #include +#include +#include +#include +#include #include -#include +#include #include - +#include /// \cond CLASSIMP ClassImp(AliMUONPadStatusMaker) @@ -65,102 +68,187 @@ ClassImp(AliMUONPadStatusMaker) //_____________________________________________________________________________ AliMUONPadStatusMaker::AliMUONPadStatusMaker(const AliMUONCalibrationData& calibData) : fCalibrationData(calibData), - fPedMeanLimits(0,4095), - fPedSigmaLimits(0,4095), - fHVSt12Limits(0,5000), - fHVSt345Limits(0,5000) -{ - /// ctor -} - -//_____________________________________________________________________________ -AliMUONPadStatusMaker::~AliMUONPadStatusMaker() +fGainA1Limits(0,1E30), +fGainA2Limits(-1E-30,1E30), +fGainThresLimits(0,4095), +fHVSt12Limits(0,5000), +fHVSt345Limits(0,5000), +fPedMeanLimits(0,4095), +fPedSigmaLimits(0,4095), +fManuOccupancyLimits(0,0.1), +fStatus(new AliMUON2DMap(true)), +fHV(new TExMap), +fPedestals(calibData.Pedestals()), +fGains(calibData.Gains()), +fTrackerData(0x0) { - /// dtor. -} - -//_____________________________________________________________________________ -AliMUONV2DStore* -AliMUONPadStatusMaker::Combine(const AliMUONV2DStore& store1, - const AliMUONV2DStore& store2, - Int_t binShift) const -{ - /// Combine two status containers into one, shifting store2 status bits - /// to the left by binShift before making an OR with store1. + /// ctor + AliDebug(1,Form("ped store %s gain store %s", + fPedestals->ClassName(), + fGains->ClassName())); - TStopwatch timer; - timer.Start(kTRUE); + TString qaFileName(AliQA::GetQADataFileName("MUON",calibData.RunNumber(),0)); - AliMUONV2DStore* combined = static_cast(store1.Clone()); - - AliMUONVDataIterator* it = store1.Iterator(); - AliMUONObjectPair* pair; - - while ( ( pair = static_cast(it->Next()) ) ) + // search the QA file in memory first. + TFile* f = static_cast(gROOT->GetListOfFiles()->FindObject(qaFileName.Data())); + + if (!f) { - AliMpIntPair* ip = static_cast(pair->First()); - Int_t detElemId = ip->GetFirst(); - Int_t manuId = ip->GetSecond(); - AliMUONVCalibParam* param1 = static_cast(store1.Get(detElemId,manuId)); - AliMUONVCalibParam* param2 = static_cast(store2.Get(detElemId,manuId)); - if (!param2) + // then tries to open it + if ( gSystem->AccessPathName(qaFileName.Data()) == kFALSE ) { - AliWarning(Form("Could not get statuses for store2 for DE %d ManuId %d. Marking as missing.", - detElemId,manuId)); - param2 = static_cast(param1->Clone()); - for ( Int_t manuChannel = 0; manuChannel < param2->Size(); ++manuChannel ) + f = TFile::Open(qaFileName.Data()); + if ( f ) { - param2->SetValueAsInt(manuChannel,0,kMissing); - } - } - AliMUONVCalibParam* paramCombined = static_cast(combined->Get(detElemId,manuId)); - if (!paramCombined) - { - paramCombined = static_cast(param2->Clone()); - combined->Set(detElemId,manuId,paramCombined,kFALSE); + AliDebug(1,Form("Got %s from disk",qaFileName.Data())); + } } + } + else + { + AliDebug(1,Form("Got %s from memory",qaFileName.Data())); + } + + if (f) + { + TDirectory* d = gDirectory; + + f->cd("MUON/Raws"); + + TIter next(gDirectory->GetListOfKeys()); + TKey* key; - for ( Int_t manuChannel = 0; manuChannel < param1->Size(); ++manuChannel ) + while ( ( key = static_cast(next()) ) && !fTrackerData ) { - if ( AliMpManuList::DoesChannelExist(detElemId, manuId, manuChannel) ) + TString name(key->GetName()); + + if ( name.Contains("CALZ") ) { - Int_t status1(param1->ValueAsInt(manuChannel)); - Int_t status2(param2->ValueAsInt(manuChannel)); - - Int_t status = status1 | (status2 << binShift); - - paramCombined->SetValueAsInt(manuChannel,0,status); + 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 + { + AliWarning("Did not find QA file, so will not use manu occupancy as a criteria"); + } +} + +//_____________________________________________________________________________ +AliMUONPadStatusMaker::~AliMUONPadStatusMaker() +{ + /// dtor. + delete fStatus; + delete fHV; +} + +//_____________________________________________________________________________ +TString +AliMUONPadStatusMaker::AsString(Int_t status) +{ + /// return a human readable version of the integer status + + Int_t pedStatus; + Int_t gainStatus; + Int_t hvStatus; + Int_t otherStatus; + + DecodeStatus(status,pedStatus,hvStatus,gainStatus,otherStatus); + + TString s; + + if ( pedStatus & kPedMeanZero ) s += "& Ped Mean is Zero "; + if ( pedStatus & kPedMeanTooLow ) s += "& Ped Mean Too Low "; + if ( pedStatus & kPedMeanTooHigh ) s += "& Ped Mean Too High "; + if ( pedStatus & kPedSigmaTooLow ) s += "& Ped Sigma Too Low "; + if ( pedStatus & kPedSigmaTooHigh ) s += "& Ped Sigma Too High "; + if ( pedStatus & kPedMissing ) s += "& Ped is missing "; + + if ( gainStatus & kGainA1TooLow ) s+="& Gain A1 is Too Low "; + if ( gainStatus & kGainA1TooHigh ) s+="& Gain A1 is Too High "; + if ( gainStatus & kGainA2TooLow ) s+="& Gain A2 is Too Low "; + if ( gainStatus & kGainA2TooHigh ) s+="& Gain A2 is Too High "; + if ( gainStatus & kGainThresTooLow ) s+="& Gain Thres is Too Low "; + if ( gainStatus & kGainThresTooHigh ) s+="& Gain Thres is Too High "; + if ( gainStatus & kGainMissing ) s+="& Gain is missing "; + + if ( hvStatus & kHVError ) s+="& HV is on error "; + if ( hvStatus & kHVTooLow ) s+="& HV is Too Low "; + if ( hvStatus & kHVTooHigh ) s+="& HV is Too High "; + if ( hvStatus & kHVChannelOFF ) s+="& HV has channel OFF "; + 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 "; - delete it; + if ( s[0] == '&' ) s[0] = ' '; - AliInfo("Timer:"); - StdoutToAliInfo(timer.Print();); + return s; +} + +//_____________________________________________________________________________ +TString +AliMUONPadStatusMaker::AsCondition(Int_t mask) +{ + /// return a human readable version of the mask's equivalent condition + + TString s(AsString(mask)); + + s.ReplaceAll("&","|"); - return combined; + return s; } //_____________________________________________________________________________ -AliMUONV2DStore* -AliMUONPadStatusMaker::GeneratePadStatus(Int_t value) +Int_t +AliMUONPadStatusMaker::BuildStatus(Int_t pedStatus, + Int_t hvStatus, + Int_t gainStatus, + Int_t otherStatus) { - /// Generate a "fake" store, with all (detElemId,manuId) present, - /// and containing all the same value + /// Build a complete status from specific parts (ped,hv,gain) - AliMUONCalibParamNI param(1,64,value); + return ( hvStatus & 0xFF ) | ( ( pedStatus & 0xFF ) << 8 ) | + ( ( gainStatus & 0xFF ) << 16 ) | + ( ( otherStatus & 0xFF ) << 24 ) ; +} + +//_____________________________________________________________________________ +void +AliMUONPadStatusMaker::DecodeStatus(Int_t status, + Int_t& pedStatus, + Int_t& hvStatus, + Int_t& gainStatus, + Int_t& otherStatus) +{ + /// Decode complete status into specific parts (ped,hv,gain) - return AliMUON2DMap::Generate(param); + otherStatus = ( status & 0xFF000000 ) >> 24; + gainStatus = ( status & 0xFF0000 ) >> 16; + pedStatus = ( status & 0xFF00 ) >> 8; + hvStatus = (status & 0xFF); } //_____________________________________________________________________________ Bool_t -AliMUONPadStatusMaker::GetSt12Status(const TMap& hvMap, - Int_t detElemId, Int_t sector, - Bool_t& hvChannelTooLow, - Bool_t& hvChannelTooHigh, - Bool_t& hvChannelON) const +AliMUONPadStatusMaker::HVSt12Status(Int_t detElemId, Int_t sector, + Bool_t& hvChannelTooLow, + Bool_t& hvChannelTooHigh, + Bool_t& hvChannelON) const { /// Get HV status for one HV sector of St12 @@ -168,16 +256,19 @@ AliMUONPadStatusMaker::GetSt12Status(const TMap& hvMap, /// and the switch). /// Returns false if hv switch changed during the run. + AliCodeTimerAuto("") + Bool_t error = kFALSE; hvChannelTooLow = kFALSE; hvChannelTooHigh = kFALSE; hvChannelON = kTRUE; - - AliMUONHVNamer hvNamer; + + AliMpHVNamer hvNamer; TString hvChannel(hvNamer.DCSHVChannelName(detElemId,sector)); - TPair* hvPair = static_cast(hvMap.FindObject(hvChannel.Data())); + TMap* hvMap = fCalibrationData.HV(); + TPair* hvPair = static_cast(hvMap->FindObject(hvChannel.Data())); if (!hvPair) { AliError(Form("Did not find expected alias (%s) for DE %d", @@ -221,29 +312,32 @@ AliMUONPadStatusMaker::GetSt12Status(const TMap& hvMap, //_____________________________________________________________________________ Bool_t -AliMUONPadStatusMaker::GetSt345Status(const TMap& hvMap, - Int_t detElemId, Int_t pcbIndex, - Bool_t& hvChannelTooLow, - Bool_t& hvChannelTooHigh, - Bool_t& hvChannelON, - Bool_t& hvSwitchON) const +AliMUONPadStatusMaker::HVSt345Status(Int_t detElemId, Int_t pcbIndex, + Bool_t& hvChannelTooLow, + Bool_t& hvChannelTooHigh, + Bool_t& hvChannelON, + Bool_t& hvSwitchON) const { /// For a given PCB in a given DE, get the HV status (both the channel /// and the switch). /// Returns false if something goes wrong (in particular if /// hv switch changed during the run). + AliCodeTimerAuto("") + Bool_t error = kFALSE; hvChannelTooLow = kFALSE; hvChannelTooHigh = kFALSE; hvSwitchON = kTRUE; hvChannelON = kTRUE; - AliMUONHVNamer hvNamer; + AliMpHVNamer hvNamer; TString hvChannel(hvNamer.DCSHVChannelName(detElemId)); - TPair* hvPair = static_cast(hvMap.FindObject(hvChannel.Data())); + TMap* hvMap = fCalibrationData.HV(); + + TPair* hvPair = static_cast(hvMap->FindObject(hvChannel.Data())); if (!hvPair) { AliError(Form("Did not find expected alias (%s) for DE %d", @@ -277,13 +371,13 @@ AliMUONPadStatusMaker::GetSt345Status(const TMap& hvMap, float highThreshold = fHVSt345Limits.Y(); if ( hvMin < lowThreshold ) hvChannelTooLow = kTRUE; - if ( hvMax > highThreshold ) hvChannelTooHigh = kTRUE; + else if ( hvMax > highThreshold ) hvChannelTooHigh = kTRUE; if ( hvMin < 1 ) hvChannelON = kFALSE; } } TString hvSwitch(hvNamer.DCSHVSwitchName(detElemId,pcbIndex)); - TPair* switchPair = static_cast(hvMap.FindObject(hvSwitch.Data())); + TPair* switchPair = static_cast(hvMap->FindObject(hvSwitch.Data())); if (!switchPair) { AliError(Form("Did not find expected alias (%s) for DE %d PCB %d", @@ -334,308 +428,223 @@ AliMUONPadStatusMaker::GetSt345Status(const TMap& hvMap, } //_____________________________________________________________________________ -AliMUONV2DStore* -AliMUONPadStatusMaker::MakeGainStatus(const AliMUONV2DStore& /*gainValues*/) const -{ - /// FIXME: to be implemented - AliWarning("Not implemented yet"); - return 0x0; -} - -//_____________________________________________________________________________ -AliMUONV2DStore* -AliMUONPadStatusMaker::MakeHVStatus(const TMap& hvValues) const +Int_t +AliMUONPadStatusMaker::HVStatus(Int_t detElemId, Int_t manuId) const { - /// Scrutinize HV values and deduce an HV status for each pad + /// Get HV status of one manu - TStopwatch timerSt12; - TStopwatch timerSt345; + AliCodeTimerAuto("") - timerSt12.Start(kTRUE); - timerSt12.Stop(); - timerSt345.Start(kTRUE); - timerSt345.Stop(); - - AliMUONHVNamer hvNamer; - - AliMpDEIterator deIt; + if ( !fCalibrationData.HV() ) return kMissing; + + Long_t lint = fHV->GetValue(AliMpManuUID::BuildUniqueID(detElemId,manuId)); - deIt.First(); + if ( lint ) + { + return (Int_t)(lint - 1); + } + + Int_t status(0); - AliMUONV2DStore* hv = new AliMUON2DMap(kTRUE); + AliMpHVNamer hvNamer; - while ( !deIt.IsDone() ) + switch ( AliMpDEManager::GetStationType(detElemId) ) { - Int_t detElemId = deIt.CurrentDEId(); - - switch ( AliMpDEManager::GetStationType(detElemId) ) + case AliMp::kStation1: + case AliMp::kStation2: { - case AliMp::kStation1: - case AliMp::kStation2: - timerSt12.Start(kFALSE); - for ( int sector = 0; sector < 3; ++sector) - { - AliDebug(1,Form("detElemId %5d sector %d",detElemId,sector)); - - Bool_t hvChannelTooLow, hvChannelTooHigh, hvChannelON; - Bool_t error = GetSt12Status(hvValues, - detElemId,sector, - hvChannelTooLow,hvChannelTooHigh, - hvChannelON); - Int_t status = 0; - if ( error ) status |= kHVError; - if ( hvChannelTooLow ) status |= kHVTooLow; - if ( hvChannelTooHigh ) status |= kHVTooHigh; - if ( !hvChannelON ) status |= kHVChannelOFF; - SetStatusSt12(*hv,detElemId,sector,status); - - } - timerSt12.Stop(); - break; - case AliMp::kStation345: + int sector = hvNamer.ManuId2Sector(detElemId,manuId); + if ( sector >= 0 ) { - timerSt345.Start(kFALSE); - for ( Int_t pcbIndex = 0; pcbIndex < hvNamer.NumberOfPCBs(detElemId); ++pcbIndex) - { - AliDebug(1,Form("detElemId %5d pcbIndex %d",detElemId,pcbIndex)); - Bool_t hvChannelTooLow, hvChannelTooHigh, hvChannelON,hvSwitchON; - Bool_t error = GetSt345Status(hvValues, - detElemId,pcbIndex, - hvChannelTooLow,hvChannelTooHigh, - hvChannelON,hvSwitchON); - Int_t status = 0; - if ( error ) status |= kHVError; - if ( hvChannelTooLow ) status |= kHVTooLow; - if ( hvChannelTooHigh ) status |= kHVTooHigh; - if ( !hvSwitchON ) status |= kHVSwitchOFF; - if ( !hvChannelON) status |= kHVChannelOFF; - SetStatusSt345(*hv,detElemId,pcbIndex,status); - } - timerSt345.Stop(); + Bool_t hvChannelTooLow, hvChannelTooHigh, hvChannelON; + Bool_t error = HVSt12Status(detElemId,sector, + hvChannelTooLow, + hvChannelTooHigh, + hvChannelON); + if ( error ) status |= kHVError; + if ( hvChannelTooLow ) status |= kHVTooLow; + if ( hvChannelTooHigh ) status |= kHVTooHigh; + if ( !hvChannelON ) status |= kHVChannelOFF; + // assign this status to all the other manus handled by the same HV channel + SetHVStatus(detElemId,sector,status); } - break; - default: - break; } - deIt.Next(); + break; + case AliMp::kStation345: + { + int pcbIndex = hvNamer.ManuId2PCBIndex(detElemId,manuId); + if ( pcbIndex >= 0 ) + { + Bool_t hvChannelTooLow, hvChannelTooHigh, hvChannelON,hvSwitchON; + Bool_t error = HVSt345Status(detElemId,pcbIndex, + hvChannelTooLow,hvChannelTooHigh, + hvChannelON,hvSwitchON); + if ( error ) status |= kHVError; + if ( hvChannelTooLow ) status |= kHVTooLow; + if ( hvChannelTooHigh ) status |= kHVTooHigh; + if ( !hvSwitchON ) status |= kHVSwitchOFF; + if ( !hvChannelON) status |= kHVChannelOFF; + // assign this status to all the other manus handled by the same HV channel + SetHVStatus(detElemId,pcbIndex,status); + } + } + break; + default: + break; } - AliInfo("St12 timer:"); - StdoutToAliInfo(timerSt12.Print();); - AliInfo("St345 timer:"); - StdoutToAliInfo(timerSt345.Print();); - - return hv; + return status; } //_____________________________________________________________________________ -AliMUONV2DStore* -AliMUONPadStatusMaker::MakePedestalStatus(const AliMUONV2DStore& pedValues) const +AliMUONVCalibParam* +AliMUONPadStatusMaker::Neighbours(Int_t detElemId, Int_t manuId) const { - /// Assign a pedestal status to each pad - - TStopwatch timer; - - timer.Start(kTRUE); + /// Get the neighbours parameters for a given manu + AliMUONVStore* neighbourStore = fCalibrationData.Neighbours(); + return static_cast(neighbourStore->FindObject(detElemId,manuId)); +} + +//_____________________________________________________________________________ +AliMUONVStore* +AliMUONPadStatusMaker::NeighboursStore() const +{ + /// Return the store containing all the neighbours + return fCalibrationData.Neighbours(); +} + +//_____________________________________________________________________________ +AliMUONVCalibParam* +AliMUONPadStatusMaker::ComputeStatus(Int_t detElemId, Int_t manuId) const +{ + /// Compute the status of a given manu, using all available information, + /// i.e. pedestals, gains, and HV - AliMUONV2DStore* pedStatuses = new AliMUON2DMap(kTRUE); + AliMUONVCalibParam* param = new AliMUONCalibParamNI(1,AliMpConstants::ManuNofChannels(),detElemId,manuId,-1); + fStatus->Add(param); + + AliMUONVCalibParam* pedestals = static_cast(fPedestals->FindObject(detElemId,manuId)); + + AliMUONVCalibParam* gains = static_cast(fGains->FindObject(detElemId,manuId)); - AliMUONVDataIterator* it = pedValues.Iterator(); - AliMUONObjectPair* pair; - Int_t nofManus(0); + Int_t hvStatus = HVStatus(detElemId,manuId); + + Int_t otherStatus = OtherStatus(detElemId,manuId); - while ( ( pair = static_cast(it->Next() ) ) ) + for ( Int_t manuChannel = 0; manuChannel < param->Size(); ++manuChannel ) { - AliMpIntPair* ip = static_cast(pair->First()); - Int_t detElemId = ip->GetFirst(); - Int_t manuId = ip->GetSecond(); - AliMUONVCalibParam* pedestals = static_cast(pair->Second()); - ++nofManus; - for ( Int_t manuChannel = 0; manuChannel < pedestals->Size(); ++manuChannel ) + Int_t pedStatus(0); + + if (pedestals) { - Int_t status(0); - if ( AliMpManuList::DoesChannelExist(detElemId, manuId, manuChannel) ) - { - Float_t pedMean = pedestals->ValueAsFloat(manuChannel,0); - Float_t pedSigma = pedestals->ValueAsFloat(manuChannel,1); - if ( pedMean < fPedMeanLimits.X() ) status |= kPedMeanTooLow; - if ( pedMean > fPedMeanLimits.Y() ) status |= kPedMeanTooHigh; - if ( pedSigma < fPedSigmaLimits.X() ) status |= kPedSigmaTooLow; - if ( pedSigma > fPedSigmaLimits.Y() ) status |= kPedSigmaTooHigh; - if ( pedMean == 0 ) status |= kPedMeanZero; - - AliMUONVCalibParam* vStatus = - static_cast(pedStatuses->Get(detElemId,manuId)); - if ( !vStatus ) - { - vStatus = new AliMUONCalibParamNI(1,64,0); - pedStatuses->Set(detElemId,manuId,vStatus,false); - } - vStatus->SetValueAsInt(manuChannel,0,status); - } + Float_t pedMean = pedestals->ValueAsFloatFast(manuChannel,0); + Float_t pedSigma = pedestals->ValueAsFloatFast(manuChannel,1); + if ( pedMean < fPedMeanLimits.X() ) pedStatus |= kPedMeanTooLow; + else if ( pedMean > fPedMeanLimits.Y() ) pedStatus |= kPedMeanTooHigh; + if ( pedSigma < fPedSigmaLimits.X() ) pedStatus |= kPedSigmaTooLow; + else if ( pedSigma > fPedSigmaLimits.Y() ) pedStatus |= kPedSigmaTooHigh; + if ( pedMean == 0 ) pedStatus |= kPedMeanZero; + } + else + { + pedStatus = kPedMissing; + } + + Int_t gainStatus(0); + + if ( gains ) + { + Float_t a0 = gains->ValueAsFloatFast(manuChannel,0); + Float_t a1 = gains->ValueAsFloatFast(manuChannel,1); + Float_t thres = gains->ValueAsFloatFast(manuChannel,2); + + if ( a0 < fGainA1Limits.X() ) gainStatus |= kGainA1TooLow; + else if ( a0 > fGainA1Limits.Y() ) gainStatus |= kGainA1TooHigh; + if ( a1 < fGainA2Limits.X() ) gainStatus |= kGainA2TooLow; + else if ( a1 > fGainA2Limits.Y() ) gainStatus |= kGainA2TooHigh; + if ( thres < fGainThresLimits.X() ) gainStatus |= kGainThresTooLow; + else if ( thres > fGainThresLimits.Y() ) gainStatus |= kGainThresTooHigh; + } + else + { + gainStatus = kGainMissing; } + + Int_t status = BuildStatus(pedStatus,hvStatus,gainStatus,otherStatus); + + param->SetValueAsIntFast(manuChannel,0,status); } - AliInfo(Form("%d manus checked in :",nofManus)); - StdoutToAliInfo(timer.Print();); - return pedStatuses; + return param; } //_____________________________________________________________________________ -AliMUONV2DStore* -AliMUONPadStatusMaker::MakeStatus() const +Int_t +AliMUONPadStatusMaker::OtherStatus(Int_t detElemId, Int_t manuId) const { - /// Read ped, gains and hv values from CDB, apply some Q&A and produces - /// a combined status for each pad. - - TMap* hvValues = fCalibrationData.HV(); - AliMUONV2DStore* hvStatus(0x0); - - if (!hvValues) + /// Get the "other" status for a given manu + if ( fTrackerData ) { - AliError("Could not get HV values from CDB. Will create dummy ones and mark those as missing"); - AliMUONCalibParamNI param(1,64,kHVMissing); - hvStatus = AliMUON2DMap::Generate(param); - } - else - { - hvStatus = MakeHVStatus(*hvValues); + Double_t occ = fTrackerData->Manu(detElemId,manuId,2); + if ( occ < fManuOccupancyLimits.X() ) + { + return kManuOccupancyTooLow; + } + if ( occ > fManuOccupancyLimits.Y() ) + { + return kManuOccupancyTooHigh; + } } - - AliMUONV2DStore* pedValues = fCalibrationData.Pedestals(); - AliMUONV2DStore* pedStatus(0x0); + return 0; +} - if (!pedValues) - { - AliError("Could not get pedestals values from CDB. Will create dummy ones and mark those as missing"); - AliMUONCalibParamNI param(1,64,kPedMissing); - pedStatus = AliMUON2DMap::Generate(param); - } - else - { - pedStatus = MakePedestalStatus(*pedValues); - } - - // FIXME: should do the same for gains as for hv and ped. - - AliMUONV2DStore* status = Combine(*hvStatus,*pedStatus,8); - - delete hvStatus; - delete pedStatus; - - // Insure we get all channels there (some or even all can be bad, but they - // must be there somehow). +//_____________________________________________________________________________ +AliMUONVCalibParam* +AliMUONPadStatusMaker::PadStatus(Int_t detElemId, Int_t manuId) const +{ + /// Get the status container for a given manu - AliMUON2DStoreValidator validator; - - TObjArray* a = validator.Validate(*status); - - if (a) + AliMUONVCalibParam* param = static_cast(fStatus->FindObject(detElemId,manuId)); + if (!param) { - // this should not happen. - AliError("Status store not complete. Crash to follow soon..."); - StdoutToAliError(a->Print();); - AliFatal("this should not happen at all!"); - delete status; - status = 0x0; + // not already there, so compute it now + AliCodeTimerAuto("ComputeStatus"); + param = ComputeStatus(detElemId,manuId); } - - return status; + return param; } //_____________________________________________________________________________ -void -AliMUONPadStatusMaker::SetStatusSt12(AliMUONV2DStore& hvStatus, - Int_t detElemId, - Int_t isector, - Int_t status) const +Int_t +AliMUONPadStatusMaker::PadStatus(Int_t detElemId, Int_t manuId, Int_t manuChannel) const { - /// Flag all pads of detElemId (for St12) as bad. - - // FIXME: need a way to iterator on pads over a given HV sector for St12... - // we currently suppose that one sector is about a third of the chamber... - // FIXME !! This has to be checked very carefully... + /// Get the status for a given channel - const AliMp::CathodType kCathodes[] = { AliMp::kCath0, AliMp::kCath1 }; - - for ( Int_t icathode = 0; icathode < 2; ++icathode ) + AliMUONVCalibParam* param = static_cast(fStatus->FindObject(detElemId,manuId)); + if (!param) { - const AliMpSectorSegmentation* seg = - static_cast(AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,kCathodes[icathode])); - const AliMpSector* sector = seg->GetSector(); - AliMpMotifMap* mMap = sector->GetMotifMap(); - TArrayI a; - - mMap->GetAllMotifPositionsIDs(a); - - TVector2 dim = seg->Dimensions(); - Double_t x = dim.X()*2; - Double_t xmin = isector*x/3.0; - Double_t xmax = xmin + x/3.0; - - for ( Int_t i = 0; i < a.GetSize(); ++i ) - { - AliMpMotifPosition* pos = mMap->FindMotifPosition(a[i]); - Int_t manuId = pos->GetID(); - TVector2 position = pos->Position(); - if ( position.X() >= xmin && position.X() <= xmax) - { - AliMUONVCalibParam* dead = - static_cast(hvStatus.Get(detElemId,manuId)); - if (!dead) - { - dead = new AliMUONCalibParamNI(1,64,status); - hvStatus.Set(detElemId,manuId,dead,false); - } - else - { - // FIXME: this should really not happen, if we'd know really the - // relationship between manuId and HV sector... - // For the time being, let's leave it like that, for testing - // purposes only. For production, this will have to be fixed. - AliWarning("Please fixme."); - } - } - } - } + // not already there, so compute it now + param = ComputeStatus(detElemId,manuId); + } + return param->ValueAsInt(manuChannel,0); } //_____________________________________________________________________________ void -AliMUONPadStatusMaker::SetStatusSt345(AliMUONV2DStore& hvStatus, - Int_t detElemId, Int_t pcbIndex, - Int_t status) const +AliMUONPadStatusMaker::SetHVStatus(Int_t detElemId, Int_t index, Int_t status) const { - /// Flag all pads of pcbIndex-th PCB of detElemId (for St345) as bad. + /// Assign status to all manus in a given HV "zone" (defined by index, meaning + /// is different thing from St12 and St345) - const AliMp::CathodType kCathodes[] = { AliMp::kCath0, AliMp::kCath1 }; + AliCodeTimerAuto("") - for ( Int_t icathode = 0; icathode < 2; ++icathode ) + AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId); + + const AliMpArrayI* manus = de->ManusForHV(index); + + for ( Int_t i = 0; i < manus->GetSize(); ++ i ) { - const AliMpSlatSegmentation* seg = static_cast - (AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,kCathodes[icathode])); - const AliMpSlat* slat = seg->Slat(); - const AliMpPCB* pcb = slat->GetPCB(pcbIndex); - - for ( Int_t i = 0; i < pcb->GetSize(); ++i ) - { - AliMpMotifPosition* pos = pcb->GetMotifPosition(i); - Int_t manuId = pos->GetID(); - AliMUONVCalibParam* dead = - static_cast(hvStatus.Get(detElemId,manuId)); - if (dead) - { - AliError(Form("dead is not null as expected from DE %d manuId %d", - detElemId,manuId)); - } - if (!dead) - { - dead = new AliMUONCalibParamNI(1,64,status); - hvStatus.Set(detElemId,manuId,dead,false); - } - } + Int_t manuId = manus->GetValue(i); + fHV->Add(AliMpManuUID::BuildUniqueID(detElemId,manuId),status + 1); } } - - -