86#include "TRestAnalysisTree.h" 
   93#include "TRestStringHelper.h" 
   94#include "TRestStringOutput.h" 
  100TRestAnalysisTree::TRestAnalysisTree() : TTree() {
 
  101    SetName(
"AnalysisTree");
 
  102    SetTitle(
"REST Analysis tree");
 
  107TRestAnalysisTree::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") {
 
  133TRestAnalysisTree::TRestAnalysisTree(
const TString& name, 
const TString& title) : TTree(name, title) {
 
  140void 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) {
 
  284        if (NObsInList == 0) {
 
  292                return TRestAnalysisTree_Status::Filled;
 
  297    } 
else if (NBranches == 6) {
 
  298        auto br = (TBranch*)GetListOfBranches()->UncheckedAt(0);
 
  299        if ((
int*)br->GetAddress() != &fRunOrigin) {
 
  307                return TRestAnalysisTree_Status::Filled;
 
 
  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]);
 
 
  445void 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;
 
 
  471void 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;
 
  554RESTValue 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;
 
 
  634RESTValue 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;
 
  676void 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++) {
 
  705void 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;
 
  716Int_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();
 
  752void 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();
 
  768Int_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);
 
 
 1286Long64_t TRestAnalysisTree::GetEntries()
 const {
 
 1288        return TTree::GetEntries();
 
 1290    return fChain->GetEntries();
 
 1293Long64_t TRestAnalysisTree::GetEntries(
const char* sel) {
 
 1295        return TTree::GetEntries(sel);
 
 1297    return fChain->GetEntries(sel);
 
 1300TRestAnalysisTree::~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.