ROOT logo
#ifndef ALIMUONPADSTATUSMAKER_H
#define ALIMUONPADSTATUSMAKER_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice                               */

// $Id$

/// \ingroup rec
/// \class AliMUONPadStatusMaker
/// \brief Make a 2DStore of pad statuses, using different sources of information
/// 
//  Author Laurent Aphecetche

#ifndef ROOT_TObject
#  include "TObject.h"
#endif
#ifndef ROOT_TVector2
#  include "TVector2.h"
#endif

class TExMap;
class AliMUONCalibrationData;
class AliMUONRecoParam;
class AliMUONVCalibParam;
class AliMUONVTrackerData;
class AliMUONVStore;

using std::ostream;

class AliMUONPadStatusMaker : public TObject
{
public:
  AliMUONPadStatusMaker(const AliMUONCalibrationData& calibData);
  virtual ~AliMUONPadStatusMaker();
  
  /// Get the reference to the calibrationdata object we use.
  const AliMUONCalibrationData& CalibrationData() const { return fkCalibrationData; }
  
  /** Get access to internal status store (for debug only, as it may not be complete,
    depending on whether you've already called PadStatus for all possible de,manu
    combinations or not...
    */
  AliMUONVStore* StatusStore() const { return fStatus; }

  AliMUONVCalibParam* PadStatus(Int_t detElemId, Int_t manuId) const;

  Int_t PadStatus(Int_t detElemId, Int_t manuId, Int_t manuChannel) const;
  
  AliMUONVStore* NeighboursStore() const;
  
  AliMUONVCalibParam* Neighbours(Int_t detElemId, Int_t manuId) const;
  
  static TString AsString(Int_t status);

  static TString AsCondition(Int_t status);

  /// Return Low and High limits for a0 parameter of gain (linear slope)
  TVector2 GainA1Limits() const { return fGainA1Limits; }
  /// Return Low and High limits for a1 parameter of gain (parabolic term)
  TVector2 GainA2Limits() const { return fGainA2Limits; }
  /// Return Low and High limits for thres parameter of gain
  TVector2 GainThresLimits() const { return fGainThresLimits; }
  
  /// Return HV threshold
  Double_t HVLimit(Int_t chamberId) const;
  
  /// Return Low and High threshold for pedestal mean
  TVector2 PedMeanLimits() const { return fPedMeanLimits; }
  /// Return Low and High threshold for pedestal sigma
  TVector2 PedSigmaLimits() const { return fPedSigmaLimits; }
  
  /// Set Low and High limits for a0 parameter of gain (linear slope)
  void GainA1Limits(float low, float high) { fGainA1Limits.Set(low,high); }
  /// Set Low and High limits for a1 parameter of gain (parabolic term)
  void GainA2Limits(float low, float high) { fGainA2Limits.Set(low,high); }
  /// Set Low and High limits for thres parameter of gain
  void GainThresLimits(float low, float high) { fGainThresLimits.Set(low,high); }
  
  /// Set HV limit
  void SetHVLimit(Int_t chamberId, Double_t hv);

  /// Set Low and High threshold for pedestal mean
  void SetPedMeanLimits(float low, float high) { fPedMeanLimits.Set(low,high); }
  /// Set Low and High threshold for pedestal sigma 
  void SetPedSigmaLimits(float low, float high) { fPedSigmaLimits.Set(low,high); }
  
	/// Set Low and High threshold for gain a0 term
	void SetGainA1Limits(float low, float high) { fGainA1Limits.Set(low,high); }
	/// Set Low and High threshold for gain a1 term
	void SetGainA2Limits(float low, float high) { fGainA2Limits.Set(low,high); }
	/// Set Low and High threshold for gain threshold term
	void SetGainThresLimits(float low, float high) { fGainThresLimits.Set(low,high); }
	
  /// Set Low and High manu occupancy limits
  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);
  
  static Float_t SwitchValue(const TObjArray& dcsArray);
  
  Int_t HVStatus(Int_t detElemId, Int_t manuId) const;
  
  Int_t OccupancyStatus(Int_t detElemId, Int_t manuId) const;

  static void DecodeStatus(Int_t status, Int_t& pedStatus, Int_t& hvStatus, 
                           Int_t&  gainStatus, Int_t& otherStatus);
  static Int_t BuildStatus(Int_t pedStatus, Int_t hvStatus, 
                           Int_t gainStatus, Int_t otherStatus);  
private:
  /// Not implemented
  AliMUONPadStatusMaker(const AliMUONPadStatusMaker&);
  /// Not implemented
  AliMUONPadStatusMaker& operator=(const AliMUONPadStatusMaker&);

  
  AliMUONVCalibParam* ComputeStatus(Int_t detElemId, Int_t manuId) const;

  Bool_t HVSt12Status(Int_t detElemId, Int_t sector,
                      Bool_t& hvChannelTooLow,
                      Bool_t& hvChannelTooHigh,
                      Bool_t& hvChannelON) const;
  
  
  Bool_t HVSt345Status(Int_t detElemId, Int_t pcbIndex,
                       Bool_t& hvChannelTooLow,
                       Bool_t& hvChannelTooHigh,
                       Bool_t& hvChannelON,
                       Bool_t& hvSwitchON) const;

  void SetHVStatus(Int_t detElemId, Int_t index, Int_t status) const;

private:
  /// General status
  enum EGeneralStatus
  {
    kMissing = (1<<7)
  };

  /// Gain status
  enum EGainStatus
  {
    kGainOK = 0,
    kGainA1TooLow = (1<<1),
    kGainA1TooHigh = (1<<2),
    kGainA2TooLow = (1<<3),
    kGainA2TooHigh = (1<<4),
    kGainThresTooLow = (1<<5),
    kGainThresTooHigh = (1<<6),
    
    kGainMissing = kMissing // please always use last bit for meaning "missing"
  };
  
  /// Pedestal status
  enum EPedestalStatus
  {
    kPedOK = 0,
    kPedMeanZero = (1<<1),
    kPedMeanTooLow = (1<<2),
    kPedMeanTooHigh = (1<<3),
    kPedSigmaTooLow = (1<<4),
    kPedSigmaTooHigh = (1<<5),
    
    kPedMissing = kMissing // please always use last bit for meaning "missing"
  };
  
  /// HV Error
  enum EHVError 
  {
    kHVOK = 0,
    kHVError = (1<<0),
    kHVTooLow = (1<<1),
    kHVTooHigh = (1<<2), // no longer to be used
    kHVChannelOFF = (1<<3),
    kHVSwitchOFF = (1<<4),

    kHVMissing = kMissing // please always use last bit for meaning "missing"
  };
  
  /// Other
  enum EOccupancyStatus
  {
    kManuOccupancyTooLow = (1<<1),
    kManuOccupancyTooHigh = (1<<2),
    kBusPatchOccupancyTooLow = (1<<3),
    kBusPatchOccupancyTooHigh = (1<<4),
    kDEOccupancyTooLow = (1<<5),
    kDEOccupancyTooHigh = (1<<6)
  };
  
  const AliMUONCalibrationData& fkCalibrationData; //!< helper class to get data access (not owner)
  
  TVector2 fGainA1Limits; //!< Low and High threshold for gain a0 parameter
  TVector2 fGainA2Limits; //!< Low and High threshold for gain a1 parameter
  TVector2 fGainThresLimits; //!< Low and High threshold for gain threshold parameter

  Double_t fHVLimit[10]; //!< Low thresholds for HV

  TVector2 fPedMeanLimits; //!< Low and High threshold for pedestal mean
  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 fDEOccupancyLimits; //!< Low and High DE occupancy limits
  
  AliMUONVStore* fStatus; //!< statuses of the pads
  
  mutable TExMap* fHV; //!< cache of hv statuses

  AliMUONVStore* fPedestals; //!< pedestal values
  AliMUONVStore* fGains; //!< gain values
  
  AliMUONVTrackerData* fTrackerData; //!< to get occupancies...
  
  ClassDef(AliMUONPadStatusMaker,0) // Creates pad statuses from ped,gain,hv
};

#endif
 AliMUONPadStatusMaker.h:1
 AliMUONPadStatusMaker.h:2
 AliMUONPadStatusMaker.h:3
 AliMUONPadStatusMaker.h:4
 AliMUONPadStatusMaker.h:5
 AliMUONPadStatusMaker.h:6
 AliMUONPadStatusMaker.h:7
 AliMUONPadStatusMaker.h:8
 AliMUONPadStatusMaker.h:9
 AliMUONPadStatusMaker.h:10
 AliMUONPadStatusMaker.h:11
 AliMUONPadStatusMaker.h:12
 AliMUONPadStatusMaker.h:13
 AliMUONPadStatusMaker.h:14
 AliMUONPadStatusMaker.h:15
 AliMUONPadStatusMaker.h:16
 AliMUONPadStatusMaker.h:17
 AliMUONPadStatusMaker.h:18
 AliMUONPadStatusMaker.h:19
 AliMUONPadStatusMaker.h:20
 AliMUONPadStatusMaker.h:21
 AliMUONPadStatusMaker.h:22
 AliMUONPadStatusMaker.h:23
 AliMUONPadStatusMaker.h:24
 AliMUONPadStatusMaker.h:25
 AliMUONPadStatusMaker.h:26
 AliMUONPadStatusMaker.h:27
 AliMUONPadStatusMaker.h:28
 AliMUONPadStatusMaker.h:29
 AliMUONPadStatusMaker.h:30
 AliMUONPadStatusMaker.h:31
 AliMUONPadStatusMaker.h:32
 AliMUONPadStatusMaker.h:33
 AliMUONPadStatusMaker.h:34
 AliMUONPadStatusMaker.h:35
 AliMUONPadStatusMaker.h:36
 AliMUONPadStatusMaker.h:37
 AliMUONPadStatusMaker.h:38
 AliMUONPadStatusMaker.h:39
 AliMUONPadStatusMaker.h:40
 AliMUONPadStatusMaker.h:41
 AliMUONPadStatusMaker.h:42
 AliMUONPadStatusMaker.h:43
 AliMUONPadStatusMaker.h:44
 AliMUONPadStatusMaker.h:45
 AliMUONPadStatusMaker.h:46
 AliMUONPadStatusMaker.h:47
 AliMUONPadStatusMaker.h:48
 AliMUONPadStatusMaker.h:49
 AliMUONPadStatusMaker.h:50
 AliMUONPadStatusMaker.h:51
 AliMUONPadStatusMaker.h:52
 AliMUONPadStatusMaker.h:53
 AliMUONPadStatusMaker.h:54
 AliMUONPadStatusMaker.h:55
 AliMUONPadStatusMaker.h:56
 AliMUONPadStatusMaker.h:57
 AliMUONPadStatusMaker.h:58
 AliMUONPadStatusMaker.h:59
 AliMUONPadStatusMaker.h:60
 AliMUONPadStatusMaker.h:61
 AliMUONPadStatusMaker.h:62
 AliMUONPadStatusMaker.h:63
 AliMUONPadStatusMaker.h:64
 AliMUONPadStatusMaker.h:65
 AliMUONPadStatusMaker.h:66
 AliMUONPadStatusMaker.h:67
 AliMUONPadStatusMaker.h:68
 AliMUONPadStatusMaker.h:69
 AliMUONPadStatusMaker.h:70
 AliMUONPadStatusMaker.h:71
 AliMUONPadStatusMaker.h:72
 AliMUONPadStatusMaker.h:73
 AliMUONPadStatusMaker.h:74
 AliMUONPadStatusMaker.h:75
 AliMUONPadStatusMaker.h:76
 AliMUONPadStatusMaker.h:77
 AliMUONPadStatusMaker.h:78
 AliMUONPadStatusMaker.h:79
 AliMUONPadStatusMaker.h:80
 AliMUONPadStatusMaker.h:81
 AliMUONPadStatusMaker.h:82
 AliMUONPadStatusMaker.h:83
 AliMUONPadStatusMaker.h:84
 AliMUONPadStatusMaker.h:85
 AliMUONPadStatusMaker.h:86
 AliMUONPadStatusMaker.h:87
 AliMUONPadStatusMaker.h:88
 AliMUONPadStatusMaker.h:89
 AliMUONPadStatusMaker.h:90
 AliMUONPadStatusMaker.h:91
 AliMUONPadStatusMaker.h:92
 AliMUONPadStatusMaker.h:93
 AliMUONPadStatusMaker.h:94
 AliMUONPadStatusMaker.h:95
 AliMUONPadStatusMaker.h:96
 AliMUONPadStatusMaker.h:97
 AliMUONPadStatusMaker.h:98
 AliMUONPadStatusMaker.h:99
 AliMUONPadStatusMaker.h:100
 AliMUONPadStatusMaker.h:101
 AliMUONPadStatusMaker.h:102
 AliMUONPadStatusMaker.h:103
 AliMUONPadStatusMaker.h:104
 AliMUONPadStatusMaker.h:105
 AliMUONPadStatusMaker.h:106
 AliMUONPadStatusMaker.h:107
 AliMUONPadStatusMaker.h:108
 AliMUONPadStatusMaker.h:109
 AliMUONPadStatusMaker.h:110
 AliMUONPadStatusMaker.h:111
 AliMUONPadStatusMaker.h:112
 AliMUONPadStatusMaker.h:113
 AliMUONPadStatusMaker.h:114
 AliMUONPadStatusMaker.h:115
 AliMUONPadStatusMaker.h:116
 AliMUONPadStatusMaker.h:117
 AliMUONPadStatusMaker.h:118
 AliMUONPadStatusMaker.h:119
 AliMUONPadStatusMaker.h:120
 AliMUONPadStatusMaker.h:121
 AliMUONPadStatusMaker.h:122
 AliMUONPadStatusMaker.h:123
 AliMUONPadStatusMaker.h:124
 AliMUONPadStatusMaker.h:125
 AliMUONPadStatusMaker.h:126
 AliMUONPadStatusMaker.h:127
 AliMUONPadStatusMaker.h:128
 AliMUONPadStatusMaker.h:129
 AliMUONPadStatusMaker.h:130
 AliMUONPadStatusMaker.h:131
 AliMUONPadStatusMaker.h:132
 AliMUONPadStatusMaker.h:133
 AliMUONPadStatusMaker.h:134
 AliMUONPadStatusMaker.h:135
 AliMUONPadStatusMaker.h:136
 AliMUONPadStatusMaker.h:137
 AliMUONPadStatusMaker.h:138
 AliMUONPadStatusMaker.h:139
 AliMUONPadStatusMaker.h:140
 AliMUONPadStatusMaker.h:141
 AliMUONPadStatusMaker.h:142
 AliMUONPadStatusMaker.h:143
 AliMUONPadStatusMaker.h:144
 AliMUONPadStatusMaker.h:145
 AliMUONPadStatusMaker.h:146
 AliMUONPadStatusMaker.h:147
 AliMUONPadStatusMaker.h:148
 AliMUONPadStatusMaker.h:149
 AliMUONPadStatusMaker.h:150
 AliMUONPadStatusMaker.h:151
 AliMUONPadStatusMaker.h:152
 AliMUONPadStatusMaker.h:153
 AliMUONPadStatusMaker.h:154
 AliMUONPadStatusMaker.h:155
 AliMUONPadStatusMaker.h:156
 AliMUONPadStatusMaker.h:157
 AliMUONPadStatusMaker.h:158
 AliMUONPadStatusMaker.h:159
 AliMUONPadStatusMaker.h:160
 AliMUONPadStatusMaker.h:161
 AliMUONPadStatusMaker.h:162
 AliMUONPadStatusMaker.h:163
 AliMUONPadStatusMaker.h:164
 AliMUONPadStatusMaker.h:165
 AliMUONPadStatusMaker.h:166
 AliMUONPadStatusMaker.h:167
 AliMUONPadStatusMaker.h:168
 AliMUONPadStatusMaker.h:169
 AliMUONPadStatusMaker.h:170
 AliMUONPadStatusMaker.h:171
 AliMUONPadStatusMaker.h:172
 AliMUONPadStatusMaker.h:173
 AliMUONPadStatusMaker.h:174
 AliMUONPadStatusMaker.h:175
 AliMUONPadStatusMaker.h:176
 AliMUONPadStatusMaker.h:177
 AliMUONPadStatusMaker.h:178
 AliMUONPadStatusMaker.h:179
 AliMUONPadStatusMaker.h:180
 AliMUONPadStatusMaker.h:181
 AliMUONPadStatusMaker.h:182
 AliMUONPadStatusMaker.h:183
 AliMUONPadStatusMaker.h:184
 AliMUONPadStatusMaker.h:185
 AliMUONPadStatusMaker.h:186
 AliMUONPadStatusMaker.h:187
 AliMUONPadStatusMaker.h:188
 AliMUONPadStatusMaker.h:189
 AliMUONPadStatusMaker.h:190
 AliMUONPadStatusMaker.h:191
 AliMUONPadStatusMaker.h:192
 AliMUONPadStatusMaker.h:193
 AliMUONPadStatusMaker.h:194
 AliMUONPadStatusMaker.h:195
 AliMUONPadStatusMaker.h:196
 AliMUONPadStatusMaker.h:197
 AliMUONPadStatusMaker.h:198
 AliMUONPadStatusMaker.h:199
 AliMUONPadStatusMaker.h:200
 AliMUONPadStatusMaker.h:201
 AliMUONPadStatusMaker.h:202
 AliMUONPadStatusMaker.h:203
 AliMUONPadStatusMaker.h:204
 AliMUONPadStatusMaker.h:205
 AliMUONPadStatusMaker.h:206
 AliMUONPadStatusMaker.h:207
 AliMUONPadStatusMaker.h:208
 AliMUONPadStatusMaker.h:209
 AliMUONPadStatusMaker.h:210
 AliMUONPadStatusMaker.h:211
 AliMUONPadStatusMaker.h:212
 AliMUONPadStatusMaker.h:213
 AliMUONPadStatusMaker.h:214
 AliMUONPadStatusMaker.h:215
 AliMUONPadStatusMaker.h:216
 AliMUONPadStatusMaker.h:217
 AliMUONPadStatusMaker.h:218
 AliMUONPadStatusMaker.h:219
 AliMUONPadStatusMaker.h:220
 AliMUONPadStatusMaker.h:221
 AliMUONPadStatusMaker.h:222
 AliMUONPadStatusMaker.h:223
 AliMUONPadStatusMaker.h:224
 AliMUONPadStatusMaker.h:225
 AliMUONPadStatusMaker.h:226
 AliMUONPadStatusMaker.h:227
 AliMUONPadStatusMaker.h:228
 AliMUONPadStatusMaker.h:229
 AliMUONPadStatusMaker.h:230
 AliMUONPadStatusMaker.h:231
 AliMUONPadStatusMaker.h:232