45static_assert(std::is_nothrow_move_assignable_v<RBranchData>);
46static_assert(std::is_nothrow_move_constructible_v<RBranchData>);
54 if (
branchData.fOutputBranch->GetAddress() ==
nullptr)
65 std::string
msg =
"RDataFrame::Snapshot:";
68 " is needed as it provides the size for one or more branches containing dynamically sized arrays, but "
74 msg.resize(
msg.size() - 2);
75 msg +=
" are needed as they provide the size of other branches containing dynamically sized arrays, but they are";
77 msg +=
" not part of the set of branches that are being written out.";
78 throw std::runtime_error(
msg);
107 const auto bname =
leaf->GetName();
140 const auto btype =
leaf->GetTypeName();
144 "RDataFrame::Snapshot: could not correctly construct a leaflist for C-style array in column %s. The "
145 "leaf is of type '%s'. This column will not be written out.",
203 "RDataFrame::Snapshot: could not correctly construct a leaflist for fundamental type in column %s. This "
204 "column will not be written out.",
205 bd.fOutputBranchName.c_str());
216 const std::string &fileName)
226 throw std::invalid_argument(
"Snapshot: cannot open file \"" + fileName +
"\" in update mode");
233 if (
opts.fOverwriteIfExists) {
234 if (
outTree->InheritsFrom(
"TTree")) {
240 const std::string
msg =
"Snapshot: tree \"" +
treeName +
"\" already present in file \"" + fileName +
241 "\". If you want to delete the original tree and write another, please set "
242 "RSnapshotOptions::fOverwriteIfExists to true.";
243 throw std::invalid_argument(
msg);
251 const std::string &fileName)
261 throw std::invalid_argument(
"Snapshot: cannot open file \"" + fileName +
"\" in update mode");
266 if (
opts.fOverwriteIfExists) {
270 const std::string
msg =
"Snapshot: RNTuple \"" +
ntupleName +
"\" already present in file \"" + fileName +
271 "\". If you want to delete the original ntuple and write another, please set "
272 "the 'fOverwriteIfExists' option to true in RSnapshotOptions.";
273 throw std::invalid_argument(
msg);
284 if (
opts.fOverwriteIfExists) {
291 const std::string
msg =
"Snapshot: object \"" +
ntupleName +
"\" already present in file \"" + fileName +
292 "\". If you want to delete the original object and write a new RNTuple, please set "
293 "the 'fOverwriteIfExists' option to true in RSnapshotOptions.";
294 throw std::invalid_argument(
msg);
364 throw std::logic_error(
365 "RDataFrame::Snapshot: something went wrong when creating a TTree branch, please report this as a bug.");
379 }
else if (options.
fOutputFormat == OutputFormat::kRNTuple) {
386 throw std::invalid_argument(
"RDataFrame::Snapshot: unrecognized output format");
392 const std::type_info *
typeID)
417 auto &
dynamic = std::get<EmptyDynamicType>(fTypeData);
425 dynamic.fEmptyInstance = std::shared_ptr<void>{tclass->New(), tclass->GetDestructor()};
431 return &
dynamic.fRawPtrToEmptyInstance;
433 return dynamic.fEmptyInstance.get();
450 fOutputBranch->SetAddress(EmptyInstance(
true));
458 const std::vector<const std::type_info *> &
colTypeIDs)
470 for (
unsigned int i = 0; i <
vbnames.size(); ++i) {
483 if (!fTreeName.empty() && !fOutputFile && fOptions.fLazy) {
487 return checkupdate ==
"update" ?
"updated" :
"created";
490 "A lazy Snapshot action was booked but never triggered. The tree '%s' in output file '%s' was not %s. "
491 "In case it was desired instead, remember to trigger the Snapshot operation, by storing "
492 "its result in a variable and for example calling the GetValue() method on it.",
502 fInputTree =
treeDS->GetTree();
503 fBranchAddressesNeedReset =
true;
508 if (!fBranchAddressesNeedReset) {
509 UpdateCArraysPtrs(values);
512 fBranchAddressesNeedReset =
false;
524 assert(values.size() == fBranchData.size());
527 if (fBranchData[i].fIsCArray) {
531 if (
auto *
data =
rawRVec->data(); fBranchData[i].fBranchAddressForCArrays !=
data) {
532 fBranchData[i].fOutputBranch->SetAddress(
data);
533 fBranchData[i].fBranchAddressForCArrays =
data;
542 assert(fBranchData.size() == values.size());
543 for (std::size_t i = 0; i < fBranchData.size(); i++) {
544 SetBranchesHelper(fInputTree, *fOutputTree, fBranchData, i, fOptions.fBasketSize, values[i]);
552 for (std::size_t i = 0; i < fBranchData.size(); i++) {
562 throw std::runtime_error(
"Snapshot: could not create output file " + fFileName);
565 if (!fDirName.empty()) {
569 outputDir = fOutputFile->mkdir(fDirName.c_str(),
"",
true);
571 outputDir = fOutputFile->mkdir(fDirName.c_str());
574 fOutputTree = std::make_unique<TTree>(fTreeName.c_str(), fTreeName.c_str(), fOptions.fSplitLevel,
outputDir);
576 if (fOptions.fAutoFlush)
577 fOutputTree->SetAutoFlush(fOptions.fAutoFlush);
582 assert(fOutputTree !=
nullptr);
583 assert(fOutputFile !=
nullptr);
587 if (fOutputTree->GetEntries() == 0) {
588 SetEmptyBranches(fInputTree, *fOutputTree);
591 fOutputTree->AutoSave(
"flushbaskets");
594 fOutputFile->Close();
597 auto fullTreeName = fDirName.empty() ? fTreeName : fDirName +
'/' + fTreeName;
598 fOutputLoopManager->SetDataSource(std::make_unique<ROOT::Internal::RDF::RTTreeDS>(
fullTreeName, fFileName));
615 const std::string
finalName = *
reinterpret_cast<const std::string *
>(
newName);
620 for (
const auto &
bd : fBranchData) {
621 if (
bd.fInputBranchName.empty())
645 const std::vector<const std::type_info *> &
colTypeIDs)
647 fOutputFiles(fNSlots),
648 fOutputTrees(fNSlots),
649 fBranchAddressesNeedReset(fNSlots, 1),
650 fInputTrees(fNSlots),
666 for (
unsigned int i = 0; i <
vbnames.size(); ++i) {
680 if (!fTreeName.empty() && fOptions.fLazy && !fOutputFiles.empty() &&
681 std::all_of(fOutputFiles.begin(), fOutputFiles.end(), [](
const auto &
f) { return !f; }) ) {
685 return checkupdate ==
"update" ?
"updated" :
"created";
688 "A lazy Snapshot action was booked but never triggered. The tree '%s' in output file '%s' was not %s. "
689 "In case it was desired instead, remember to trigger the Snapshot operation, by storing "
690 "its result in a variable and for example calling the GetValue() method on it.",
698 if (!fOutputFiles[
slot]) {
700 fOutputFiles[
slot] = fMerger->GetFile();
703 if (!fDirName.empty()) {
710 std::make_unique<TTree>(fTreeName.c_str(), fTreeName.c_str(), fOptions.fSplitLevel,
treeDirectory);
713 fOutputTrees[
slot]->SetImplicitMT(
false);
714 if (fOptions.fAutoFlush)
715 fOutputTrees[
slot]->SetAutoFlush(fOptions.fAutoFlush);
718 fInputTrees[
slot] =
r->GetTree();
722 fBranchAddressesNeedReset[
slot] = 1;
727 if (fOutputTrees[
slot]->GetEntries() > 0)
728 fOutputFiles[
slot]->Write();
732 fOutputTrees[
slot].reset(
nullptr);
737 if (fBranchAddressesNeedReset[
slot] == 0) {
738 UpdateCArraysPtrs(
slot, values);
740 SetBranches(
slot, values);
741 fBranchAddressesNeedReset[
slot] = 0;
743 fOutputTrees[
slot]->Fill();
744 auto entries = fOutputTrees[
slot]->GetEntries();
747 fOutputFiles[
slot]->Write();
751 const std::vector<void *> &values)
757 assert(values.size() == fBranchData[
slot].size());
775 const std::vector<void *> &values)
780 for (std::size_t i = 0; i <
branchData.size(); i++) {
791 for (std::size_t i = 0; i <
branchData.size(); i++) {
799 std::unique_ptr<TFile>{
TFile::Open(fFileName.c_str(), fOptions.fMode.c_str(), fFileName.c_str(),
802 throw std::runtime_error(
"Snapshot: could not create output file " + fFileName);
804 fMerger = std::make_unique<ROOT::TBufferMerger>(std::move(
outFile));
810 for (
auto &file : fOutputFiles) {
819 auto fullTreeName = fDirName.empty() ? fTreeName : fDirName +
'/' + fTreeName;
820 assert(fOutputFile &&
"Missing output file in Snapshot finalization.");
825 if (!fDirName.empty()) {
826 treeDirectory = fOutputFile->mkdir(fDirName.c_str(),
"",
true);
832 std::make_unique<TTree>(fTreeName.c_str(), fTreeName.c_str(), fOptions.fSplitLevel,
treeDirectory);
838 fOutputFile->Write();
842 fOutputFiles.clear();
846 fOutputLoopManager->SetDataSource(std::make_unique<ROOT::Internal::RDF::RTTreeDS>(
fullTreeName, fFileName));
863 const std::string
finalName = *
reinterpret_cast<const std::string *
>(
newName);
868 for (
const auto &
bd : fBranchData.front()) {
869 if (
bd.fInputBranchName.empty())
894 const std::vector<const std::type_info *> &
colTypeIDs)
919 if (!fNTupleName.empty() && !fOutputFile && fOptions.fLazy)
920 Warning(
"Snapshot",
"A lazy Snapshot action was booked but never triggered.");
926 auto nFields = fOutputFieldNames.size();
934 fInputFieldNames[i], fOptions.fVector2RVec)
937 fFieldTokens[i] = model->GetToken(fOutputFieldNames[i]);
943 writeOptions.SetInitialUnzippedPageSize(fOptions.fInitialUnzippedPageSize);
944 writeOptions.SetMaxUnzippedPageSize(fOptions.fMaxUnzippedPageSize);
945 writeOptions.SetApproxZippedClusterSize(fOptions.fApproxZippedClusterSize);
946 writeOptions.SetMaxUnzippedClusterSize(fOptions.fMaxUnzippedClusterSize);
947 writeOptions.SetEnablePageChecksums(fOptions.fEnablePageChecksums);
948 writeOptions.SetEnableSamePageMerging(fOptions.fEnableSamePageMerging);
950 fOutputFile.reset(
TFile::Open(fFileName.c_str(), fOptions.fMode.c_str()));
952 throw std::runtime_error(
"Snapshot: could not create output file " + fFileName);
955 if (!fDirName.empty()) {
959 outputDir = fOutputFile->mkdir(fDirName.c_str(),
"",
true);
961 outputDir = fOutputFile->mkdir(fDirName.c_str());
971 if (!fFillContexts[
slot]) {
972 fFillContexts[
slot] = fWriter->CreateFillContext();
973 fEntries[
slot] = fFillContexts[
slot]->GetModel().CreateBareEntry();
981 assert(values.size() == fFieldTokens.size());
982 for (
decltype(values.size()) i = 0; i < values.size(); i++) {
983 outputEntry->BindRawPtr(fFieldTokens[i], values[i]);
992 fFillContexts[
slot]->FlushCluster();
999 fFillContexts.clear();
1003 fOutputLoopManager->SetDataSource(std::make_unique<ROOT::RDF::RNTupleDS>(fDirName +
"/" + fNTupleName, fFileName));
1020 const std::string
finalName = *
reinterpret_cast<const std::string *
>(
newName);
1022 fNSlots,
finalName, fDirName, fNTupleName, fInputFieldNames,
1023 fOutputFieldNames, fOptions, fInputLoopManager, fOutputLoopManager, fInputColumnTypeIDs};
1059 (std::string{
"R_rdf_column_to_bitmask_mapping_"} +
fTree->GetName()).c_str());
1063 fTree->AutoSave(
"flushbaskets");
1066 std::string tree =
fTree->GetName();
1069 std::string file =
fFile->GetName();
1092 throw std::logic_error(
"Branch " + branchName +
1093 " is being registered with different variation index than the expected one: " +
1107 std::string{
"R_rdf_mask_"} +
fTree->GetName() +
'_' + std::to_string(
fBitMasks.size());
1120 mask.bitset.reset();
1141 throw std::runtime_error(
"The TTree associated to the Snapshot action doesn't exist, any more.");
1144 *
mask.branchBuffer =
mask.bitset.to_ullong();
1157 const std::vector<const std::type_info *> &
colTypeIDs)
1166 throw std::runtime_error(std::string{
"Snapshot: could not create output file "} + std::string{
filename});
1189 for (
unsigned int i = 0; i <
vbnames.size(); ++i) {
1236 fInputTree =
treeDS->GetTree();
1239 for (std::size_t i = 0; i < fBranchData.size(); i++) {
1240 SetBranchesHelper(fInputTree, *fOutputHandle->fTree, fBranchData, i, fOptions.fBasketSize,
1241 fBranchData[i].EmptyInstance(
false));
1253 assert(fBranchData.size() == values.size());
1254 for (std::size_t i = 0; i < values.size(); i++) {
1258 SetBranchesHelper(fInputTree, *fOutputHandle->fTree, fBranchData, i, fOptions.fBasketSize, values[i]);
1261 const bool fundamentalType = fBranchData[i].WriteValueIfFundamental(values[i]);
1263 SetBranchesHelper(fInputTree, *fOutputHandle->fTree, fBranchData, i, fOptions.fBasketSize, values[i]);
1269 assert(!fOutputHandle->MaskEmpty());
1271 fOutputHandle->Write();
1272 fOutputHandle->ClearMaskBits();
1280 fOutputHandle.reset();
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t mask
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
static TBranch * SearchForBranch(TTree *tree, const char *name)
The head node of a RDF computation graph.
void SetDataSource(std::unique_ptr< ROOT::RDF::RDataSource > dataSource)
std::shared_ptr< SnapshotOutputWriter > fOutputHandle
RSnapshotOptions fOptions
SnapshotHelperWithVariations(std::string_view filename, std::string_view dirname, std::string_view treename, const ColumnNames_t &, const ColumnNames_t &bnames, const RSnapshotOptions &options, std::vector< bool > &&, ROOT::Detail::RDF::RLoopManager *outputLoopMgr, ROOT::Detail::RDF::RLoopManager *inputLoopMgr, const std::vector< const std::type_info * > &colTypeIDs)
void InitTask(TTreeReader *, unsigned int slot)
Bind all output branches to RDF columns for the given slots.
std::vector< RBranchData > fBranchData
ROOT::Detail::RDF::RLoopManager * fOutputLoopManager
void Exec(unsigned int, const std::vector< void * > &values, std::vector< bool > const &filterPassed)
Connect all output fields to the values pointed to by values, fill the output dataset,...
void RegisterVariedColumn(unsigned int slot, unsigned int columnIndex, unsigned int originalColumnIndex, unsigned int varationIndex, std::string const &variationName)
Register a new column as a variation of the column at originalColumnIndex, and clone its properties.
void FinalizeTask(unsigned int slot)
RSnapshotOptions fOptions
UntypedSnapshotRNTupleHelper(unsigned int nSlots, std::string_view filename, std::string_view dirname, std::string_view ntuplename, const ColumnNames_t &vfnames, const ColumnNames_t &fnames, const RSnapshotOptions &options, ROOT::Detail::RDF::RLoopManager *inputLM, ROOT::Detail::RDF::RLoopManager *outputLM, const std::vector< const std::type_info * > &colTypeIDs)
void Exec(unsigned int slot, const std::vector< void * > &values)
UntypedSnapshotRNTupleHelper MakeNew(void *newName)
Create a new UntypedSnapshotRNTupleHelper with a different output file name.
void InitTask(TTreeReader *, unsigned int slot)
UntypedSnapshotTTreeHelperMT(unsigned int nSlots, std::string_view filename, std::string_view dirname, std::string_view treename, const ColumnNames_t &vbnames, const ColumnNames_t &bnames, const RSnapshotOptions &options, std::vector< bool > &&isDefine, ROOT::Detail::RDF::RLoopManager *loopManager, ROOT::Detail::RDF::RLoopManager *inputLM, const std::vector< const std::type_info * > &colTypeIDs)
void UpdateCArraysPtrs(unsigned int slot, const std::vector< void * > &values)
void SetEmptyBranches(TTree *inputTree, TTree &outputTree)
std::vector< std::vector< RBranchData > > fBranchData
UntypedSnapshotTTreeHelperMT MakeNew(void *newName, std::string_view="nominal")
Create a new UntypedSnapshotTTreeHelperMT with a different output file name.
RSnapshotOptions fOptions
void InitTask(TTreeReader *r, unsigned int slot)
void FinalizeTask(unsigned int slot)
void Exec(unsigned int slot, const std::vector< void * > &values)
void SetBranches(unsigned int slot, const std::vector< void * > &values)
RSnapshotOptions fOptions
std::vector< RBranchData > fBranchData
void InitTask(TTreeReader *, unsigned int)
UntypedSnapshotTTreeHelper MakeNew(void *newName, std::string_view="nominal")
Create a new UntypedSnapshotTTreeHelper with a different output file name.
void SetEmptyBranches(TTree *inputTree, TTree &outputTree)
void SetBranches(const std::vector< void * > &values)
void Exec(unsigned int, const std::vector< void * > &values)
UntypedSnapshotTTreeHelper(std::string_view filename, std::string_view dirname, std::string_view treename, const ColumnNames_t &vbnames, const ColumnNames_t &bnames, const RSnapshotOptions &options, std::vector< bool > &&isDefine, ROOT::Detail::RDF::RLoopManager *loopManager, ROOT::Detail::RDF::RLoopManager *inputLM, const std::vector< const std::type_info * > &colTypeIDs)
void UpdateCArraysPtrs(const std::vector< void * > &values)
static RResult< std::unique_ptr< RFieldBase > > Create(const std::string &fieldName, const std::string &typeName, const ROOT::RCreateFieldOptions &options, const ROOT::RNTupleDescriptor *desc, ROOT::DescriptorId_t fieldId)
Factory method to resurrect a field from the stored on-disk type information.
static std::unique_ptr< RNTupleModel > CreateBare()
Creates a "bare model", i.e. an RNTupleModel with no default entry.
static std::unique_ptr< RNTupleParallelWriter > Append(std::unique_ptr< ROOT::RNTupleModel > model, std::string_view ntupleName, TDirectory &fileOrDirectory, const ROOT::RNTupleWriteOptions &options=ROOT::RNTupleWriteOptions())
Append an RNTuple to the existing file.
Common user-tunable settings for storing RNTuples.
Representation of an RNTuple data set in a ROOT file.
const_iterator begin() const
const_iterator end() const
A "std::vector"-like collection of values implementing handy operation to analyse them.
A Branch for the case of an object.
A TTree is a list of TBranches.
TClassRef is used to implement a permanent reference to a TClass object.
TClass instances represent classes, structs and namespaces in the ROOT type system.
Basic data type descriptor (datatype information is obtained from CINT).
static TDictionary * GetDictionary(const char *name)
Retrieve the type (class, fundamental type, typedef etc) named "name".
TDirectory::TContext keeps track and restore the current directory.
Describe directory structure in memory.
A file, usually with extension .root, that stores data and code in the form of serialized objects in ...
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
Mother of all ROOT objects.
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
A TTree represents a columnar dataset.
@ kEntriesReshuffled
If set, signals that this TTree is the output of the processing of another TTree, and the entries are...
std::vector< std::string > ReplaceDotWithUnderscore(const std::vector< std::string > &columnNames)
Replace occurrences of '.
char TypeName2ROOTTypeName(const std::string &b)
Convert type name (e.g.
std::string TypeID2TypeName(const std::type_info &id)
Returns the name of a type starting from its type_info An empty string is returned in case of failure...
std::string GetTypeNameWithOpts(const ROOT::RDF::RDataSource &ds, std::string_view colName, bool vector2RVec)
char TypeID2ROOTTypeName(const std::type_info &tid)
TBranch * CallBranchImp(TTree &tree, const char *branchname, TClass *ptrClass, void *addobj, Int_t bufsize=32000, Int_t splitlevel=99)
TBranch * CallBranchImpRef(TTree &tree, const char *branchname, TClass *ptrClass, EDataType datatype, void *addobj, Int_t bufsize=32000, Int_t splitlevel=99)
std::vector< std::string > ColumnNames_t
int CompressionSettings(RCompressionSetting::EAlgorithm::EValues algorithm, int compressionLevel)
ROOT::ESTLType STLKind(std::string_view type)
Converts STL container name to number.
ROOT::ESTLType IsSTLCont(std::string_view type)
type : type name: vector<list<classA,allocator>,allocator> result: 0 : not stl container code of cont...
Stores empty instances of classes, so a dummy object can be written when a systematic variation doesn...
Stores variations of a fundamental type.
Stores properties of each output branch in a Snapshot.
void * EmptyInstance(bool pointerToPointer)
Return a pointer to an empty instance of the type represented by this branch.
void ClearBranchContents()
Point the branch address to an empty instance of the type represented by this branch or write null by...
std::variant< FundamentalType, EmptyDynamicType > fTypeData
const std::type_info * fInputTypeID
std::unique_ptr< uint64_t > branchBuffer
An object to store an output file and a tree in one common place to share them between instances of S...
void Write() const
Write the current event and the bitmask to the output dataset.
std::unique_ptr< TTree > fTree
void ClearMaskBits()
Clear all bits, as if none of the variations passed its filter.
SnapshotOutputWriter(SnapshotOutputWriter const &)=delete
RLoopManager * fOutputLoopManager
std::string fDirectoryName
std::unordered_map< std::string, std::pair< std::string, unsigned int > > fBranchToBitmaskMapping
std::unique_ptr< TFile > fFile
void RegisterBranch(std::string const &branchName, unsigned int variationIndex)
Register a branch and corresponding systematic uncertainty.
SnapshotOutputWriter(TFile *file)
void SetMaskBit(unsigned int index)
Set a bit signalling that the variation at index passed its filter.
bool MaskEmpty() const
Test if any of the mask bits are set.
SnapshotOutputWriter & operator=(SnapshotOutputWriter const &)=delete
std::unordered_map< std::string, unsigned int > fBranchToVariationMapping
SnapshotOutputWriter(SnapshotOutputWriter &&) noexcept=delete
std::vector< Bitmask > fBitMasks
Tag to let data sources use the native data type when creating a column reader.
EValues
Note: this is only temporarily a struct and will become a enum class hence the name convention used.
A collection of options to steer the creation of the dataset on disk through Snapshot().
int fAutoFlush
*(TTree only)* AutoFlush value for output tree
ESnapshotOutputFormat fOutputFormat
Which data format to write to.
std::string fMode
Mode of creation of output file.
ECAlgo fCompressionAlgorithm
Compression algorithm of output file.
int fSplitLevel
*(TTree only)* Split level of output tree
int fCompressionLevel
Compression level of output file.