]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONPadStatusMaker.cxx
Changes required in QA for the amoreQAshifter agent; change units of titles from...
[u/mrichter/AliRoot.git] / MUON / AliMUONPadStatusMaker.cxx
CommitLineData
2c780493 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15
16// $Id$
78649106 17
3d1463c8 18//-----------------------------------------------------------------------------
2c780493 19/// \class AliMUONPadStatusMaker
20///
21/// Make a 2DStore of pad statuses, using different sources of information,
22/// like pedestal values, gain values, and HV values.
23///
78649106 24/// \author Laurent Aphecetche
3d1463c8 25//-----------------------------------------------------------------------------
2c780493 26
27#include "AliMUONPadStatusMaker.h"
28
29#include "AliMUON2DMap.h"
9044498f 30#include "AliMUON2DStoreValidator.h"
31#include "AliMUONCalibParamNI.h"
2c780493 32#include "AliMUONCalibrationData.h"
411a502a 33#include "AliMUONLogger.h"
34#include "AliMUONRecoParam.h"
49e396d9 35#include "AliMUONStringIntMap.h"
7eafe398 36#include "AliMUONTrackerData.h"
411a502a 37#include "AliMUONVCalibParam.h"
2ce1c72b 38
2c780493 39#include "AliMpArea.h"
49e396d9 40#include "AliMpArrayI.h"
411a502a 41#include "AliMpCDB.h"
8d8e920c 42#include "AliMpConstants.h"
49e396d9 43#include "AliMpDDLStore.h"
2c780493 44#include "AliMpDEManager.h"
49e396d9 45#include "AliMpDetElement.h"
49e110ec 46#include "AliMpDCSNamer.h"
411a502a 47#include "AliMpManuIterator.h"
49e396d9 48#include "AliMpManuUID.h"
2ce1c72b 49
50#include "AliCDBEntry.h"
51#include "AliCDBManager.h"
52#include "AliCodeTimer.h"
53#include "AliDCSValue.h"
54#include "AliLog.h"
55
9044498f 56#include <Riostream.h>
49e396d9 57#include <TArrayI.h>
58#include <TExMap.h>
004a9ccd 59#include <TFile.h>
60#include <TKey.h>
9044498f 61#include <TMap.h>
004a9ccd 62#include <TROOT.h>
9044498f 63#include <TString.h>
004a9ccd 64#include <TSystem.h>
2c780493 65
78649106 66/// \cond CLASSIMP
2c780493 67ClassImp(AliMUONPadStatusMaker)
78649106 68/// \endcond
2c780493 69
70//_____________________________________________________________________________
71AliMUONPadStatusMaker::AliMUONPadStatusMaker(const AliMUONCalibrationData& calibData)
72dae9ff 72: fkCalibrationData(calibData),
004a9ccd 73fGainA1Limits(0,1E30),
74fGainA2Limits(-1E-30,1E30),
75fGainThresLimits(0,4095),
76fHVSt12Limits(0,5000),
77fHVSt345Limits(0,5000),
78fPedMeanLimits(0,4095),
79fPedSigmaLimits(0,4095),
7eafe398 80fManuOccupancyLimits(0,1.0),
411a502a 81fBuspatchOccupancyLimits(0,1.0),
7eafe398 82fDEOccupancyLimits(0,1.0),
004a9ccd 83fStatus(new AliMUON2DMap(true)),
84fHV(new TExMap),
85fPedestals(calibData.Pedestals()),
86fGains(calibData.Gains()),
7eafe398 87fTrackerData(0x0)
2c780493 88{
004a9ccd 89 /// ctor
7eafe398 90 if ( calibData.OccupancyMap() )
004a9ccd 91 {
7eafe398 92 /// create a tracker data from the occupancy map
93 fTrackerData = new AliMUONTrackerData("OCC","OCC",*(calibData.OccupancyMap()));
411a502a 94 }
95
2c780493 96}
97
98//_____________________________________________________________________________
99AliMUONPadStatusMaker::~AliMUONPadStatusMaker()
100{
71a2d3aa 101 /// dtor.
411a502a 102
49e396d9 103 delete fStatus;
104 delete fHV;
7eafe398 105 delete fTrackerData;
2c780493 106}
107
108//_____________________________________________________________________________
49e396d9 109TString
110AliMUONPadStatusMaker::AsString(Int_t status)
2c780493 111{
49e396d9 112 /// return a human readable version of the integer status
004a9ccd 113
49e396d9 114 Int_t pedStatus;
115 Int_t gainStatus;
116 Int_t hvStatus;
7eafe398 117 Int_t occStatus;
004a9ccd 118
7eafe398 119 DecodeStatus(status,pedStatus,hvStatus,gainStatus,occStatus);
004a9ccd 120
121 TString s;
122
123 if ( pedStatus & kPedMeanZero ) s += "& Ped Mean is Zero ";
124 if ( pedStatus & kPedMeanTooLow ) s += "& Ped Mean Too Low ";
125 if ( pedStatus & kPedMeanTooHigh ) s += "& Ped Mean Too High ";
126 if ( pedStatus & kPedSigmaTooLow ) s += "& Ped Sigma Too Low ";
127 if ( pedStatus & kPedSigmaTooHigh ) s += "& Ped Sigma Too High ";
128 if ( pedStatus & kPedMissing ) s += "& Ped is missing ";
129
130 if ( gainStatus & kGainA1TooLow ) s+="& Gain A1 is Too Low ";
131 if ( gainStatus & kGainA1TooHigh ) s+="& Gain A1 is Too High ";
132 if ( gainStatus & kGainA2TooLow ) s+="& Gain A2 is Too Low ";
133 if ( gainStatus & kGainA2TooHigh ) s+="& Gain A2 is Too High ";
134 if ( gainStatus & kGainThresTooLow ) s+="& Gain Thres is Too Low ";
135 if ( gainStatus & kGainThresTooHigh ) s+="& Gain Thres is Too High ";
136 if ( gainStatus & kGainMissing ) s+="& Gain is missing ";
137
138 if ( hvStatus & kHVError ) s+="& HV is on error ";
139 if ( hvStatus & kHVTooLow ) s+="& HV is Too Low ";
140 if ( hvStatus & kHVTooHigh ) s+="& HV is Too High ";
141 if ( hvStatus & kHVChannelOFF ) s+="& HV has channel OFF ";
142 if ( hvStatus & kHVSwitchOFF ) s+="& HV has switch OFF ";
143 if ( hvStatus & kHVMissing ) s+="& HV is missing ";
144
7eafe398 145 if ( occStatus & kManuOccupancyTooHigh ) s+="& manu occupancy too high ";
146 if ( occStatus & kManuOccupancyTooLow ) s+="& manu occupancy too low ";
147 if ( occStatus & kBusPatchOccupancyTooHigh ) s+="& bus patch occupancy too high ";
148 if ( occStatus & kBusPatchOccupancyTooLow ) s+="& bus patch occupancy too low ";
149 if ( occStatus & kDEOccupancyTooHigh ) s+="& DE occupancy too high ";
150 if ( occStatus & kDEOccupancyTooLow ) s+="& DE occupancy too low ";
49e396d9 151
004a9ccd 152 if ( s[0] == '&' ) s[0] = ' ';
153
154 return s;
155}
49e396d9 156
004a9ccd 157//_____________________________________________________________________________
158TString
159AliMUONPadStatusMaker::AsCondition(Int_t mask)
160{
161 /// return a human readable version of the mask's equivalent condition
162
163 TString s(AsString(mask));
164
165 s.ReplaceAll("&","|");
166
49e396d9 167 return s;
2c780493 168}
169
96199305 170//_____________________________________________________________________________
49e396d9 171Int_t
172AliMUONPadStatusMaker::BuildStatus(Int_t pedStatus,
173 Int_t hvStatus,
004a9ccd 174 Int_t gainStatus,
7eafe398 175 Int_t occStatus)
96199305 176{
49e396d9 177 /// Build a complete status from specific parts (ped,hv,gain)
8d8e920c 178
49e396d9 179 return ( hvStatus & 0xFF ) | ( ( pedStatus & 0xFF ) << 8 ) |
004a9ccd 180 ( ( gainStatus & 0xFF ) << 16 ) |
7eafe398 181 ( ( occStatus & 0xFF ) << 24 ) ;
49e396d9 182}
183
184//_____________________________________________________________________________
185void
186AliMUONPadStatusMaker::DecodeStatus(Int_t status,
187 Int_t& pedStatus,
188 Int_t& hvStatus,
004a9ccd 189 Int_t& gainStatus,
7eafe398 190 Int_t& occStatus)
49e396d9 191{
192 /// Decode complete status into specific parts (ped,hv,gain)
96199305 193
7eafe398 194 occStatus = ( status & 0xFF000000 ) >> 24;
49e396d9 195 gainStatus = ( status & 0xFF0000 ) >> 16;
196 pedStatus = ( status & 0xFF00 ) >> 8;
197 hvStatus = (status & 0xFF);
96199305 198}
199
2c780493 200//_____________________________________________________________________________
201Bool_t
49e396d9 202AliMUONPadStatusMaker::HVSt12Status(Int_t detElemId, Int_t sector,
203 Bool_t& hvChannelTooLow,
204 Bool_t& hvChannelTooHigh,
205 Bool_t& hvChannelON) const
2c780493 206{
207 /// Get HV status for one HV sector of St12
208
209 /// For a given PCB in a given DE, get the HV status (both the channel
210 /// and the switch).
211 /// Returns false if hv switch changed during the run.
212
99c136e1 213 AliCodeTimerAuto("",0)
49e396d9 214
2c780493 215 Bool_t error = kFALSE;
216 hvChannelTooLow = kFALSE;
217 hvChannelTooHigh = kFALSE;
218 hvChannelON = kTRUE;
49e396d9 219
49e110ec 220 AliMpDCSNamer hvNamer("TRACKER");
2c780493 221
49e110ec 222 TString hvChannel(hvNamer.DCSChannelName(detElemId,sector));
2c780493 223
72dae9ff 224 TMap* hvMap = fkCalibrationData.HV();
49e396d9 225 TPair* hvPair = static_cast<TPair*>(hvMap->FindObject(hvChannel.Data()));
2c780493 226 if (!hvPair)
227 {
228 AliError(Form("Did not find expected alias (%s) for DE %d",
229 hvChannel.Data(),detElemId));
230 error = kTRUE;
231 }
232 else
233 {
234 TObjArray* values = static_cast<TObjArray*>(hvPair->Value());
235 if (!values)
236 {
237 AliError(Form("Could not get values for alias %s",hvChannel.Data()));
238 error = kTRUE;
239 }
240 else
241 {
242 // find out min and max value, and makes a cut
243 Float_t hvMin(1E9);
244 Float_t hvMax(0);
245 TIter next(values);
246 AliDCSValue* val;
247
248 while ( ( val = static_cast<AliDCSValue*>(next()) ) )
249 {
250 Float_t hv = val->GetFloat();
251 hvMin = TMath::Min(hv,hvMin);
252 hvMax = TMath::Max(hv,hvMax);
253 }
254
255 float lowThreshold = fHVSt12Limits.X();
256 float highThreshold = fHVSt12Limits.Y();
257
258 if ( hvMin < lowThreshold ) hvChannelTooLow = kTRUE;
259 if ( hvMax > highThreshold ) hvChannelTooHigh = kTRUE;
260 if ( hvMin < 1 ) hvChannelON = kFALSE;
261 }
262 }
263
264 return error;
265}
266
ca913045 267//_____________________________________________________________________________
268Float_t
269AliMUONPadStatusMaker::SwitchValue(const TObjArray& dcsArray)
270{
271 /// Loop over the dcs value for a single switch to decide whether
272 /// we should consider it on or off
273
274 // we'll count the number of ON/OFF for this pad, to insure
275 // consistency (i.e. if status changed during the run, we should
276 // at least notify this fact ;-) and hope it's not the norm)
277 Int_t nTrue(0);
278 Int_t nFalse(0);
279 TIter next(&dcsArray);
280 AliDCSValue* val;
281
282 while ( ( val = static_cast<AliDCSValue*>(next()) ) )
283 {
284 if ( val->GetBool() )
285 {
286 ++nTrue;
287 }
288 else
289 {
290 ++nFalse;
291 }
292 }
293
294 if ( (nTrue>0 && nFalse>0) )
295 {
296 // change of state during the run, consider it off
297 return 0.0;
298 }
299
300 if ( nFalse )
301 {
302 /// switch = FALSE means the HV was flowding up to the PCB.
303 /// i.e. switch = FALSE = ON
304 return 1.0;
305 }
306
307 return 0.0;
308}
309
2c780493 310//_____________________________________________________________________________
311Bool_t
49e396d9 312AliMUONPadStatusMaker::HVSt345Status(Int_t detElemId, Int_t pcbIndex,
313 Bool_t& hvChannelTooLow,
314 Bool_t& hvChannelTooHigh,
315 Bool_t& hvChannelON,
316 Bool_t& hvSwitchON) const
2c780493 317{
318 /// For a given PCB in a given DE, get the HV status (both the channel
319 /// and the switch).
320 /// Returns false if something goes wrong (in particular if
321 /// hv switch changed during the run).
322
99c136e1 323 AliCodeTimerAuto("",0)
49e396d9 324
2c780493 325 Bool_t error = kFALSE;
326 hvChannelTooLow = kFALSE;
327 hvChannelTooHigh = kFALSE;
328 hvSwitchON = kTRUE;
329 hvChannelON = kTRUE;
330
49e110ec 331 AliMpDCSNamer hvNamer("TRACKER");
2c780493 332
49e110ec 333 TString hvChannel(hvNamer.DCSChannelName(detElemId));
2c780493 334
72dae9ff 335 TMap* hvMap = fkCalibrationData.HV();
49e396d9 336
337 TPair* hvPair = static_cast<TPair*>(hvMap->FindObject(hvChannel.Data()));
2c780493 338 if (!hvPair)
339 {
340 AliError(Form("Did not find expected alias (%s) for DE %d",
341 hvChannel.Data(),detElemId));
342 error = kTRUE;
343 }
344 else
345 {
346 TObjArray* values = static_cast<TObjArray*>(hvPair->Value());
347 if (!values)
348 {
349 AliError(Form("Could not get values for alias %s",hvChannel.Data()));
350 error = kTRUE;
351 }
352 else
353 {
354 // find out min and max value, and makes a cut
355 Float_t hvMin(1E9);
356 Float_t hvMax(0);
357 TIter next(values);
358 AliDCSValue* val;
359
360 while ( ( val = static_cast<AliDCSValue*>(next()) ) )
361 {
362 Float_t hv = val->GetFloat();
363 hvMin = TMath::Min(hv,hvMin);
364 hvMax = TMath::Max(hv,hvMax);
365 }
366
367 float lowThreshold = fHVSt345Limits.X();
368 float highThreshold = fHVSt345Limits.Y();
369
370 if ( hvMin < lowThreshold ) hvChannelTooLow = kTRUE;
49e396d9 371 else if ( hvMax > highThreshold ) hvChannelTooHigh = kTRUE;
2c780493 372 if ( hvMin < 1 ) hvChannelON = kFALSE;
373 }
374 }
375
49e110ec 376 TString hvSwitch(hvNamer.DCSSwitchName(detElemId,pcbIndex));
49e396d9 377 TPair* switchPair = static_cast<TPair*>(hvMap->FindObject(hvSwitch.Data()));
2c780493 378 if (!switchPair)
379 {
380 AliError(Form("Did not find expected alias (%s) for DE %d PCB %d",
381 hvSwitch.Data(),detElemId,pcbIndex));
382 error = kTRUE;
383 }
384 else
385 {
386 TObjArray* values = static_cast<TObjArray*>(switchPair->Value());
387 if (!values)
388 {
389 AliError(Form("Could not get values for alias %s",hvSwitch.Data()));
390 error = kTRUE;
391 }
392 else
393 {
ca913045 394 Float_t sv = SwitchValue(*values);
395 if ( sv < 0.99 ) hvSwitchON = kFALSE;
2c780493 396 }
397 }
398 return error;
399}
400
401//_____________________________________________________________________________
49e396d9 402Int_t
403AliMUONPadStatusMaker::HVStatus(Int_t detElemId, Int_t manuId) const
2c780493 404{
49e396d9 405 /// Get HV status of one manu
2c780493 406
99c136e1 407 AliCodeTimerAuto("",0)
2c780493 408
72dae9ff 409 if ( !fkCalibrationData.HV() ) return kMissing;
49e396d9 410
411 Long_t lint = fHV->GetValue(AliMpManuUID::BuildUniqueID(detElemId,manuId));
2c780493 412
49e396d9 413 if ( lint )
414 {
415 return (Int_t)(lint - 1);
416 }
417
418 Int_t status(0);
2c780493 419
49e110ec 420 AliMpDCSNamer hvNamer("TRACKER");
2c780493 421
49e396d9 422 switch ( AliMpDEManager::GetStationType(detElemId) )
2c780493 423 {
4e51cfd2 424 case AliMp::kStation12:
2c780493 425 {
49e396d9 426 int sector = hvNamer.ManuId2Sector(detElemId,manuId);
427 if ( sector >= 0 )
2c780493 428 {
49e396d9 429 Bool_t hvChannelTooLow, hvChannelTooHigh, hvChannelON;
430 Bool_t error = HVSt12Status(detElemId,sector,
431 hvChannelTooLow,
432 hvChannelTooHigh,
433 hvChannelON);
434 if ( error ) status |= kHVError;
435 if ( hvChannelTooLow ) status |= kHVTooLow;
436 if ( hvChannelTooHigh ) status |= kHVTooHigh;
437 if ( !hvChannelON ) status |= kHVChannelOFF;
438 // assign this status to all the other manus handled by the same HV channel
439 SetHVStatus(detElemId,sector,status);
440 }
441 }
442 break;
443 case AliMp::kStation345:
444 {
445 int pcbIndex = hvNamer.ManuId2PCBIndex(detElemId,manuId);
446 if ( pcbIndex >= 0 )
447 {
448 Bool_t hvChannelTooLow, hvChannelTooHigh, hvChannelON,hvSwitchON;
449 Bool_t error = HVSt345Status(detElemId,pcbIndex,
450 hvChannelTooLow,hvChannelTooHigh,
451 hvChannelON,hvSwitchON);
452 if ( error ) status |= kHVError;
453 if ( hvChannelTooLow ) status |= kHVTooLow;
454 if ( hvChannelTooHigh ) status |= kHVTooHigh;
455 if ( !hvSwitchON ) status |= kHVSwitchOFF;
456 if ( !hvChannelON) status |= kHVChannelOFF;
457 // assign this status to all the other manus handled by the same HV channel
458 SetHVStatus(detElemId,pcbIndex,status);
2c780493 459 }
2c780493 460 }
49e396d9 461 break;
462 default:
463 break;
2c780493 464 }
465
49e396d9 466 return status;
467}
468
469//_____________________________________________________________________________
470AliMUONVCalibParam*
471AliMUONPadStatusMaker::Neighbours(Int_t detElemId, Int_t manuId) const
472{
473 /// Get the neighbours parameters for a given manu
72dae9ff 474 AliMUONVStore* neighbourStore = fkCalibrationData.Neighbours();
49e396d9 475 return static_cast<AliMUONVCalibParam*>(neighbourStore->FindObject(detElemId,manuId));
2c780493 476}
477
478//_____________________________________________________________________________
8d8e920c 479AliMUONVStore*
49e396d9 480AliMUONPadStatusMaker::NeighboursStore() const
2c780493 481{
49e396d9 482 /// Return the store containing all the neighbours
72dae9ff 483 return fkCalibrationData.Neighbours();
49e396d9 484}
485
486//_____________________________________________________________________________
487AliMUONVCalibParam*
488AliMUONPadStatusMaker::ComputeStatus(Int_t detElemId, Int_t manuId) const
489{
490 /// Compute the status of a given manu, using all available information,
491 /// i.e. pedestals, gains, and HV
2c780493 492
49e396d9 493 AliMUONVCalibParam* param = new AliMUONCalibParamNI(1,AliMpConstants::ManuNofChannels(),detElemId,manuId,-1);
494 fStatus->Add(param);
004a9ccd 495
49e396d9 496 AliMUONVCalibParam* pedestals = static_cast<AliMUONVCalibParam*>(fPedestals->FindObject(detElemId,manuId));
497
498 AliMUONVCalibParam* gains = static_cast<AliMUONVCalibParam*>(fGains->FindObject(detElemId,manuId));
2c780493 499
49e396d9 500 Int_t hvStatus = HVStatus(detElemId,manuId);
501
7eafe398 502 Int_t occStatus = OccupancyStatus(detElemId,manuId);
2c780493 503
49e396d9 504 for ( Int_t manuChannel = 0; manuChannel < param->Size(); ++manuChannel )
2c780493 505 {
49e396d9 506 Int_t pedStatus(0);
507
508 if (pedestals)
2c780493 509 {
49e396d9 510 Float_t pedMean = pedestals->ValueAsFloatFast(manuChannel,0);
511 Float_t pedSigma = pedestals->ValueAsFloatFast(manuChannel,1);
512 if ( pedMean < fPedMeanLimits.X() ) pedStatus |= kPedMeanTooLow;
513 else if ( pedMean > fPedMeanLimits.Y() ) pedStatus |= kPedMeanTooHigh;
514 if ( pedSigma < fPedSigmaLimits.X() ) pedStatus |= kPedSigmaTooLow;
515 else if ( pedSigma > fPedSigmaLimits.Y() ) pedStatus |= kPedSigmaTooHigh;
516 if ( pedMean == 0 ) pedStatus |= kPedMeanZero;
517 }
518 else
519 {
520 pedStatus = kPedMissing;
521 }
522
523 Int_t gainStatus(0);
524
525 if ( gains )
526 {
527 Float_t a0 = gains->ValueAsFloatFast(manuChannel,0);
528 Float_t a1 = gains->ValueAsFloatFast(manuChannel,1);
529 Float_t thres = gains->ValueAsFloatFast(manuChannel,2);
530
004a9ccd 531 if ( a0 < fGainA1Limits.X() ) gainStatus |= kGainA1TooLow;
532 else if ( a0 > fGainA1Limits.Y() ) gainStatus |= kGainA1TooHigh;
533 if ( a1 < fGainA2Limits.X() ) gainStatus |= kGainA2TooLow;
534 else if ( a1 > fGainA2Limits.Y() ) gainStatus |= kGainA2TooHigh;
49e396d9 535 if ( thres < fGainThresLimits.X() ) gainStatus |= kGainThresTooLow;
536 else if ( thres > fGainThresLimits.Y() ) gainStatus |= kGainThresTooHigh;
2c780493 537 }
49e396d9 538 else
539 {
540 gainStatus = kGainMissing;
541 }
2b8a1212 542
7eafe398 543 Int_t status = BuildStatus(pedStatus,hvStatus,gainStatus,occStatus);
49e396d9 544
545 param->SetValueAsIntFast(manuChannel,0,status);
2c780493 546 }
547
49e396d9 548 return param;
2c780493 549}
550
004a9ccd 551//_____________________________________________________________________________
552Int_t
7eafe398 553AliMUONPadStatusMaker::OccupancyStatus(Int_t detElemId, Int_t manuId) const
004a9ccd 554{
555 /// Get the "other" status for a given manu
7eafe398 556
557 Int_t rv(0);
558
004a9ccd 559 if ( fTrackerData )
560 {
7eafe398 561 const Int_t occIndex = 2;
562
563 Double_t occ = fTrackerData->DetectionElement(detElemId,occIndex);
564
565 if ( occ <= fDEOccupancyLimits.X() )
566 {
567 rv |= kDEOccupancyTooLow;
568 }
569 else if ( occ > fDEOccupancyLimits.Y() )
004a9ccd 570 {
7eafe398 571 rv |= kDEOccupancyTooHigh;
004a9ccd 572 }
7eafe398 573
574 Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId,manuId);
575
576 occ = fTrackerData->BusPatch(busPatchId,occIndex);
577
411a502a 578 if ( occ <= fBuspatchOccupancyLimits.X() )
7eafe398 579 {
580 rv |= kBusPatchOccupancyTooLow;
581 }
411a502a 582 else if ( occ > fBuspatchOccupancyLimits.Y() )
7eafe398 583 {
584 rv |= kBusPatchOccupancyTooHigh;
585 }
586
587 occ = fTrackerData->Manu(detElemId,manuId,occIndex);
588
589 if ( occ <= fManuOccupancyLimits.X() )
590 {
591 rv |= kManuOccupancyTooLow;
592 }
593 else if ( occ > fManuOccupancyLimits.Y() )
004a9ccd 594 {
7eafe398 595 rv |= kManuOccupancyTooHigh;
004a9ccd 596 }
597 }
7eafe398 598 return rv;
004a9ccd 599}
600
2c780493 601//_____________________________________________________________________________
49e396d9 602AliMUONVCalibParam*
603AliMUONPadStatusMaker::PadStatus(Int_t detElemId, Int_t manuId) const
2c780493 604{
004a9ccd 605 /// Get the status container for a given manu
2c780493 606
49e396d9 607 AliMUONVCalibParam* param = static_cast<AliMUONVCalibParam*>(fStatus->FindObject(detElemId,manuId));
608 if (!param)
96199305 609 {
49e396d9 610 // not already there, so compute it now
99c136e1 611 AliCodeTimerAuto("ComputeStatus",0);
49e396d9 612 param = ComputeStatus(detElemId,manuId);
96199305 613 }
49e396d9 614 return param;
2c780493 615}
616
617//_____________________________________________________________________________
49e396d9 618Int_t
619AliMUONPadStatusMaker::PadStatus(Int_t detElemId, Int_t manuId, Int_t manuChannel) const
2c780493 620{
49e396d9 621 /// Get the status for a given channel
2c780493 622
49e396d9 623 AliMUONVCalibParam* param = static_cast<AliMUONVCalibParam*>(fStatus->FindObject(detElemId,manuId));
624 if (!param)
2c780493 625 {
49e396d9 626 // not already there, so compute it now
627 param = ComputeStatus(detElemId,manuId);
628 }
629 return param->ValueAsInt(manuChannel,0);
2c780493 630}
631
632//_____________________________________________________________________________
633void
49e396d9 634AliMUONPadStatusMaker::SetHVStatus(Int_t detElemId, Int_t index, Int_t status) const
2c780493 635{
49e396d9 636 /// Assign status to all manus in a given HV "zone" (defined by index, meaning
637 /// is different thing from St12 and St345)
638
99c136e1 639 AliCodeTimerAuto("",0)
49e396d9 640
641 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
2c780493 642
49e396d9 643 const AliMpArrayI* manus = de->ManusForHV(index);
2c780493 644
49e396d9 645 for ( Int_t i = 0; i < manus->GetSize(); ++ i )
2c780493 646 {
49e396d9 647 Int_t manuId = manus->GetValue(i);
648 fHV->Add(AliMpManuUID::BuildUniqueID(detElemId,manuId),status + 1);
2c780493 649 }
650}
411a502a 651
652//_____________________________________________________________________________
653void
654AliMUONPadStatusMaker::SetLimits(const AliMUONRecoParam& recoParams)
655{
656 /// Set the limits from the recoparam
657
658 SetHVSt12Limits(recoParams.HVSt12LowLimit(),recoParams.HVSt12HighLimit());
659 SetHVSt345Limits(recoParams.HVSt345LowLimit(),recoParams.HVSt345HighLimit());
660
661 SetPedMeanLimits(recoParams.PedMeanLowLimit(),recoParams.PedMeanHighLimit());
662 SetPedSigmaLimits(recoParams.PedSigmaLowLimit(),recoParams.PedSigmaHighLimit());
663
664 SetGainA1Limits(recoParams.GainA1LowLimit(),recoParams.GainA1HighLimit());
665 SetGainA2Limits(recoParams.GainA2LowLimit(),recoParams.GainA2HighLimit());
666 SetGainThresLimits(recoParams.GainThresLowLimit(),recoParams.GainThresHighLimit());
667
668 SetManuOccupancyLimits(recoParams.ManuOccupancyLowLimit(),recoParams.ManuOccupancyHighLimit());
669 SetBuspatchOccupancyLimits(recoParams.BuspatchOccupancyLowLimit(),recoParams.BuspatchOccupancyHighLimit());
670 SetDEOccupancyLimits(recoParams.DEOccupancyLowLimit(),recoParams.DEOccupancyHighLimit());
671}
672
673//_____________________________________________________________________________
674void
675AliMUONPadStatusMaker::Report(UInt_t mask)
676{
677 /// Report the number of bad pads, according to the mask,
678 /// and the various reasons why they are bad (with occurence rates)
679
680 AliInfo("");
99c136e1 681 AliCodeTimerAuto("",0);
411a502a 682
683 AliMUONLogger log(1064008);
684
685 Int_t nBadPads(0);
686 Int_t nPads(0);
687
688 AliMpManuIterator it;
689
690 Int_t detElemId, manuId;
691
692 while ( it.Next(detElemId,manuId) )
693 {
694 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
695
696 for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i )
697 {
698 if ( de->IsConnectedChannel(manuId,i) )
699 {
700 ++nPads;
701
702 Int_t status = PadStatus(detElemId,manuId,i);
703
704 if ( ( status & mask) || (!mask && status) )
705 {
706 ++nBadPads;
707 log.Log(AsString(status));
708 }
709 }
710 }
711 }
712
713 TString msg;
714 Int_t ntimes;
715
716 cout << Form("According to mask %x (human readable form below) %6d pads are bad (over a total of %6d, i.e. %7.2f %%)",
717 mask,nBadPads,nPads,nPads ? nBadPads*100.0/nPads : 0.0) << endl;
718 cout << AliMUONPadStatusMaker::AsCondition(mask) << endl;
719 cout << "--------" << endl;
720
721 while ( log.Next(msg,ntimes) )
722 {
723 cout << Form("The message (%120s) occured %15d times (%7.4f %%)",msg.Data(),ntimes,ntimes*100.0/nPads) << endl;
724 }
725
726}
727