とにかく便利な関数を並べる¶
何回同じコードを書いたんだろう,,,ってくらい頭が悪いのでとりあえずここ一箇所にまとめることを目標に頑張る.
ソースコードをまとめたいけどpathガーって言ってバグるからそれは追々...
よく使う計算は関数として書いておいて使い回すのが常套手段,というか当たり前でありたい.
関数が書かれたコードをincludeしてから解説
In [2]:
#include "/Users/tak/Documents/BL05/Analysis/src/ConvertEtalon.h"
In [3]:
Double2String
(TString (*)(Double_t)) Function @0x1367ac3b0
at /Users/tak/Documents/BL05/Analysis/src/./FittingFunction.h:31:
TString Double2String(Double_t val)
{
TString str = Form("%f",val);
Int_t n = str.First(".");
str[n] = 'd';
Int_t l = str.First("-");
if(l+1>0)str[l] = 'm';
return str;
}
In [4]:
Double_t input = 0.1;
TString output = Double2String(0.1);
cout<<input<<" "<<output<<endl;
0.1 0d100000
In [5]:
GetWeightedAverage
(vector<Double_t> (*)(vector<vector<Double_t> >)) Function @0x1367b70f4
at /Users/tak/Documents/BL05/Analysis/src/ConvertEtalon.h:265:
vector<Double_t> GetWeightedAverage(vector<vector<Double_t> > val){
// val[i][0] is value, val[i][1] is each Error
Int_t size = val.size();
Double_t mean = 0.;
Double_t err = 0.;
vector <Double_t> NoErrVal(size);
Bool_t NoErr = kFALSE;
for (Int_t i=0; i<size; i++){
if(val.at(i).size()!=2){cerr<<"error in GetWeightedAverage"<<endl; return {};}
if(val[i][1]==0.)NoErr = kTRUE;
NoErrVal[i] = val[i][0];
mean += 1./val[i][1]/val[i][1]*val[i][0];
err += 1./val[i][1]/val[i][1];
}
if(NoErr)return GetAverage(NoErrVal);
mean = mean/err;
err = TMath::Sqrt(1./err);
return {mean, err};
}
In [6]:
vector<vector<Double_t> > input = {{100, 20}, {110, 10}, {120, 50}};
vector<Double_t> output = GetWeightedAverage(input);
cout<<output[0]<<" +/- "<<output[1]<<endl;
input = {{100, 20}, {110, 10}, {120, 0}};
output = GetWeightedAverage(input);
cout<<output[0]<<" +/- "<<output[1]<<endl;
108.372 +/- 8.80451 110 +/- 0
In [7]:
GetAverage
(vector<Double_t> (*)(vector<Double_t>)) Function @0x1367b6fd8
at /Users/tak/Documents/BL05/Analysis/src/ConvertEtalon.h:258:
vector<Double_t> GetAverage(vector<Double_t> val){
Int_t size = val.size();
Double_t mean = 0.;
for (Int_t i=0; i<size; i++)mean += val[i];
return {mean/size, 0.};
}
In [8]:
GetAverage({1,2,3})
(std::vector<Double_t>) { 2.0000000, 0.0000000 }
誤差を含んだ割り算¶
In [9]:
GetAoverBErr
(Double_t (*)(Double_t, Double_t, Double_t, Double_t)) Function @0x1367ba298
at /Users/tak/Documents/BL05/Analysis/src/ConvertEtalon.h:595:
Double_t GetAoverBErr(Double_t A, Double_t B, Double_t AErr, Double_t BErr){
return TMath::Sqrt(TMath::Power(AErr/B, 2.) + TMath::Power(A/B/B*BErr, 2.));
}
In [10]:
Double_t A = 1000;
Double_t B = 5;
Double_t AErr = 100.5;
Double_t BErr = 2.5;
Double_t output = GetAoverBErr(A, B, AErr, BErr);
cerr<<A/B<<" +/- "<<output<<endl;
200 +/- 102
In [11]:
Double_t A = 0.034;
Double_t B = 0.00423;
Double_t AErr = 0.004;
Double_t BErr = 0.0;
Double_t output = GetAoverBErr(A, B, AErr, BErr);
cerr<<A/B<<" +/- "<<output<<endl;
8.03783 +/- 0.945626
ヒストグラムをLog Scaleで分割する¶
In [19]:
Double_t HISTBINS = 100;
In [20]:
Double_t *LogBins(Double_t bins, Double_t minbin, Double_t maxbin)
{
static Double_t errorbins[3] = {0.0};
static const Int_t n = HISTBINS+1;
if(HISTBINS!=bins){cerr<<"LogBins error!"<<endl; return errorbins;}
static const Double_t x[n];
for(Int_t i=0; i<n; i++){
x[i] = pow(10.0, log10(minbin) + (log10(maxbin)-log10(minbin))/bins*i);
//cerr<<i<<" "<<xbins[i]<<endl;
}
return x;
}
input_line_71:6:25: error: variable length array declaration cannot have 'static' storage duration static const Double_t x[n]; ^ ~
In [ ]:
In [ ]:
In [ ]: