00001
00002 #ifndef ENERGYCALIBRATION_H
00003 #define ENERGYCALIBRATION_H
00004
00005 #include <TROOT.h>
00006 #include <TF1.h>
00007
00008 using namespace std;
00009
00010 class TH1F;
00011 class TGraphErrors;
00012
00013
00014
00015
00016
00017 const float conven=1000./3.6;
00018 const float el=1.67E-4;
00050 class energyCalibrationFunctions {
00051
00052 public:
00053
00054 energyCalibrationFunctions(int s=-1) {setScanSign(s);};
00055
00060 int setScanSign(int s=0) {if (s==1 || s==-1) sign=s; return sign;};;
00061
00062
00072 Double_t gaussChargeSharing(Double_t *x, Double_t *par);
00073
00080 Double_t erfFunction(Double_t *x, Double_t *par) ;
00081
00090 Double_t erfFunctionChargeSharing(Double_t *x, Double_t *par);
00091
00105 Double_t erfFuncFluo(Double_t *x, Double_t *par);
00106
00107
00109 static float median(float *x, int n);
00111 static int quick_select(int arr[], int n);
00113 static int kth_smallest(int *a, int n, int k);
00114
00115
00124 Double_t spectrum(Double_t *x, Double_t *par);
00125
00126
00135 Double_t scurve(Double_t *x, Double_t *par);
00136
00137
00138
00151 Double_t scurveFluo(Double_t *x, Double_t *par);
00152
00153
00154 private:
00155 int sign;
00156
00157
00158 };
00159
00165 class energyCalibration {
00166
00167
00168 public:
00172 energyCalibration();
00173
00177 ~energyCalibration();
00178
00183 int setPlotFlag(int p=-1) {if (p>=0) plot_flag=p; return plot_flag;};
00184
00189 int setScanSign(int s=0) {return funcs->setScanSign(s);};
00190
00195 int setChargeSharing(int p=-1);
00196
00201 void setFitRange(Double_t mi, Double_t ma){fit_min=mi; fit_max=ma;};
00202
00207 void getFitRange(Double_t &mi, Double_t &ma){mi=fit_min; ma=fit_max;};
00208
00209
00219 void setStartParameters(Double_t *par);
00220
00230 void getStartParameters(Double_t *par);
00231
00239 TF1 *fitSCurve(TH1 *h1, Double_t *mypar, Double_t *emypar);
00240
00241
00249 TF1 *fitSpectrum(TH1 *h1, Double_t *mypar, Double_t *emypar);
00250
00251
00265 TGraphErrors* linearCalibration(int nscan, Double_t *en, Double_t *een, Double_t *fl, Double_t *efl, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff);
00266
00279 TGraphErrors* calibrateScurves(int nscan, Double_t *en, Double_t *een, TH1F **h1, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff){return calibrate(nscan, en, een, h1, gain, off, egain, eoff, 1);};
00280
00293 TGraphErrors* calibrateSpectra(int nscan, Double_t *en, Double_t *een, TH1F **h1, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff){return calibrate(nscan, en, een, h1, gain, off, egain, eoff, 0);};
00294
00295
00296
00297 private:
00309 TGraphErrors* calibrate(int nscan, Double_t *en, Double_t *een, TH1F **h1, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff, int integral=1);
00310
00311
00319 void initFitFunction(TF1 *fun, TH1 *h1);
00320
00321
00330 TF1 *fitFunction(TF1 *fun, TH1 *h1, Double_t *mypar, Double_t *emypar);
00331
00332
00333 int plot_flag;
00335 int cs_flag;
00337 Double_t fit_min;
00338 Double_t fit_max;
00340 Double_t bg_offset;
00341 Double_t bg_slope;
00342 Double_t flex;
00343 Double_t noise;
00344 Double_t ampl;
00345 Double_t cs_slope;
00347 energyCalibrationFunctions *funcs;
00348
00349 TF1 *fscurve;
00351 TF1 *fspectrum;
00354 };
00355
00356 #endif
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375