ROOT logo
//------------------------------------------------------------------------------
// divide.C
//
// macro to divide two TGraphs using Exponential interpolation
//------------------------------------------------------------------------------

using namespace std;

Double_t ExtrapolateExp(Double_t x0, Double_t y0, Double_t x1, Double_t y1, Double_t x)
{
        // extra/interpolates using an exponential defined by (x0,y0) and (x1,y1) to x

        Double_t b = (TMath::Log(y0) - TMath::Log(y1)) / (x0 - x1);
        Double_t a = TMath::Log(y0) - b * x0;
        Double_t a2 = TMath::Log(y1) - b * x1;

        //Printf("%f %f %f", b, a, a2);

        return TMath::Exp(a + b * x);
} 


TGraphErrors* divide(TGraph* dividend, TGraph* divisor, Bool_t exp = kTRUE)
{

cout << "---------------------------------------------------------" << endl;
cout << "starting macro: << divide.C >> " << endl;
cout << "---------------------------------------------------------" << endl;

Double_t x=0;
Double_t y=0;
Double_t y1;
Double_t y2;
Double_t ex;
Double_t ey;
Double_t e1;
Double_t e2;


divisor->GetPoint(0,x,y);
Double_t minx = x;
cout << "divisor: minx = " << minx << endl;

divisor->GetPoint(divisor->GetN()-1,x,y);
Double_t maxx = x;
cout << "divisor: maxx = " << maxx << endl;

dividend->GetPoint(0,x,y);
if (x > minx) { minx = x; } 

dividend->GetPoint(dividend->GetN()-1,x,y);
if (x < maxx) { maxx = x; } 

cout << "minx = " << minx << endl;
cout << "maxx = " << maxx << endl;

Int_t bins = 0;

for (int i=0; i < dividend->GetN(); i++) {
    dividend->GetPoint(i,x,y);
    if ((x <= maxx) && (x >= minx)) {bins++;}
}

TGraphErrors* result = new TGraphErrors(bins);
TGraph* errors = new TGraph(divisor->GetN(),divisor->GetX(),divisor->GetEY());

Int_t j=0;

for (int i=0; i < dividend->GetN(); i++) {
    dividend->GetPoint(i,x,y1);
    if (!((x <= maxx) && (x >= minx))) { continue; }            
    if (exp) {
        Double_t x1temp = 0;
        Double_t y1temp = 0;
        for (int n=0; n < divisor->GetN(); n++) {
            divisor->GetPoint(n,x1temp,y1temp);
            
            if (x1temp >= x)  break;
        }
        cout << "x=" << x;
        cout << "x1temp=" << x1temp;
        if (x1temp == x) { y2 = y1temp; }
        if (x1temp > x) { 
            Double_t x0temp = 0;
            Double_t y0temp = 0;
            cout << "nfortemp=" << n << endl;
            divisor->GetPoint(n-1,x0temp,y0temp);
            y2 = ExtrapolateExp(x0temp,y0temp,x1temp,y1temp,x);
            cout << "exp extrapolation used" << endl;
        }
    } else {
        y2 = divisor->Eval(x);
    }
    
    y = y1/y2;
    e1 = dividend->GetErrorY(i);
    //e2 = errors->Eval(x);
    e2 = 0;    
    ex = 0;
    ey = y*sqrt((e1/y1)*(e1/y1) + (e2/y2)*(e2/y2));    
    result->SetPoint(j,x,y);
    result->SetPointError(j,ex,ey);
    j++;
    cout << "data point # " << j << endl;
    cout << "   x= " << x << " +- " << ex <<endl;
    cout << "   y= " << y << " +- " << ey <<endl;
}
delete errors;
errors = 0;



cout << "min:" << minx <<endl;
cout << "max:" << maxx <<endl;

cout << "---------------------------------------------------------" << endl;
cout << "finished macro: << divide.C >> " << endl;
cout << "---------------------------------------------------------" << endl;
return result;
 divide.C:1
 divide.C:2
 divide.C:3
 divide.C:4
 divide.C:5
 divide.C:6
 divide.C:7
 divide.C:8
 divide.C:9
 divide.C:10
 divide.C:11
 divide.C:12
 divide.C:13
 divide.C:14
 divide.C:15
 divide.C:16
 divide.C:17
 divide.C:18
 divide.C:19
 divide.C:20
 divide.C:21
 divide.C:22
 divide.C:23
 divide.C:24
 divide.C:25
 divide.C:26
 divide.C:27
 divide.C:28
 divide.C:29
 divide.C:30
 divide.C:31
 divide.C:32
 divide.C:33
 divide.C:34
 divide.C:35
 divide.C:36
 divide.C:37
 divide.C:38
 divide.C:39
 divide.C:40
 divide.C:41
 divide.C:42
 divide.C:43
 divide.C:44
 divide.C:45
 divide.C:46
 divide.C:47
 divide.C:48
 divide.C:49
 divide.C:50
 divide.C:51
 divide.C:52
 divide.C:53
 divide.C:54
 divide.C:55
 divide.C:56
 divide.C:57
 divide.C:58
 divide.C:59
 divide.C:60
 divide.C:61
 divide.C:62
 divide.C:63
 divide.C:64
 divide.C:65
 divide.C:66
 divide.C:67
 divide.C:68
 divide.C:69
 divide.C:70
 divide.C:71
 divide.C:72
 divide.C:73
 divide.C:74
 divide.C:75
 divide.C:76
 divide.C:77
 divide.C:78
 divide.C:79
 divide.C:80
 divide.C:81
 divide.C:82
 divide.C:83
 divide.C:84
 divide.C:85
 divide.C:86
 divide.C:87
 divide.C:88
 divide.C:89
 divide.C:90
 divide.C:91
 divide.C:92
 divide.C:93
 divide.C:94
 divide.C:95
 divide.C:96
 divide.C:97
 divide.C:98
 divide.C:99
 divide.C:100
 divide.C:101
 divide.C:102
 divide.C:103
 divide.C:104
 divide.C:105
 divide.C:106
 divide.C:107
 divide.C:108
 divide.C:109
 divide.C:110
 divide.C:111
 divide.C:112
 divide.C:113
 divide.C:114
 divide.C:115
 divide.C:116
 divide.C:117
 divide.C:118
 divide.C:119
 divide.C:120