14#ifdef HAS_RNTUPLE_SUPPORT
15#include <ROOT/RNTupleModel.hxx>
16#include <ROOT/RNTupleWriter.hxx>
21#ifdef __USE_DATABASE__
41 Bool_t localdebug = kFALSE;
48 std::cout<<
" photodiode ["<<i<<
"]="<<
fPhotodiode[i].GetElementName()<<
"\n";
55 fRelPos[0].InitializeChannel(name+
"RelMean",
"derived");
56 fRelPos[1].InitializeChannel(name+
"RelVariance",
"derived");
72 Bool_t localdebug = kFALSE;
79 std::cout<<
" photodiode ["<<i<<
"]="<<
fPhotodiode[i].GetElementName()<<
"\n";
82 fEffectiveCharge.InitializeChannel(subsystem,
"QwLinearDiodeArray", name+
"WS",
"derived");
86 fRelPos[0].InitializeChannel(subsystem,
"QwLinearDiodeArray", name+
"RelMean",
"derived");
87 fRelPos[1].InitializeChannel(subsystem,
"QwLinearDiodeArray", name+
"RelVariance",
"derived");
116 Bool_t eventokay=kTRUE;
118 UInt_t deviceerror=0;
119 for(
size_t i=0;i<8;i++)
122 eventokay &= (deviceerror & 0x0);
124 if (
bDEBUG) std::cout<<
" Inconsistent within LinearArray terminals photodiode[ "<<i<<
" ] "<<std::endl;
125 if (
bDEBUG) std::cout<<
" photodiode[ "<<i<<
" ] sequence num "<<
fPhotodiode[i].GetSequenceNumber()<<
" sample size "<<
fPhotodiode[i].GetNumberOfSamples()<<std::endl;
137 fRelPos[i].IncrementErrorCounters();
148 fRelPos[i].PrintErrorCounters();
160 error|=
fRelPos[i].GetEventcutErrorFlag();
178 fRelPos[i].UpdateErrorFlag(error1);
179 error2|=
fRelPos[i].GetEventcutErrorFlag();
194 UInt_t error_code = 0;
202 if (
bDEBUG) std::cout<<
" array ["<<i<<
"] event cut failed ";
210 fRelPos[i].UpdateErrorFlag(error_code);
216 if (
bDEBUG) std::cout<<
" Rel X event cut failed ";
227 if (
bDEBUG) std::cout<<
"EffectiveCharge event cut failed ";
242 if (ch_name==
"relx"){
244 }
else if (ch_name==
"rely"){
246 }
else if (ch_name==
"absx" || ch_name==
"x" ){
248 }
else if (ch_name==
"absy" || ch_name==
"y"){
250 }
else if (ch_name==
"effectivecharge" || ch_name==
"charge"){
253 TString loc=
"QwLinearDiodeArray::GetSubelementByName for"
255 + ch_name +
", which is an unrecognized subelement name.";
256 throw std::invalid_argument(loc.Data());
280 if (ch_name==
"relx"){
282 fRelPos[0].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
284 }
else if (ch_name==
"rely"){
286 fRelPos[1].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
288 }
else if (ch_name==
"effectivecharge"){
290 fEffectiveCharge.SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
292 }
else if (ch_name==
"photodiode"){
294 fPhotodiode[1].SetSingleEventCuts(errorflag,minX,maxX,stability,burplevel);
305 Bool_t burpstatus = kFALSE;
307 if(
typeid(*ev_error)==
typeid(*
this)) {
312 burpstatus |=
fRelPos[i].CheckForBurpFail(&(value_lin->
fRelPos[i]));
320 TString loc=
"Standard exception from QwLinearDiodeArray::CheckForBurpFail :"+
323 throw std::invalid_argument(loc.Data());
325 }
catch (std::exception& e) {
326 std::cerr<< e.what()<<std::endl;
334 if(
typeid(*ev_error)==
typeid(*
this)) {
347 TString loc=
"Standard exception from QwLinearDiodeArray::UpdateErrorFlag :"+
350 throw std::invalid_argument(loc.Data());
352 }
catch (std::exception& e) {
353 std::cerr<< e.what()<<std::endl;
359 Bool_t localdebug = kFALSE;
401 fRelPos[1].Difference(meansqr,tmp2);
404 std::cout<<
"\n#################"<<std::endl;
405 std::cout<<
" LinearArray name="<<
fElementName<<std::endl;
406 std::cout<<
" Size of the linear array = "<<8<<std::endl;
407 std::cout<<
" event number= "<<
fPhotodiode[0].GetSequenceNumber()<<std::endl;
408 for(Int_t i = 0; i<8; i++)
409 std::cout<<
" pad"<<i<<
" ="<<
fPhotodiode[i].GetValue()<<std::endl;
410 std::cout<<
" mean ="<<
fRelPos[0].GetValue()<<std::endl;
411 std::cout<<
" variance ="<<
fRelPos[1].GetValue()<<std::endl;
424 fPhotodiode[index].ProcessEvBuffer(buffer,word_position_in_buffer);
429 "QwLinearDiodeArray::ProcessEvBuffer(): attempt to fill in raw data for a pad that doesn't exist \n";
431 return word_position_in_buffer;
438 for (
size_t i = 0; i < 2; i++) {
448 for (i = 0; i < 2; i++) {
459 if (subindex>-1) localindex = subindex;
464 std::cerr<<
"QwLinearDiodeArray::GetSubElementName for "
466 << subindex <<
", doesn't exist \n";
476 padindex = subname(subname.Sizeof()-2,1);
478 if (padindex.IsDigit()){
479 Int_t tmpval = padindex.Atoi();
480 if (tmpval>-1) localindex = tmpval-1;
485 std::cerr <<
"QwLinearDiodeArray::GetSubElementIndex is unable to associate the string -"
486 <<subname<<
"- to any index"<<std::endl;
635 TString thisprefix=prefix;
637 if(prefix.Contains(
"asym_"))
638 thisprefix.ReplaceAll(
"asym_",
"diff_");
645 fRelPos[i].ConstructHistograms(folder, thisprefix);
675 TString thisprefix=prefix;
676 if(prefix.Contains(
"asym_"))
677 thisprefix.ReplaceAll(
"asym_",
"diff_");
687 fRelPos[i].ConstructBranchAndVector(tree,thisprefix,values);
700 TString thisprefix=prefix;
701 if(prefix.Contains(
"asym_"))
702 thisprefix.ReplaceAll(
"asym_",
"diff_");
712 fRelPos[i].ConstructBranch(tree,thisprefix);
724 devicename.ToLower();
729 if (modulelist.
HasValue(devicename)){
730 TString thisprefix=prefix;
731 if(prefix.Contains(
"asym_"))
732 thisprefix.ReplaceAll(
"asym_",
"diff_");
742 fRelPos[i].ConstructBranch(tree,thisprefix);
769 fRelPos[i].FillTreeVector(values);
775#ifdef HAS_RNTUPLE_SUPPORT
776void QwLinearDiodeArray::ConstructNTupleAndVector(std::unique_ptr<ROOT::RNTupleModel>& model, TString& prefix, std::vector<Double_t>& values, std::vector<std::shared_ptr<Double_t>>& fieldPtrs)
782 TString thisprefix=prefix;
783 if(prefix.Contains(
"asym_"))
784 thisprefix.ReplaceAll(
"asym_",
"diff_");
791 for(i=0;i<8;i++)
fPhotodiode[i].ConstructNTupleAndVector(model,thisprefix,values,fieldPtrs);
794 fRelPos[i].ConstructNTupleAndVector(model,thisprefix,values,fieldPtrs);
801void QwLinearDiodeArray::FillNTupleVector(std::vector<Double_t>& values)
const
810 for(i=0;i<8;i++)
fPhotodiode[i].FillNTupleVector(values);
813 fRelPos[i].FillNTupleVector(values);
827 fRelPos[i].SetEventCutMode(bcuts);
828 fAbsPos[i].SetEventCutMode(bcuts);
846#ifdef __USE_DATABASE__
849 std::vector <QwDBInterface> row_list;
852 for(
size_t i=0;i<2;i++) {
861 std::vector <QwErrDBInterface> row_list;
863 for(
size_t i=0;i<2;i++) {
864 fRelPos[i].AddErrEntriesToList(row_list);
879 Double_t sumX = 1.1e8;
880 Double_t sumY = 0.9e8;
884 Double_t meanXP = (1.0 + meanX) * sumX / 2.0;
885 Double_t meanXM = (1.0 - meanX) * sumX / 2.0;
886 Double_t meanYP = (1.0 + meanY) * sumY / 2.0;
887 Double_t meanYM = (1.0 - meanY) * sumY / 2.0;
891 Double_t sigmaXP = fabs(sumX * sigmaX / meanX);
892 Double_t sigmaXM = sigmaXP;
893 Double_t sigmaYP = fabs(sumY * sigmaY / meanY);
894 Double_t sigmaYM = sigmaYP;
897 fPhotodiode[0].SetRandomEventParameters(meanXP, sigmaXP);
898 fPhotodiode[1].SetRandomEventParameters(meanXM, sigmaXM);
899 fPhotodiode[2].SetRandomEventParameters(meanYP, sigmaYP);
900 fPhotodiode[3].SetRandomEventParameters(meanYM, sigmaYM);
914 for (
size_t i=0; i<2; i++)
916 fRelPos[i].SetHardwareSum(relpos[i], sequencenumber);
#define QwMessage
Predefined log drain for regular messages.
Parameter file parsing and management.
static const UInt_t kBPMErrorFlag
static const UInt_t kInvalidSubelementIndex
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.
Concrete hardware channel for VQWK ADC modules (6x32-bit words)
void InitializeChannel(TString name, TString datatosave) override
Initialize the fields in this object.
void ClearEventData() override
Clear the event data in this element.
void Ratio(const QwVQWK_Channel &numer, const QwVQWK_Channel &denom)
void Product(const QwVQWK_Channel &value1, const QwVQWK_Channel &value2)
void Scale(Double_t Offset) override
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.
void AddEntriesToList(std::vector< QwDBInterface > &row_list)
void Ratio(QwLinearDiodeArray &numer, QwLinearDiodeArray &denom)
std::vector< QwDBInterface > GetDBEntry()
void MakeLinearArrayList()
static UInt_t GetSubElementIndex(TString subname)
void SetSubElementCalibrationFactor(Int_t j, Double_t value) override
void ProcessEvent() override
std::vector< QwVQWK_Channel > fLinearArrayElementList
void FillTreeVector(QwRootTreeBranchVector &values) const override
Bool_t ApplySingleEventCuts() override
Apply single-event cuts across photodiodes and derived channels.
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 DeaccumulateRunningSum(QwLinearDiodeArray &value, Int_t ErrorMask=0xFFFFFFF)
std::vector< QwErrDBInterface > GetErrDBEntry()
VQwHardwareChannel * GetSubelementByName(TString ch_name) override
Resolve an internal channel pointer by subelement name.
void GetAbsolutePosition() override
Bool_t ApplyHWChecks()
Apply hardware checks for all photodiode pads.
void RandomizeEventData(int helicity=0, double time=0.0) override
void InitializeChannel(TString name)
Initialize this linear diode array with a detector name.
void ClearEventData() override
Clear event-scoped data for all pads and derived channels.
static const size_t kMaxElements
VQwBPM & operator-=(const VQwBPM &value) override
void PrintInfo() const override
Print multiple lines of information about this data element.
QwVQWK_Channel fRelPos[2]
void SetEventData(Double_t *block, UInt_t sequencenumber)
void EncodeEventData(std::vector< UInt_t > &buffer) override
void PrintValue() const override
Print single line of value and error of this data element.
void PrintErrorCounters() const override
Print error counters for all internal channels.
VQwBPM & operator+=(const VQwBPM &value) override
QwVQWK_Channel fAbsPos[2]
void IncrementErrorCounters() override
Increment error counters for all internal channels.
TString GetSubElementName(Int_t subindex) override
UInt_t UpdateErrorFlag() override
Update and return the aggregated event-cut error flag.
QwVQWK_Channel fPhotodiode[8]
UInt_t GetEventcutErrorFlag() override
Aggregate and return the event-cut error flag for this array.
static const TString subelement[8]
void SetDefaultSampleSize(Int_t sample_size) override
void CalculateRunningAverage() override
void SetEventCutMode(Int_t bcuts) override
void SetSubElementPedestal(Int_t j, Double_t value) override
void SetRandomEventParameters(Double_t meanX, Double_t sigmaX, Double_t meanY, Double_t sigmaY) override
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 Double_t kQwLinearDiodeArrayPadSize
VQwBPM & operator=(const VQwBPM &value) override
void ConstructHistograms(TDirectory *folder, TString &prefix) override
Construct the histograms for this data element.
void AccumulateRunningSum(const QwLinearDiodeArray &value, Int_t count=0, Int_t ErrorMask=0xFFFFFFF)
void Scale(Double_t factor) override
void FillHistograms() override
Fill the histograms for this data element.
void ConstructBranch(TTree *tree, TString &prefix) override
Bool_t CheckForBurpFail(const VQwDataElement *ev_error) override
Check for burp failures against another linear array of same type.
void ConstructBranchAndVector(TTree *tree, TString &prefix, QwRootTreeBranchVector &values) override
QwVQWK_Channel fEffectiveCharge
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