stupid question: How do I obtain the minimum value and the maximum value in one branch of a tree using a selection (cut)? I tried drawing a histogram, but the range of the histogram is somewhat wider than the range of the entries.
I know of no way to do this using only ROOT functionality, but since you are
probably already using C++ you could use std::min_element or
std::max_element from the standard library which work on iterators. The
downside is that you need to have all values available in memory for that.
#include <algorithm>
void f() {
// create some dummy data
TNtuple nt("nt", "", "x");
for (int i=0; i<1000; ++i) {
nt.Fill(gRandom->Gaus());
}
gROOT->SetBatch(); // prevent actually showing the plots here
// must draw something first to fill data structures
const unsigned nentries = nt.Draw("x", "x>0");
if (nentries) {
// getting some minimum or maximum value only makes sense if the cut
// selected anything
double* x = nt.GetV1();
std::cout << "min :" << *(std::min_element(x, x+nentries)) << std::endl;
std::cout << "max :" << *(std::max_element(x, x+nentries)) << std::endl;
}
}
Ok, thanks for the suggestion. Goes into the direction of my solution, where I scanned calling GetBinEntry of TAxis to be larger than 1 and to break then. The Drawback is, that precision is limited by the binsize of the histogram. I was hoping for an elegant solution. So I will have to filter it by hand.
Thank you anyway.
[quote=“Promme”]Goes into the direction of my solution, where I scanned
calling GetBinEntry of TAxis to be larger than 1 and to break then. The
Drawback is, that precision is limited by the binsize of the histogram. I was
hoping for an elegant solution. So I will have to filter it by hand.
[/quote]
Did you actually try what I suggested? TTree::GetV1 after a draw will give you
access to the raw values in the tree (just like TTree::Scan would print them).
There is no binning involved.