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") {
351 }
else if (modtype==
"VPMT") {
354 localMainDetID.
fWeight = weight;
359 QwError <<
"VQwDetectorArray::LoadChannelMap: Unknown module type: "
360 << modtype <<
", the detector "<<namech<<
" will not be decoded "
370 QwError <<
"VQwDetectorArray::LoadChannelMap: Unknown detector type: "
371 << dettype <<
", the detector "<<namech<<
" will not be decoded "
380 if (localMainDetID.
fIndex==-1){
386 if (keyword==
"not_blindable" || keyword2==
"not_blindable")
392 if (keyword==
"not_normalizable" || keyword2==
"not_normalizable")
410 if (keyword==
"not_normalizable" || keyword2==
"not_normalizable")
416 if (keyword==
"not_blindable" || keyword2 ==
"not_blindable")
430 localMainDetID.
Print();
431 std::cout<<
"line ok=";
434 std::cout<<
"TRUE"<<std::endl;
437 std::cout<<
"FALSE"<<std::endl;
454 std::cout<<
"fMainDetID[i].fCombinedChannelNames.size()="
455 <<
fMainDetID[i].fCombinedChannelNames.size()<<std::endl<<
"name list: ";
457 for (
size_t n=0; n<
fMainDetID[i].fCombinedChannelNames.size(); n++)
458 std::cout<<
" "<<
fMainDetID[i].fCombinedChannelNames[n];
460 std::cout<<std::endl;
465 for (
size_t j=0; j<
fMainDetID[i].fCombinedChannelNames.size(); j++) {
472 std::cout<<
"found a to-be-combined channel candidate"<<std::endl;
480 if ((Int_t)
fMainDetID[i].fCombinedChannelNames.size()==chanmatched) {
482 for (
size_t l=0; l<
fMainDetID[i].fCombinedChannelNames.size(); l++) {
493 std::cout<<
"linked a combined channel"<<std::endl;
496 std::cerr<<
"cannot combine void channels for "<<
fMainDetID[i].fdetectorname<<std::endl;
506 std::unique_ptr<QwParameterFile> section;
507 std::vector<TString> publishinfo;
510 if (varvalue ==
"PUBLISH") {
514 while (section->ReadNextLine()) {
516 section->TrimComment();
517 section->TrimWhitespace();
519 for (
int ii = 0; ii < 4; ii++) {
521 varvalue = section->GetNextToken().c_str();
523 if (varvalue.Length()) {
525 publishinfo.push_back(varvalue);
529 if (publishinfo.size() == 4)
549 std::cout<<
"Done with Load channel map\n";
563 device_type.ToLower();
565 device_name.ToLower();
568 if (det_index == -1) {
603 Bool_t ldebug=kFALSE;
609 Double_t varnormrate;
610 Double_t varvoltperhz;
628 if (ldebug)std::cout<<
" line read so far ="<<lineread<<
"\n";
638 varname.Remove(TString::kBoth,
' ');
646 std::cout <<
"Inputs for channel " << varname <<
": ped=" << varped <<
": cal=" << varcal <<
"\n"
647 <<
": varnormrate=" << varnormrate <<
"\n"
648 <<
": varvoltperhz=" << varvoltperhz <<
"\n"
649 <<
": asym=" << varasym <<
"\n"
650 <<
": C_x=" << varcx <<
": C_y=" << varcy <<
"\n"
651 <<
": C_xp=" << varcxp <<
": C_yp=" << varcyp <<
"\n"
652 <<
": C_e=" << varce <<
"\n";
679 std::cout<<
" line read in the pedestal + cal file ="<<lineread<<
" \n";
697 Bool_t ldebug=kFALSE;
703 Double_t varnormrate;
704 Double_t varvoltperhz;
722 if (ldebug)std::cout<<
" line read so far ="<<lineread<<
"\n";
732 varname.Remove(TString::kBoth,
' ');
746 std::cout <<
"Inputs for channel " << varname <<
": ped=" << varped <<
": cal=" << varcal <<
"\n"
747 <<
": varnormrate=" << varnormrate <<
"\n"
748 <<
": varvoltperhz=" << varvoltperhz <<
"\n"
749 <<
": asym=" << varasym <<
"\n"
750 <<
": C_x=" << varcx <<
": C_y=" << varcy <<
"\n"
751 <<
": C_xp=" << varcxp <<
": C_yp=" << varcyp <<
"\n"
752 <<
": C_e=" << varce <<
"\n";
784 std::cout<<
" line read in the pedestal + cal file ="<<lineread<<
" \n";
829 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
841 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
853 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
865 std::vector<UInt_t> elements;
869 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
879 std::vector<UInt_t> subbankheader;
880 std::vector<UInt_t> rocheader;
882 if (elements.size() > 0) {
885 subbankheader.clear();
886 subbankheader.push_back(elements.size() + 1);
887 subbankheader.push_back((
fCurrentBank_ID << 16) | (0x01 << 8) | (1 & 0xff));
892 rocheader.push_back(subbankheader.size() + elements.size() + 1);
893 rocheader.push_back((
fCurrentROC_ID << 16) | (0x10 << 8) | (1 & 0xff));
897 buffer.insert(buffer.end(), rocheader.begin(), rocheader.end());
898 buffer.insert(buffer.end(), subbankheader.begin(), subbankheader.end());
899 buffer.insert(buffer.end(), elements.begin(), elements.end());
994 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
1021 Bool_t lkDEBUG=kFALSE;
1025 if (index>=0 && num_words>0) {
1029 std::cout <<
"VQwDetectorArray::ProcessEvBuffer: "
1030 <<
"Begin processing ROC" << roc_id
1031 <<
" and subbank "<<bank_id
1032 <<
" number of words="<<num_words<<std::endl;
1042 std::cout<<
"found IntegrationPMT data for "<<
fMainDetID[i].fdetectorname<<std::endl;
1043 std::cout<<
"word left to read in this buffer:"<<num_words-
fMainDetID[i].fWordInSubbank<<std::endl;
1066 Bool_t status=kTRUE;
1071 std::cout<<
"******* VQwDetectorArray::SingleEventCuts()->IntegrationPMT[ "<<i<<
" , "<<
fIntegrationPMT[i].GetElementName()<<
" ] ******\n";
1078 std::cout<<
"******* VQwDetectorArray::SingleEventCuts()->CombinedPMT[ "<<i<<
" , "<<
fCombinedPMT[i].GetElementName()<<
" ] ******\n";
1152 Bool_t burpstatus = kFALSE;
1253 std::cout<<
"VQwDetectorArray::ProcessEvent_2(): processing with exchanged data"<<std::endl;
1254 std::cout<<
"pedestal, calfactor, average volts = "<<pedestal<<
", "<<calfactor<<
", "<<volts<<std::endl;
1263 QwWarning<<
"VQwDetectorArray::ProcessEvent_2(): could not get all external values."<<
QwLog::endl;
1325 std::unique_ptr<QwParameterFile> nextmodule;
1327 tmp=
"QwIntegrationPMT";
1339 tmp=
"QwCombinedPMT";
1365#ifdef HAS_RNTUPLE_SUPPORT
1366void VQwDetectorArray::ConstructNTupleAndVector(std::unique_ptr<ROOT::RNTupleModel>& model, TString& prefix, std::vector<Double_t>& values, std::vector<std::shared_ptr<Double_t>>& fieldPtrs) {
1369 fIntegrationPMT[i].ConstructNTupleAndVector(model, prefix, values, fieldPtrs);
1372 fCombinedPMT[i].ConstructNTupleAndVector(model, prefix, values, fieldPtrs);
1378void VQwDetectorArray::FillNTupleVector(std::vector<Double_t>& values)
const {
1405 if (
typeid(*value)!=
typeid(*
this)) {
1434 if (
this != value &&
Compare(value)) {
1592 Bool_t ldebug=kFALSE;
1596 std::cout<<
"VQwDetectorArray::GetDetectorIndex\n";
1597 std::cout<<
"type_id=="<<type_id<<
" name="<<name<<
"\n";
1598 std::cout<<
fMainDetID.size()<<
" already registered detector\n";
1610 std::cout<<
"testing against ("<<
fMainDetID[i].fTypeID
1611 <<
","<<
fMainDetID[i].fdetectorname<<
")=>"<<result<<
"\n";
1622 TString tmpname = name;
1639 QwMessage <<
"VQwDetectorArray::GetIntegrationPMT: cannot find channel " << tmpname <<
QwLog::endl;
1647 TString tmpname = name;
1660 QwMessage <<
"VQwDetectorArray::GetCombinedPMT: cannot find channel " << tmpname <<
QwLog::endl;
1674 catch (std::exception& e) {
1676 std::cerr << e.what() << std::endl;
1684#ifdef __USE_DATABASE__
1687 Bool_t local_print_flag =
false;
1689 if(local_print_flag) {
1691 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1693 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1697 std::vector<QwDBInterface> interface;
1698 std::vector<QwParitySchema::md_data_row> entrylist;
1700 UInt_t analysis_id = db->GetAnalysisID();
1702 TString measurement_type;
1715 for(j=0; j<interface.size(); j++) {
1717 interface.at(j).SetAnalysisID( analysis_id );
1718 interface.at(j).SetMainDetectorID( db );
1719 interface.at(j).SetMeasurementTypeID( measurement_type );
1720 interface.at(j).PrintStatus( local_print_flag );
1721 interface.at(j).AddThisEntryToList( entrylist );
1732 for(j=0; j<interface.size(); j++) {
1734 interface.at(j).SetAnalysisID( analysis_id );
1735 interface.at(j).SetMainDetectorID( db );
1736 interface.at(j).SetMeasurementTypeID( measurement_type );
1737 interface.at(j).PrintStatus( local_print_flag );
1738 interface.at(j).AddThisEntryToList( entrylist );
1743 if(local_print_flag) {
1752 if( entrylist.size() ) {
1753 auto c = db->GetScopedConnection();
1754 for (
const auto& entry : entrylist) {
1755 c->QueryExecute(entry.insert_into());
1758 QwMessage <<
"VQwDetectorArray::FillDB :: This is the case when the entrylist contains nothing in "<< datatype.Data() <<
QwLog::endl;
1777 std::cout<<
"Name of the subsystem ="<<
fSystemName<<
"\n";
1779 std::cout<<
"there are "<<
fIntegrationPMT.size()<<
" IntegrationPMT \n";
1780 std::cout<<
" "<<
fCombinedPMT.size()<<
" CombinedPMT \n";
1782 std::cout<<
" Printing Running AVG and other channel info"<<std::endl;
1795 std::cout<<
"============================="<<std::endl;
1796 std::cout<<
" Detector ID="<<i<<std::endl;
1805#ifdef __USE_DATABASE__
1808 Bool_t local_print_flag =
false;
1809 if(local_print_flag){
1811 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1813 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1818 std::vector<QwErrDBInterface> interface;
1819 std::vector<QwParitySchema::md_errors_row> entrylist;
1821 UInt_t analysis_id = db->GetAnalysisID();
1832 for(j=0; j<interface.size(); j++) {
1834 interface.at(j).SetAnalysisID ( analysis_id );
1835 interface.at(j).SetMainDetectorID ( db );
1836 interface.at(j).PrintStatus ( local_print_flag );
1837 interface.at(j).AddThisEntryToList( entrylist );
1850 for(j=0; j<interface.size(); j++) {
1852 interface.at(j).SetAnalysisID ( analysis_id );
1853 interface.at(j).SetMainDetectorID ( db );
1854 interface.at(j).PrintStatus ( local_print_flag );
1855 interface.at(j).AddThisEntryToList( entrylist );
1861 if(local_print_flag) {
1870 if( entrylist.size() ) {
1871 auto c = db->GetScopedConnection();
1872 for (
const auto& entry : entrylist) {
1873 c->QueryExecute(entry.insert_into());
1876 QwMessage <<
"VQwDetectorArray::FillErrDB :: This is the case when the entrylist contains nothing in "<< datatype.Data() <<
QwLog::endl;
1884 Bool_t local_print_flag =
false;
1885 Bool_t local_add_element= type.Contains(
"yield");
1887 if(local_print_flag){
1889 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1891 QwMessage <<
" --------------------------------------------------------------- " <<
QwLog::endl;
1895 TString element_name =
"";
1896 Double_t element_value = 0.0;
1897 Double_t element_value_err = 0.0;
1898 Double_t element_value_width = 0.0;
1901 Bool_t local_add_these_elements=
false;
1903 for (
size_t i = 0; i <
fMainDetID.size(); i++) {
1907 element_value = 0.0;
1908 element_value_err = 0.0;
1909 element_value_width = 0.0;
1912 local_add_these_elements=element_name.Contains(
"sam");
1914 if(local_add_these_elements&&local_add_element){
1924 if(local_ps_element) {
1926 element_value = tmp_channel->
GetValue();
1930 local_ps_element->
Set(type, element_value, element_value_err, element_value_width);
1934 if( local_print_flag && local_ps_element) {
1936 printf(
"Type %12s, Element %32s, value %12.4e error %8.4e width %12.4e\n",
1937 type.Data(), element_name.Data(), element_value, element_value_err, element_value_width);
1951 std::cout<<std::endl<<
"Detector name= "<<
fdetectorname<<std::endl;
1954 std::cout<<
"module type= "<<
fmoduletype<<std::endl;
1956 std::cout<<
"Index of this detector in the vector of similar detector= "<<
fIndex<<std::endl;
1957 std::cout<<
"Subelement index= "<<
fSubelement<<std::endl;
1958 std::cout<<
"==========================================\n";
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.
Array container for managing multiple subsystems.
Prompt summary data management.
EQwPMTInstrumentType GetQwPMTInstrumentType(TString name)
TString GetQwPMTInstrumentTypeName(EQwPMTInstrumentType type)
UInt_t GetGlobalErrorFlag(TString evtype, Int_t evMode, Double_t stabilitycut)
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 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)
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
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)