86 #include "TRestAnalysisTree.h"
91 #include <TObjArray.h>
93 #include "TRestStringHelper.h"
94 #include "TRestStringOutput.h"
100 TRestAnalysisTree::TRestAnalysisTree() : TTree() {
101 SetName(
"AnalysisTree");
102 SetTitle(
"REST Analysis tree");
107 TRestAnalysisTree::TRestAnalysisTree(TTree* tree) : TTree() {
108 SetName(
"AnalysisTree");
109 SetTitle(
"Linked to " + (TString)tree->GetName());
115 TObjArray* lfs = tree->GetListOfLeaves();
116 for (
int i = 0; i < lfs->GetLast() + 1; i++) {
117 TLeaf* lf = (TLeaf*)lfs->UncheckedAt(i);
119 ReadLeafValueToObservable(lf, obs);
120 obs.
name = lf->GetName();
121 SetObservable(-1, obs);
126 if (tree->ClassName() == (TString)
"TRestAnalysisTree") {
133 TRestAnalysisTree::TRestAnalysisTree(
const TString& name,
const TString& title) : TTree(name, title) {
140 void TRestAnalysisTree::Initialize() {
145 fSubEventTag =
new TString();
152 fObservableIdMap.clear();
153 fObservableIdSearchMap.clear();
154 fObservableDescriptions.clear();
155 fObservableNames.clear();
156 fObservables.clear();
167 auto iter = fObservableIdMap.find(obsName);
168 if (iter != fObservableIdMap.end()) {
183 auto iter = fObservableIdSearchMap.find(obsName);
184 if (iter != fObservableIdSearchMap.end()) {
188 for (
auto& fObservableName : fObservableNames) {
189 string obs = (string)fObservableName;
192 obs = obs.substr(obs.find(
'_') + 1, -1);
195 diffs.push_back(min(diff1, diff2));
198 int matchedCount = 0;
201 for (
unsigned int i = 0; i < diffs.size(); i++) {
202 if (min > diffs[i]) {
211 if (matchedCount == 1) {
212 cout <<
"TRestAnalysisTree::GetObservableID(): Find observable " << fObservableNames[minPos]
213 <<
" for obs name: " << obsName << endl;
214 fObservableIdSearchMap[obsName] = minPos;
216 }
else if (matchedCount == 0) {
217 RESTError <<
"TRestAnalysisTree::GetObservableID(): No Matching observable found" << RESTendl;
219 RESTError <<
"did you mean \"" << fObservableNames[minPos] <<
"\" ?" << RESTendl;
220 fObservableIdSearchMap[obsName] = -1;
224 RESTWarning <<
"TRestAnalysisTree::GetObservableID(): Multiple observables found" << RESTendl;
226 <<
"Please specify the full observable name (e.g, sAna_ThresholdIntegral) in your code. "
228 RESTWarning <<
"Returning the first matched observable : " << fObservableNames[minPos]
230 fObservableIdSearchMap[obsName] = minPos;
234 fObservableIdSearchMap[obsName] = -1;
245 return fObservableIdMap.count(obsName) > 0;
271 int NBranches = GetListOfBranches()->GetEntriesFast();
272 int NObsInList = fObservables.size();
273 int Entries = GetEntriesFast();
279 if (NBranches == 0) {
280 return TRestAnalysisTree_Status::Created;
284 if (NObsInList == 0) {
286 return TRestAnalysisTree_Status::Retrieved;
288 return TRestAnalysisTree_Status::EmptyCloned;
292 return TRestAnalysisTree_Status::Filled;
294 return TRestAnalysisTree_Status::Connected;
297 }
else if (NBranches == 6) {
298 auto br = (TBranch*)GetListOfBranches()->UncheckedAt(0);
299 if ((
int*)br->GetAddress() != &fRunOrigin) {
301 return TRestAnalysisTree_Status::Retrieved;
303 return TRestAnalysisTree_Status::EmptyCloned;
307 return TRestAnalysisTree_Status::Filled;
309 return TRestAnalysisTree_Status::Connected;
313 return TRestAnalysisTree_Status::Error;
316 return TRestAnalysisTree_Status::Error;
329 TBranch* br1 = GetBranch(
"runOrigin");
330 TBranch* br2 = GetBranch(
"subRunOrigin");
331 TBranch* br3 = GetBranch(
"eventID");
332 TBranch* br4 = GetBranch(
"subEventID");
333 TBranch* br5 = GetBranch(
"timeStamp");
334 TBranch* br6 = GetBranch(
"subEventTag");
336 if (br1 && br2 && br3 && br4 && br5 && br6) {
337 br1->SetAddress(&fRunOrigin);
338 br2->SetAddress(&fSubRunOrigin);
339 br3->SetAddress(&fEventID);
340 br4->SetAddress(&fSubEventID);
341 br5->SetAddress(&fTimeStamp);
342 br6->SetAddress(&fSubEventTag);
344 cout <<
"REST Error: TRestAnalysisTree::ConnectBranches(): event branches does not exist!" << endl;
349 fObservables = std::vector<RESTValue>(GetNumberOfObservables());
350 for (
int i = 0; i < GetNumberOfObservables(); i++) {
352 fObservables[i].name = fObservableNames[i];
362 for (
int i = 0; i < GetNumberOfObservables(); i++) {
363 TBranch* branch = GetBranch(fObservableNames[i]);
364 if (branch !=
nullptr) {
365 if (branch->GetAddress() !=
nullptr) {
366 if ((
string)branch->ClassName() !=
"TBranch") {
368 fObservables[i].address = *(
char**)branch->GetAddress();
371 fObservables[i].address = branch->GetAddress();
374 fObservables[i].Assembly();
375 branch->SetAddress(fObservables[i].address);
392 if (!GetBranch(
"runOrigin")) Branch(
"runOrigin", &fRunOrigin);
393 if (!GetBranch(
"subRunOrigin")) Branch(
"subRunOrigin", &fSubRunOrigin);
394 if (!GetBranch(
"eventID")) Branch(
"eventID", &fEventID);
395 if (!GetBranch(
"subEventID")) Branch(
"subEventID", &fSubEventID);
396 if (!GetBranch(
"timeStamp")) Branch(
"timeStamp", &fTimeStamp);
397 if (!GetBranch(
"subEventTag")) Branch(
"subEventTag", fSubEventTag);
399 for (
int n = 0; n < GetNumberOfObservables(); n++) {
400 TString typeName = fObservableTypes[n];
401 TString brName = fObservableNames[n];
402 char* ref = fObservables[n].address;
404 TBranch* branch = GetBranch(brName);
405 if (branch ==
nullptr) {
406 if (typeName ==
"double") {
407 this->Branch(brName, (
double*)ref);
408 }
else if (typeName ==
"float") {
409 this->Branch(brName, (
float*)ref);
410 }
else if (typeName ==
"long double") {
411 this->Branch(brName, (
long double*)ref);
412 }
else if (typeName ==
"bool") {
413 this->Branch(brName, (
bool*)ref);
414 }
else if (typeName ==
"char") {
415 this->Branch(brName, (
char*)ref);
416 }
else if (typeName ==
"int") {
417 this->Branch(brName, (
int*)ref);
418 }
else if (typeName ==
"short") {
419 this->Branch(brName, (
short*)ref);
420 }
else if (typeName ==
"unsigned char") {
421 this->Branch(brName, (
unsigned char*)ref);
422 }
else if (typeName ==
"unsigned int") {
423 this->Branch(brName, (
unsigned int*)ref);
424 }
else if (typeName ==
"unsigned short") {
425 this->Branch(brName, (
unsigned short*)ref);
426 }
else if (typeName ==
"long") {
427 this->Branch(brName, (
long*)ref);
428 }
else if (typeName ==
"long long") {
429 this->Branch(brName, (
long long*)ref);
430 }
else if (typeName ==
"unsigned long") {
431 this->Branch(brName, (
unsigned long*)ref);
432 }
else if (typeName ==
"unsigned long long") {
433 this->Branch(brName, (
unsigned long long*)ref);
435 this->Branch(brName, typeName, ref);
438 this->GetBranch(brName)->SetTitle(
"(" + typeName +
") " + fObservableDescriptions[n]);
445 void TRestAnalysisTree::InitObservables() {
446 fObservables = std::vector<RESTValue>(GetNumberOfObservables());
447 for (
int i = 0; i < GetNumberOfObservables(); i++) {
449 fObservables[i].name = fObservableNames[i];
460 if (fObservableIdMap.size() != fObservableNames.size()) {
461 fObservableIdMap.clear();
462 for (
unsigned int i = 0; i < fObservableNames.size(); i++) {
463 fObservableIdMap[(string)fObservableNames[i]] = i;
465 if (fObservableIdMap.size() != fObservableNames.size()) {
466 cout <<
"REST ERROR! duplicated or blank observable name!" << endl;
471 void TRestAnalysisTree::ReadLeafValueToObservable(TLeaf* lf,
RESTValue& obs) {
472 if (lf ==
nullptr || lf->GetLen() == 0)
return;
477 string leafdef(lf->GetBranch()->GetTitle());
478 if (leafdef.find(
"[") == string::npos) {
480 switch (leafdef[leafdef.size() - 1]) {
506 RESTError <<
"Unsupported leaf definition: " << leafdef <<
"! Assuming int" << RESTendl;
510 switch (leafdef[leafdef.size() - 1]) {
512 type =
"vector<int>";
515 type =
"vector<float>";
518 type =
"vector<double>";
521 RESTError <<
"Unsupported leaf definition: " << leafdef <<
"! Assuming vector<int>"
523 type =
"vector<int>";
532 obs.
address = (
char*)lf->GetValuePointer();
533 }
else if (obs.
type ==
"vector<double>") {
534 auto ptr = (
double*)lf->GetValuePointer();
535 vector<double> val(ptr, ptr + lf->GetLen());
537 }
else if (obs.
type ==
"vector<int>") {
538 int* ptr = (
int*)lf->GetValuePointer();
539 vector<int> val(ptr, ptr + lf->GetLen());
541 }
else if (obs.
type ==
"vector<float>") {
542 auto ptr = (
float*)lf->GetValuePointer();
543 vector<float> val(ptr, ptr + lf->GetLen());
545 }
else if (obs.
type ==
"string") {
546 char* ptr = (
char*)lf->GetValuePointer();
547 string val(ptr, lf->GetLen());
550 RESTWarning <<
"Unsupported observable type to convert from TLeaf!" << RESTendl;
554 RESTValue TRestAnalysisTree::GetObservable(
const string& obsName) {
556 if (
id == -1)
return {};
557 return GetObservable(
id);
564 cout <<
"Error! TRestAnalysisTree::GetObservable(): index outside limits!" << endl;
572 return fObservables[n];
578 cout <<
"Error! TRestAnalysisTree::GetObservableName(): index outside limits!" << endl;
581 return fObservableNames[n];
587 cout <<
"Error! TRestAnalysisTree::GetObservableDescription(): index outside limits!" << endl;
590 return fObservableDescriptions[n];
596 cout <<
"Error! TRestAnalysisTree::GetObservableType(): index outside limits!" << endl;
599 return fObservableTypes[n];
605 if (
id == -1)
return "NotFound";
621 cout <<
"Error! TRestAnalysisTree::GetDblObservableValue(): index outside limits!" << endl;
629 cout <<
"TRestAnalysisTree::GetDblObservableValue. Type " <<
GetObservableType(n)
630 <<
" not supported! Returning zero" << endl;
634 RESTValue TRestAnalysisTree::AddObservable(
const TString& observableName,
const TString& observableType,
635 const TString& description) {
640 cout <<
"REST_Warning: cannot add observable for retrieved tree with data!" << endl;
645 }
else if (fStatus == Filled) {
646 cout <<
"REST_Warning: cannot add observable! AnalysisTree is already filled" << endl;
648 }
else if (
fChain !=
nullptr) {
649 cout <<
"Error! cannot add observable! AnalysisTree is in chain state" << endl;
655 ptr.
name = observableName;
657 fObservableNames.push_back(observableName);
658 fObservableIdMap[(string)observableName] = fObservableNames.size() - 1;
659 fObservableDescriptions.push_back(description);
660 fObservableTypes.push_back(observableType);
661 fObservables.push_back(ptr);
665 cout <<
"Error adding observable \"" << observableName <<
"\" with type \"" << observableType
666 <<
"\", type not found!" << endl;
676 void TRestAnalysisTree::PrintObservables() {
681 cout <<
"TRestAnalysisTree::PrintObservables(): Reading entry 0" << endl;
684 cout <<
"REST_Warning: AnalysisTree is empty" << endl;
687 cout <<
"REST_Warning: AnalysisTree is empty" << endl;
688 }
else if (fStatus == Filled) {
692 std::cout <<
"Entry : " << GetReadEntry() << std::endl;
693 std::cout <<
"> Event ID : " << GetEventID() << std::endl;
694 std::cout <<
"> Event Time : " << GetTimeStamp() << std::endl;
695 std::cout <<
"> Event Tag : " << GetSubEventTag() << std::endl;
696 std::cout <<
"-----------------------------------------" << std::endl;
699 for (
int n = 0; n < GetNumberOfObservables(); n++) {
705 void TRestAnalysisTree::PrintObservable(
int n) {
709 string obsVal = GetObservable(n).
ToString();
710 int lengthRemaining = Console::GetWidth() - 14 - 45 - 13;
712 std::cout <<
"Observable : " << ToString(fObservableNames[n], 45)
713 <<
" Value : " << ToString(obsVal, lengthRemaining) << std::endl;
716 Int_t TRestAnalysisTree::GetEntry(Long64_t entry, Int_t getall) {
726 }
else if (fStatus == Filled) {
730 return fChain->GetEntry(entry, getall);
732 return TTree::GetEntry(entry, getall);
738 cout <<
"Error! cannot fill tree. AnalysisTree is in chain state" << endl;
742 if (tree !=
nullptr) {
743 fEventID = tree->GetEventID();
744 fSubEventID = tree->GetSubEventID();
745 fTimeStamp = tree->GetTimeStamp();
746 *fSubEventTag = tree->GetSubEventTag();
747 fRunOrigin = tree->GetRunOrigin();
748 fSubRunOrigin = tree->GetSubRunOrigin();
752 void TRestAnalysisTree::SetEventInfo(
TRestEvent* evt) {
754 cout <<
"Error! cannot fill tree. AnalysisTree is in chain state" << endl;
758 if (evt !=
nullptr) {
759 fEventID = evt->GetID();
760 fSubEventID = evt->GetSubID();
761 fTimeStamp = evt->GetTimeStamp().AsDouble();
762 *fSubEventTag = evt->GetSubEventTag();
763 fRunOrigin = evt->GetRunOrigin();
764 fSubRunOrigin = evt->GetSubRunOrigin();
768 Int_t TRestAnalysisTree::Fill() {
772 cout <<
"Error! cannot fill tree. AnalysisTree is in chain state" << endl;
776 fSetObservableIndex = 0;
778 if (fStatus == Filled) {
779 return TTree::Fill();
780 }
else if (fStatus ==
Created) {
782 int a = TTree::Fill();
787 int a = TTree::Fill();
792 int a = TTree::Fill();
797 int a = TTree::Fill();
809 cout <<
"Error! cannot set observable! AnalysisTree is in chain state" << endl;
820 }
else if (
id == (
int)fObservables.size()) {
826 if (obs.
type != fObservables[
id].type) {
830 cout <<
"Warning: SetObservableValue(): setting value with different type. Observable : "
831 << obs.
name <<
", existing type: " << fObservables[id].type
832 <<
", value to add is in type: " << obs.
type <<
", trying to update to the new type."
834 fObservableTypes[id] = obs.
type;
835 string name = fObservables[id].name;
836 fObservables[id].Destroy();
838 fObservables[id].name = name;
840 obs >> fObservables[id];
883 std::vector<string> cuts =
Split(cut,
"&&",
false,
true);
885 for (
auto& cut : cuts) {
901 const std::vector<string> validOperators = {
"==",
"<=",
">=",
"!=",
"=",
">",
"<"};
903 if (cut.find(
"&&") != string::npos)
return EvaluateCuts(cut);
905 string operation, observable;
907 for (
const auto& validOperator : validOperators) {
908 if (cut.find(validOperator) != string::npos) {
909 operation = validOperator;
910 observable = (string)cut.substr(0, cut.find(operation));
911 value = std::stod((
string)cut.substr(cut.find(operation) + operation.length(), string::npos));
916 if (operation.empty())
917 cout <<
"TRestAnalysisTree::EvaluateCut. Invalid operator in cut definition! " << cut << endl;
920 if (operation ==
"==" && value == val)
return true;
921 if (operation ==
"!=" && value != val)
return true;
922 if (operation ==
"<=" && val <= value)
return true;
923 if (operation ==
">=" && val >= value)
return true;
924 if (operation ==
"=" && val == value)
return true;
925 if (operation ==
">" && val > value)
return true;
926 if (operation ==
"<" && val < value)
return true;
936 const std::vector<string> validOperators = {
"==",
"<=",
">=",
"!=",
"=",
">",
"<"};
938 std::vector<string> cuts =
Split(cut_str,
"&&",
false,
true);
940 vector<string> obsNames;
941 for (
auto& cut : cuts) {
942 string operation, observable;
943 for (
const auto& validOperator : validOperators) {
944 if (cut.find(validOperator) != string::npos) {
945 obsNames.push_back((
string)cut.substr(0, cut.find(validOperator)));
957 for (
auto& obsName : obsNames) this->SetBranchStatus(obsName.c_str(),
true);
964 for (
auto& obsName : obsNames) this->SetBranchStatus(obsName.c_str(),
false);
998 RESTError <<
"TRestAnalysisTree::GetObservableIntegral. Observable not found! : " << obsName
1004 for (Int_t n = 0; n < TTree::GetEntries(); n++) {
1008 if (xLow != -1 && xHigh != -1 && (value < xLow || value > xHigh))
continue;
1023 RESTError <<
"TRestAnalysisTree::GetObservableAverage. Observable not found! : " << obsName
1030 for (Int_t n = 0; n < TTree::GetEntries(); n++) {
1034 if (xLow != -1 && xHigh != -1 && (value < xLow || value > xHigh))
continue;
1039 if (N <= 0)
return 0;
1055 for (Int_t n = 0; n < TTree::GetEntries(); n++) {
1059 if (xLow != -1 && xHigh != -1 && (value < xLow || value > xHigh))
continue;
1062 sum += (value - mean) * (value - mean);
1065 if (N <= 0)
return 0;
1067 return TMath::Sqrt(sum / N);
1078 RESTError <<
"TRestAnalysisTree::GetObservableMaximum. Observable not found! : " << obsName
1083 Double_t max = -DBL_MAX;
1084 for (Int_t n = 0; n < TTree::GetEntries(); n++) {
1088 if (xLow != -1 && xHigh != -1 && (value < xLow || value > xHigh))
continue;
1089 if (value > max) max = value;
1103 RESTError <<
"TRestAnalysisTree::GetObservableMinimum. Observable not found! : " << obsName
1108 Double_t min = DBL_MAX;
1109 for (Int_t n = 0; n < TTree::GetEntries(); n++) {
1113 if (xLow != -1 && xHigh != -1 && (value < xLow || value > xHigh))
continue;
1114 if (value < min) min = value;
1145 Double_t level, Int_t nBins, Double_t xLow, Double_t xHigh) {
1146 if (level > 1 || level < 0) {
1147 RESTWarning <<
"Level is : " << level << RESTendl;
1148 RESTWarning <<
"Level must be between 0 and 1" << RESTendl;
1152 Double_t integral = this->GetIntegral(obsWeight, xLow, xHigh);
1154 TString histDefinition = Form(
"hc(%5d,%lf,%lf)", nBins, xLow, xHigh);
1156 this->Draw(obsName +
">>hc", obsWeight);
1158 this->Draw(obsName +
">>" + histDefinition, obsWeight);
1160 TH1F* htemp = (TH1F*)gPad->GetPrimitive(
"hc");
1163 for (
int i = 0; i < htemp->GetNbinsX(); i++) {
1164 sum += htemp->GetBinContent(i + 1);
1166 if (sum > level * integral)
return htemp->GetBinCenter(i + 1);
1177 std::vector<std::string> names;
1179 auto branches = GetListOfBranches();
1180 for (
int i = 0; i < branches->GetEntries(); i++) {
1181 names.push_back((
string)branches->At(i)->GetName());
1191 TTree* tree =
new TTree();
1193 char* dest = (
char*)tree +
sizeof(TObject);
1194 char* from = (
char*)
this +
sizeof(TObject);
1196 constexpr
size_t n =
sizeof(TTree) -
sizeof(TObject);
1199 char* temp = (
char*)malloc(n);
1200 memcpy(temp, dest, n);
1203 memcpy(dest, from, n);
1204 int result = tree->Write(name, option, bufsize);
1207 memcpy(dest, temp, n);
1220 auto file = std::unique_ptr<TFile>{TFile::Open(_file.c_str(),
"update")};
1221 if (!file->IsOpen()) {
1222 RESTWarning <<
"TRestAnalysisTree::AddChainFile(): failed to open file " << _file << RESTendl;
1226 if (this->GetRunOrigin() == 0) {
1231 if (tree !=
nullptr && tree->GetEntry(0)) {
1232 if (tree->GetEntry(0) > 0) {
1233 if (tree->GetRunOrigin() == this->GetRunOrigin()) {
1238 fChain =
new TChain(
"AnalysisTree",
"Chained AnalysisTree");
1239 fChain->Add(this->GetCurrentFile()->GetName());
1241 return fChain->Add(_file.c_str()) == 1;
1244 <<
"TRestAnalysisTree::AddChainFile(): invalid file, AnalysisTree in file has different "
1248 RESTWarning <<
"TRestAnalysisTree::AddChainFile(): invalid file, AnalysisTree in file is empty!"
1252 RESTWarning <<
"TRestAnalysisTree::AddChainFile(): invalid file, file does not contain an AnalysisTree!"
1265 return TTree::GetTree();
1278 return TTree::LoadTree(entry);
1280 return fChain->LoadTree(entry);
1286 Long64_t TRestAnalysisTree::GetEntries()
const {
1288 return TTree::GetEntries();
1290 return fChain->GetEntries();
1293 Long64_t TRestAnalysisTree::GetEntries(
const char* sel) {
1295 return TTree::GetEntries(sel);
1297 return fChain->GetEntries(sel);
1300 TRestAnalysisTree::~TRestAnalysisTree() {
delete fSubEventTag; }
void SetValue(const T &val)
Set the value of the wrapped type.
std::string type
Type of the wrapped object.
char * address
Address of the wrapped object.
bool is_data_type
Pointer to the corresponding TDataType helper, if the wrapped object is in data type.
bool IsZombie() const
If this object type wrapper is invalid.
std::string ToString() const
Convert the wrapped object to std::string.
std::string name
Name field.
REST core data-saving helper based on TTree.
TString GetObservableDescription(Int_t n)
Get the observable description according to id.
void DisableQuickObservableValueSetting()
It will disable quick observable value setting.
std::vector< std::string > GetCutObservables(const std::string &cut_str)
It will return a list with the names found in a string with conditions, as given in methods as Evalua...
void UpdateObservables()
Update observables stored in the tree.
Double_t GetObservableContour(const TString &obsName, const TString &obsIndexer, Double_t level=0.5, Int_t nBins=-1, Double_t xLow=-1, Double_t xHigh=-1)
This method generates a histogram of the the observable obsName given in the argument weighting it wi...
void EnableAllBranches()
It will enable all branches in the tree.
void EnableQuickObservableValueSetting()
It will enable quick observable value setting.
Long64_t LoadTree(Long64_t entry)
Overrides TTree::LoadTree(), to set current tree according to the given entry number,...
Bool_t AddChainFile(const std::string &file)
Add a series output file like TChain.
TString GetObservableName(Int_t n)
Get the observable name according to id.
void UpdateBranches()
Update branches in the tree.
Double_t GetObservableIntegral(const TString &obsName, Double_t xLow=-1, Double_t xHigh=-1)
It returns the integral of the observable considering the given range. If no range is given the full ...
TChain * fChain
used for quick search of certain observables
Bool_t EvaluateCuts(const std::string &expression)
This method will receive a string with several analysis observables/cuts in the same fashion as used ...
TTree * GetTree() const
Overrides TTree::GetTree(), to get the actual tree used in case of chain operation(fCurrentTree !...
Double_t GetObservableMaximum(const TString &obsName, Double_t xLow=-1, Double_t xHigh=-1)
It returns the maximum value of obsName considering the given range. If no range is given the full hi...
Int_t GetObservableID(const std::string &obsName)
Get the index of the specified observable.
void MakeObservableIdMap()
Update the map of observable name to observable id.
Int_t GetMatchedObservableID(const std::string &obsName)
Get the index of the observable, erasing the prefix if exists.
Double_t GetObservableAverage(const TString &obsName, Double_t xLow=-1, Double_t xHigh=-1)
It returns the average of the observable considering the given range. If no range is given the full h...
void DisableBranches(std::vector< std::string > obsNames)
It will disable the branches given by argument.
Double_t GetObservableRMS(const TString &obsName, Double_t xLow=-1, Double_t xHigh=-1)
It returns the RMS of the observable considering the given range. If no range is given the full histo...
Double_t GetDblObservableValue(const std::string &obsName)
Get double value of the observable, according to the name.
TString GetObservableType(Int_t n)
Get the observable type according to id.
std::vector< std::string > GetObservableNames()
It returns a vector with strings containing all the observables that exist in the analysis tree.
void DisableAllBranches()
It will disable all branches in the tree.
Double_t GetObservableMinimum(const TString &obsName, Double_t xLow=-1, Double_t xHigh=-1)
It returns the minimum value of obsName considering the given range. If no range is given the full hi...
int EvaluateStatus()
Evaluate the Status of this tree.
Bool_t ObservableExists(const std::string &obsName)
Get if the specified observable exists.
Int_t fNObservables
in case multiple files for reading
void EnableBranches(std::vector< std::string > obsNames)
It will enable the branches given by argument.
Bool_t EvaluateCut(const std::string &expression)
This method will evaluate a condition on one analysis observable constructed as "observable>value"....
void SetObservable(Int_t id, RESTValue obs)
Set the value of observable whose id is as specified.
Int_t WriteAsTTree(const char *name=0, Int_t option=0, Int_t bufsize=0)
It writes TRestAnalysisTree as TTree, in order to migrate files to pure ROOT users.
A base class for any REST event.
TRestReflector WrapType(const std::string &typeName)
Wrap information an object of type: typeName, memory is not allocated.
TRestReflector Assembly(const std::string &typeName)
Assembly an object of type: typeName, returning the allocated memory address and size.
std::vector< std::string > Split(std::string in, std::string separator, bool allowBlankString=false, bool removeWhiteSpaces=false, int startPos=-1)
Split the input string according to the given separator. Returning a vector of fragments.
Int_t DiffString(const std::string &source, const std::string &target)
Returns the number of different characters between two strings.