I have a TGraph from which I want to extract the y-value and its error given some x-value.

For the y-value I can use graph->Eval(x), which works just fine even if x is between two points.

I cannot find a similar function to Eval for interpolating the error between points. As a workaround, I wanted to find the closest point to x, such that I could use getErrorY(closestPoint). However, I cannot find a function that will tell me the point index given x.

I could write a loop over points, calculate the distance to my x-value, etc. But is there a cleaner, quicker way?

Double_t GetClosestXIndex(const TGraph* graph, Double_t xValue) {
Double_t minDist = DBL_MAX;
Int_t closestIndex = -1;
// Iterate over all points in the graph
for (Int_t i = 0; i < graph->GetN(); ++i) {
Double_t x, y;
graph->GetPoint(i, x, y);
// Calculate the distance between the current x-value and the desired x-value
Double_t dist = TMath::Abs(x - xValue);
// Update the closest index if a closer point is found
if (dist < minDist) {
minDist = dist;
closestIndex = i;
}
}
return closestIndex;
}

then:

TGraph* graph = ...; // Your TGraph object
Double_t xValue = 3.14159; // Your desired x-value
Int_t closestIndex = GetClosestXIndex(graph, xValue);
Double_t closestYError = graph->GetErrorY(closestIndex);
// Print the result
std::cout << "Closest point index: " << closestIndex << std::endl;
std::cout << "Closest point y-error: " << closestYError << std::endl;