ROOT logo
#ifndef ALIMUONTRACKERDATA_H
#define ALIMUONTRACKERDATA_H

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

// $Id$

/// \ingroup calib
/// \class AliMUONTrackerData
/// \brief Implementation of AliMUONVTrackerData
/// 
// Author Laurent Aphecetche, Subatech

#ifndef ALIMUONVTRACKERDATA_H
#  include "AliMUONVTrackerData.h"
#endif

class AliMUONSparseHisto;
class AliMUONVCalibParam;
class AliMUONVStore;
class AliMpDetElement;
class AliMUONRejectList;

class AliMUONTrackerData : public AliMUONVTrackerData
{
public:
  AliMUONTrackerData(const char* name="", const char* title="", 
                     Int_t dimension=0,
                     Bool_t issingleevent=kFALSE);
  
  AliMUONTrackerData(const char* name, const char* title,
                     const AliMUONVStore& manuValues);

  AliMUONTrackerData(const char* name, const char* title,
                     const AliMUONVStore& deOrBpValues, Int_t val);

  AliMUONTrackerData(const char* name, const char* title,
                     const AliMUONRejectList& rejectList);

  virtual ~AliMUONTrackerData();

  Bool_t Add(const AliMUONTrackerData& data);
  
  virtual Bool_t Add(const AliMUONVStore& channelValues, TArrayI* nofEventsPerDDL=0x0);

  virtual Bool_t Replace(const AliMUONVStore& channelValues);

  virtual Double_t BusPatch(Int_t busPatchId, Int_t dim=0) const;

  virtual Double_t Chamber(Int_t chamberId, Int_t dim=0) const;

  virtual Double_t Channel(Int_t detElemId, Int_t manuId, Int_t manuChannel,
                           Int_t dim=0) const;
  
  virtual void Clear(Option_t* opt="");
  
  virtual Double_t Count(Int_t detElemId, Int_t manuId, Int_t manuChannel) const;
  
  virtual Double_t DetectionElement(Int_t detElemId, Int_t dim=0) const;

  virtual TString DimensionName(Int_t dim) const;
  
  virtual TString ExternalDimensionName(Int_t dim) const;

  virtual Bool_t HasChamber(Int_t chamberId) const;
  
  virtual Bool_t HasBusPatch(Int_t busPatchId) const;

  virtual Bool_t HasDetectionElement(Int_t detElemId) const;

  virtual Bool_t HasManu(Int_t detElemId, Int_t manuId) const;

  virtual Bool_t HasPCB(Int_t detElemId, Int_t pcbIndex) const;
  
  /// Whether we can be run
  virtual Bool_t IsSingleEvent() const { return fIsSingleEvent; }
  
  virtual Double_t Manu(Int_t detElemId, Int_t manuId, Int_t dim=0) const;
      
  /// Returns the number of dimensions (i.e. the number of values) each element has
  virtual Int_t NumberOfDimensions() const;
  
  /// The number of values we are inputting
  virtual Int_t ExternalDimension() const { return fExternalDimension; }

  /// Convert from internal to external dimension
  virtual Int_t InternalToExternal(Int_t dim) const { return dim/2; }

  /// Returns the number of events we have seen so far
  virtual Int_t NumberOfEvents(Int_t ddlNumber) const;
  
  virtual Double_t PCB(Int_t detElemId, Int_t pcbIndex, Int_t dim=0) const;

  using TObject::Print;
  
  /// Print, with option, all objects whose name matches wildcard
  virtual void Print(Option_t* wildcard, Option_t* opt) const;
  
  virtual void SetDimensionName(Int_t index, const char* value);  

  Bool_t CanHistogram() const { return kTRUE; }
  
  void MakeHistogramForDimension(Int_t index, Bool_t value, Double_t xmin=0.0, Double_t xmax=4096.0);
  
  virtual void HistogramRange(Double_t& xmin, Double_t& xmax) const { xmin = fXmin; xmax = fXmax; }

  AliMUONSparseHisto* GetManuSparseHisto(Int_t detElemId, Int_t manuId, 
                                         Int_t dim=0);

  AliMUONSparseHisto* GetManuSparseHisto(Int_t detElemId, Int_t manuId, 
                                         Int_t dim=0) const;
  
  AliMUONSparseHisto* GetChannelSparseHisto(Int_t detElemId, Int_t manuId, 
                                            Int_t manuChannel, Int_t dim=0);
  
  virtual AliMUONSparseHisto* GetChannelSparseHisto(Int_t detElemId, Int_t manuId, 
                                                    Int_t manuChannel, Int_t dim=0) const;

	/// Disable storing values at the channel level
	virtual void DisableChannelLevel();
	
	/// Whether we store values at the channel level or not
	virtual Bool_t IsChannelLevelEnabled() const { return fIsChannelLevelEnabled; }

  /// Disable storing values at the manu level
	virtual void DisableManuLevel();
	
	/// Whether we store values at the manu level or not
	virtual Bool_t IsManuLevelEnabled() const { return fIsManuLevelEnabled; }
  
  /// Whether we store values at the bus patch level or not
  virtual Bool_t IsBusPatchLevelEnabled() const { return fIsBustPatchLevelEnabled; }

  /// Whether we store values at the PCB level or not
  virtual Bool_t IsPCBLevelEnabled() const { return fIsPCBLevelEnabled; }

  /// To allow merging of different objects
  virtual Long64_t Merge(TCollection* list);
    
  Bool_t ExportAsASCIIOccupancyFile(const char* filename, Int_t runNumber) const;
  
private:
    
  void BuildFromDEStore(const AliMUONVStore& deStore);

  void BuildFromBPStore(const AliMUONVStore& bpStore);

  void FillHisto(Int_t detElemId, Int_t manuId, Int_t manuChannel,
                 Int_t dim, Double_t value);

  AliMUONVCalibParam* BusPatchParam(Int_t busPatch, Bool_t create=kFALSE) const;

  AliMUONVCalibParam* CreateBusPatchParam(Int_t busPatch) const;
  
  AliMUONVCalibParam* ChamberParam(Int_t chamberId, Bool_t create=kFALSE) const;

  AliMUONVCalibParam* CreateChamberParam(Int_t chamberId) const;
  
  AliMUONVCalibParam* ChannelParam(Int_t detElemId, Int_t manuId,
                                   const AliMUONVCalibParam* external=0x0) const;

  AliMUONVCalibParam* DetectionElementParam(Int_t detElemId, Bool_t create=kFALSE) const;

  AliMUONVCalibParam* CreateDetectionElementParam(Int_t detElemId) const;
  
  AliMUONVCalibParam* ManuParam(Int_t detElemId, Int_t manuId, Bool_t create=kFALSE) const;

  AliMUONVCalibParam* CreateManuParam(Int_t detElemInd, Int_t manuId) const;
  
  AliMUONVCalibParam* PCBParam(Int_t detElemId, Int_t pcbIndex, Bool_t create=kFALSE) const;

  AliMUONVCalibParam* CreatePCBParam(Int_t detElemId, Int_t pcbIndex) const;
  
  /// Index of the dimension containing the number of time an item was hit
  virtual Int_t IndexOfNumberDimension() const { return fDimension - 1; }

  /// Index of the dimension containing the occupancy number
  virtual Int_t IndexOfOccupancyDimension() const { return fDimension - 2; }

  /// Whether we have histograms for a given dimension, or not
  virtual Bool_t IsHistogrammed(Int_t dim) const { return ( fHistogramming[dim] > 0 ); }

  Int_t DdlIdFromBusPatchId(Int_t buspatchid) const;
  Int_t DdlIdFromDetElemId(Int_t detelemid) const;
  Int_t DdlIdFromChamberId(Int_t chamberid) const;
  
  /// Not implemented
  AliMUONTrackerData(const AliMUONTrackerData& rhs);
  /// Not implemented
  AliMUONTrackerData& operator=(const AliMUONTrackerData& rhs);
  
  AliMUONVCalibParam* CreateDouble(const AliMUONVCalibParam& param, Int_t detElemId, Int_t manuId) const;

  Int_t GetParts(AliMUONVCalibParam* external,
                 AliMUONVCalibParam*& chamber,
                 AliMUONVCalibParam*& de,
                 AliMUONVCalibParam*& busPatch,
                 AliMUONVCalibParam*& pcb,
                 AliMUONVCalibParam*& manu,
                 AliMUONVCalibParam*& channel,
                 AliMpDetElement*& mpde);

  /// Convert from external to internal index
  Int_t External2Internal(Int_t index) const;

  void SetInternalDimensionName(Int_t index, const char* value);  

  void SetExternalDimensionName(Int_t index, const char* value);  

  Double_t Value(const AliMUONVCalibParam& param, Int_t i, Int_t dim, Int_t ddlId) const;
  
  /// The number of values we actually *store* for each item
  Int_t Dimension() const { return fDimension; }
    
  Bool_t InternalAdd(const AliMUONVStore& store, TArrayI* nevents, Bool_t replace);

  void GetDEManu(const AliMUONVCalibParam& param,
                  Int_t& detElemId, Int_t& manuId) const;
  
  void AddCalibParams(const AliMUONVCalibParam& src, AliMUONVCalibParam& dest) const;

  void Add2D(const AliMUONVStore& src, AliMUONVStore& dest) const;
  
  void Add1D(const AliMUONVStore& src, AliMUONVStore& dest) const;
  
  void AssertStores();
  
  Bool_t UpdateNumberOfEvents(TArrayI* nevents);
  
  static void DispatchValue(AliMUONVCalibParam& param, Int_t index, Double_t y, Double_t ey, Int_t nchannels);
  
private:
  
  Bool_t fIsSingleEvent; ///< whether we can deal with more than one event
  AliMUONVStore* fChannelValues; ///< the channel store
  AliMUONVStore* fManuValues; ///< the manu store
  AliMUONVStore* fBusPatchValues; ///< the bus patch store
  AliMUONVStore* fDEValues; ///< the detection element store
  AliMUONVStore* fChamberValues; ///< the chamber store
  AliMUONVStore* fPCBValues; ///< the pcb store
  Int_t fDimension; ///< the dimension of the data
  Int_t fNevents; ///< the number of events treated
  TObjArray* fDimensionNames; ///< the names of the (internal) dimensions
  TObjArray* fExternalDimensionNames; ///< the names of the external (i.e. original) dimensions
  Int_t fExternalDimension; ///< number of interface values per item 
  /// whether we should histogram the dimension(s)
  Int_t* fHistogramming; //[fExternalDimension] whether we should histogram the dimension(s)
  AliMUONVStore* fHistos; ///< the lowest histograms we have
  Double_t fXmin; ///< min x value for histograms
  Double_t fXmax; ///< max x value for histograms
  static const Int_t fgkExtraDimension; ///< to hold extra information
  static const Int_t fgkVirtualExtraDimension; ///< to give access to information not stored, but computed on the fly
  Bool_t fIsChannelLevelEnabled; ///< whether we allow storing of channel (fChannelValues) values
  Bool_t fIsManuLevelEnabled; ///< whether we allow storing of manu (fManuValues) values
  Bool_t fIsBustPatchLevelEnabled; ///< whether we allow storing of bus patches (fBusPatchValues) values
  Bool_t fIsPCBLevelEnabled; ///< whether we allow storing of PCB values (fPCBValues)
  Int_t fNofDDLs; ///< nof of DDLs we're dealing with
  /// the number of events treated (per DDL)
  Int_t* fNofEventsPerDDL; //[fNofDDLs] the number of events treated (per DDL)

  ClassDef(AliMUONTrackerData,8) // Implementation of AliMUONVTrackerData
};

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