JAPAn
Just Another Parity Analyzer
Loading...
Searching...
No Matches
VQwClock.h
Go to the documentation of this file.
1/********************************************************\
2* File: VQwClock.h *
3* *
4* Author: Juan Carlos Cornejo <cornejo@jlab.org> *
5* Time-stamp: <2011-06-16> *
6\********************************************************/
7
8#pragma once
9
10// System headers
11#include <vector>
12
13// ROOT headers
14#include <TTree.h>
15#ifdef HAS_RNTUPLE_SUPPORT
16#include <ROOT/RNTupleModel.hxx>
17#endif // HAS_RNTUPLE_SUPPORT
18
19#include "QwParameterFile.h"
20#include "VQwDataElement.h"
21#include "VQwHardwareChannel.h"
22
23// Forward declarations
24#ifdef __USE_DATABASE__
25class QwDBInterface;
26#endif // __USE_DATABASE__
27
28template<typename T> class QwClock;
29
30/**
31 * \ingroup QwAnalysis_BeamLine
32 */
33/**
34 * \class VQwClock
35 * \ingroup QwAnalysis_BeamLine
36 * \brief Abstract base for beam clocks used to normalize rates and yields
37 *
38 * VQwClock provides the interface for clock-like data elements that can be
39 * used to normalize other channels. Concrete clocks are provided by the
40 * templated QwClock<T> factory. The class exposes hooks for event decoding,
41 * tree/histogram output, accumulation, and single-event cuts.
42 *
43 * Specialized note: containers may hold pointers of type VQwClock* and invoke
44 * virtual hooks such as CheckForBurpFail; derived implementations must ensure
45 * proper overrides are provided to enable polymorphic dispatch.
46 */
47class VQwClock : public VQwDataElement {
48 /***************************************************************
49 * Class: VQwClock
50 * Pure Virtual base class for the clocks in the datastream
51 * Through use of the Create factory function, one can
52 * get a concrete instance of a templated QwClock.
53 *
54 ***************************************************************/
55public:
56 VQwClock() { }; // Do not use this function!!
57 VQwClock(const VQwClock& source)
58 : VQwDataElement(source)
59 { }
60 ~VQwClock() override {};
61
62 // VQwDataElement virtual functions
63 Int_t ProcessEvBuffer(UInt_t* buffer, UInt_t word_position_in_buffer, UInt_t subelement=0) override = 0;
64 void ConstructHistograms(TDirectory *folder, TString &prefix) override = 0;
65 void FillHistograms() override = 0;
66 /*! \brief Inherited from VQwDataElement to set the upper and lower limits (fULimit and fLLimit), stability % and the error flag on this channel */
67 virtual void SetSingleEventCuts(UInt_t errorflag,Double_t min, Double_t max, Double_t stability, Double_t burplevel) = 0;
68 virtual void Ratio( const VQwClock &/*numer*/, const VQwClock &/*denom*/)
69 { std::cerr << "Ratio not defined! (VQwClock)" << std::endl; }
70 void ClearEventData() override = 0;
71
72 // Virtual functions delegated to sub classes
73 virtual void InitializeChannel(TString subsystem, TString name, TString datatosave, TString type = "") = 0;
74
75 void LoadChannelParameters(QwParameterFile &paramfile) override = 0;
76
77 virtual void SetEventCutMode(Int_t bcuts) = 0;
78 virtual void SetPedestal(Double_t ped) = 0;
79 virtual void SetCalibrationFactor(Double_t calib) = 0;
80 virtual Bool_t ApplySingleEventCuts() = 0;//Check for good events by setting limits on the devices readings
81 virtual void IncrementErrorCounters() = 0;
82 virtual void ProcessEvent() = 0;
83 virtual void Scale(Double_t factor) = 0;
84 virtual void CalculateRunningAverage() = 0;
85 virtual void AccumulateRunningSum(const VQwClock& value, Int_t count=0, Int_t ErrorMask=0xFFFFFFF) = 0;
86 virtual void DeaccumulateRunningSum(VQwClock& value, Int_t ErrorMask=0xFFFFFFF) = 0;
87 virtual void ConstructBranchAndVector(TTree *tree, TString &prefix, QwRootTreeBranchVector &values) = 0;
88 virtual void ConstructBranch(TTree *tree, TString &prefix) = 0;
89 virtual void ConstructBranch(TTree *tree, TString &prefix, QwParameterFile& modulelist) = 0;
90 virtual void FillTreeVector(QwRootTreeBranchVector &values) const = 0;
91#ifdef HAS_RNTUPLE_SUPPORT
92 virtual void ConstructNTupleAndVector(std::unique_ptr<ROOT::RNTupleModel>& model, TString& prefix, std::vector<Double_t>& values, std::vector<std::shared_ptr<Double_t>>& fieldPtrs) = 0;
93 virtual void FillNTupleVector(std::vector<Double_t>& values) const = 0;
94#endif // HAS_RNTUPLE_SUPPORT
95
96#ifdef __USE_DATABASE__
97 virtual std::vector<QwDBInterface> GetDBEntry() = 0;
98#endif // __USE_DATABASE__
99
100 // Operators
101 virtual VQwClock& operator= (const VQwClock &value) =0;
102 virtual VQwClock& operator+= (const VQwClock &value) =0;
103 virtual VQwClock& operator-= (const VQwClock &value) =0;
104
105 // Factory function to produce appropriate Clock
106 static VQwClock* Create(TString subsystemname, TString type, TString name);
107 static VQwClock* Create(const VQwClock& source);
108
109 // These are related to those hardware channels that need to normalize
110 // to an external clock
111 Double_t GetNormClockValue() override = 0;
112 virtual Double_t GetStandardClockValue() = 0;
113
114 virtual const VQwHardwareChannel* GetTime() const = 0;
115
116 // Polymorphic burp-failure check for clocks
117 virtual Bool_t CheckForBurpFail(const VQwClock* ev_error) = 0;
118
119};
120
121typedef std::shared_ptr<VQwClock> VQwClock_ptr;
Parameter file parsing and management.
Definition of the pure virtual base class of all data elements.
std::shared_ptr< VQwClock > VQwClock_ptr
Definition VQwClock.h:121
const TString QwBPMStripline< T >::subelement[4]
Configuration file parser with flexible tokenization and search capabilities.
A helper class to manage a vector of branch entries for ROOT trees.
Definition QwRootFile.h:53
VQwDataElement()
Default constructor.
Abstract base for concrete hardware channels implementing dual-operator pattern.
Standard clock channel with calibration representing frequency.
Definition QwClock.h:42
virtual void ConstructBranch(TTree *tree, TString &prefix)=0
virtual void DeaccumulateRunningSum(VQwClock &value, Int_t ErrorMask=0xFFFFFFF)=0
virtual VQwClock & operator-=(const VQwClock &value)=0
VQwClock()
Definition VQwClock.h:56
VQwClock(const VQwClock &source)
Definition VQwClock.h:57
~VQwClock() override
Definition VQwClock.h:60
virtual void CalculateRunningAverage()=0
virtual void AccumulateRunningSum(const VQwClock &value, Int_t count=0, Int_t ErrorMask=0xFFFFFFF)=0
void LoadChannelParameters(QwParameterFile &paramfile) override=0
virtual const VQwHardwareChannel * GetTime() const =0
virtual void Scale(Double_t factor)=0
virtual void SetPedestal(Double_t ped)=0
Int_t ProcessEvBuffer(UInt_t *buffer, UInt_t word_position_in_buffer, UInt_t subelement=0) override=0
Process the CODA event buffer for this element.
virtual void IncrementErrorCounters()=0
virtual void InitializeChannel(TString subsystem, TString name, TString datatosave, TString type="")=0
void ClearEventData() override=0
Clear the event data in this element.
virtual void FillTreeVector(QwRootTreeBranchVector &values) const =0
virtual void ConstructBranch(TTree *tree, TString &prefix, QwParameterFile &modulelist)=0
virtual void Ratio(const VQwClock &, const VQwClock &)
Definition VQwClock.h:68
virtual VQwClock & operator=(const VQwClock &value)=0
virtual VQwClock & operator+=(const VQwClock &value)=0
virtual Bool_t ApplySingleEventCuts()=0
Double_t GetNormClockValue() override=0
virtual void ProcessEvent()=0
static VQwClock * Create(TString subsystemname, TString type, TString name)
Definition VQwClock.cc:30
virtual void ConstructBranchAndVector(TTree *tree, TString &prefix, QwRootTreeBranchVector &values)=0
void FillHistograms() override=0
Fill the histograms for this data element.
virtual void SetSingleEventCuts(UInt_t errorflag, Double_t min, Double_t max, Double_t stability, Double_t burplevel)=0
Inherited from VQwDataElement to set the upper and lower limits (fULimit and fLLimit),...
virtual void SetEventCutMode(Int_t bcuts)=0
virtual Double_t GetStandardClockValue()=0
virtual void SetCalibrationFactor(Double_t calib)=0
virtual Bool_t CheckForBurpFail(const VQwClock *ev_error)=0
void ConstructHistograms(TDirectory *folder, TString &prefix) override=0
Construct the histograms for this data element.