8#include "TFileMerger.h"
9#include "TFileCacheWrite.h"
29 if(outputFilename.empty()) {
30 outputFilename =
"temp.root";
40 fOutputFile(TFile::Open(outputFilename.c_str(),
"recreate")),
45 std::cerr <<
"Failed to open '" << outputFilename <<
"'" << std::endl;
49 fEventTree =
new TTree(
"AnalysisTree",
"AnalysisTree");
76 std::shared_ptr<TUnpackedEvent> event;
83 std::ostringstream str;
85 <<
"??? good events" << std::endl;
96 std::shared_ptr<TUnpackedEvent> event;
100 std::this_thread::sleep_for(std::chrono::milliseconds(100));
106 std::shared_ptr<const TFragment> frag;
108 if(frag !=
nullptr) {
116 if(event !=
nullptr) {
133 GValue::Get()->Write(
"Values", TObject::kOverwrite);
142 if(options->WriteDiagnostics()) {
144 diag->Write(
"SortingDiagnostics", TObject::kOverwrite);
148 if(!options->WriteFragmentTree()) {
151 parsingDiagnostics->Write(
"ParsingDiagnostics", TObject::kOverwrite);
157 if(!options->IgnoreScaler()) {
158 std::cout <<
"Starting to write dead time scalers" << std::endl;
159 auto* scalerTree =
new TTree(
"DeadtimeScaler",
"DeadtimeScaler");
161 scalerTree->Branch(
"ScalerData", &scalerData);
163 while(deadtimeQueue->Size() > 0) {
164 scalerData = deadtimeQueue->PopScaler();
171 std::cout <<
"Starting to write rate scalers" << std::endl;
172 scalerTree =
new TTree(
"RateScaler",
"RateScaler");
174 scalerTree->Branch(
"ScalerData", &scalerData);
176 while(rateQueue->Size() > 0) {
177 scalerData = rateQueue->PopScaler();
183 std::cout <<
"Done writing scaler trees" << std::endl;
185 delete deadtimeQueue;
202 auto* det_p =
reinterpret_cast<TDetector*
>(cls->New());
211 TBranch* newBranch =
fEventTree->Branch(cls->GetName(), cls->GetName(), det_pp);
225 for(
int i = 0; i <
fEventTree->GetEntries(); i++) {
229 std::cout <<
"\r" << std::string(30,
' ') <<
"\r" <<
Name() <<
": added \"" << cls->GetName() << R
"(" branch, )" << det_pp << ", " << det_p << std::string(30,
' ') << std::endl;
246 (*elem.second)->Clear(
"a");
250 for(
const auto& det : event->GetDetectors()) {
251 TClass* cls = det->IsA();
257 (*
fDetMap.at(cls))->ClearTransients();
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()
bool WriteToFile(const std::string &file)
static TAnalysisWriteLoop * Get(std::string name="", std::string outputFilename="")
std::shared_ptr< ThreadsafeQueue< std::shared_ptr< const TFragment > > > fOutOfOrderQueue
std::string EndStatus() override
void WriteEvent(std::shared_ptr< TUnpackedEvent > &event)
TFragment * fOutOfOrderFrag
std::shared_ptr< ThreadsafeQueue< std::shared_ptr< TUnpackedEvent > > > fInputQueue
std::map< TClass *, TDetector ** > fDetMap
bool Iteration() override
void ClearQueue() override
void AddBranch(TClass *cls)
std::map< TClass *, TDetector * > fDefaultDets
TAnalysisWriteLoop(const TAnalysisWriteLoop &)=delete
static int WriteToRoot(TFile *fileptr=nullptr)
static size_t GetNumberOfChannels()
static TDeadtimeScalerQueue * Get()
virtual void ClearTransients() const
static TGRSIOptions * Get(int argc=0, char **argv=nullptr)
Do not use!
static TAnalysisOptions * AnalysisOptions()
static TRateScalerQueue * Get()
static bool WriteToRoot(TFile *fileptr=nullptr)
static TPPG * Get(bool verbose=false)