Hall A ROOT/C++ Analyzer (podd)
Loading...
Searching...
No Matches
GenScaler.cxx
Go to the documentation of this file.
1
2//
3// GenScaler
4// A generic scaler
5//
7
8#include "GenScaler.h"
9#include "THaEvData.h"
10#include "TMath.h"
11#include <iostream>
12#include <string>
13
14using namespace std;
15
16namespace Decoder {
17
18 const int DEFAULT_DELTAT = 4;
19
21 VmeModule(crate, slot),
22 fIsDecoded(false), fFirstTime(true), fDeltaT(0.0),
23 fClockChan(0), fNumChanMask(0), fNumChanShift(0),
24 fHasClock(false), fClockRate(0), fNormScaler(nullptr),
25 firsttime(true), firstwarn(true)
26 {
27 fWordsExpect = 32;
28 fNumChan = 0;
29 }
30
32 // Clear event-by-event data
34 fIsDecoded=false;
35 }
36
38 {
39 fHasClock = false;
40 fFirstTime = true;
41 fIsDecoded = false;
42 fClockChan = -1;
43 fClockRate = 0;
44 fNormScaler = nullptr;
45 fNumChanMask = 0xff;
46 fNumChanShift = 0;
47 fDeltaT = DEFAULT_DELTAT; // a default time interval between readings
49 fPrevData.resize(fWordsExpect);
50 fRate.resize(fWordsExpect);
51 fDataArray.assign(fDataArray.size(), 0);
52 fPrevData.assign(fPrevData.size(), 0);
53 fRate.assign(fRate.size(), 0.0);
54 }
55
58 fBank = bank;
59 if(fBank > 0) {
60 fHeader = fSlot << 8;
61 fHeaderMask = 0xff00;
62 }
63 }
64
65 Int_t GenScaler::SetClock( Double_t deltaT, UInt_t clockchan, Double_t clockrate) {
66 // Sets the clock for the time base
67 // retcode:
68 // 0 nothing wrong, but has no deltaT nor clock data. (a bit odd)
69 // -1 something wrong, see error print
70 // 1 clock rate set for this scaler. This scaler has a clock.
71 // 2 using deltaT, instead, for an approx time diff between readings
72
73 Int_t retcode = 0;
74 fHasClock = false;
75 if (clockrate > 0) {
76 if (fNormScaler) {
77 cout << "GenScaler:: WARNING: Declaring this object to have"<<endl;
78 cout << " a clock even though this also has a normalization scaler ?"<<endl;
79 cout << " This makes no sense. "<<endl;
80 retcode = -1;
81 }
82 fHasClock = true;
83 }
84 if( clockchan >= fWordsExpect ) {
85 cout << "GenScaler:: ERROR: clock channel out of range "<<endl;
86 retcode = -1;
87 } else {
88 fClockChan = clockchan;
89 }
90 fClockRate = clockrate;
91 if (retcode >= 0 && fClockRate > 0) retcode=1;
92 if (deltaT > 0) {
93 fDeltaT = deltaT;
94 if (fClockRate <= 0 && retcode>=0) retcode=2;
95 } else {
96 cout << "GenScaler:: Warning: using default deltaT = "<<fDeltaT<<endl;
97 }
98 if (retcode == 0) cout << "GetScaler:: Warning:: no deltaT nor clockrate define for this scaler "<<endl;
99 return retcode;
100 }
101
103 if (fHasClock) {
104 cout << "GenScaler:: WARNING: loading norm scaler although this"<<endl;
105 cout << " object has a clock ? This makes no sense. "<<endl;
106 }
107 if ( !scal ) {
108 cout << "GenScaler:: ERROR: attempting to load a non-existent "<<endl;
109 cout << "normalization scaler !" <<endl;
110 return;
111 }
112 fNormScaler = scal;
113 }
114
115 Int_t GenScaler::Decode(const UInt_t *evbuffer) {
116 Int_t doload=0;
117 Int_t nfound=1;
118 if (IsDecoded()) return nfound;
119 if (fFirstTime) {
120 fFirstTime = false;
121 } else {
122 doload=1;
124 }
125 if ( !IsSlot(*evbuffer) ) return nfound;
126 if (fDebugFile) *fDebugFile << "is slot 0x"<<hex<<*evbuffer<<dec<<" num chan "<<fNumChan<<endl;
127 evbuffer++;
128 fIsDecoded = true;
129 fDataArray.assign( evbuffer, evbuffer+fNumChan );
130 nfound += fNumChan;
131 if (fDebugFile) {
132 for( UInt_t i = 0; i < fNumChan; i++ )
133 *fDebugFile << " data[" << i << "] = 0x" << hex << fDataArray[i] << dec << endl;
134 }
135 if (doload) LoadRates();
136 return nfound;
137 }
138
140 // Time since previous reading.
141 // If a normalization scaler was defined, use its time base.
142 // Otherwise, if this scaler has a clock, use it to get the time precisely.
143 // Finally, if there is no clock, use fDeltaT as an approximate time.
144
146 Double_t dtime = 0;
147 if (fDebugFile) {
148 *fDebugFile << "Into GetTimeSincePrev "<<endl;
149 if (IsDecoded()) *fDebugFile << "Is Decoded "<<endl;
150 if (fHasClock) *fDebugFile << "has Clock "<<endl;
151 }
153 // Check for scaler overflow
154 UInt_t clockdif;
156 clockdif = (kMaxUInt-(fPrevData[fClockChan]-1))
158 } else {
160 }
161 dtime = clockdif/fClockRate;
162 if (fDebugFile) *fDebugFile << "GetTimeSincePrev "<<fClockRate<<" "<<fClockChan<<" "<<dtime<<endl;
163 } else {
164 if (fDeltaT > 0) dtime = fDeltaT; // default
165 }
166 return dtime;
167 }
168
170 if (IsDecoded()) {
171 Double_t dtime = GetTimeSincePrev();
172 if (dtime==0) {
173 fRate.assign(fRate.size(), 0);
174 return;
175 }
176 for( UInt_t i = 0; i < fWordsExpect; i++ ) {
177 // Check for scaler overflow
178 UInt_t diff;
179 if(fDataArray[i] < fPrevData[i]) {
180 diff = (kMaxUInt-(fPrevData[i]-1)) + fDataArray[i];
181 } else {
182 diff = fDataArray[i]-fPrevData[i];
183 }
184 fRate[i] = diff/dtime;
185 }
186 }
187 }
188
190 if (checkchan(chan)) {
191 return fDataArray[chan];
192 } else {
193 return 0;
194 }
195 }
196
198 if (checkchan(chan)) {
199 return fRate[chan];
200 } else {
201 return 0;
202 }
203 }
204
205 void GenScaler::DoPrint() const {
206 cout << "GenScaler:: crate "<<fCrate<<" slot "<<fSlot<<endl;
207 cout << "GenScaler:: Header 0x"<<hex<<fHeader<<" Mask 0x"<<fHeaderMask<<dec<<endl;
208 cout << "GenScaler:: fNumChanMask = "<< hex<< fNumChanMask<<dec<<endl;
209 cout << "GenScaler:: fNumChanShift = "<< hex<< fNumChanShift<<dec<<endl;
210 cout << "num words expected "<<fWordsExpect<<endl;
211 if (fHasClock) cout << "Has a clock"<<endl;
212 if (fNormScaler) cout << "Using norm scaler with ptr = "<<fNormScaler << endl;
213 cout << "Clock channel "<<fClockChan<<" clock rate "<<fClockRate<<endl;
214 }
215
216 void GenScaler::DebugPrint(ofstream *file) const {
217 if (!file) return;
218 *file << "GenScaler:: crate "<<fCrate<<" slot "<<fSlot<<endl;
219 *file << "GenScaler:: Header 0x"<<hex<<fHeader<<" Mask 0x"<<fHeaderMask<<dec<<endl;
220 *file << "num words expected "<<fWordsExpect<<endl;
221 if (fHasClock) *file << "Has a clock"<<endl;
222 if (fNormScaler) *file << "Using norm scaler with ptr = "<<fNormScaler << endl;
223 *file << "Clock channel "<<fClockChan<<" clock rate "<<fClockRate<<endl;
224 *file<<" ---- Data ---- "<<fWordsExpect<<endl;
225 *file<<"Data now // previous // rate "<<endl;
226 for( UInt_t i = 0; i < fWordsExpect; i++ ) {
227 *file << " 0x"<<hex<<fDataArray[i]<<" 0x"<<fPrevData[i]<<dec<<" "<<fRate[i]<<endl;
228 }
229 }
230
236 if( (rdata & fHeaderMask) != fHeader )
237 return false;
238 // This is a header word. Try extracting the number of channels.
239 fNumChan = (rdata & fNumChanMask) >> fNumChanShift;
240 if( fNumChan == 0 ) {
242 if( firsttime ) {
243 firsttime = false;
244 cout << "Warning::GenScaler:: (" << fCrate << "," << fSlot
245 << ") using default num " << fgNumChanDefault << " channels"
246 << endl;
247 }
248 }
249 if( fNumChan != fWordsExpect ) {
250 if( fNumChan > fWordsExpect )
252
253 // Print warning once to alert user to potential problems,
254 // or for every suspect event if debugging enabled
255 if( firstwarn && fNumChan != 16 && fNumChan != fWordsExpect ) {
256 cout << "GenScaler:: ERROR: (" << fCrate << "," << fSlot << ") "
257 << "inconsistent number of chan." << endl;
258 // DoPrint();
259 firstwarn = false;
260 }
261 }
262 return true;
263 }
264
265UInt_t GenScaler::LoadSlot( THaSlotData* sldat, const UInt_t* evbuffer, const UInt_t* pstop )
266 {
267 // This is a simple, default method for loading a slot
268 const UInt_t* p = evbuffer;
269 Clear();
270 while( p < pstop ) {
271 if( IsSlot(*p) ) {
272 if (fDebugFile) *fDebugFile << "GenScaler:: Loadslot "<<endl;
273 if (!fHeader) cerr << "GenScaler::LoadSlot::ERROR : no header ?"<<endl;
274 Decode(p);
275 for( UInt_t ichan = 0; ichan < fNumChan; ichan++ ) {
276 sldat->loadData(ichan, fDataArray[ichan], fDataArray[ichan]);
277 }
279 return fWordsSeen;
280 }
281 p++;
282 }
283 return 0;
284 }
285
286 UInt_t GenScaler::LoadSlot( THaSlotData *sldat, const UInt_t* evbuffer, UInt_t pos, UInt_t len) {
290 fWordsSeen = 0;
291 Clear();
292
293 // How can set set this just once?
294 // fHeader = fSlot << 8;
295 // fHeaderMask = 0x3f00;
296
297 while(fWordsSeen < len) {
298 UInt_t index = pos + fWordsSeen;
299 if( IsSlot(evbuffer[index]) ) {
300 Decode(&evbuffer[index]);
301 for( UInt_t ichan = 0; ichan < fNumChan; ichan++ ) {
302 sldat->loadData(ichan, fDataArray[ichan], fDataArray[ichan]);
303 }
304 fWordsSeen += (fNumChan + 1);
305 break;
306 }
307 fWordsSeen += (fNumChan + 1); // Skip to next header
308 }
309 return fWordsSeen;
310 }
311
312}
313
int Int_t
unsigned int UInt_t
uint32_t chan
bool Bool_t
const UInt_t kMaxUInt
double Double_t
const char Option_t
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Double_t GetRate(UInt_t chan) const
static const UInt_t fgNumChanDefault
Definition GenScaler.h:64
Bool_t checkchan(UInt_t chan) const
Definition GenScaler.h:54
Double_t GetTimeSincePrev() const
void DebugPrint(std::ofstream *file=nullptr) const
Double_t fClockRate
Definition GenScaler.h:61
virtual void DoPrint() const
virtual void Clear(Option_t *opt="")
Definition GenScaler.cxx:31
Int_t SetClock(Double_t deltaT, UInt_t clockchan=0, Double_t clockrate=0)
Definition GenScaler.cxx:65
std::vector< Double_t > fRate
Definition GenScaler.h:58
std::vector< UInt_t > fPrevData
Definition GenScaler.h:57
void LoadNormScaler(GenScaler *scal)
GenScaler * fNormScaler
Definition GenScaler.h:62
Bool_t IsDecoded() const
Definition GenScaler.h:39
virtual void SetBank(Int_t bank)
Definition GenScaler.cxx:56
virtual Bool_t IsSlot(UInt_t rdata)
virtual Int_t Decode(const UInt_t *evbuffer)
std::vector< UInt_t > fDataArray
Definition GenScaler.h:57
virtual UInt_t GetData(UInt_t chan) const
virtual UInt_t LoadSlot(THaSlotData *sldat, const UInt_t *evbuffer, const UInt_t *pstop)
UInt_t fCrate
Definition Module.h:142
UInt_t fNumChan
Definition Module.h:148
std::ofstream * fDebugFile
Definition Module.h:156
UInt_t fWordsExpect
Definition Module.h:145
UInt_t fHeader
Definition Module.h:143
UInt_t fSlot
Definition Module.h:142
UInt_t fHeaderMask
Definition Module.h:143
UInt_t fWordsSeen
Definition Module.h:145
Int_t loadData(const char *type, UInt_t chan, UInt_t dat, UInt_t raw)
void Clear(Option_t *option="") override
const int DEFAULT_DELTAT
Definition GenScaler.cxx:18
STL namespace.
ClassImp(TPyArg)