16#ifdef HAS_RNTUPLE_SUPPORT
17#include <ROOT/RNTupleModel.hxx>
18#include <ROOT/RNTupleWriter.hxx>
22#ifdef __USE_DATABASE__
34 Bool_t localdebug = kFALSE;
44 std::cout<<
" photodiode ["<<i<<
"]="<<
fPhotodiode[i].GetElementName()<<
"\n";
61 Bool_t localdebug = kFALSE;
70 std::cout<<
" photodiode ["<<i<<
"]="<<
fPhotodiode[i].GetElementName()<<
"\n";
89 Bool_t ldebug = kFALSE;
95 std::cout<<
"\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
131 Bool_t eventokay=kTRUE;
133 UInt_t deviceerror=0;
134 for(Short_t i=0;i<4;i++)
137 eventokay &= (deviceerror & 0x0);
139 if (
bDEBUG) std::cout<<
" Inconsistent within QPD terminals photodiode[ "<<i<<
" ] "<<std::endl;
140 if (
bDEBUG) std::cout<<
" photodiode[ "<<i<<
" ] sequence num "<<
fPhotodiode[i].GetSequenceNumber()<<
" sample size "<<
fPhotodiode[i].GetNumberOfSamples()<<std::endl;
153 fRelPos[i].IncrementErrorCounters();
154 fAbsPos[i].IncrementErrorCounters();
166 fRelPos[i].PrintErrorCounters();
167 fAbsPos[i].PrintErrorCounters();
181 error|=
fRelPos[i].GetEventcutErrorFlag();
182 error|=
fAbsPos[i].GetEventcutErrorFlag();
203 fRelPos[i].UpdateErrorFlag(error1);
204 fAbsPos[i].UpdateErrorFlag(error1);
205 error2|=
fRelPos[i].GetEventcutErrorFlag();
206 error2|=
fAbsPos[i].GetEventcutErrorFlag();
223 UInt_t error_code = 0;
231 if (
bDEBUG) std::cout<<
" single pad "<<
fPhotodiode[i].GetElementName()<<
" event cut failed ";
238 fRelPos[i].UpdateErrorFlag(error_code);
239 status &=
fRelPos[i].ApplySingleEventCuts();
241 fAbsPos[i].UpdateErrorFlag(error_code);
242 status &=
fAbsPos[i].ApplySingleEventCuts();
263 }
else if (ch_name==
"tr"){
265 }
else if (ch_name==
"br"){
267 }
else if (ch_name==
"bl"){
269 }
else if (ch_name==
"relx"){
271 }
else if (ch_name==
"rely"){
273 }
else if (ch_name==
"absx" || ch_name==
"x" ){
275 }
else if (ch_name==
"absy" || ch_name==
"y"){
277 }
else if (ch_name==
"effectivecharge" || ch_name==
"charge"){
280 TString loc=
"QwQPD::GetSubelementByName for"
282 + ch_name +
", which is an unrecognized subelement name.";
283 throw std::invalid_argument(loc.Data());
338 fPhotodiode[0].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
340 }
else if (ch_name==
"tr"){
342 fPhotodiode[1].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
344 }
else if (ch_name==
"br"){
346 fPhotodiode[2].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
348 }
else if (ch_name==
"bl"){
350 fPhotodiode[3].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
352 }
else if (ch_name==
"relx"){
354 fRelPos[0].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
356 }
else if (ch_name==
"rely"){
358 fRelPos[1].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
360 }
else if (ch_name==
"absx"){
362 fAbsPos[0].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
364 }
else if (ch_name==
"absy"){
366 fAbsPos[1].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
368 }
else if (ch_name==
"effectivecharge"){
370 fEffectiveCharge.SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
385 Bool_t burpstatus = kFALSE;
387 if(
typeid(*ev_error)==
typeid(*
this)) {
390 const QwQPD* value_qpd =
dynamic_cast<const QwQPD*
>(ev_error);
395 burpstatus |=
fRelPos[i].CheckForBurpFail(&(value_qpd->
fRelPos[i]));
396 burpstatus |=
fAbsPos[i].CheckForBurpFail(&(value_qpd->
fAbsPos[i]));
401 TString loc=
"Standard exception from QwQPD::CheckForBurpFail :"+
404 throw std::invalid_argument(loc.Data());
406 }
catch (std::exception& e) {
407 std::cerr<< e.what()<<std::endl;
420 if(
typeid(*ev_error)==
typeid(*
this)) {
423 const QwQPD* value_bpm =
dynamic_cast<const QwQPD*
>(ev_error);
434 TString loc=
"Standard exception from QwQPD::UpdateErrorFlag :"+
437 throw std::invalid_argument(loc.Data());
439 }
catch (std::exception& e) {
440 std::cerr<< e.what()<<std::endl;
455 Bool_t localdebug = kFALSE;
497 std::cout<<
"#############################\n";
499 std::cout<<
" event number = "<<
fPhotodiode[0].GetSequenceNumber()<<
"\n";
500 std::cout<<
" hw BR ="<<
fPhotodiode[0].GetValue()<<
"\n";
501 std::cout<<
" hw TR ="<<
fPhotodiode[1].GetValue()<<
"\n";
502 std::cout<<
" hw BL ="<<
fPhotodiode[2].GetValue()<<
"\n";
503 std::cout<<
" hw TL ="<<
fPhotodiode[3].GetValue()<<
"\n\n";
512 numer[0].
Sum(tmp1,tmp2);
520 numer[1].
Sum(tmp1,tmp2);
537 std::cout<<
" hw numerator= "<<numer[i].
GetValue()<<
" ";
538 std::cout<<
" hw denominator (== Effective_Charge)= "<<
fEffectiveCharge.GetValue()<<
"\n";
561 fPhotodiode[index].ProcessEvBuffer(buffer,word_position_in_buffer);
566 "QwQPD::ProcessEvBuffer(): attempt to fill in raw date for a wire that doesn't exist \n";
568 return word_position_in_buffer;
575 if(subindex<4&&subindex>-1)
578 std::cerr<<
"QwQPD::GetSubElementName for "<<
588 for(Short_t i=0;i<4;i++)
if(subname==
subelement[i])localindex=i;
591 std::cerr <<
"QwQPD::GetSubElementIndex is unable to associate the string -"
592 <<subname<<
"- to any index"<<std::endl;
599 *(
dynamic_cast<QwQPD*
>(
this)) = *(
dynamic_cast<const QwQPD*
>(&value));
619 *(
dynamic_cast<QwQPD*
>(
this)) += *(
dynamic_cast<const QwQPD*
>(&value));
640 *(
dynamic_cast<QwQPD*
>(
this)) -= *(
dynamic_cast<const QwQPD*
>(&value));
689 for (i = 0; i < 2; i++){
690 fRelPos[i].CalculateRunningAverage();
691 fAbsPos[i].CalculateRunningAverage();
706 for (i = 0; i < 2; i++){
707 fRelPos[i].AccumulateRunningSum(value.
fRelPos[i], count, ErrorMask);
708 fAbsPos[i].AccumulateRunningSum(value.
fAbsPos[i], count, ErrorMask);
726 for (i = 0; i < 2; i++){
745 TString thisprefix=prefix;
747 if(prefix.Contains(
"asym_"))
748 thisprefix.ReplaceAll(
"asym_",
"diff_");
755 fAbsPos[i].ConstructHistograms(folder, thisprefix);
756 fRelPos[i].ConstructHistograms(folder, thisprefix);
787 TString thisprefix=prefix;
788 if(prefix.Contains(
"asym_"))
789 thisprefix.ReplaceAll(
"asym_",
"diff_");
799 fAbsPos[i].ConstructBranchAndVector(tree,thisprefix,values);
800 fRelPos[i].ConstructBranchAndVector(tree,thisprefix,values);
813 TString thisprefix=prefix;
814 if(prefix.Contains(
"asym_"))
815 thisprefix.ReplaceAll(
"asym_",
"diff_");
825 fAbsPos[i].ConstructBranch(tree,thisprefix);
826 fRelPos[i].ConstructBranch(tree,thisprefix);
838 devicename.ToLower();
843 if (modulelist.
HasValue(devicename)){
844 TString thisprefix=prefix;
845 if(prefix.Contains(
"asym_"))
846 thisprefix.ReplaceAll(
"asym_",
"diff_");
856 fAbsPos[i].ConstructBranch(tree,thisprefix);
857 fRelPos[i].ConstructBranch(tree,thisprefix);
885 fAbsPos[i].FillTreeVector(values);
886 fRelPos[i].FillTreeVector(values);
892#ifdef HAS_RNTUPLE_SUPPORT
893void QwQPD::ConstructNTupleAndVector(std::unique_ptr<ROOT::RNTupleModel>& model, TString& prefix, std::vector<Double_t>& values, std::vector<std::shared_ptr<Double_t>>& fieldPtrs)
899 TString thisprefix=prefix;
900 if(prefix.Contains(
"asym_"))
901 thisprefix.ReplaceAll(
"asym_",
"diff_");
908 for(i=0;i<4;i++)
fPhotodiode[i].ConstructNTupleAndVector(model,thisprefix,values,fieldPtrs);
911 fAbsPos[i].ConstructNTupleAndVector(model,thisprefix,values,fieldPtrs);
912 fRelPos[i].ConstructNTupleAndVector(model,thisprefix,values,fieldPtrs);
919void QwQPD::FillNTupleVector(std::vector<Double_t>& values)
const
928 for(i=0;i<4;i++)
fPhotodiode[i].FillNTupleVector(values);
932 fAbsPos[i].FillNTupleVector(values);
933 fRelPos[i].FillNTupleVector(values);
948 fAbsPos[i].SetEventCutMode(bcuts);
949 fRelPos[i].SetEventCutMode(bcuts);
967#ifdef __USE_DATABASE__
968std::vector<QwDBInterface> QwQPD::GetDBEntry()
970 std::vector <QwDBInterface> row_list;
973 fAbsPos[i].AddEntriesToList(row_list);
979std::vector<QwErrDBInterface> QwQPD::GetErrDBEntry()
981 std::vector <QwErrDBInterface> row_list;
984 fAbsPos[i].AddErrEntriesToList(row_list);
999 Double_t sumX = 1.1e8;
1000 Double_t sumY = 0.9e8;
1011 Double_t sigmaXP = fabs(sumX * sigmaX / meanX);
1012 Double_t sigmaXM = sigmaXP;
1013 Double_t sigmaYP = fabs(sumY * sigmaY / meanY);
1014 Double_t sigmaYM = sigmaYP;
1017 fPhotodiode[0].SetRandomEventParameters(meanXP, sigmaXP);
1018 fPhotodiode[1].SetRandomEventParameters(meanXM, sigmaXM);
1019 fPhotodiode[2].SetRandomEventParameters(meanYP, sigmaYP);
1020 fPhotodiode[3].SetRandomEventParameters(meanYM, sigmaYM);
1034 for (Short_t i=0; i<2; i++)
1036 fAbsPos[i].SetHardwareSum(relpos[i], sequencenumber);
#define QwMessage
Predefined log drain for regular messages.
static const UInt_t kBPMErrorFlag
static const UInt_t kInvalidSubelementIndex
Database interface for QwIntegrationPMT and subsystems.
Quadrant photodiode beam position monitor implementation.
static std::ostream & endl(std::ostream &)
End of the line.
Configuration file parser with flexible tokenization and search capabilities.
Bool_t HasValue(TString &vname)
A helper class to manage a vector of branch entries for ROOT trees.
Concrete hardware channel for VQWK ADC modules (6x32-bit words)
void InitializeChannel(TString name, TString datatosave) override
Initialize the fields in this object.
void Sum(const QwVQWK_Channel &value1, const QwVQWK_Channel &value2)
void ClearEventData() override
Clear the event data in this element.
Double_t GetValue(size_t element) const override
void Difference(const QwVQWK_Channel &value1, const QwVQWK_Channel &value2)
VQwDataElement()
Default constructor.
TString fElementName
Name of this data element.
virtual const TString & GetElementName() const
Get the name of this element.
Abstract base for concrete hardware channels implementing dual-operator pattern.
static UInt_t GetSubElementIndex(TString subname)
static const TString subelement[4]
void ClearEventData() override
void AccumulateRunningSum(const QwQPD &value, Int_t count=0, Int_t ErrorMask=0xFFFFFFF)
void GetCalibrationFactors(Double_t AlphaX, Double_t AlphaY)
Bool_t CheckForBurpFail(const VQwDataElement *ev_error) override
void ConstructBranch(TTree *tree, TString &prefix) override
void SetEventCutMode(Int_t bcuts) override
TString GetSubElementName(Int_t subindex) override
void ConstructHistograms(TDirectory *folder, TString &prefix) override
Construct the histograms for this data element.
void ConstructBranchAndVector(TTree *tree, TString &prefix, QwRootTreeBranchVector &values) override
std::array< QwVQWK_Channel, 4 > fPhotodiode
void Scale(Double_t factor) override
std::array< QwVQWK_Channel, 2 > fAbsPos
void ProcessEvent() override
UInt_t GetEventcutErrorFlag() override
VQwHardwareChannel * GetSubelementByName(TString ch_name) override
void SetDefaultSampleSize(Int_t sample_size) override
VQwBPM & operator-=(const VQwBPM &value) override
Int_t ProcessEvBuffer(UInt_t *buffer, UInt_t word_position_in_buffer, UInt_t indexnumber) override
QwVQWK_Channel fEffectiveCharge
VQwBPM & operator+=(const VQwBPM &value) override
void SetSubElementPedestal(Int_t j, Double_t value) override
std::vector< QwVQWK_Channel > fQPDElementList
UInt_t UpdateErrorFlag() override
Bool_t ApplySingleEventCuts() override
void CalculateRunningAverage() override
void Ratio(QwQPD &numer, QwQPD &denom)
void SetRandomEventParameters(Double_t meanX, Double_t sigmaX, Double_t meanY, Double_t sigmaY) override
void PrintErrorCounters() const override
void SetSubElementCalibrationFactor(Int_t j, Double_t value) override
void InitializeChannel(TString name)
Double_t fQwQPDCalibration[2]
void EncodeEventData(std::vector< UInt_t > &buffer) override
void DeaccumulateRunningSum(VQwBPM &value, Int_t ErrorMask=0xFFFFFFF) override
void FillHistograms() override
Fill the histograms for this data element.
VQwBPM & operator=(const VQwBPM &value) override
std::array< QwVQWK_Channel, 2 > fRelPos
void IncrementErrorCounters() override
void FillTreeVector(QwRootTreeBranchVector &values) const override
void SetSingleEventCuts(TString ch_name, UInt_t errorflag, Double_t minX, Double_t maxX, Double_t stability, Double_t burplevel)
Inherited from VQwDataElement to set the upper and lower limits (fULimit and fLLimit),...
void RandomizeEventData(int helicity=0, double time=0.0) override
void SetEventData(Double_t *block, UInt_t sequencenumber)
void SetRootSaveStatus(TString &prefix)
static const TString kAxisLabel[2]
Double_t fRelativeGains[2]
void InitializeChannel(TString name)
Initialize common BPM state and set the element name.
static const Bool_t bDEBUG