14#ifdef HAS_RNTUPLE_SUPPORT
15#include <ROOT/RNTupleModel.hxx>
16#include <ROOT/RNTupleWriter.hxx>
21#ifdef __USE_DATABASE__
25template <
typename ChannelType>
29template <
typename ChannelType>
33template <
typename ChannelType>
40template <
typename ChannelType>
45 Bool_t localdebug = kFALSE;
52 std::cout<<
" photodiode ["<<i<<
"]="<<
fPhotodiode[i].GetElementName()<<
"\n";
59 fRelPos[0].InitializeChannel(name+
"RelMean",
"derived");
60 fRelPos[1].InitializeChannel(name+
"RelVariance",
"derived");
72template <
typename ChannelType>
77 Bool_t localdebug = kFALSE;
84 std::cout<<
" photodiode ["<<i<<
"]="<<
fPhotodiode[i].GetElementName()<<
"\n";
87 fEffectiveCharge.InitializeChannel(subsystem,
"QwLinearDiodeArray", name+
"WS",
"derived");
91 fRelPos[0].InitializeChannel(subsystem,
"QwLinearDiodeArray", name+
"RelMean",
"derived");
92 fRelPos[1].InitializeChannel(subsystem,
"QwLinearDiodeArray", name+
"RelVariance",
"derived");
100template <
typename ChannelType>
120template <
typename ChannelType>
123 Bool_t eventokay=kTRUE;
125 UInt_t deviceerror=0;
126 for(
size_t i=0;i<8;i++)
129 eventokay &= (deviceerror & 0x0);
131 if (
bDEBUG) std::cout<<
" Inconsistent within LinearArray terminals photodiode[ "<<i<<
" ] "<<std::endl;
132 if (
bDEBUG) std::cout<<
" photodiode[ "<<i<<
" ] sequence num "<<
fPhotodiode[i].GetSequenceNumber()<<
" sample size "<<
fPhotodiode[i].GetNumberOfSamples()<<std::endl;
139template <
typename ChannelType>
145 fRelPos[i].IncrementErrorCounters();
151template <
typename ChannelType>
157 fRelPos[i].PrintErrorCounters();
163template <
typename ChannelType>
170 error|=
fRelPos[i].GetEventcutErrorFlag();
178template <
typename ChannelType>
189 fRelPos[i].UpdateErrorFlag(error1);
190 error2|=
fRelPos[i].GetEventcutErrorFlag();
201template <
typename ChannelType>
206 UInt_t error_code = 0;
214 if (
bDEBUG) std::cout<<
" array ["<<i<<
"] event cut failed ";
222 fRelPos[i].UpdateErrorFlag(error_code);
228 if (
bDEBUG) std::cout<<
" Rel X event cut failed ";
239 if (
bDEBUG) std::cout<<
"EffectiveCharge event cut failed ";
250template <
typename ChannelType>
255 if (ch_name==
"relx"){
257 }
else if (ch_name==
"rely"){
259 }
else if (ch_name==
"absx" || ch_name==
"x" ){
261 }
else if (ch_name==
"absy" || ch_name==
"y"){
263 }
else if (ch_name==
"effectivecharge" || ch_name==
"charge"){
266 TString loc=
"QwLinearDiodeArray::GetSubelementByName for"
268 + ch_name +
", which is an unrecognized subelement name.";
269 throw std::invalid_argument(loc.Data());
290template <
typename ChannelType>
294 if (ch_name==
"relx"){
296 fRelPos[0].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
298 }
else if (ch_name==
"rely"){
300 fRelPos[1].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
302 }
else if (ch_name==
"effectivecharge"){
304 fEffectiveCharge.SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
306 }
else if (ch_name==
"photodiode"){
308 fPhotodiode[1].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
317template <
typename ChannelType>
320 Bool_t burpstatus = kFALSE;
322 if(
typeid(*ev_error)==
typeid(*
this)) {
327 burpstatus |=
fRelPos[i].CheckForBurpFail(&(value_lin->
fRelPos[i]));
335 TString loc=
"Standard exception from QwLinearDiodeArray::CheckForBurpFail :"+
338 throw std::invalid_argument(loc.Data());
340 }
catch (std::exception& e) {
341 std::cerr<< e.what()<<std::endl;
346template <
typename ChannelType>
350 if(
typeid(*ev_error)==
typeid(*
this)) {
363 TString loc=
"Standard exception from QwLinearDiodeArray::UpdateErrorFlag :"+
366 throw std::invalid_argument(loc.Data());
368 }
catch (std::exception& e) {
369 std::cerr<< e.what()<<std::endl;
373template <
typename ChannelType>
376 Bool_t localdebug = kFALSE;
377 static ChannelType mean, meansqr;
378 static ChannelType tmp(
"tmp");
379 static ChannelType tmp2(
"tmp2");
381 mean.InitializeChannel(
"mean",
"raw");
382 meansqr.InitializeChannel(
"meansqr",
"raw");
402 mean.ClearEventData();
403 meansqr.ClearEventData();
418 fRelPos[1].Difference(meansqr,tmp2);
421 std::cout<<
"\n#################"<<std::endl;
422 std::cout<<
" LinearArray name="<<
fElementName<<std::endl;
423 std::cout<<
" Size of the linear array = "<<8<<std::endl;
424 std::cout<<
" event number= "<<
fPhotodiode[0].GetSequenceNumber()<<std::endl;
425 for(Int_t i = 0; i<8; i++)
426 std::cout<<
" pad"<<i<<
" ="<<
fPhotodiode[i].GetValue()<<std::endl;
427 std::cout<<
" mean ="<<
fRelPos[0].GetValue()<<std::endl;
428 std::cout<<
" variance ="<<
fRelPos[1].GetValue()<<std::endl;
436template <
typename ChannelType>
441 fPhotodiode[index].ProcessEvBuffer(buffer,word_position_in_buffer);
446 "QwLinearDiodeArray::ProcessEvBuffer(): attempt to fill in raw data for a pad that doesn't exist \n";
448 return word_position_in_buffer;
452template <
typename ChannelType>
455 for (
size_t i = 0; i < 2; i++) {
461template <
typename ChannelType>
466 for (i = 0; i < 2; i++) {
472template <
typename ChannelType>
477 if (subindex>-1) localindex = subindex;
482 std::cerr<<
"QwLinearDiodeArray::GetSubElementName for "
484 << subindex <<
", doesn't exist \n";
489template <
typename ChannelType>
495 padindex = subname(subname.Sizeof()-2,1);
497 if (padindex.IsDigit()){
498 Int_t tmpval = padindex.Atoi();
499 if (tmpval>-1) localindex = tmpval-1;
504 std::cerr <<
"QwLinearDiodeArray::GetSubElementIndex is unable to associate the string -"
505 <<subname<<
"- to any index"<<std::endl;
511template <
typename ChannelType>
521template <
typename ChannelType>
529template <
typename ChannelType>
545template <
typename ChannelType>
553template <
typename ChannelType>
568template <
typename ChannelType>
576template <
typename ChannelType>
592template <
typename ChannelType>
603template <
typename ChannelType>
610template <
typename ChannelType>
624template <
typename ChannelType>
634template <
typename ChannelType>
639template <
typename ChannelType>
649template <
typename ChannelType>
654template <
typename ChannelType>
666template <
typename ChannelType>
674 TString thisprefix=prefix;
676 if(prefix.Contains(
"asym_"))
677 thisprefix.ReplaceAll(
"asym_",
"diff_");
684 fRelPos[i].ConstructHistograms(folder, thisprefix);
690template <
typename ChannelType>
709template <
typename ChannelType>
716 TString thisprefix=prefix;
717 if(prefix.Contains(
"asym_"))
718 thisprefix.ReplaceAll(
"asym_",
"diff_");
728 fRelPos[i].ConstructBranchAndVector(tree,thisprefix,values);
735template <
typename ChannelType>
742 TString thisprefix=prefix;
743 if(prefix.Contains(
"asym_"))
744 thisprefix.ReplaceAll(
"asym_",
"diff_");
754 fRelPos[i].ConstructBranch(tree,thisprefix);
761template <
typename ChannelType>
767 devicename.ToLower();
772 if (modulelist.
HasValue(devicename)){
773 TString thisprefix=prefix;
774 if(prefix.Contains(
"asym_"))
775 thisprefix.ReplaceAll(
"asym_",
"diff_");
785 fRelPos[i].ConstructBranch(tree,thisprefix);
800template <
typename ChannelType>
813 fRelPos[i].FillTreeVector(values);
819#ifdef HAS_RNTUPLE_SUPPORT
820template <
typename ChannelType>
823 if (GetElementName()==
""){
827 TString thisprefix=prefix;
828 if(prefix.Contains(
"asym_"))
829 thisprefix.ReplaceAll(
"asym_",
"diff_");
831 SetRootSaveStatus(prefix);
833 fEffectiveCharge.ConstructNTupleAndVector(model,prefix,values,fieldPtrs);
836 for(i=0;i<8;i++) fPhotodiode[i].ConstructNTupleAndVector(model,thisprefix,values,fieldPtrs);
838 for(i=kXAxis;i<kNumAxes;i++) {
839 fRelPos[i].ConstructNTupleAndVector(model,thisprefix,values,fieldPtrs);
846template <
typename ChannelType>
849 if (GetElementName()==
"") {
853 fEffectiveCharge.FillNTupleVector(values);
856 for(i=0;i<8;i++) fPhotodiode[i].FillNTupleVector(values);
858 for(i=kXAxis;i<kNumAxes;i++){
859 fRelPos[i].FillNTupleVector(values);
867template <
typename ChannelType>
874 fRelPos[i].SetEventCutMode(bcuts);
875 fAbsPos[i].SetEventCutMode(bcuts);
880template<
typename ChannelType>
884 ChannelType relpos(
fRelPos[i]);
893#ifdef __USE_DATABASE__
894template <
typename ChannelType>
897 std::vector <QwDBInterface> row_list;
900 for(
size_t i=0;i<2;i++) {
901 fRelPos[i].AddEntriesToList(row_list);
903 fEffectiveCharge.AddEntriesToList(row_list);
907template <
typename ChannelType>
910 std::vector <QwErrDBInterface> row_list;
912 for(
size_t i=0;i<2;i++) {
913 fRelPos[i].AddErrEntriesToList(row_list);
915 fEffectiveCharge.AddErrEntriesToList(row_list);
925template <
typename ChannelType>
929 Double_t sumX = 1.1e8;
930 Double_t sumY = 0.9e8;
934 Double_t meanXP = (1.0 + meanX) * sumX / 2.0;
935 Double_t meanXM = (1.0 - meanX) * sumX / 2.0;
936 Double_t meanYP = (1.0 + meanY) * sumY / 2.0;
937 Double_t meanYM = (1.0 - meanY) * sumY / 2.0;
941 Double_t sigmaXP = fabs(sumX * sigmaX / meanX);
942 Double_t sigmaXM = sigmaXP;
943 Double_t sigmaYP = fabs(sumY * sigmaY / meanY);
944 Double_t sigmaYM = sigmaYP;
947 fPhotodiode[0].SetRandomEventParameters(meanXP, sigmaXP);
948 fPhotodiode[1].SetRandomEventParameters(meanXM, sigmaXM);
949 fPhotodiode[2].SetRandomEventParameters(meanYP, sigmaYP);
950 fPhotodiode[3].SetRandomEventParameters(meanYM, sigmaYM);
953template <
typename ChannelType>
961template <
typename ChannelType>
964 for (
size_t i=0; i<2; i++)
966 fRelPos[i].SetHardwareSum(relpos[i], sequencenumber);
973template <
typename ChannelType>
980template <
typename ChannelType>
987template <
typename ChannelType>
994template <
typename ChannelType>
static const UInt_t kBPMErrorFlag
static const UInt_t kInvalidSubelementIndex
Parameter file parsing and management.
#define QwMessage
Predefined log drain for regular messages.
Database interface for QwIntegrationPMT and subsystems.
Linear diode array 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.
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.
Linear diode array beam position monitor implementation.
VQwBPM & operator=(const VQwBPM &value) override
void ProcessEvent() override
void SetSubElementPedestal(Int_t j, Double_t value) override
std::vector< ChannelType > fLinearArrayElementList
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 EncodeEventData(std::vector< UInt_t > &buffer) override
void SetRandomEventParameters(Double_t meanX, Double_t sigmaX, Double_t meanY, Double_t sigmaY) override
UInt_t UpdateErrorFlag() override
Update and return the aggregated event-cut error flag.
Bool_t ApplyHWChecks()
Apply hardware checks for all photodiode pads.
void FillHistograms() override
Fill the histograms for this data element.
TString GetSubElementName(Int_t subindex) override
void GetAbsolutePosition() override
void ConstructBranch(TTree *tree, TString &prefix) override
void DeaccumulateRunningSum(QwLinearDiodeArray &value, Int_t ErrorMask=0xFFFFFFF)
VQwBPM & operator-=(const VQwBPM &value) override
void SetEventCutMode(Int_t bcuts) override
Bool_t CheckForBurpFail(const VQwDataElement *ev_error) override
Check for burp failures against another linear array of same type.
static const Double_t kQwLinearDiodeArrayPadSize
void FillTreeVector(QwRootTreeBranchVector &values) const override
void PrintErrorCounters() const override
Print error counters for all internal channels.
Bool_t ApplySingleEventCuts() override
Apply single-event cuts across photodiodes and derived channels.
std::array< ChannelType, 2 > fAbsPos
void ConstructBranchAndVector(TTree *tree, TString &prefix, QwRootTreeBranchVector &values) override
void PrintInfo() const override
Print multiple lines of information about this data element.
VQwHardwareChannel * GetSubelementByName(TString ch_name) override
Resolve an internal channel pointer by subelement name.
ChannelType fEffectiveCharge
void PrintValue() const override
Print single line of value and error of this data element.
static const size_t kMaxElements
void RandomizeEventData(int helicity=0, double time=0.0) override
void SetSubElementCalibrationFactor(Int_t j, Double_t value) override
void AccumulateRunningSum(const QwLinearDiodeArray &value, Int_t count=0, Int_t ErrorMask=0xFFFFFFF)
static UInt_t GetSubElementIndex(TString subname)
std::array< ChannelType, 8 > fPhotodiode
Int_t ProcessEvBuffer(UInt_t *buffer, UInt_t word_position_in_buffer, UInt_t indexnumber) override
Process the CODA event buffer for this element.
static const TString subelement[8]
VQwBPM & operator+=(const VQwBPM &value) override
void IncrementErrorCounters() override
Increment error counters for all internal channels.
void SetDefaultSampleSize(Int_t sample_size) override
void Ratio(VQwBPM &numer, VQwBPM &denom) override
void CalculateRunningAverage() override
void InitializeChannel(TString name)
Initialize this linear diode array with a detector name.
void ConstructHistograms(TDirectory *folder, TString &prefix) override
Construct the histograms for this data element.
UInt_t GetEventcutErrorFlag() override
Aggregate and return the event-cut error flag for this array.
std::array< ChannelType, 2 > fRelPos
void MakeLinearArrayList()
void ClearEventData() override
Clear event-scoped data for all pads and derived channels.
void Scale(Double_t factor) override
void SetEventData(Double_t *block, UInt_t sequencenumber)
Double_t fPositionCenter[3]
void SetRootSaveStatus(TString &prefix)
void InitializeChannel(TString name)
Initialize common BPM state and set the element name.
static const Bool_t bDEBUG
virtual VQwBPM & operator=(const VQwBPM &value)=0