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
29 // --- Inner classes ---
34 PadData(Short_t* d=0, Short_t l=0) : fData(d), fLength(l) {}
36 PadData(const PadData& p) : fData(p.fData), fLength(p.fLength) {}
37 PadData& operator=(const PadData& p)
38 { if(this!=&p){fData = p.fData; fLength = p.fLength;} return *this; }
40 Short_t* Data() const { return fData; }
41 Short_t Length() const { return fLength; }
43 void SetDataLength(Short_t* d, Short_t l) { fData = d; fLength = l; }
45 void Print(Option_t* opt="");
48 Short_t* fData; // Data for given pad.
49 Short_t fLength; // Length of pad-data.
55 PadIterator(const PadData& pd, Short_t thr=0) :
56 fBeg(pd.Data()), fEnd(pd.Data() + pd.Length()), fPos(pd.Data()),
57 fTime(-1), fSignal(-1), fThreshold(thr), fNChunk(0)
59 PadIterator(const PadIterator& i) :
60 fBeg(i.fBeg), fEnd(i.fEnd), fPos(i.fPos),
61 fTime(i.fTime), fSignal(i.fSignal), fThreshold(i.fThreshold), fNChunk(i.fNChunk)
63 virtual ~PadIterator() {}
65 PadIterator& operator=(const PadIterator& i) {if(this!=&i){
66 fBeg = i.fBeg; fEnd = i.fEnd; fPos = i.fPos;
67 fTime = i.fTime; fSignal = i.fSignal; fThreshold = i.fThreshold; fNChunk = i.fNChunk;
73 void Reset(const PadData& pd);
75 Short_t Time() const { return fTime; }
76 Short_t Signal() const { return fSignal; }
78 Short_t Threshold() const { return fThreshold; }
79 void SetThreshold(Short_t t) { fThreshold = t; }
84 Short_t *fBeg, *fEnd; // Begin and end of data.
85 Short_t *fPos; // Current position.
86 Short_t fTime, fSignal; // Current time and signal.
87 Short_t fThreshold; // Threshold for data iteration.
88 Short_t fNChunk; // Number of contiguous signals still to read.
91 class RowIterator : public PadIterator
94 RowIterator(const PadData* first, Short_t npads, Short_t thr=0) :
95 PadIterator(*first, thr),
96 fPadArray(first), fNPads(npads),
99 RowIterator(const RowIterator& i) :
101 fPadArray(i.fPadArray), fNPads(i.fNPads), fPad(i.fPad)
104 RowIterator& operator=(const RowIterator& i) {if(this!=&i){
105 fPadArray = i.fPadArray; fNPads = i.fNPads; fPad = i.fPad;
111 void ResetRow(const PadData* first, Short_t npads);
113 Short_t TEvePad() const { return fPad; }
116 const PadData *fPadArray; // Pointer to array of pad-data.
117 Short_t fNPads; // Number of pads in row.
118 Short_t fPad; // Current pad.
121 class SegmentInfo : public TObject
123 friend class AliEveTPCSectorData;
128 Float_t GetPadWidth() const { return fPadWidth; }
129 Float_t GetPadHeight() const { return fPadHeight; }
130 Float_t GetRLow() const { return fRLow; }
131 Int_t GetNRows() const { return fNRows; }
132 Int_t GetFirstRow() const { return fFirstRow; }
133 Int_t GetLastRow() const { return fLastRow; }
134 Int_t GetNMaxPads() const { return fNMaxPads; }
135 Int_t GetNYSteps() const { return fNYSteps; }
136 Float_t GetYStep(Int_t step) const { return fYStep[step]; }
139 Float_t fPadWidth; // Width of pad in this segment.
140 Float_t fPadHeight; // Height of pad in this segment.
141 Float_t fRLow; // Radius at the bottom of first row.
142 Int_t fNRows; // Number of rows in this segment.
143 Int_t fFirstRow; // First row index within sector.
144 Int_t fLastRow; // Last row index within sector.
145 Int_t fNMaxPads; // Maximum number of pads in a row.
146 Int_t fNYSteps; // Number of steps in pad-count.
147 Float_t fYStep[64]; // Y coords where pad-count changes.
149 ClassDef(SegmentInfo, 0);
154 AliEveTPCSectorData(Int_t sector, Int_t bsize=65536);
155 virtual ~AliEveTPCSectorData();
159 virtual void Print(Option_t* opt="") const;
161 void BeginPad(Int_t row, Int_t pad, Bool_t reverseTime=kFALSE);
162 void RegisterData(Short_t time, Short_t signal);
163 void EndPad(Bool_t autoPedestal=kFALSE, Short_t threshold=0);
165 const PadData& GetPadData(Int_t padAddr) const;
166 const PadData& GetPadData(Int_t row, Int_t pad) const;
168 PadIterator MakePadIterator(Int_t padAddr, Short_t thr=0);
169 PadIterator MakePadIterator(Int_t row, Int_t pad, Short_t thr=0);
171 RowIterator MakeRowIterator(Int_t row, Short_t thr=0);
173 // --- Static functions
175 static const AliTPCParam& GetParam() { return *fgParam; }
176 static Float_t GetZLength() { return fgZLength; }
177 static Int_t GetNAllRows() { return fgNAllRows; }
178 static Int_t GetNAllPads() { return fgNAllPads; }
180 static Int_t GetNPadsInRow(Int_t row);
182 static const SegmentInfo& GetInnSeg() { return fgInnSeg; }
183 static const SegmentInfo& GetOut1Seg() { return fgOut1Seg; }
184 static const SegmentInfo& GetOut2Seg() { return fgOut2Seg; }
186 static const SegmentInfo& GetSeg(Int_t seg);
188 static void InitStatics();
192 Int_t fSectorID; // Sector id.
193 Int_t fNPadsFilled; // Number of filled pads.
194 std::vector<PadData> fPads; // Vector of pad-data.
196 // Blocks of pad-data.
197 const Int_t fkBlockSize; // Size of pad-data block.
198 Int_t fBlockPos; // Position in current block.
199 std::vector<Short_t*> fBlocks; // Vector of blocks.
204 // Intermediate buffer/vars used during filling of pad-data.
205 Short_t fPadBuffer[2048]; // Buffer for current pad.
206 Int_t fCurrentRow; // Current row.
207 Int_t fCurrentPad; // Current pad.
208 Int_t fCurrentPos; // Current position in pad-buffer.
209 Int_t fCurrentStep; // Step, can be -2 or +2, depending on fill direction.
211 Int_t PadIndex(Int_t row, Int_t pad) const { return fgRowBegs[row] + pad; }
215 static AliTPCParam *fgParam; // Global TPC parameters.
216 static Float_t fgZLength; // Z-length of a sector.
217 static Int_t fgNAllRows; // Number of rows in all segments.
218 static Int_t fgNAllPads; // Number of pads in all segments.
219 static Int_t *fgRowBegs; // Ids of pads at row-beginnings.
221 static SegmentInfo fgInnSeg; // Geometry information for inner segment.
222 static SegmentInfo fgOut1Seg; // Geometry information for middle segment.
223 static SegmentInfo fgOut2Seg; // Geometry information for outer segment.
225 static SegmentInfo* fgSegInfoPtrs[3]; // Array of geometry information objects, for access by segment id.
227 AliEveTPCSectorData(const AliEveTPCSectorData&); // Not implemented
228 AliEveTPCSectorData& operator=(const AliEveTPCSectorData&); // Not implemented
230 ClassDef(AliEveTPCSectorData, 0); // Holds pad-data of a single TPC sector. Also stores geometry information in static data-members.
234 inline void AliEveTPCSectorData::RegisterData(Short_t time, Short_t signal)
236 // Register data for given time.
238 fPadBuffer[fCurrentPos] = time;
239 fPadBuffer[fCurrentPos+1] = signal;
240 fCurrentPos += fCurrentStep;