JAPAn
Just Another Parity Analyzer
Loading...
Searching...
No Matches
QwScaler.cc
Go to the documentation of this file.
1/**
2 * QwScaler.cc
3 *
4 * Scaler subsystem managing collections of scaler channels with optional
5 * normalization, differential operation, and module/channel mapping.
6 * Supports SIS3801, STR7200 modules with configurable headers and buffers.
7 * Documentation-only edits; runtime behavior unchanged.
8 */
9
10#include "QwScaler.h"
11
12// ROOT headers
13#ifdef HAS_RNTUPLE_SUPPORT
14#include "ROOT/RNTupleModel.hxx"
15#include "ROOT/RField.hxx"
16#endif // HAS_RNTUPLE_SUPPORT
17
18// Qweak headers
19#include "QwParameterFile.h"
20
21
22/** Define command-line options for scaler subsystem (placeholder). */
24{
25 // Define command line options
26}
27
28/** Process command-line options for scaler subsystem (placeholder). */
30{
31 // Handle command line options
32}
33
34
35/**
36 * Constructor: initialize scaler subsystem with name.
37 */
38QwScaler::QwScaler(const TString& name)
40{
41 // Nothing, really
42}
43
44/**
45 * Destructor: clean up all owned scaler channel objects.
46 */
48{
49 // Delete scalers
50 for (size_t i = 0; i < fScaler.size(); i++) {
51 delete fScaler.at(i);
52 }
53 fScaler.clear();
54}
55
56
57/**
58 * Load scaler channel map from file, creating channels and configuring
59 * normalization, headers, differential mode, and buffer offsets.
60 *
61 * @param mapfile Path to the channel map file.
62 * @return 0 on success.
63 */
64Int_t QwScaler::LoadChannelMap(TString mapfile)
65{
66 // Normalization channel (register default token "1")
67 const TString default_norm_channel = "1";
68 fName_Map[default_norm_channel] = -1;
69 Name_to_Scaler_Map_t::iterator current_norm_channel = fName_Map.find(default_norm_channel);
70 double current_norm_factor = 1;
71 // Map with normalizations
72 std::vector<Name_to_Scaler_Map_t::iterator> norm_channel;
73 std::vector<double> norm_factor;
74
75 // Include header for this scaler bank
76 UInt_t header = 1;
77 UInt_t buffer_offset = 0;
78
79 // By default the scalers are not differential
80 Bool_t differential = false;
81
82 // Open the file
83 QwParameterFile mapstr(mapfile.Data());
85 mapstr.EnableGreediness();
86 mapstr.SetCommentChars("!");
87 mapstr.AddBreakpointKeyword("norm");
88 mapstr.AddBreakpointKeyword("header");
89 mapstr.AddBreakpointKeyword("differential");
90 mapstr.AddBreakpointKeyword("scaler_buffer_offset");
91
92 while (mapstr.ReadNextLine()) {
94
95 mapstr.TrimComment(); // Remove everything after a comment character.
96 mapstr.TrimWhitespace(); // Get rid of leading and trailing whitespace
97 if (mapstr.LineIsEmpty()) continue;
98
99 TString varname, varvalue;
100 if (mapstr.HasVariablePair("=", varname, varvalue)) {
101 // This is a declaration line. Decode it.
102 varname.ToLower();
103 UInt_t value = QwParameterFile::GetUInt(varvalue);
104 if (varname == "norm") {
105 // Normalization line of format: norm = [ 1 | channel / factor ]
106 string dummy = mapstr.GetNextToken("=");
107 string channame = mapstr.GetNextToken("/");
108 string channorm = mapstr.GetNextToken("/");
109 if (fName_Map.count(channame) == 0) {
110 // assign a temporarily pointer
111 fName_Map[channame] = -1;
112 }
113 current_norm_channel = fName_Map.find(channame);
114 try {
115 current_norm_factor = lexical_cast<double>(channorm);
116 } catch (boost::bad_lexical_cast&) {
117 current_norm_factor = 1;
118 }
119 QwMessage << "Normalization channel: " << channame << QwLog::endl;
120 QwMessage << "Normalization factor: " << current_norm_factor << QwLog::endl;
121 } else if (varname == "scaler_buffer_offset") {
122 // Buffer offset
123 buffer_offset = value;
124 } else if (varname == "header") {
125 // Header for this block of channels
126 header = value;
127 QwMessage << "Number of scaler header words: " << header << QwLog::endl;
128 if (header > 32)
129 QwError << "Is that really what you want?" << QwLog::endl;
130 } else if (varname == "differential") {
131 // Differential scaler
132 try {
133 differential = lexical_cast<bool>(varvalue);
134 } catch (boost::bad_lexical_cast&) {
135 differential = false;
136 }
137 if (differential)
138 QwMessage << "Subsequent scalers will be differential." << QwLog::endl;
139 else
140 QwMessage << "Subsequent scalers will not be differential." << QwLog::endl;
141 }
142
143 } else {
144
145 // Break this line into tokens to process it.
146 TString modtype = mapstr.GetTypedNextToken<TString>();
147 UInt_t modnum = mapstr.GetTypedNextToken<UInt_t>();
148 UInt_t channum = mapstr.GetTypedNextToken<UInt_t>();
149 TString dettype = mapstr.GetTypedNextToken<TString>();
150 TString keyword = mapstr.GetTypedNextToken<TString>();
151 modtype.ToUpper();
152 dettype.ToUpper();
153
154 UInt_t offset = 0;
155 if (modtype == "SIS3801" || modtype == "SIS3801D24" || modtype == "SIS3801D32") {
156 offset = QwSIS3801D24_Channel::GetBufferOffset(modnum, channum, header)+buffer_offset;
157 } else if (modtype == "STR7200") {
158 offset = QwSIS3801D32_Channel::GetBufferOffset(modnum, channum, header)+buffer_offset;
159 } else {
160 QwError << "Unrecognized module type " << modtype << QwLog::endl;
161 continue;
162 }
163
164 // Register data channel type
166 if (modnum >= fSubbank_Map[subbank].size())
167 fSubbank_Map[subbank].resize(modnum+1);
168 if (channum >= fSubbank_Map[subbank].at(modnum).size())
169 fSubbank_Map[subbank].at(modnum).resize(channum+1,-1);
170 // Add scaler channel
171 if (fSubbank_Map[subbank].at(modnum).at(channum) < 0) {
172 QwVerbose << "Registering " << modtype << " " << keyword
173 << std::hex
174 << " in ROC 0x" << fCurrentROC_ID << ", bank 0x" << fCurrentBank_ID
175 << std::dec
176 << " at mod " << modnum << ", chan " << channum
177 << QwLog::endl;
178 size_t index = fScaler.size();
179 VQwScaler_Channel* scaler = 0;
180 if (modtype == "SIS3801" || modtype == "SIS3801D24")
181 scaler = new QwSIS3801D24_Channel(keyword);
182 else if (modtype == "SIS3801D32")
183 scaler = new QwSIS3801D32_Channel(keyword);
184 else if (modtype == "STR7200")
185 scaler = new QwSTR7200_Channel(keyword);
186 else {
187 QwError << "Unrecognized module type " << modtype << QwLog::endl;
188 continue;
189 }
190
191 // Differential scaler
192 scaler->SetDifferentialScaler(differential);
193
194 // Register keyword to scaler channel
195 fName_Map[keyword] = index;
196 fSubbank_Map[subbank].at(modnum).at(channum) = index;
197 fModuleChannel_Map[std::pair<Int_t,Int_t>(modnum,channum)] = index;
198 // Store scaler
199 fScaler.push_back(scaler);
200 fNorm.push_back(std::pair<VQwScaler_Channel*,double>(0,1));
201 fBufferOffset.push_back(offset);
202 // Store current normalization
203 norm_channel.push_back(current_norm_channel);
204 norm_factor.push_back(current_norm_factor);
205 }
206 }
207 }
208
209 // Check for normalization names without actual channels
210 for (Name_to_Scaler_Map_t::iterator iter = fName_Map.begin(); iter != fName_Map.end(); iter++) {
211 if (iter->second == -1 && iter->first != default_norm_channel) {
212 QwError << "Normalization channel " << iter->first << " not found!" << QwLog::endl;
213 }
214 }
215
216 // Fill normalization structure
217 fNorm.resize(fScaler.size());
218 for (size_t i = 0; i < fScaler.size(); i++) {
219 Int_t norm_index = norm_channel.at(i)->second;
220 if (norm_index < 0) {
221 // No normalization
222 fNorm.at(i).first = 0;
223 fNorm.at(i).second = 1;
224 } else {
225 // Normalization
226 fNorm.at(i).first = fScaler.at(norm_index);
227 fNorm.at(i).second = norm_factor.at(i);
228 // Prevent corruption of normalization channel itself
229 fNorm.at(norm_index).first = 0;
230 fNorm.at(norm_index).second = 1;
231 }
232 }
233
234 mapstr.Close(); // Close the file (ifstream)
235 return 0;
236}
237
238/**
239 * Load pedestals and calibration factors for scaler channels.
240 *
241 * @return 0 on success.
242 */
243Int_t QwScaler::LoadInputParameters(TString mapfile)
244{
245 // Open the file
246 QwParameterFile mapstr(mapfile.Data());
248 while (mapstr.ReadNextLine()) {
249 mapstr.TrimComment(); // Remove everything after a comment character
250 mapstr.TrimWhitespace(); // Get rid of leading and trailing spaces
251 if (mapstr.LineIsEmpty()) continue;
252
253 TString varname = mapstr.GetTypedNextToken<TString>(); // name of the channel
254 varname.ToLower();
255 varname.Remove(TString::kBoth,' ');
256 Double_t varped = mapstr.GetTypedNextToken<Double_t>(); // value of the pedestal
257 Double_t varcal = mapstr.GetTypedNextToken<Double_t>(); // value of the calibration factor
258 QwVerbose << varname << ": " << QwLog::endl;
259
260 if (fName_Map.count(varname) != 0) {
261 Int_t index = fName_Map[varname];
262 QwMessage << "Parameters scaler channel " << varname << ": "
263 << "ped = " << varped << ", "
264 << "cal = " << varcal << QwLog::endl;
265 fScaler[index]->SetPedestal(varped);
266 fScaler[index]->SetCalibrationFactor(varcal);
267 }
268
269 } // end of loop reading all lines of the pedestal file
270
271 mapstr.Close(); // Close the file (ifstream)
272 return 0;
273}
274
275/**
276 * Clear event data for all scaler channels and reset good event count.
277 */
279{
280 // Clear all scaler channels
281 for (size_t i = 0; i < fScaler.size(); i++) {
282 fScaler.at(i)->ClearEventData();
283 }
284 // Reset good event count
285 fGoodEventCount = 0;
286}
287
288/**
289 * Process the configuration buffer for this subsystem
290 * @param roc_id ROC ID
291 * @param bank_id Subbank ID
292 * @param buffer Buffer to read from
293 * @param num_words Number of words left in buffer
294 * @return Number of words read
295 */
296Int_t QwScaler::ProcessConfigurationBuffer(const ROCID_t /*roc_id*/, const BankID_t /*bank_id*/, UInt_t* /*buffer*/, UInt_t /*num_words*/)
297{
298 return 0;
299}
300
301/**
302 * Process raw buffer data, routing to registered scaler channels.
303 *
304 * @return Number of words consumed from the buffer.
305 */
306Int_t QwScaler::ProcessEvBuffer(const ROCID_t roc_id, const BankID_t bank_id, UInt_t* buffer, UInt_t num_words)
307{
308 // TODO fix :-)
309
310 UInt_t words_read = 0;
311
312 // Get the subbank index (or -1 when no match)
313 Int_t subbank = GetSubbankIndex(roc_id, bank_id);
314
315 if (subbank >= 0 && num_words > 0) {
316
317 // Read header word
318 //UInt_t num_events = buffer[words_read];
319 words_read++;
320 // TODO Multiscaler functionality
321
322 // Read scalers
323 for (size_t modnum = 0; modnum < fSubbank_Map[subbank].size(); modnum++) {
324 for (size_t channum = 0; channum < fSubbank_Map[subbank].at(modnum).size(); channum++) {
325 Int_t index = fSubbank_Map[subbank].at(modnum).at(channum);
326 if (index >= 0) {
327 UInt_t offset = fBufferOffset.at(index);
328 words_read += fScaler[index]->ProcessEvBuffer(&(buffer[offset]), num_words - offset);
329 }
330 }
331 }
332 words_read = num_words;
333
334 }
335
336 return words_read;
337}
338
339/** Process all scaler channels and apply normalization if configured. */
341{
342 // Process the event
343 for (size_t i = 0; i < fScaler.size(); i++) {
344 fScaler.at(i)->ProcessEvent();
345 }
346
347 // Normalization
348 for (size_t i = 0; i < fScaler.size(); i++) {
349 if (fNorm.at(i).first) {
350 fScaler.at(i)->Scale(fNorm.at(i).second);
351 fScaler.at(i)->DivideBy(*(fNorm.at(i).first));
352 }
353 }
354}
355
356/** Construct histograms for all scaler channels. */
357void QwScaler::ConstructHistograms(TDirectory* folder, TString& prefix)
358{
359 for(size_t i = 0; i < fScaler.size(); i++) {
360 fScaler.at(i)->ConstructHistograms(folder, prefix);
361 }
362}
363
364/** Fill histograms for all scaler channels. */
366{
367 for(size_t i = 0; i < fScaler.size(); i++) {
368 fScaler.at(i)->FillHistograms();
369 }
370}
371
372/** Construct TTree branches and backing vectors for all scaler channels. */
373void QwScaler::ConstructBranchAndVector(TTree *tree, TString & prefix, QwRootTreeBranchVector &values)
374{
375 for (size_t i = 0; i < fScaler.size(); i++) {
376 fScaler.at(i)->ConstructBranchAndVector(tree, prefix, values);
377 }
378}
379
380/** Fill tree vector with current scaler channel values. */
382{
383 for(size_t i = 0; i < fScaler.size(); i++) {
384 fScaler.at(i)->FillTreeVector(values);
385 }
386}
387
388#ifdef HAS_RNTUPLE_SUPPORT
389void QwScaler::ConstructNTupleAndVector(std::unique_ptr<ROOT::RNTupleModel>& model, TString& prefix, std::vector<Double_t>& values, std::vector<std::shared_ptr<Double_t>>& fieldPtrs)
390{
391 for (size_t i = 0; i < fScaler.size(); i++) {
392 fScaler.at(i)->ConstructNTupleAndVector(model, prefix, values, fieldPtrs);
393 }
394}
395
396void QwScaler::FillNTupleVector(std::vector<Double_t>& values) const
397{
398 for(size_t i = 0; i < fScaler.size(); i++) {
399 fScaler.at(i)->FillNTupleVector(values);
400 }
401}
402#endif // HAS_RNTUPLE_SUPPORT
403
404/**
405 * Assignment operator: copy all scaler channel values.
406 */
408{
409 if (Compare(value)) {
411 QwScaler* input = dynamic_cast<QwScaler*>(value);
412 for (size_t i = 0; i < fScaler.size(); i++) {
413 *(fScaler.at(i)) = *(input->fScaler.at(i));
414 }
415 }
416 return *this;
417}
418
419/**
420 * Addition-assignment: element-wise addition of scaler channels.
421 */
423{
424 if (Compare(value)) {
425 QwScaler* input = dynamic_cast<QwScaler*>(value);
426 for (size_t i = 0; i < fScaler.size(); i++) {
427 *(fScaler.at(i)) += *(input->fScaler.at(i));
428 }
429 }
430 return *this;
431}
432
433/**
434 * Subtraction-assignment: element-wise subtraction of scaler channels.
435 */
437{
438 if (Compare(value)) {
439 QwScaler* input = dynamic_cast<QwScaler *> (value);
440 for (size_t i = 0; i < fScaler.size(); i++) {
441 *(fScaler.at(i)) -= *(input->fScaler.at(i));
442 }
443 }
444 return *this;
445}
446
447
448/**
449 * Compute element-wise ratios of scaler channels.
450 */
452{
453 if (Compare(numer) && Compare(denom)) {
454 QwScaler* innumer = dynamic_cast<QwScaler*>(numer);
455 QwScaler* indenom = dynamic_cast<QwScaler*>(denom);
456 for (size_t i = 0; i < fScaler.size(); i++) {
457 fScaler.at(i)->Ratio(*(innumer->fScaler.at(i)), *(indenom->fScaler.at(i)));
458 }
459 }
460}
461
462/**
463 * Scale all scaler channels by a common factor.
464 */
465void QwScaler::Scale(Double_t factor)
466{
467 for (size_t i = 0; i < fScaler.size(); i++) {
468 fScaler.at(i)->Scale(factor);
469 }
470}
471
472/**
473 * Accumulate running sums for all scaler channels.
474 */
475void QwScaler::AccumulateRunningSum(VQwSubsystem* value, Int_t count, Int_t ErrorMask)
476{
477 if (Compare(value)) {
478 QwScaler* scaler = dynamic_cast<QwScaler*>(value);
479 for (size_t i = 0; i < fScaler.size(); i++) {
480 fScaler.at(i)->AccumulateRunningSum(scaler->fScaler.at(i), count, ErrorMask);
481 }
482 }
483}
484
485/**
486 * Deaccumulate running sums for all scaler channels.
487 */
489{
490 if (Compare(value)) {
491 QwScaler* scaler = dynamic_cast<QwScaler*>(value);
492 for (size_t i = 0; i < fScaler.size(); i++) {
493 fScaler.at(i)->DeaccumulateRunningSum(scaler->fScaler.at(i), ErrorMask);
494 }
495 }
496}
497
498/**
499 * Calculate running averages for all scaler channels.
500 */
502{
503 for (size_t i = 0; i < fScaler.size(); i++) {
504 fScaler.at(i)->CalculateRunningAverage();
505 }
506}
507
508Int_t QwScaler::LoadEventCuts(TString /*filename*/)
509{
510 return 0;
511}
512
514{
515 return true;
516}
517
518/*Bool_t QwScaler::CheckForBurpFail(const VQwSubsystem *subsys){
519 Bool_t burpstatus = kFALSE;
520 VQwSubsystem* tmp = const_cast<VQwSubsystem *>(subsys);
521 if(Compare(tmp)) {
522 const QwScaler* input = dynamic_cast<const QwScaler*>(subsys);
523 for (size_t i = 0; i < input->fScaler.size(); i++) {
524 //QwError << "************* test " << typeid(this->fScaler[i]).name() << "*****************" << QwLog::endl;
525 burpstatus |= (this->fScaler.at(i))->CheckForBurpFail(input->fScaler.at(i));
526 }
527 }
528 return burpstatus;
529}*/
530
534
536{
537}
538
540{
541 return 0;
542}
543
544Int_t QwScaler::GetChannelIndex(TString channelName, UInt_t module_number)
545{
546 return 0;
547}
548
549
550/**
551 * Compare two scaler objects
552 * @param value Object to compare with
553 * @return kTRUE if the object is equal
554 */
556{
557 // Immediately fail on null objects
558 if (value == 0) return kFALSE;
559
560 // Continue testing on actual object
561 Bool_t result = kTRUE;
562 if (typeid(*value) != typeid(*this)) {
563 result = kFALSE;
564
565 } else {
566 QwScaler* input = dynamic_cast<QwScaler*> (value);
567 if (input->fScaler.size() != fScaler.size()) {
568 result = kFALSE;
569 }
570 }
571 return result;
572}
573
574/**
575 * Print some debugging output for the subcomponents
576 */
578{
580
581 QwOut << " there are " << fScaler.size() << " scaler channels" << QwLog::endl;
582
583 for (size_t i = 0; i < fScaler.size(); i++) {
584 QwOut << " scaler " << i << ": ";
585 fScaler.at(i)->PrintInfo();
586 }
587}
588
589/**
590 * Print the value for the subcomponents
591 */
593{
594 QwMessage << "=== QwScaler: " << GetName() << " ===" << QwLog::endl;
595 for(size_t i = 0; i < fScaler.size(); i++) {
596 fScaler.at(i)->PrintValue();
597 }
598}
class QwScaler_Channel< 0x00ffffff, 0 > QwSIS3801D24_Channel
class QwScaler_Channel< 0xffffffff, 0 > QwSTR7200_Channel
class QwScaler_Channel< 0xffffffff, 0 > QwSIS3801D32_Channel
#define QwVerbose
Predefined log drain for verbose messages.
Definition QwLog.h:54
#define QwOut
Predefined log drain for explicit output.
Definition QwLog.h:34
#define QwError
Predefined log drain for errors.
Definition QwLog.h:39
#define QwMessage
Predefined log drain for regular messages.
Definition QwLog.h:49
Parameter file parsing and management.
ULong64_t BankID_t
Definition QwTypes.h:21
UInt_t ROCID_t
Definition QwTypes.h:20
Scaler subsystem for counting and rate measurements.
static std::ostream & endl(std::ostream &)
End of the line.
Definition QwLog.cc:297
Command-line and configuration file options processor.
Definition QwOptions.h:141
Configuration file parser with flexible tokenization and search capabilities.
T GetTypedNextToken()
Get next token into specific type.
void TrimWhitespace(TString::EStripType head_tail=TString::kBoth)
Bool_t HasVariablePair(const std::string &separatorchars, std::string &varname, std::string &varvalue)
void SetCommentChars(const std::string value)
Set various sets of special characters.
void AddBreakpointKeyword(std::string keyname)
void TrimComment(const char commentchar)
std::string GetNextToken(const std::string &separatorchars)
Get next token as a string.
static UInt_t GetUInt(const TString &varvalue)
const std::pair< TString, TString > GetParamFileNameContents()
A helper class to manage a vector of branch entries for ROOT trees.
Definition QwRootFile.h:55
Abstract base class for scaler channels.
virtual void SetDifferentialScaler(Bool_t diff)
BankID_t fCurrentBank_ID
Bank ID (and Marker word) that is currently being processed;.
Int_t GetSubbankIndex() const
virtual VQwSubsystem & operator=(VQwSubsystem *value)
Assignment Note: Must be called at the beginning of all subsystems routine call to operator=(VQwSubsy...
virtual void PrintInfo() const
Print some information about the subsystem.
void RegisterRocBankMarker(QwParameterFile &mapstr)
static void DefineOptions()
Define options function (note: no virtual static functions in C++)
TString GetName() const
std::map< TString, TString > fDetectorMaps
Map of file name to full path or content.
VQwSubsystem(const TString &name)
Constructor with name.
ROCID_t fCurrentROC_ID
ROC ID that is currently being processed.
void ClearEventData() override
Definition QwScaler.cc:278
void Scale(Double_t factor) override
Definition QwScaler.cc:465
Int_t LoadChannelMap(TString mapfile) override
Definition QwScaler.cc:64
Int_t LoadInputParameters(TString pedestalfile) override
Definition QwScaler.cc:243
Bool_t Compare(VQwSubsystem *source)
Definition QwScaler.cc:555
Int_t LoadEventCuts(TString filename) override
Optional event cut file.
Definition QwScaler.cc:508
void AccumulateRunningSum(VQwSubsystem *value, Int_t count=0, Int_t ErrorMask=0xFFFFFFF) override
Definition QwScaler.cc:475
void ProcessOptions(QwOptions &options) override
Definition QwScaler.cc:29
Bool_t ApplySingleEventCuts() override
Apply the single event cuts.
Definition QwScaler.cc:513
void CalculateRunningAverage() override
Definition QwScaler.cc:501
void DeaccumulateRunningSum(VQwSubsystem *value, Int_t ErrorMask=0xFFFFFFF) override
Definition QwScaler.cc:488
VQwSubsystem & operator-=(VQwSubsystem *value) override
Definition QwScaler.cc:436
virtual void ConstructHistograms()
Construct the histograms for this subsystem.
Name_to_Scaler_Map_t fName_Map
Definition QwScaler.h:145
void Ratio(VQwSubsystem *value1, VQwSubsystem *value2) override
Definition QwScaler.cc:451
Int_t ProcessConfigurationBuffer(const ROCID_t roc_id, const BankID_t bank_id, UInt_t *buffer, UInt_t num_words) override
Definition QwScaler.cc:296
std::vector< std::pair< VQwScaler_Channel *, double > > fNorm
Definition QwScaler.h:150
void FillHistograms() override
Definition QwScaler.cc:365
Module_Channel_to_Scaler_Map_t fModuleChannel_Map
Definition QwScaler.h:141
Int_t ProcessEvBuffer(const ROCID_t roc_id, const BankID_t bank_id, UInt_t *buffer, UInt_t num_words) override
Definition QwScaler.cc:306
UInt_t GetEventcutErrorFlag() override
Return the error flag to the top level routines related to stability checks and ErrorFlag updates.
Definition QwScaler.cc:539
std::vector< UInt_t > fBufferOffset
Definition QwScaler.h:149
void ConstructBranchAndVector(TTree *tree, TString &prefix, QwRootTreeBranchVector &values) override
Definition QwScaler.cc:373
void IncrementErrorCounters() override
Increment the error counters.
Definition QwScaler.cc:531
std::vector< VQwScaler_Channel * > fScaler
Definition QwScaler.h:148
QwScaler()
Private default constructor (not implemented, will throw linker error on use)
VQwSubsystem & operator=(VQwSubsystem *value) override
Definition QwScaler.cc:407
void FillTreeVector(QwRootTreeBranchVector &values) const override
Definition QwScaler.cc:381
void PrintErrorCounters() const override
Definition QwScaler.cc:535
~QwScaler() override
Destructor.
Definition QwScaler.cc:47
Subbank_to_Scaler_Map_t fSubbank_Map
Definition QwScaler.h:137
VQwSubsystem & operator+=(VQwSubsystem *value) override
Definition QwScaler.cc:422
void PrintInfo() const override
Definition QwScaler.cc:577
Int_t GetChannelIndex(TString channelName, UInt_t module_number)
Definition QwScaler.cc:544
void ProcessEvent() override
Definition QwScaler.cc:340
void PrintValue() const override
Definition QwScaler.cc:592
Int_t fGoodEventCount
Definition QwScaler.h:133
VQwSubsystemParity()
Private default constructor (not implemented, will throw linker error on use)