Hall C ROOT/C++ Analyzer (hcana)
Loading...
Searching...
No Matches
THcConfigEvtHandler.cxx
Go to the documentation of this file.
1
24#include "THcConfigEvtHandler.h"
25#include "CodaDecoder.h"
26#include "THcGlobals.h"
27#include "THcParmList.h"
28#include "THaGlobals.h"
29#include "THaRunBase.h"
30#include "THaRunParameters.h"
31#include "Helper.h"
32#include <iostream>
33#include <iomanip>
34#include <sstream>
35
36using namespace std;
37
38THcConfigEvtHandler::THcConfigEvtHandler(const char *name, const char* description)
39 : THaEvtTypeHandler(name,description)
40{
41}
42
44{
45 // Remove the parameters we've added to gHcParms. Otherwise they would
46 // reference deallocated memory once this object goes away
47 for( const auto& name : fParms )
48 gHcParms->RemoveName( name.c_str() );
49}
50
51//Float_t THcConfigEvtHandler::GetData(const std::string& tag)
52//{
53// // A public method which other classes may use
54// if (theDataMap.find(tag) == theDataMap.end())
55// return 0;
56// return theDataMap[tag];
57//}
58
60{
61 static const char* const here = "THcConfigEvtHandler::Analyze";
62
63 if ( !IsMyEvent(evdata->GetEvType()) )
64 return -1;
65 if (fDebug)
66 cout << "------------------\n Event type 125"<<endl;
67 const char* whereami = Here(here);
68
69 UInt_t evlen = evdata->GetEvLength();
70 UInt_t ip = 1; // index of next word to be processed (for CODA 2)
71
72 if( evdata->GetDataVersion() > 2 ) {
73 // Unpack CODA 3 bank structure
74 auto bankinfo =
75 Decoder::CodaDecoder::GetBank(evdata->GetRawDataBuffer(), 0, evlen);
76 ip = bankinfo.pos_;
77
78 // Check for errors
79 if( bankinfo.status_ != Decoder::CodaDecoder::BankInfo::kOK ) {
80 ostringstream ostr;
81 ostr << whereami << ": CODA3 bank decoding error \""
82 << bankinfo.Errtxt() << "\"";
84 }
85 if( bankinfo.GetDataSize() != Decoder::CodaDecoder::BankInfo::k32bit ||
86 bankinfo.GetFloat() != Decoder::CodaDecoder::BankInfo::kInteger ) {
87 ostringstream ostr;
88 ostr << whereami << ": CODA3 bank does not contain 32-bit integer "
89 "data, found " << bankinfo.Typtxt();
91 }
92 if( ip + bankinfo.len_ > evlen ) {
93 ostringstream ostr;
94 ostr << whereami << ": CODA3 bank size too large, pos+len = "
95 << ip+bankinfo.len_ << ", evlen = " << evlen;
97 }
98 }
99
100 UInt_t header = evdata->GetRawData(ip++);
101 UInt_t roc = header & 0xff;
102 if (fDebug)
103 cout << whereami << ": Found config for ROC " << roc << endl;
104 // Using a map as opposed to a vector ensures that none of the iterators into
105 // it are invalidated as more elements are added. This is important since we
106 // define parameters on _references_ to the map elements (see MakeParms()).
107 auto ins = fCrateInfoMap.emplace(roc, CrateConfig(roc));
108 auto& cinfo = ins.first->second;
109
110 // Possible blocks of config data
111 // 0xdafadcNN - FADC information for the crate (NN = blocklevel), optionally
112 // followed by set of thresholds by slot/channel
113 // 0xdedc1190 - 1190 TDC information for the crate
114 // 0xd0000000 - TI configuration (for TI master crate only)
115 while( ip < evlen ) {
116 UInt_t thisword = evdata->GetRawData(ip);
117
118 if( (thisword & 0xffffff00) == 0xdafadc00 ) {
119 // FADC250 information
120 ip = DecodeFADC250Config(evdata, ip, cinfo.FADC250);
121
122 } else if( thisword == 0xdedc1190 ) {
123 // CAEN 1190 information
124 ip = DecodeCAEN1190Config(evdata, ip, cinfo.CAEN1190);
125
126 } else if( thisword == 0xd0000000 ) {
127 // TI setup data
128 ip = DecodeTIConfig(evdata, ip, cinfo.TI);
129
130 } else {
131 cerr << whereami << ": Expected header missing"
132 << "pos " << ip << ", data " << hex << thisword << dec << endl;
133 break;
134 }
135 }
136
137 if( fDebug > 1 )
138 cout << whereami << ": Making Parms for ROC " << roc << " Event type " << evdata->GetEvType() << endl;
139 cinfo.MakeParms(*this);
140
141 // Copy prescales to run parameters stored in the run object.
142 // The run object will be saved in the output ROOT file, so
143 // users will have easy access to these numbers.
144 const auto& TI = cinfo.TI;
145 if( gHaRun && TI.present ) {
146 auto& prescales = gHaRun->GetParameters()->Prescales();
147 for( Int_t i = 0; i < Podd::SSIZE(TI.ps_factors); ++i ) {
148 prescales[i] = TI.ps_factors[i];
149 }
150 }
151
152 if( fDebug > 1 )
153 PrintConfig();
154 return 1;
155}
156
159{
160 static const char* here = "THcConfigEvtHandler::DecodeFADC250Config";
161 const char* whereami = Here(here);
162
163 UInt_t thisword = evdata->GetRawData(ip);
164 if( fDebug )
165 cout << whereami << ": FADC250 config: Block level " << (thisword & 0xff) << endl;
166 UInt_t versionword = evdata->GetRawData(ip + 1);
167 if( (versionword & 0xffff0000) == 0xabcd0000 ) {
168 //UInt_t version = versionword & 0xffff;
169 cfg.present = true;
170 cfg.blocklevel = thisword & 0xff;
171 cfg.dac_level = evdata->GetRawData(ip + 2);
172 cfg.threshold = evdata->GetRawData(ip + 3);
173 cfg.mode = evdata->GetRawData(ip + 4);
174 cfg.window_lat = evdata->GetRawData(ip + 5);
175 cfg.window_width = evdata->GetRawData(ip + 6);
176 cfg.nsb = evdata->GetRawData(ip + 7);
177 cfg.nsa = evdata->GetRawData(ip + 8);
178 cfg.np = evdata->GetRawData(ip + 9);
179 cfg.nped = evdata->GetRawData(ip + 10);
180 cfg.maxped = evdata->GetRawData(ip + 11);
181 cfg.nsat = evdata->GetRawData(ip + 12);
182 UInt_t lastword = evdata->GetRawData(ip + 13);
183 if( lastword != 0xdafadcff ) {
184 cerr << whereami << ": Unexpected FADC250 configuration block trailer"
185 << ", expected " << hex << 0xdafadcff << ", got " << lastword << dec << endl;
186 }
187 } else {
188 cerr << whereami << ": Unexpected FADC250 version word "
189 << hex << thisword << dec << ", expected 0xabcdNNNN" << endl;
190 }
191 ip += 14;
192
193 // A set of per-slot ADC thresholds may follow
194 thisword = evdata->GetRawData(ip);
195 if( (thisword & 0xffffff00) == 0xfadcf000 ) {
196 if( fDebug )
197 cout << whereami << ": FADC250 thresholds for slot";
198 while( (thisword & 0xffffff00) == 0xfadcf000 ) {
199 UInt_t slot = thisword & 0x1f;
200 if( fDebug )
201 cout << " " << slot;
202 // Should check if this slot has already been SDC_WIRE_CENTER
203 auto ithr =
204 cfg.thresholds.emplace(slot, std::array<UInt_t, NTHR>{});
205 if( ithr.second ) // if insertion successful, then we've added a module
206 cfg.nmodules++;
207 ip++;
208 for( auto& threshold: ithr.first->second ) // assigns NTHR (=16) values
209 threshold = evdata->GetRawData(ip++);
210 UInt_t lastword = evdata->GetRawData(ip++);
211 if( lastword != (0xfadcff00 | slot) ) {
212 if( fDebug )
213 cout << endl;
214 cerr << whereami << ": Unexpected FADC250 threshold block trailer"
215 << ", expected " << hex << (0xfadcff00 | slot)
216 << ", got " << lastword << dec
217 << ". Thresholds for this slot may be incorrect." << endl;
218 }
219 thisword = evdata->GetRawData(ip);
220 }
221 if( fDebug )
222 cout << endl;
223 }
224
225 return ip;
226}
227
230{
231 static const char* here = "THcConfigEvtHandler::DecodeCAEN1190Config";
232 const char* whereami = Here(here);
233 const UInt_t trailer = 0xdedc119f;
234
235 if (fDebug)
236 cout << whereami << ": CAEN1190 TDC information" << endl;
237 UInt_t versionword = evdata->GetRawData(ip + 1);
238 if( (versionword & 0xffff0000) == 0xabcd0000 ) {
239 //UInt_t version = versionword & 0xffff;
240 cfg.present = true;
241 cfg.resolution = evdata->GetRawData(ip + 2);
242 cfg.timewindow_offset = evdata->GetRawData(ip + 3);
243 cfg.timewindow_width = evdata->GetRawData(ip + 4);
244 UInt_t lastword = evdata->GetRawData(ip + 5);
245 if( lastword != trailer ) {
246 cerr << whereami << ": Unexpected 1190 configuration block trailer"
247 << ", expected " << hex << trailer << ", got " << lastword << dec << endl;
248 }
249 } else {
250 UInt_t thisword = evdata->GetRawData(ip);
251 cerr << whereami << ": Unexpected 1190 version word "
252 << hex << thisword << dec << ", expected 0xabcdNNNN" << endl;
253 }
254 return ip + 6;
255}
256
258 CrateConfig::TI_t& cfg )
259{
260 static const char* here = "THcConfigEvtHandler::DecodeTIConfig";
261 const char* whereami = Here(here);
262
263 if (fDebug)
264 cout << whereami << ": TI setup data" << endl;
265
266 UInt_t versionword = evdata->GetRawData(ip + 1);
267 if( (versionword & 0xffff0000) == 0xabcd0000 ) {
268 UInt_t version = versionword & 0xffff;
269 ip += 2;
270 cfg.present = true;
271 cfg.nped = evdata->GetRawData(ip++);
272 if( version >= 2 ) {
273 cfg.scaler_period = evdata->GetRawData(ip++);
274 cfg.sync_count = evdata->GetRawData(ip++);
275 } else {
276 cfg.scaler_period = 2;
277 cfg.sync_count = -1;
278 }
279 // Prescale factors
280 for( UInt_t i = 0; i < NPS; i++ ) {
281 auto ps = cfg.prescales[i] = static_cast<Int_t>(evdata->GetRawData(ip++));
282 if( evdata->GetDataVersion() > 2 ) {
283 // CODA3: Calculate actual factor from "exponent" format
284 auto& fact = cfg.ps_factors[i];
285 if( ps > 0 && ps <= 16 )
286 fact = (1 << (ps - 1)) + 1;
287 else if( ps == 0 )
288 fact = 1;
289 else if( ps == -1 )
290 fact = -1;
291 else {
292 cerr << whereami << ": Invalid CODA3 prescale = " << ps << ". "
293 << "Must be between -1 and 16 (inclusive)" << endl;
294 fact = -1;
295 }
296 } else
297 cfg.ps_factors = cfg.prescales;
298 }
299 UInt_t lastword = evdata->GetRawData(ip++);
300 if( lastword != 0xd000000f ) {
301 cerr << whereami << ": Unexpected last word of TI information block "
302 << hex << lastword << dec << endl;
303 }
304 } else {
305 UInt_t thisword = evdata->GetRawData(ip);
306 cerr << whereami << ": Unexpected TI info word " << hex << thisword
307 << dec << endl << " Expected 0xabcdNNNN" << endl;
308 ip += 11; // This may be wrong. Look for trailer? Give up on entire event?
309 }
310 return ip;
311}
312
317 auto it = fCrateInfoMap.find(roc);
318 assert(it != fCrateInfoMap.end()); // else bug in Analyze
319
320 const auto& cinfo = it->second;
321 cinfo.MakeParms(*this);
322}
323
324// Pretty print the config data
326{
327 for( const auto& crate_config : fCrateInfoMap ) {
328 cout << "================= Configuration Data ROC " << crate_config.first << "==================" << endl;
329 crate_config.second.Print();
330 }
331}
332
334{
335 auto it = fCrateInfoMap.find(crate);
336 if( it != fCrateInfoMap.end() ) {
337 const auto& cinfo = it->second;
338 return cinfo.FADC250.present;
339 }
340 return false;
341}
343{
344 auto it = fCrateInfoMap.find(crate);
345 if( it != fCrateInfoMap.end() ) {
346 const auto& cinfo = it->second;
347 if( cinfo.FADC250.present )
348 return cinfo.FADC250.nsa;
349 }
350 return -1;
351}
353{
354 auto it = fCrateInfoMap.find(crate);
355 if( it != fCrateInfoMap.end() ) {
356 const auto& cinfo = it->second;
357 if( cinfo.FADC250.present )
358 return cinfo.FADC250.nsb;
359 }
360 return -1;
361}
363{
364 auto it = fCrateInfoMap.find(crate);
365 if( it != fCrateInfoMap.end() ) {
366 const auto& cinfo = it->second;
367 if( cinfo.FADC250.present )
368 return cinfo.FADC250.nped;
369 }
370 return -1;
371}
373{
374 if( eventtypes.empty() ) {
375 eventtypes.push_back(125); // what events to look for
376 }
377
378 fCrateInfoMap.clear();
379
380 return THaEvtTypeHandler::Init(date);
381}
382
384{
385 // Create Hall C parameters referencing these configuration data
386
387 auto& parm_names = h.fParms;
388 const auto& modname = h.fName;
389
390 // FADC configuration
391 if( FADC250.present ) {
392 // Loop over FADC slots
393 for( const auto& islot: FADC250.thresholds ) {
394 auto slot = islot.first;
395 const auto& thresholds = islot.second;
396
397 parm_names.emplace_back(Form("g%s_adc_thresholds_%u_%u[%u]", modname.Data(), roc, slot, NTHR));
398 gHcParms->RemoveName(parm_names.back().c_str());
399 gHcParms->Define(parm_names.back().c_str(), "ADC Thresholds", *thresholds.data());
400
401 // FIXME: The following parameters are labeled "per slot", but their
402 // values are identical for all slots.
403 parm_names.emplace_back(Form("g%s_adc_mode_%u_%u", modname.Data(), roc, slot));
404 gHcParms->RemoveName(parm_names.back().c_str());
405 gHcParms->Define(parm_names.back().c_str(), "ADC Mode", FADC250.mode);
406 parm_names.emplace_back(Form("g%s_adc_latency_%u_%u", modname.Data(), roc, slot));
407 gHcParms->RemoveName(parm_names.back().c_str());
408 gHcParms->Define(parm_names.back().c_str(), "Window Latency", FADC250.window_lat);
409
410 parm_names.emplace_back(Form("g%s_adc_width_%u_%u", modname.Data(), roc, slot));
411 gHcParms->RemoveName(parm_names.back().c_str());
412 gHcParms->Define(parm_names.back().c_str(), "Window Width", FADC250.window_width);
413
414 parm_names.emplace_back(Form("g%s_adc_daclevel_%u_%u", modname.Data(), roc, slot));
415 gHcParms->RemoveName(parm_names.back().c_str());
416 gHcParms->Define(parm_names.back().c_str(), "DAC Level", FADC250.dac_level);
417 parm_names.emplace_back(Form("g%s_adc_nped_%u_%u", modname.Data(), roc, slot));
418 gHcParms->RemoveName(parm_names.back().c_str());
419 gHcParms->Define(parm_names.back().c_str(), "NPED", FADC250.nped);
420 parm_names.emplace_back(Form("g%s_adc_nsa_%u_%u", modname.Data(), roc, slot));
421 gHcParms->RemoveName(parm_names.back().c_str());
422 gHcParms->Define(parm_names.back().c_str(), "NSA", FADC250.nsa);
423 parm_names.emplace_back(Form("g%s_adc_maxped_%u_%u", modname.Data(), roc, slot));
424 gHcParms->RemoveName(parm_names.back().c_str());
425 gHcParms->Define(parm_names.back().c_str(), "MAXPED", FADC250.maxped);
426 parm_names.emplace_back(Form("g%s_adc_np_%u_%u", modname.Data(), roc, slot));
427 gHcParms->RemoveName(parm_names.back().c_str());
428 gHcParms->Define(parm_names.back().c_str(), "NP", FADC250.np);
429 parm_names.emplace_back(Form("g%s_adc_blocklevel_%u_%u", modname.Data(), roc, slot));
430 gHcParms->RemoveName(parm_names.back().c_str());
431 gHcParms->Define(parm_names.back().c_str(), "Blocklevel", FADC250.blocklevel);
432 }
433 }
434
435 // CAEN 1190 TDC information
436 if( CAEN1190.present ) {
437 // FIXME: shouldn't this info be per slot?
438 parm_names.emplace_back(Form("g%s_tdc_resolution_%d", modname.Data(), roc));
439 gHcParms->RemoveName(parm_names.back().c_str());
440 gHcParms->Define(parm_names.back().c_str(), "TDC resolution", CAEN1190.resolution);
441 parm_names.emplace_back(Form("g%s_tdc_offset_%d", modname.Data(), roc));
442 gHcParms->RemoveName(parm_names.back().c_str());
443 gHcParms->Define(parm_names.back().c_str(), "TDC Time Window Offset", CAEN1190.timewindow_offset);
444 parm_names.emplace_back(Form("g%s_tdc_width_%d", modname.Data(), roc));
445 gHcParms->RemoveName(parm_names.back().c_str());
446 gHcParms->Define(parm_names.back().c_str(), "TDC Time Window Width", CAEN1190.timewindow_width);
447 }
448
449 // TI Configuration
450 // We assume that this information is only provided by the master TI crate.
451 // If that is not true we will get "Variable XXX already exists." warnings
452 if( TI.present ) {
453 parm_names.emplace_back(Form("g%s_ti_nped", modname.Data()));
454 gHcParms->RemoveName(parm_names.back().c_str());
455 gHcParms->Define(parm_names.back().c_str(),
456 "Number of Pedestal events", TI.nped);
457 parm_names.emplace_back(Form("g%s_ti_scaler_period", modname.Data()));
458 gHcParms->RemoveName(parm_names.back().c_str());
459 gHcParms->Define(parm_names.back().c_str(),
460 "Number of Pedestal events", TI.scaler_period);
461 parm_names.emplace_back(Form("g%s_ti_sync_count", modname.Data()));
462 gHcParms->RemoveName(parm_names.back().c_str());
463 gHcParms->Define(parm_names.back().c_str(),
464 "Number of Pedestal events", TI.sync_count);
465 parm_names.emplace_back(Form("g%s_ti_ps[%d]", modname.Data(), NPS));
466 gHcParms->RemoveName(parm_names.back().c_str());
467 gHcParms->Define(parm_names.back().c_str(), "TI Event Prescale Internal Value", *TI.prescales.data());
468 parm_names.emplace_back(Form("g%s_ti_ps_factors[%d]", modname.Data(), NPS));
469 gHcParms->RemoveName(parm_names.back().c_str());
470 gHcParms->Define(parm_names.back().c_str(), "TI Event Prescale Factor", *TI.ps_factors.data());
471 }
472
473 return 0;
474}
475
477{
478 // Print configuration info
479
480 if( CAEN1190.present ) {
481 cout << " CAEN 1190 Configuration" << endl;
482 cout << " Resolution: " << CAEN1190.resolution << " ps" << endl;
483 cout << " T Offset: " << CAEN1190.timewindow_offset << endl;
484 cout << " T Width: " << CAEN1190.timewindow_width << endl;
485 }
486 if( FADC250.present ) {
487 cout << " FADC250 Configuration" << endl;
488 cout << " Mode: " << FADC250.mode << endl;
489 cout << " Blocklevel: " << FADC250.blocklevel << endl;
490 cout << " Latency: " << FADC250.window_lat << " Width: "<< FADC250.window_width << endl;
491 cout << " DAC Level: " << FADC250.dac_level << " Threshold: " << FADC250.threshold << endl;
492 cout << " NPED: " << FADC250.nped << " NSA: " << FADC250.nsa << " NSB: " << FADC250.nsb << endl;
493 cout << " MAXPED: " << FADC250.maxped << " NP: " << FADC250.np << " NSAT: " << FADC250.nsat << endl;
494
495 if( !FADC250.thresholds.empty() ) {
496 cout << " Thresholds";
497 for( const auto& thr: FADC250.thresholds ) {
498 auto slot = thr.first;
499 cout << " " << setw(5) << slot;
500 }
501 cout << endl;
502 for( UInt_t ichan = 0; ichan < NTHR; ichan++ ) {
503 cout << " " << setw(2) << ichan << " ";
504 for( const auto& chan: FADC250.thresholds ) {
505 const auto& thresholds = chan.second;
506 cout << " " << setw(5) << thresholds[ichan];
507 }
508 cout << endl;
509 }
510 }
511 }
512 if( TI.present ) {
513 cout << " TI Configuration" << endl;
514 cout << " N Pedestals: " << TI.nped << " events" << endl;
515 cout << " Scaler Period: " << TI.scaler_period << " seconds" << endl;
516 cout << " Sync interval: " << TI.sync_count << " events" << endl;
517 cout << " Prescale exponents: ";
518 for( auto ps: TI.prescales )
519 cout << " " << ps;
520 cout << endl;
521 cout << " Prescale factors: ";
522 for( auto ps: TI.ps_factors )
523 cout << " " << ps;
524 cout << endl;
525 }
526}
527
529 : present{false}
530 , blocklevel{0}
531 , dac_level{0}
532 , threshold{0}
533 , mode{0}
534 , window_lat{0}
535 , window_width{0}
536 , nsb{0}
537 , nsa{0}
538 , np{0}
539 , nped{0}
540 , maxped{0}
541 , nsat{0}
542 , nmodules{0}
543{}
544
546 : present{false}
547 , resolution{0}
548 , timewindow_offset{0}
549 , timewindow_width{0}
550{}
551
553 : present{false}
554 , nped{0}
555 , scaler_period{0}
556 , sync_count{0}
557 , prescales{}
558 , ps_factors{}
559{
560 for( auto& ps : prescales )
561 ps = 0;
562}
563
int Int_t
unsigned int UInt_t
uint32_t chan
bool Bool_t
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 np
Option_t Option_t TPoint TPoint const char mode
R__EXTERN class THaRunBase * gHaRun
ClassImp(VDC::AnalyticTTDConv) using namespace std
R__EXTERN class THcParmList * gHcParms
Definition THcGlobals.h:11
char * Form(const char *fmt,...)
UInt_t threshold[NUMSLOTS][NADCCHAN]
virtual const char * Here(const char *) const
UInt_t GetEvType() const
UInt_t GetRawData(UInt_t crate, UInt_t i) const
Int_t GetDataVersion() const
const UInt_t * GetRawDataBuffer() const
UInt_t GetEvLength() const
std::vector< UInt_t > eventtypes
virtual Bool_t IsMyEvent(UInt_t type) const
THaRunParameters * GetParameters() const
TArrayI & Prescales()
virtual Int_t RemoveName(const char *name)
THaVar * Define(const char *name, const Byte_t &var, const Int_t *count=nullptr)
Analyze Hall C Configuration events. (Event type 125).
static constexpr UInt_t NTHR
UInt_t DecodeCAEN1190Config(THaEvData *evdata, UInt_t ip, CrateConfig::CAEN1190_t &cfg)
std::vector< std::string > fParms
Bool_t IsPresent(UInt_t crate)
UInt_t GetNSA(UInt_t crate)
virtual Int_t Analyze(THaEvData *evdata)
virtual void MakeParms(UInt_t roc)
THcConfigEvtHandler(const char *name, const char *description)
static constexpr UInt_t NPS
UInt_t GetNSB(UInt_t crate)
std::map< UInt_t, CrateConfig > fCrateInfoMap
UInt_t GetNPED(UInt_t crate)
UInt_t DecodeFADC250Config(THaEvData *evdata, UInt_t ip, CrateConfig::FADC250_t &cfg)
UInt_t DecodeTIConfig(THaEvData *evdata, UInt_t ip, CrateConfig::TI_t &cfg)
TString fName
TH1 * h
STL namespace.
std::map< UInt_t, std::array< UInt_t, NTHR > > thresholds
Int_t MakeParms(THcConfigEvtHandler &h) const