2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
10 #ifndef AliEveTPCSectorData_H
11 #define AliEveTPCSectorData_H
19 //------------------------------------------------------------------------------
20 // AliEveTPCSectorData
22 // Constainer for pad-data of a single TPC sector.
23 // Also stores relevant geometry information in static data-members.
26 class AliEveTPCSectorData : public TObject
28 AliEveTPCSectorData(const AliEveTPCSectorData&); // Not implemented
29 AliEveTPCSectorData& operator=(const AliEveTPCSectorData&); // Not implemented
36 Short_t* fData; // Data for given pad.
37 Short_t fLength; // Length of pad-data.
40 PadData(Short_t* d=0, Short_t l=0) : fData(d), fLength(l) {}
42 PadData(const PadData& p) : fData(p.fData), fLength(p.fLength) {}
43 PadData& operator=(const PadData& p)
44 { fData = p.fData; fLength = p.fLength; return *this; }
46 Short_t* Data() const { return fData; }
47 Short_t Length() const { return fLength; }
49 void SetDataLength(Short_t* d, Short_t l) { fData = d; fLength = l; }
51 void Print(Option_t* opt="");
57 Short_t *fBeg, *fEnd; // Begin and end of data.
58 Short_t *fPos; // Current position.
59 Short_t fTime, fSignal; // Current time and signal.
60 Short_t fThreshold; // Threshold for data iteration.
61 Short_t fNChunk; // Number of contiguous signals still to read.
64 PadIterator(const PadData& pd, Short_t thr=0) :
65 fBeg(pd.Data()), fEnd(pd.Data() + pd.Length()), fPos(pd.Data()),
66 fTime(-1), fSignal(-1), fThreshold(thr), fNChunk(0)
68 PadIterator(const PadIterator& i) :
69 fBeg(i.fBeg), fEnd(i.fEnd), fPos(i.fPos),
70 fTime(i.fTime), fSignal(i.fSignal), fThreshold(i.fThreshold), fNChunk(i.fNChunk)
72 virtual ~PadIterator() {}
74 PadIterator& operator=(const PadIterator& i) {
75 fBeg = i.fBeg; fEnd = i.fEnd; fPos = i.fPos;
76 fTime = i.fTime; fSignal = i.fSignal; fThreshold = i.fThreshold; fNChunk = i.fNChunk;
82 void Reset(const PadData& pd);
84 Short_t Time() const { return fTime; }
85 Short_t Signal() const { return fSignal; }
87 Short_t Threshold() const { return fThreshold; }
88 void SetThreshold(Short_t t) { fThreshold = t; }
93 class RowIterator : public PadIterator
96 const PadData *fPadArray; // Pointer to array of pad-data.
97 Short_t fNPads; // Number of pads in row.
98 Short_t fPad; // Current pad.
101 RowIterator(const PadData* first, Short_t npads, Short_t thr=0) :
102 PadIterator(*first, thr),
103 fPadArray(first), fNPads(npads),
106 RowIterator(const RowIterator& i) :
108 fPadArray(i.fPadArray), fNPads(i.fNPads), fPad(i.fPad)
111 RowIterator& operator=(const RowIterator& i) {
112 fPadArray = i.fPadArray; fNPads = i.fNPads; fPad = i.fPad;
118 void ResetRow(const PadData* first, Short_t npads);
120 Short_t TEvePad() const { return fPad; }
123 class SegmentInfo : public TObject
125 friend class AliEveTPCSectorData;
128 Float_t fPadWidth; // Width of pad in this segment.
129 Float_t fPadHeight; // Height of pad in this segment.
130 Float_t fRLow; // Radius at the bottom of first row.
131 Int_t fNRows; // Number of rows in this segment.
132 Int_t fFirstRow; // First row index within sector.
133 Int_t fLastRow; // Last row index within sector.
134 Int_t fNMaxPads; // Maximum number of pads in a row.
135 Int_t fNYSteps; // Number of steps in pad-count.
136 Float_t fYStep[64]; // Y coords where pad-count changes.
141 Float_t GetPadWidth() const { return fPadWidth; }
142 Float_t GetPadHeight() const { return fPadHeight; }
143 Float_t GetRLow() const { return fRLow; }
144 Int_t GetNRows() const { return fNRows; }
145 Int_t GetFirstRow() const { return fFirstRow; }
146 Int_t GetLastRow() const { return fLastRow; }
147 Int_t GetNMaxPads() const { return fNMaxPads; }
148 Int_t GetNYSteps() const { return fNYSteps; }
149 Float_t GetYStep(Int_t step) const { return fYStep[step]; }
151 ClassDef(SegmentInfo, 0);
155 static AliTPCParam *fgParam; // Global TPC parameters.
156 static Float_t fgZLength; // Z-length of a sector.
157 static Int_t fgNAllRows; // Number of rows in all segments.
158 static Int_t fgNAllPads; // Number of pads in all segments.
159 static Int_t *fgRowBegs; // Ids of pads at row-beginnings.
161 static SegmentInfo fgInnSeg; // Geometry information for inner segment.
162 static SegmentInfo fgOut1Seg; // Geometry information for middle segment.
163 static SegmentInfo fgOut2Seg; // Geometry information for outer segment.
165 static SegmentInfo* fgSegInfoPtrs[3]; // Array of geometry information objects, for access by segment id.
168 Int_t fSectorID; // Sector id.
169 Int_t fNPadsFilled; // Number of filled pads.
170 std::vector<PadData> fPads; // Vector of pad-data.
172 // Blocks of pad-data.
173 const Int_t fkBlockSize; // Size of pad-data block.
174 Int_t fBlockPos; // Position in current block.
175 std::vector<Short_t*> fBlocks; // Vector of blocks.
180 // Intermediate buffer/vars used during filling of pad-data.
181 Short_t fPadBuffer[2048]; // Buffer for current pad.
182 Int_t fCurrentRow; // Current row.
183 Int_t fCurrentPad; // Current pad.
184 Int_t fCurrentPos; // Current position in pad-buffer.
185 Int_t fCurrentStep; // Step, can be -2 or +2, depending on fill direction.
187 Int_t PadIndex(Int_t row, Int_t pad) const { return fgRowBegs[row] + pad; }
190 AliEveTPCSectorData(Int_t sector, Int_t bsize=65536);
191 virtual ~AliEveTPCSectorData();
195 virtual void Print(Option_t* opt="") const;
197 void BeginPad(Int_t row, Int_t pad, Bool_t reverseTime=kFALSE);
198 void RegisterData(Short_t time, Short_t signal);
199 void EndPad(Bool_t autoPedestal=kFALSE, Short_t threshold=0);
201 const PadData& GetPadData(Int_t padAddr) const;
202 const PadData& GetPadData(Int_t row, Int_t pad) const;
204 PadIterator MakePadIterator(Int_t padAddr, Short_t thr=0);
205 PadIterator MakePadIterator(Int_t row, Int_t pad, Short_t thr=0);
207 RowIterator MakeRowIterator(Int_t row, Short_t thr=0);
209 // --- Static functions
211 static const AliTPCParam& GetParam() { return *fgParam; }
212 static Float_t GetZLength() { return fgZLength; }
213 static Int_t GetNAllRows() { return fgNAllRows; }
214 static Int_t GetNAllPads() { return fgNAllPads; }
216 static Int_t GetNPadsInRow(Int_t row);
218 static const SegmentInfo& GetInnSeg() { return fgInnSeg; }
219 static const SegmentInfo& GetOut1Seg() { return fgOut1Seg; }
220 static const SegmentInfo& GetOut2Seg() { return fgOut2Seg; }
222 static const SegmentInfo& GetSeg(Int_t seg);
224 static void InitStatics();
227 //----------------------------------------------------------------
228 // Hack for noisy pad-row removal
229 //----------------------------------------------------------------
234 Int_t fRow, fPad; // For which row, pad we hack.
235 Int_t fThrExt; // Additional treshold
236 Float_t fThrFac; // Additional threshold factor.
237 // Actual threshold = fThrExt + fThrFac*thr
239 PadRowHack(Int_t r, Int_t p, Int_t te=0, Float_t tf=1) :
240 fRow(r), fPad(p), fThrExt(te), fThrFac(tf) {}
241 bool operator<(const PadRowHack& a) const
242 { return (fRow == a.fRow) ? fPad < a.fPad : fRow < a.fRow; }
245 PadRowHack* GetPadRowHack(Int_t r, Int_t p);
246 void AddPadRowHack(Int_t r, Int_t p, Int_t te=0, Float_t tf=1);
247 void RemovePadRowHack(Int_t r, Int_t p);
248 void DeletePadRowHack();
251 void* fPadRowHackSet; // Pointer to set of PadRowHacks.
254 ClassDef(AliEveTPCSectorData, 0); // Holds pad-data of a single TPC sector. Also stores geometry information in static data-members.
258 inline void AliEveTPCSectorData::RegisterData(Short_t time, Short_t signal)
260 // Register data for given time.
262 fPadBuffer[fCurrentPos] = time;
263 fPadBuffer[fCurrentPos+1] = signal;
264 fCurrentPos += fCurrentStep;