1 #ifndef ALIMUONVDIGIT_H
2 #define ALIMUONVDIGIT_H
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * See cxx source for full Copyright notice */
10 /// \class AliMUONVDigit
11 /// \brief ABC of a MUON digit
12 // Author Laurent Aphecetche, Subatech
18 class AliMUONVDigit : public TObject
22 AliMUONVDigit(Int_t detElemId, Int_t manuId, Int_t manuChannel, Int_t cathode);
23 virtual ~AliMUONVDigit();
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;
30 virtual const char* GetName() const;
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;
41 /// The charge of this digit, calibrated or not depending on IsCalibrated()
42 virtual Float_t Charge() const=0;
44 /// Raw ADC value of this digit
45 virtual Int_t ADC() const = 0;
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;
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;
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) { }
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) {}
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;
72 /// Whether this digit has charge in femto coulomb
73 virtual Bool_t IsChargeInFC() const { return kFALSE; }
75 /// Whether or not this digit was obtained from a conversion (e.g. real to simulated)
76 virtual Bool_t IsConverted() const { return kFALSE; }
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;
83 /// A word describing the status of the neighbours of this digit
84 virtual UInt_t StatusMap() const=0;
86 virtual void SetStatusMap(UInt_t statusMap)=0;
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;
95 virtual void AddCharge(Float_t q) { SetCharge(Charge()+q); }
97 /// Merge this with other
98 virtual Bool_t MergeWith(const AliMUONVDigit& other)=0;
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 ?
105 virtual Bool_t IsTrigger() const { return DetElemId()>=1100; }
107 virtual void Print(Option_t* opt="") const;
109 /// Below are methods only relevant for MC digigts.
111 /// Whether we implement MC methods.
112 virtual Bool_t HasMCInformation() const = 0;
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*/) { }
119 virtual Float_t Time() const {return 0;}
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*/) {}
133 static UInt_t BuildUniqueID(Int_t detElemId, Int_t manuId,
134 Int_t manuChannel, Int_t cathode);
136 static void DecodeUniqueID(UInt_t uniqueID,
137 Int_t& detElemId, Int_t& manuId,
138 Int_t& manuChannel, Int_t& cathode);
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);
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); }
151 ClassDef(AliMUONVDigit,0) // ABC of a MUON Digit