Getting x value of maximum amplitude

Hi ROOT friends,

Relatively new to ROOT, and not sure what my problem is here:
I have a plot that measures amplitude vs. frequency, and have successfully found the maximum amplitude in a given range using:

double maxamp = G->GetHistogram()->GetMaximum();

However, I run into problems when trying to find the corresponding frequency (x-axis) of maximum amplitude. Searching through these forums, I found someone with a similar problem that used:

int binmax = G->GetHistogram()->GetMaximumBin();
double xMax = G->GetXaxis()->GetBinCenter(binmax);

But this doesn’t give the corresponding x-value for me. Instead, it appears to give the value of the lower limit of my x-axis.

For instance, if my limits of frequency are 5900Hz to 6100Hz, it outputs: 5900.0020278677 Hz
If my limits are 6000Hz to 6050Hz, it outputs: 5999.9987121388 Hz

Any ideas? Thanks!

What is your G? It looks like it is a TGraph and then G->GetHistogram() gets the histogram used to draw the axes. This histogram does not have any entries, so GetMaximumBin just returns the first bin.

Instead, all you can do is iterate through the points:

Double_t findMaxPosition(TGraph *G) {
    Double_t x, y;
    G->GetPoint(0, x, y);
    Double_t max_x = x, max_y = y;
    for(int i = 1; i < G->GetN(); i++)
    {
        G->GetPoint(i, x, y);
        if(y > max_y) {
           max_x = x;
           max_y = y;
        }
    }
    return max_x;
}
root [19] Double_t x[] = {1, 2, 3, 4};
root [20] Double_t y[] = {1, 2, 3, 2};
root [21] g = new TGraph(4, x, y);
root [22] findMaxPosition(g)
(double) 3.000000

root [25] Double_t x2[] = {1, 2, 3, 4, 5, 6};
root [26] Double_t y2[] = {1, 2, 3, 2, 4, 1};
root [27] g = new TGraph(6, x2, y2);
root [28] findMaxPosition(g)
(double) 5.000000

Hi Andreas,

Thanks for the help!

Your code worked for me with slight modification. Unfortunately, my ‘max_y’ value fell outside of the range I was looking at so I simply needed to take that into account:

double xtest, ytest;
G->GetPoint(0, xtest, ytest);
double max_xtest = 0., max_ytest = 0.;
for(int i = 1; i < G->GetN(); i++)
{
    G->GetPoint(i, xtest, ytest);
    if(f1>xtest) {
    ytest=0.;
    }
    if(f1<xtest<f2) {
       if(ytest > max_ytest) {
       max_xtest = xtest;
       max_ytest = ytest;
       }
    }

}

where f1 and f2 are my limits.

Thanks again!
Brendan

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.