24 if(name.length() == 0) {
30 if(fOutputFilename.length() == 0) {
31 fOutputFilename =
"temp.root";
39 :
StoppableThread(std::move(name)), fOutputFile(nullptr), fEventTree(nullptr), fBadEventTree(nullptr), fScalerTree(nullptr),
44 if(fOutputFilename !=
"/dev/null") {
47 fOutputFile =
new TFile(fOutputFilename.c_str(),
"RECREATE");
49 throw std::runtime_error(Form(
"Failed to open \"%s\"\n", fOutputFilename.c_str()));
52 fEventTree =
new TTree(
"FragmentTree",
"FragmentTree");
56 fBadEventTree =
new TTree(
"BadFragmentTree",
"BadFragmentTree");
76 std::shared_ptr<const TFragment> event;
83 std::ostringstream str;
93 std::shared_ptr<const TFragment> event;
99 std::shared_ptr<const TBadFragment> badEvent;
102 std::shared_ptr<TEpicsFrag> scaler;
105 bool hasAnything =
event || badEvent || scaler;
108 if(event !=
nullptr) {
113 if(badEvent !=
nullptr) {
117 if(scaler !=
nullptr) {
127 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
146 gValues->Write(
"Values", TObject::kOverwrite);
158 parsingDiagnostics->
ReadPPG(ppg);
159 parsingDiagnostics->Write(
"ParsingDiagnostics", TObject::kOverwrite);
163 std::cout <<
"Starting to write dead time scalers" << std::endl;
165 auto* scalerTree =
new TTree(
"DeadtimeScaler",
"DeadtimeScaler");
167 scalerTree->Branch(
"ScalerData", &scalerData);
168 while(deadtimeQueue->Size() > 0) {
169 scalerData = deadtimeQueue->PopScaler();
174 std::cout <<
"Starting to write rate scalers" << std::endl;
176 scalerTree =
new TTree(
"RateScaler",
"RateScaler");
178 scalerTree->Branch(
"ScalerData", &scalerData);
179 while(rateQueue->Size() > 0) {
180 scalerData = rateQueue->PopScaler();
184 std::cout <<
"Done writing scaler trees" << std::endl;
202 std::cout << __PRETTY_FUNCTION__ <<
": no fragment tree!" << std::endl;
std::mutex ttree_fill_mutex
static GValue * Get(const std::string &name="")
std::atomic_size_t & ItemsPopped()
std::atomic_long & InputSize()
static StoppableThread * Get(const std::string &name)
void IncrementItemsPopped()
static int WriteToRoot(TFile *fileptr=nullptr)
static size_t GetNumberOfChannels()
static TDeadtimeScalerQueue * Get()
virtual void ClearTransients() const
void ClearQueue() override
std::string EndStatus() override
bool Iteration() override
TEpicsFrag * fScalerAddress
std::shared_ptr< ThreadsafeQueue< std::shared_ptr< const TBadFragment > > > fBadInputQueue
void WriteBadEvent(const std::shared_ptr< const TBadFragment > &event)
std::shared_ptr< ThreadsafeQueue< std::shared_ptr< const TFragment > > > fInputQueue
void WriteScaler(const std::shared_ptr< TEpicsFrag > &scaler)
TBadFragment * fBadEventAddress
std::shared_ptr< ThreadsafeQueue< std::shared_ptr< TEpicsFrag > > > fScalerInputQueue
static TFragWriteLoop * Get(std::string name="", std::string fOutputFilename="")
TFragment * fEventAddress
void WriteEvent(const std::shared_ptr< const TFragment > &event)
TFragWriteLoop(const TFragWriteLoop &)=delete
bool WriteDiagnostics() const
static TGRSIOptions * Get(int argc=0, char **argv=nullptr)
Do not use!
static bool WriteToFile(TFile *file=nullptr)
bool IgnoreScaler() const
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) override
static TRateScalerQueue * Get()
static bool WriteToRoot(TFile *fileptr=nullptr)
static TPPG * Get(bool verbose=false)