16#ifdef HAS_RNTUPLE_SUPPORT
18#include <ROOT/RNTupleModel.hxx>
19#include <ROOT/RNTupleWriter.hxx>
25#ifdef __USE_DATABASE__
26#include "QwParitySchema.h"
39 (
"QwDetectorArray.normalize",
40 po::value<bool>()->default_bool_value(
true),
41 "Normalize the detectors by beam current");
44 (
"QwDetectorArray.norm_threshold",
45 po::value<double>()->default_value(2.5),
46 "Normalize the detectors for currents above this value");
60 QwWarning <<
"QwDetectorArray::ProcessOptions: "
61 <<
"Detector yields WILL NOT be normalized."
82 Bool_t status = kTRUE;
134 device_type.ToLower();
135 device_prop.ToLower();
139 if (device_type ==
"integrationpmt") {
143 }
else if (device_type ==
"combinedpmt") {
153 if (tmp_channel == NULL) {
155 QwError <<
"QwBeamLine::PublishInternalValues(): " << publish_name <<
" not found" <<
QwLog::endl;
160 QwDebug <<
"QwBeamLine::PublishInternalValues(): " << publish_name <<
" found" <<
QwLog::endl;
181 Bool_t status = kFALSE;
188 if(device_name.CompareTo(
fMainDetID[i].fdetectorname)!=0)
continue;
211 QwDebug <<
"VQwDetectorArray::PublishByRequest: Failed to publish channel name: " << device_name <<
QwLog::endl;
228 Bool_t ldebug=kFALSE;
230 std::vector<TString> combinedchannelnames;
231 std::vector<Double_t> weight;
233 Int_t currentsubbankindex=-1;
235 Double_t abs_saturation_limit = 8.5;
236 Bool_t bAssignedLimit = kFALSE;
240 TString varname, varvalue;
247 size_t vqwk_buffer_offset = 0;
252 if (mapstr.
PopValue(
"abs_saturation_limit",value)) {
253 abs_saturation_limit=value;
254 bAssignedLimit = kTRUE;
257 if (mapstr.
PopValue(
"sample_size",value)) {
261 if (mapstr.
PopValue(
"vqwk_buffer_offset",value)) {
262 vqwk_buffer_offset=value;
270 Bool_t lineok = kTRUE;
271 TString keyword =
"";
272 TString keyword2 =
"";
273 TString modtype =
"";
274 TString dettype =
"";
283 if (modtype ==
"VPMT") {
291 combinedchannelnames.clear();
293 for (
int i=0; i<combinedchans; i++){
296 nameofcombinedchan.ToLower();
297 combinedchannelnames.push_back(nameofcombinedchan);
302 for (
int i=0; i<combinedchans; i++) {
342 if (modtype==
"MOLLERADC") {
344 UInt_t decode_mode = 0;
345 mapstr.
ReturnValue(
"molleradc_decode_mode", decode_mode)
356 }
else if (modtype==
"VPMT") {
359 localMainDetID.
fWeight = weight;
364 QwError <<
"VQwDetectorArray::LoadChannelMap: Unknown module type: "
365 << modtype <<
", the detector "<<namech<<
" will not be decoded "
375 QwError <<
"VQwDetectorArray::LoadChannelMap: Unknown detector type: "
376 << dettype <<
", the detector "<<namech<<
" will not be decoded "
385 if (localMainDetID.
fIndex==-1){
391 if (keyword==
"not_blindable" || keyword2==
"not_blindable")
397 if (keyword==
"not_normalizable" || keyword2==
"not_normalizable")
415 if (keyword==
"not_normalizable" || keyword2==
"not_normalizable")
421 if (keyword==
"not_blindable" || keyword2 ==
"not_blindable")
435 localMainDetID.
Print();
436 std::cout<<
"line ok=";
439 std::cout<<
"TRUE"<<std::endl;
442 std::cout<<
"FALSE"<<std::endl;
459 std::cout<<
"fMainDetID[i].fCombinedChannelNames.size()="
460 <<
fMainDetID[i].fCombinedChannelNames.size()<<std::endl<<
"name list: ";
462 for (
size_t n=0; n<
fMainDetID[i].fCombinedChannelNames.size(); n++)
463 std::cout<<
" "<<
fMainDetID[i].fCombinedChannelNames[n];
465 std::cout<<std::endl;
470 for (
size_t j=0; j<
fMainDetID[i].fCombinedChannelNames.size(); j++) {
477 std::cout<<
"found a to-be-combined channel candidate"<<std::endl;
485 if ((Int_t)
fMainDetID[i].fCombinedChannelNames.size()==chanmatched) {
487 for (
size_t l=0; l<
fMainDetID[i].fCombinedChannelNames.size(); l++) {
498 std::cout<<
"linked a combined channel"<<std::endl;
501 std::cerr<<
"cannot combine void channels for "<<
fMainDetID[i].fdetectorname<<std::endl;
511 std::unique_ptr<QwParameterFile> section;
512 std::vector<TString> publishinfo;
515 if (varvalue ==
"PUBLISH") {
519 while (section->ReadNextLine()) {
521 section->TrimComment();
522 section->TrimWhitespace();
524 for (
int ii = 0; ii < 4; ii++) {
526 varvalue = section->GetNextToken().c_str();
528 if (varvalue.Length()) {
530 publishinfo.push_back(varvalue);
534 if (publishinfo.size() == 4)
554 std::cout<<
"Done with Load channel map\n";
568 device_type.ToLower();
570 device_name.ToLower();
573 if (det_index == -1) {
608 Bool_t ldebug=kFALSE;
614 Double_t varnormrate;
615 Double_t varvoltperhz;
633 if (ldebug)std::cout<<
" line read so far ="<<lineread<<
"\n";
643 varname.Remove(TString::kBoth,
' ');
651 std::cout <<
"Inputs for channel " << varname <<
": ped=" << varped <<
": cal=" << varcal <<
"\n"
652 <<
": varnormrate=" << varnormrate <<
"\n"
653 <<
": varvoltperhz=" << varvoltperhz <<
"\n"
654 <<
": asym=" << varasym <<
"\n"
655 <<
": C_x=" << varcx <<
": C_y=" << varcy <<
"\n"
656 <<
": C_xp=" << varcxp <<
": C_yp=" << varcyp <<
"\n"
657 <<
": C_e=" << varce <<
"\n";
684 std::cout<<
" line read in the pedestal + cal file ="<<lineread<<
" \n";
702 Bool_t ldebug=kFALSE;
708 Double_t varnormrate;
709 Double_t varvoltperhz;
727 if (ldebug)std::cout<<
" line read so far ="<<lineread<<
"\n";
737 varname.Remove(TString::kBoth,
' ');
751 std::cout <<
"Inputs for channel " << varname <<
": ped=" << varped <<
": cal=" << varcal <<
"\n"
752 <<
": varnormrate=" << varnormrate <<
"\n"
753 <<
": varvoltperhz=" << varvoltperhz <<
"\n"
754 <<
": asym=" << varasym <<
"\n"
755 <<
": C_x=" << varcx <<
": C_y=" << varcy <<
"\n"
756 <<
": C_xp=" << varcxp <<
": C_yp=" << varcyp <<
"\n"
757 <<
": C_e=" << varce <<
"\n";
789 std::cout<<
" line read in the pedestal + cal file ="<<lineread<<
" \n";
834 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
846 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
858 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
870 std::vector<UInt_t> elements;
874 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
884 std::vector<UInt_t> subbankheader;
885 std::vector<UInt_t> rocheader;
887 if (elements.size() > 0) {
890 subbankheader.clear();
891 subbankheader.push_back(elements.size() + 1);
892 subbankheader.push_back((
fCurrentBank_ID << 16) | (0x01 << 8) | (1 & 0xff));
897 rocheader.push_back(subbankheader.size() + elements.size() + 1);
898 rocheader.push_back((
fCurrentROC_ID << 16) | (0x10 << 8) | (1 & 0xff));
902 buffer.insert(buffer.end(), rocheader.begin(), rocheader.end());
903 buffer.insert(buffer.end(), subbankheader.begin(), subbankheader.end());
904 buffer.insert(buffer.end(), elements.begin(), elements.end());
999 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
1026 Bool_t lkDEBUG=kFALSE;
1030 if (index>=0 && num_words>0) {
1034 std::cout <<
"VQwDetectorArray::ProcessEvBuffer: "
1035 <<
"Begin processing ROC" << roc_id
1036 <<
" and subbank "<<bank_id
1037 <<
" number of words="<<num_words<<std::endl;
1047 std::cout<<
"found IntegrationPMT data for "<<
fMainDetID[i].fdetectorname<<std::endl;
1048 std::cout<<
"word left to read in this buffer:"<<num_words-
fMainDetID[i].fWordInSubbank<<std::endl;
1071 Bool_t status=kTRUE;
1076 std::cout<<
"******* VQwDetectorArray::SingleEventCuts()->IntegrationPMT[ "<<i<<
" , "<<
fIntegrationPMT[i].GetElementName()<<
" ] ******\n";
1083 std::cout<<
"******* VQwDetectorArray::SingleEventCuts()->CombinedPMT[ "<<i<<
" , "<<
fCombinedPMT[i].GetElementName()<<
" ] ******\n";
1157 Bool_t burpstatus = kFALSE;
1258 std::cout<<
"VQwDetectorArray::ProcessEvent_2(): processing with exchanged data"<<std::endl;
1259 std::cout<<
"pedestal, calfactor, average volts = "<<pedestal<<
", "<<calfactor<<
", "<<volts<<std::endl;
1268 QwWarning<<
"VQwDetectorArray::ProcessEvent_2(): could not get all external values."<<
QwLog::endl;
1330 std::unique_ptr<QwParameterFile> nextmodule;
1332 tmp=
"QwIntegrationPMT";
1344 tmp=
"QwCombinedPMT";
1370#ifdef HAS_RNTUPLE_SUPPORT
1371void VQwDetectorArray::ConstructNTupleAndVector(std::unique_ptr<ROOT::RNTupleModel>& model, TString& prefix, std::vector<Double_t>& values, std::vector<std::shared_ptr<Double_t>>& fieldPtrs) {
1374 fIntegrationPMT[i].ConstructNTupleAndVector(model, prefix, values, fieldPtrs);
1377 fCombinedPMT[i].ConstructNTupleAndVector(model, prefix, values, fieldPtrs);
1383void VQwDetectorArray::FillNTupleVector(std::vector<Double_t>& values)
const {
1410 if (
typeid(*value)!=
typeid(*
this)) {
1439 if (
this != value &&
Compare(value)) {
1597 Bool_t ldebug=kFALSE;
1601 std::cout<<
"VQwDetectorArray::GetDetectorIndex\n";
1602 std::cout<<
"type_id=="<<type_id<<
" name="<<name<<
"\n";
1603 std::cout<<
fMainDetID.size()<<
" already registered detector\n";
1615 std::cout<<
"testing against ("<<
fMainDetID[i].fTypeID
1616 <<
","<<
fMainDetID[i].fdetectorname<<
")=>"<<result<<
"\n";
1627 TString tmpname = name;
1644 QwMessage <<
"VQwDetectorArray::GetIntegrationPMT: cannot find channel " << tmpname <<
QwLog::endl;
1652 TString tmpname = name;
1665 QwMessage <<
"VQwDetectorArray::GetCombinedPMT: cannot find channel " << tmpname <<
QwLog::endl;
1679 catch (std::exception& e) {
1681 std::cerr << e.what() << std::endl;
1689#ifdef __USE_DATABASE__
1692 Bool_t local_print_flag =
false;
1694 if(local_print_flag) {
1696 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1698 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1702 std::vector<QwDBInterface> interface;
1703 std::vector<QwParitySchema::md_data_row> entrylist;
1705 UInt_t analysis_id = db->GetAnalysisID();
1707 TString measurement_type;
1720 for(j=0; j<interface.size(); j++) {
1722 interface.at(j).SetAnalysisID( analysis_id );
1723 interface.at(j).SetMainDetectorID( db );
1724 interface.at(j).SetMeasurementTypeID( measurement_type );
1725 interface.at(j).PrintStatus( local_print_flag );
1726 interface.at(j).AddThisEntryToList( entrylist );
1737 for(j=0; j<interface.size(); j++) {
1739 interface.at(j).SetAnalysisID( analysis_id );
1740 interface.at(j).SetMainDetectorID( db );
1741 interface.at(j).SetMeasurementTypeID( measurement_type );
1742 interface.at(j).PrintStatus( local_print_flag );
1743 interface.at(j).AddThisEntryToList( entrylist );
1748 if(local_print_flag) {
1757 if( entrylist.size() ) {
1758 auto c = db->GetScopedConnection();
1759 for (
const auto& entry : entrylist) {
1760 c->QueryExecute(entry.insert_into());
1763 QwMessage <<
"VQwDetectorArray::FillDB :: This is the case when the entrylist contains nothing in "<< datatype.Data() <<
QwLog::endl;
1782 std::cout<<
"Name of the subsystem ="<<
fSystemName<<
"\n";
1784 std::cout<<
"there are "<<
fIntegrationPMT.size()<<
" IntegrationPMT \n";
1785 std::cout<<
" "<<
fCombinedPMT.size()<<
" CombinedPMT \n";
1787 std::cout<<
" Printing Running AVG and other channel info"<<std::endl;
1800 std::cout<<
"============================="<<std::endl;
1801 std::cout<<
" Detector ID="<<i<<std::endl;
1810#ifdef __USE_DATABASE__
1813 Bool_t local_print_flag =
false;
1814 if(local_print_flag){
1816 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1818 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1823 std::vector<QwErrDBInterface> interface;
1824 std::vector<QwParitySchema::md_errors_row> entrylist;
1826 UInt_t analysis_id = db->GetAnalysisID();
1837 for(j=0; j<interface.size(); j++) {
1839 interface.at(j).SetAnalysisID ( analysis_id );
1840 interface.at(j).SetMainDetectorID ( db );
1841 interface.at(j).PrintStatus ( local_print_flag );
1842 interface.at(j).AddThisEntryToList( entrylist );
1855 for(j=0; j<interface.size(); j++) {
1857 interface.at(j).SetAnalysisID ( analysis_id );
1858 interface.at(j).SetMainDetectorID ( db );
1859 interface.at(j).PrintStatus ( local_print_flag );
1860 interface.at(j).AddThisEntryToList( entrylist );
1866 if(local_print_flag) {
1875 if( entrylist.size() ) {
1876 auto c = db->GetScopedConnection();
1877 for (
const auto& entry : entrylist) {
1878 c->QueryExecute(entry.insert_into());
1881 QwMessage <<
"VQwDetectorArray::FillErrDB :: This is the case when the entrylist contains nothing in "<< datatype.Data() <<
QwLog::endl;
1889 Bool_t local_print_flag =
false;
1890 Bool_t local_add_element= type.Contains(
"yield");
1892 if(local_print_flag){
1894 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1896 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1900 TString element_name =
"";
1901 Double_t element_value = 0.0;
1902 Double_t element_value_err = 0.0;
1903 Double_t element_value_width = 0.0;
1906 Bool_t local_add_these_elements=
false;
1908 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
1912 element_value = 0.0;
1913 element_value_err = 0.0;
1914 element_value_width = 0.0;
1917 local_add_these_elements=element_name.Contains(
"sam");
1919 if(local_add_these_elements&&local_add_element){
1929 if(local_ps_element) {
1931 element_value = tmp_channel->
GetValue();
1935 local_ps_element->
Set(type, element_value, element_value_err, element_value_width);
1939 if( local_print_flag && local_ps_element) {
1941 printf(
"Type %12s, Element %32s, value %12.4e error %8.4e width %12.4e\n",
1942 type.Data(), element_name.Data(), element_value, element_value_err, element_value_width);
1956 std::cout<<std::endl<<
"Detector name= "<<
fdetectorname<<std::endl;
1959 std::cout<<
"module type= "<<
fmoduletype<<std::endl;
1961 std::cout<<
"Index of this detector in the vector of similar detector= "<<
fIndex<<std::endl;
1962 std::cout<<
"Subelement index= "<<
fSubelement<<std::endl;
1963 std::cout<<
"==========================================\n";
Array container for managing multiple subsystems.
EQwPMTInstrumentType GetQwPMTInstrumentType(TString name)
TString GetQwPMTInstrumentTypeName(EQwPMTInstrumentType type)
UInt_t GetGlobalErrorFlag(TString evtype, Int_t evMode, Double_t stabilitycut)
A logfile class, based on an identical class in the Hermes analyzer.
#define QwError
Predefined log drain for errors.
#define QwWarning
Predefined log drain for warnings.
#define QwMessage
Predefined log drain for regular messages.
#define QwDebug
Predefined log drain for debugging output.
Prompt summary data management.
Virtual base class for detector arrays (PMTs, etc.)
Bool_t RequestExternalValue(const TString &name, VQwHardwareChannel *value) const
Bool_t PublishInternalValue(const TString name, const TString desc, const VQwHardwareChannel *element) const
static TString DetermineMeasurementTypeID(TString type, TString suffix="", Bool_t forcediffs=kFALSE)
static std::ostream & endl(std::ostream &)
End of the line.
Concrete hardware channel for Moller ADC modules (6x32-bit words)
static void PrintErrorCounterHead()
static void SetDecodeMode(UInt_t input)
static Int_t GetBufferOffset(Int_t moduleindex, Int_t channelindex)
static void PrintErrorCounterTail()
Command-line and configuration file options processor.
T GetValue(const std::string &key)
Get a templated value.
po::options_description_easy_init AddOptions(const std::string &blockname="Specialized options")
Add an option to a named block or create new block.
Configuration file parser with flexible tokenization and search capabilities.
T GetTypedNextToken()
Get next token into specific type.
std::unique_ptr< QwParameterFile > ReadUntilNextModule(const bool add_current_line=false)
Bool_t PopValue(const std::string keyname, T &retvalue)
void TrimWhitespace(TString::EStripType head_tail=TString::kBoth)
void SetCommentChars(const std::string value)
Set various sets of special characters.
void TrimComment(const char commentchar)
const std::pair< TString, TString > GetParamFileNameContents()
Bool_t FileHasModuleHeader(const std::string &secname)
Bool_t ReturnValue(const std::string keyname, T &retvalue)
std::unique_ptr< QwParameterFile > ReadNextSection(std::string &secname, const bool keep_header=false)
void Set(TString type, const Double_t a, const Double_t a_err, const Double_t a_width)
void AddElement(PromptSummaryElement *in)
PromptSummaryElement * GetElementByName(TString name)
A helper class to manage a vector of branch entries for ROOT trees.
The pure virtual base class of all data elements.
Abstract base for concrete hardware channels implementing dual-operator pattern.
Double_t GetValueError() const
Double_t GetValueWidth() const
Double_t GetValue() const
std::vector< std::vector< TString > > fPublishList
BankID_t fCurrentBank_ID
Bank ID (and Marker word) that is currently being processed;.
TString fSystemName
Name of this subsystem.
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...
void RegisterRocBankMarker(QwParameterFile &mapstr)
static void DefineOptions()
Define options function (note: no virtual static functions in C++)
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.
Combines multiple integration PMTs into weighted sum/average.
void SetNormalizability(Bool_t isnormalizable)
void SetBlindability(Bool_t isblindable)
const QwMollerADC_Channel * GetChannel(const TString name) const
Integration PMT providing yield/diff/asym readout from Moller ADC.
const QwMollerADC_Channel * GetChannel(const TString name) const
void SetBlindability(Bool_t isblindable)
void SetNormalizability(Bool_t isnormalizable)
Identifier and mapping information for detector-array channels.
std::vector< Double_t > fWeight
std::vector< TString > fCombinedChannelNames
EQwPMTInstrumentType fTypeID
Int_t LoadInputParameters(TString pedestalfile) override
Mandatory parameter file definition.
Bool_t ApplySingleEventCuts() override
Apply the single event cuts.
void LoadEventCuts_Fin(Int_t &eventcut_flag) override
const QwCombinedPMT * GetCombinedPMT(const TString name) const
void Ratio(VQwSubsystem *numer, VQwSubsystem *denom) override
Int_t GetDetectorIndex(EQwPMTInstrumentType TypeID, TString name)
void ProcessOptions(QwOptions &options) override
void AccumulateRunningSum(VQwSubsystem *value, Int_t count=0, Int_t ErrorMask=0xFFFFFFF) override
Update the running sums for devices.
const QwIntegrationPMT * GetChannel(const TString name) const
EQwPMTInstrumentType GetDetectorTypeID(TString name)
void DoNormalization(Double_t factor=1.0)
void LoadMockDataParameters(TString pedestalfile) override
VQwDetectorArray()
Private default constructor (not implemented, will throw linker error on use)
QwBeamAngle fTargetXprime
void FillTreeVector(QwRootTreeBranchVector &values) const override
Fill the tree vector.
Int_t LoadChannelMap(TString mapfile) override
void IncrementErrorCounters() override
Increment the error counters.
void DeaccumulateRunningSum(VQwSubsystem *value, Int_t ErrorMask=0xFFFFFFF) override
remove one entry from the running sums for devices
void ConstructBranch(TTree *tree, TString &prefix) override
Construct the branch and tree vector.
void WritePromptSummary(QwPromptSummary *ps, TString type) override
Int_t ProcessEvBuffer(const ROCID_t roc_id, const BankID_t bank_id, UInt_t *buffer, UInt_t num_words) override
TODO: The non-event-type-aware ProcessEvBuffer routine should be replaced with the event-type-aware v...
std::vector< QwIntegrationPMT > fIntegrationPMT
virtual void ConstructHistograms()
Construct the histograms for this subsystem.
Bool_t CheckForBurpFail(const VQwSubsystem *subsys) override
Report the number of events failed due to HW and event cut failures.
void LoadEventCuts_Line(QwParameterFile &mapstr, TString &varvalue, Int_t &eventcut_flag) override
Bool_t Compare(VQwSubsystem *source)
VQwSubsystem & operator-=(VQwSubsystem *value) override
void PrintDetectorID() const
void PrintErrorCounters() const override
Bool_t bIsExchangedDataValid
QwBeamAngle fTargetYprime
Int_t ProcessConfigurationBuffer(const ROCID_t roc_id, const BankID_t bank_id, UInt_t *buffer, UInt_t num_words) override
static const Bool_t bDEBUG
void ExchangeProcessedData() override
Bool_t PublishInternalValues() const override
std::vector< QwDetectorArrayID > fMainDetID
void EncodeEventData(std::vector< UInt_t > &buffer) override
void Normalize(VQwDataElement *denom)
VQwSubsystem & operator+=(VQwSubsystem *value) override
QwBeamCharge fTargetCharge
std::vector< QwCombinedPMT > fCombinedPMT
VQwSubsystem & operator=(VQwSubsystem *value) override
Assignment Note: Must be called at the beginning of all subsystems routine call to operator=(VQwSubsy...
void PrintValue() const override
Print values of all channels.
void SetRandomEventAsymmetry(Double_t asymmetry)
void ConstructBranchAndVector(TTree *tree, TString &prefix, QwRootTreeBranchVector &values) override
Construct the branch and tree vector.
UInt_t GetEventcutErrorFlag() override
Return the error flag to the top level routines related to stability checks and ErrorFlag updates.
Bool_t PublishByRequest(TString device_name) override
void SetRandomEventParameters(Double_t mean, Double_t sigma)
void PrintInfo() const override
Print some information about the subsystem.
void CalculateRunningAverage() override
Calculate the average for all good events.
void Scale(Double_t factor) override
void ProcessEvent() override
void RandomizeMollerEvent(int helicity)
void ClearEventData() override
void ProcessEvent_2() override
Process the event data again, including data from other subsystems. Not all derived classes will requ...
const QwIntegrationPMT * GetIntegrationPMT(const TString name) const
void RandomizeEventData(int helicity=0, Double_t time=0.0) override
QwBeamEnergy fTargetEnergy
void FillHistograms() override
Fill the histograms for this subsystem.
virtual void FillDB(QwParityDB *, TString)
Fill the database.
virtual UInt_t UpdateErrorFlag()
Uses the error flags of contained data elements to update Returns the error flag to the top level rou...
virtual void FillErrDB(QwParityDB *, TString)