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