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

// $Id$

/// \ingroup calib
/// \class AliMUONVCalibParam
/// \brief Container of calibration values for a given number of channels.
/// 
//  Author Laurent Aphecetche

#ifndef ALIMUONVCALIBPARAM_H
#define ALIMUONVCALIBPARAM_H

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

class AliMUONVCalibParam : public TObject
{
public:
  AliMUONVCalibParam();
  //AliMUONVCalibParam(Int_t id0);
  AliMUONVCalibParam(Int_t id0, Int_t id1);
  virtual ~AliMUONVCalibParam();

  virtual const char* GetName() const;

  /// Advertise that we can be sorted in TCollections
  virtual Bool_t IsSortable() const { return kTRUE; }
  
  /// First id of this object
  virtual Int_t ID0() const;
  
  /// Second id of this object (might not be required)
  virtual Int_t ID1() const;

  /// method for sorting pedestal values ordered by ID0 and ID1
  virtual Int_t Compare(const TObject* object) const;
  
  /// whether or not the value we store are packed, e.g. as v = a*cste + b
  virtual Bool_t IsPacked() const { return kFALSE; }
  
  /// j indices in following methods are valid from 0 to Dimension()-1.
  virtual Int_t Dimension() const = 0;

  /** Set one value, for channel i, dimension j. Consider value is a double.
    Only ok to use if IsDoublePrecision() is kTRUE.
    */
  virtual void SetValueAsDouble(Int_t i, Int_t j, Double_t value);

  /// Same as above but w/o bound checking
  virtual void SetValueAsDoubleFast(Int_t i, Int_t j, Double_t value);

  /// Set one value, for channel i, dimension j. Consider value is a float.
  virtual void SetValueAsFloat(Int_t i, Int_t j, Float_t value) = 0;

  /** Set one value, for channel i, dimension j. Consider value is a float.
    Assume (i,j) are valid indices, i.e. do not check them.
    */
  virtual void SetValueAsFloatFast(Int_t i, Int_t j, Float_t value) = 0;

  /// Set one value, for channel i, dimension j. Consider value is an integer.
  virtual void SetValueAsInt(Int_t i, Int_t j, Int_t value) = 0;

  /// Same as above but w/o bound checkings.
  virtual void SetValueAsIntFast(Int_t i, Int_t j, Int_t value) = 0;

  /// The number of channels handled by this object.
  virtual Int_t Size() const = 0;

  /// Whether we can store double precision values   
  virtual Bool_t IsDoublePrecision() const { return kFALSE; }
  
  /** Retrieve the value for a given (channel,dim) as a double.
      Only ok if IsDoublePrecision() is kTRUE.
      (i,j) are checked to within boundaries
    */
  virtual Double_t ValueAsDouble(Int_t i, Int_t j=0) const;

  /** Retrieve the value for a given (channel,dim) as a double.
    Only ok if IsDoublePrecision() is kTRUE.
    Fast means there's no bound checking on (i,j)
    */
  virtual Double_t ValueAsDoubleFast(Int_t i, Int_t j=0) const;
  
  /** Retrieve the value for a given (channel,dim) as a float, with
      bound checking on (i,j).
    */
  virtual Float_t ValueAsFloat(Int_t i, Int_t j=0) const = 0;

  /// Same as above but without bound checking.
  virtual Float_t ValueAsFloatFast(Int_t i, Int_t j=0) const = 0;

  /** Retrieve the value for a given (channel,dim) as an integer.
      With bound checking.
    */
  virtual Int_t ValueAsInt(Int_t i, Int_t j=0) const = 0;

  /// Same as above but w/o bound checking.
  virtual Int_t ValueAsIntFast(Int_t i, Int_t j=0) const = 0;

  /// Unpack a value into a couple (a,b). Returns false if IsPacked()==kFALSE
  virtual Bool_t UnpackValue(Int_t /*value*/, Int_t& /*a*/, Int_t& /*b*/) const { return kFALSE; }
  
  /// Pack (a,b) as a single int. Returns false if IsPacked()==kFALSE
  virtual Bool_t PackValues(Int_t /*a*/, Int_t /*b*/, Int_t& /*packedValue*/) const { return kFALSE; }
  
  /// Return 1E38 as invalid float value
  static Float_t InvalidFloatValue() { return 1E38; }

  static UInt_t BuildUniqueID(Int_t id0, Int_t id1);
  static void DecodeUniqueID(UInt_t uniqueID, Int_t& id0, Int_t& id1);

protected:
  
  static Int_t ID0(UInt_t uniqueID);
  static Int_t ID1(UInt_t uniqueID);
  
  ClassDef(AliMUONVCalibParam,0) // Base class for a calibration data holder (usually for 64 channels)
};

#endif
 AliMUONVCalibParam.h:1
 AliMUONVCalibParam.h:2
 AliMUONVCalibParam.h:3
 AliMUONVCalibParam.h:4
 AliMUONVCalibParam.h:5
 AliMUONVCalibParam.h:6
 AliMUONVCalibParam.h:7
 AliMUONVCalibParam.h:8
 AliMUONVCalibParam.h:9
 AliMUONVCalibParam.h:10
 AliMUONVCalibParam.h:11
 AliMUONVCalibParam.h:12
 AliMUONVCalibParam.h:13
 AliMUONVCalibParam.h:14
 AliMUONVCalibParam.h:15
 AliMUONVCalibParam.h:16
 AliMUONVCalibParam.h:17
 AliMUONVCalibParam.h:18
 AliMUONVCalibParam.h:19
 AliMUONVCalibParam.h:20
 AliMUONVCalibParam.h:21
 AliMUONVCalibParam.h:22
 AliMUONVCalibParam.h:23
 AliMUONVCalibParam.h:24
 AliMUONVCalibParam.h:25
 AliMUONVCalibParam.h:26
 AliMUONVCalibParam.h:27
 AliMUONVCalibParam.h:28
 AliMUONVCalibParam.h:29
 AliMUONVCalibParam.h:30
 AliMUONVCalibParam.h:31
 AliMUONVCalibParam.h:32
 AliMUONVCalibParam.h:33
 AliMUONVCalibParam.h:34
 AliMUONVCalibParam.h:35
 AliMUONVCalibParam.h:36
 AliMUONVCalibParam.h:37
 AliMUONVCalibParam.h:38
 AliMUONVCalibParam.h:39
 AliMUONVCalibParam.h:40
 AliMUONVCalibParam.h:41
 AliMUONVCalibParam.h:42
 AliMUONVCalibParam.h:43
 AliMUONVCalibParam.h:44
 AliMUONVCalibParam.h:45
 AliMUONVCalibParam.h:46
 AliMUONVCalibParam.h:47
 AliMUONVCalibParam.h:48
 AliMUONVCalibParam.h:49
 AliMUONVCalibParam.h:50
 AliMUONVCalibParam.h:51
 AliMUONVCalibParam.h:52
 AliMUONVCalibParam.h:53
 AliMUONVCalibParam.h:54
 AliMUONVCalibParam.h:55
 AliMUONVCalibParam.h:56
 AliMUONVCalibParam.h:57
 AliMUONVCalibParam.h:58
 AliMUONVCalibParam.h:59
 AliMUONVCalibParam.h:60
 AliMUONVCalibParam.h:61
 AliMUONVCalibParam.h:62
 AliMUONVCalibParam.h:63
 AliMUONVCalibParam.h:64
 AliMUONVCalibParam.h:65
 AliMUONVCalibParam.h:66
 AliMUONVCalibParam.h:67
 AliMUONVCalibParam.h:68
 AliMUONVCalibParam.h:69
 AliMUONVCalibParam.h:70
 AliMUONVCalibParam.h:71
 AliMUONVCalibParam.h:72
 AliMUONVCalibParam.h:73
 AliMUONVCalibParam.h:74
 AliMUONVCalibParam.h:75
 AliMUONVCalibParam.h:76
 AliMUONVCalibParam.h:77
 AliMUONVCalibParam.h:78
 AliMUONVCalibParam.h:79
 AliMUONVCalibParam.h:80
 AliMUONVCalibParam.h:81
 AliMUONVCalibParam.h:82
 AliMUONVCalibParam.h:83
 AliMUONVCalibParam.h:84
 AliMUONVCalibParam.h:85
 AliMUONVCalibParam.h:86
 AliMUONVCalibParam.h:87
 AliMUONVCalibParam.h:88
 AliMUONVCalibParam.h:89
 AliMUONVCalibParam.h:90
 AliMUONVCalibParam.h:91
 AliMUONVCalibParam.h:92
 AliMUONVCalibParam.h:93
 AliMUONVCalibParam.h:94
 AliMUONVCalibParam.h:95
 AliMUONVCalibParam.h:96
 AliMUONVCalibParam.h:97
 AliMUONVCalibParam.h:98
 AliMUONVCalibParam.h:99
 AliMUONVCalibParam.h:100
 AliMUONVCalibParam.h:101
 AliMUONVCalibParam.h:102
 AliMUONVCalibParam.h:103
 AliMUONVCalibParam.h:104
 AliMUONVCalibParam.h:105
 AliMUONVCalibParam.h:106
 AliMUONVCalibParam.h:107
 AliMUONVCalibParam.h:108
 AliMUONVCalibParam.h:109
 AliMUONVCalibParam.h:110
 AliMUONVCalibParam.h:111
 AliMUONVCalibParam.h:112
 AliMUONVCalibParam.h:113
 AliMUONVCalibParam.h:114
 AliMUONVCalibParam.h:115
 AliMUONVCalibParam.h:116
 AliMUONVCalibParam.h:117
 AliMUONVCalibParam.h:118
 AliMUONVCalibParam.h:119
 AliMUONVCalibParam.h:120
 AliMUONVCalibParam.h:121
 AliMUONVCalibParam.h:122
 AliMUONVCalibParam.h:123