- Disentangle masks effect from trigger chamber efficiency estimation.
[u/mrichter/AliRoot.git] / MUON / AliMUONVDigit.h
1 #ifndef ALIMUONVDIGIT_H
2 #define ALIMUONVDIGIT_H
3
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * See cxx source for full Copyright notice                               */
6
7 // $Id$
8
9 /// \ingroup base
10 /// \class AliMUONVDigit
11 /// \brief ABC of a MUON digit
12 // Author Laurent Aphecetche, Subatech
13
14 #ifndef ROOT_TObject
15 #  include "TObject.h"
16 #endif
17
18 class AliMUONVDigit : public TObject
19 {
20 public:
21   AliMUONVDigit();
22   AliMUONVDigit(Int_t detElemId, Int_t manuId, Int_t manuChannel, Int_t cathode);
23   virtual ~AliMUONVDigit();
24   
25   virtual Bool_t IsEqual(const TObject* object) const;
26   /// Advertise that we can be sorted in TCollections
27   virtual Bool_t IsSortable() const { return kTRUE; }
28   virtual Int_t Compare(const TObject* object) const;
29   
30   virtual const char* GetName() const;
31   
32   /// The detection element this digit belongs to
33   virtual Int_t DetElemId() const=0;
34   /// The x-index of this digit (>=0)
35   virtual Int_t PadX() const=0;
36   /// The y-index of this digit (>=0)
37   virtual Int_t PadY() const=0;
38   /// Cathode number this digit is on (0 or 1)
39   virtual Int_t Cathode() const=0;
40   
41   /// The charge of this digit, calibrated or not depending on IsCalibrated()
42   virtual Float_t Charge() const=0;
43   
44   /// Raw ADC value of this digit
45   virtual Int_t ADC() const = 0;
46   
47   /// The electronic card id this digit belongs to (manuId for tracker, localboardId for trigger)
48   virtual Int_t ManuId() const = 0;
49   /// The channel within ManuId() this digit belongs to (manuChannel for tracker, localBoardChannel for trigger)
50   virtual Int_t ManuChannel() const=0;
51   
52   /// Whether the ADC has saturated
53   virtual Bool_t IsSaturated() const=0;
54   /// Set the saturation status
55   virtual void Saturated(Bool_t saturated=kTRUE)=0;
56   
57   /// Whether this (simulated) digit is purely noise
58   virtual Bool_t IsNoiseOnly() const=0;
59   /// Set the noiseOnly status
60   virtual void NoiseOnly(Bool_t /*value*/=kTRUE) { }
61   
62   /// Whether this (simulated) digit got corrected by chamber efficiency
63   virtual Bool_t IsEfficiencyApplied() const=0;
64   /// Set the efficiencyApplied status
65   virtual void EfficiencyApplied(Bool_t /*value*/=kTRUE) {}
66   
67   /// Whether this digit has been calibrated or not
68   virtual Bool_t IsCalibrated() const=0;
69   /// Set the calibrated status
70   virtual void Calibrated(Bool_t value)=0;
71
72   /// Whether this digit has charge in femto coulomb
73   virtual Bool_t IsChargeInFC() const { return kFALSE; }
74   
75   /// Whether or not this digit was obtained from a conversion (e.g. real to simulated)
76   virtual Bool_t IsConverted() const { return kFALSE; }
77
78   /// Whether this digit is used somewhere (typically in a cluster)
79   virtual Bool_t IsUsed() const = 0;
80   /// Set the used status
81   virtual void Used(Bool_t value) = 0;
82   
83   /// A word describing the status of the neighbours of this digit
84   virtual UInt_t StatusMap() const=0;
85   /// Set the statusMap
86   virtual void SetStatusMap(UInt_t statusMap)=0;
87   
88   /// Set the ADC value
89   virtual void SetADC(Int_t adc)=0;
90   /// Set the ix and iy of this digit
91   virtual void SetPadXY(Int_t padx, Int_t pady)=0;
92   /// Set the charge of this digit
93   virtual void SetCharge(Float_t q)=0;
94   /// Add a charge
95   virtual void AddCharge(Float_t q) { SetCharge(Charge()+q); }
96   
97   /// Merge this with other
98   virtual Bool_t MergeWith(const AliMUONVDigit& other)=0;
99   
100   /// Whether this digit is a tracker digit (false if belongs to trigger)
101   virtual Bool_t IsTracker() const { return !IsTrigger(); }
102   /** FIXME: how to get this information w/o hard-coding, yet being efficient ?
103     Use one fFlags that must be set when creating the digit for instance ?
104     */
105   virtual Bool_t IsTrigger() const { return DetElemId()>=1100; }
106   
107   virtual void Print(Option_t* opt="") const;
108   
109   /// Below are methods only relevant for MC digigts.
110   
111   /// Whether we implement MC methods.
112   virtual Bool_t HasMCInformation() const = 0; 
113   
114   /// Hit number that contributed to this simulated digit
115   virtual Int_t Hit() const { return 0; }
116   /// Set the hit number
117   virtual void SetHit(Int_t /*n*/) { }
118   /// Hit age
119     virtual Float_t Time() const       {return 0;}
120   /// Set hit age
121       virtual void SetTime(Float_t /*t*/) { } 
122   /// Number of tracks contributing to this digit
123   virtual Int_t Ntracks() const { return 0; }
124   /// Add a track (and its charge) to the list of tracks we handle
125   virtual void AddTrack(Int_t /*trackNumber*/, Float_t /*trackCharge*/) {}
126   /// Return the i-th track number
127   virtual Int_t Track(Int_t /*i*/) const { return 0; }
128   /// Return the i-th track charge
129   virtual Float_t TrackCharge(Int_t /*i*/) const { return 0; }
130   /// Patch track with a mask
131   virtual void PatchTracks(Int_t /*mask*/) {}
132   
133   static UInt_t BuildUniqueID(Int_t detElemId, Int_t manuId, 
134                               Int_t manuChannel, Int_t cathode);
135   
136   static void DecodeUniqueID(UInt_t uniqueID,
137                              Int_t& detElemId, Int_t& manuId, 
138                              Int_t& manuChannel, Int_t& cathode);
139   
140   static Int_t DetElemId(UInt_t uniqueID);
141   static Int_t ManuId(UInt_t uniqueID);
142   static Int_t ManuChannel(UInt_t uniqueID);
143   static Int_t Cathode(UInt_t uniqueID);
144
145   /// Return the localBoardNumber from the uniqueID  
146   static Int_t LocalBoardNumber(UInt_t uniqueID) { return ManuId(uniqueID); }
147   /// Return the localBoardChannel from the uniqueID
148   static Int_t LocalBoardChannel(UInt_t uniqueID) { return ManuChannel(uniqueID); }
149   
150   
151   ClassDef(AliMUONVDigit,0) // ABC of a MUON Digit
152 };
153
154 #endif