/usr/include/root/TSpectrum2Fit.h is in libroot-hist-spectrum-dev 5.34.30-0ubuntu8.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | // @(#)root/spectrum:$Id$
// Author: Miroslav Morhac 25/09/06
/*************************************************************************
* Copyright (C) 1995-2006, Rene Brun and Fons Rademakers. *
* All rights reserved. *
* *
* For the licensing terms see $ROOTSYS/LICENSE. *
* For the list of contributors see $ROOTSYS/README/CREDITS. *
*************************************************************************/
#ifndef ROOT_TSpectrum2Fit
#define ROOT_TSpectrum2Fit
//////////////////////////////////////////////////////////////////////////
// //
// TSpectrum2Fit //
// //
// Class for fitting 2D spectra using AWMI (algorithm without matrix //
// inversion) and conjugate gradient algorithms for symmetrical //
// matrices (Stiefel-Hestens method). AWMI method allows to fit //
// simulaneously 100s up to 1000s peaks. Stiefel method is very stable, //
// it converges faster, but is more time consuming //
// //
//////////////////////////////////////////////////////////////////////////
#ifndef ROOT_TNamed
#include "TNamed.h"
#endif
class TSpectrum2Fit : public TNamed {
protected:
Int_t fNPeaks; //number of peaks present in fit, input parameter, it should be > 0
Int_t fNumberIterations; //number of iterations in fitting procedure, input parameter, it should be > 0
Int_t fXmin; //first fitted channel in x direction
Int_t fXmax; //last fitted channel in x direction
Int_t fYmin; //first fitted channel in y direction
Int_t fYmax; //last fitted channel in y direction
Int_t fStatisticType; //type of statistics, possible values kFitOptimChiCounts (chi square statistics with counts as weighting coefficients), kFitOptimChiFuncValues (chi square statistics with function values as weighting coefficients),kFitOptimMaxLikelihood
Int_t fAlphaOptim; //optimization of convergence algorithm, possible values kFitAlphaHalving, kFitAlphaOptimal
Int_t fPower; //possible values kFitPower2,4,6,8,10,12, for details see references. It applies only for Awmi fitting function.
Int_t fFitTaylor; //order of Taylor expansion, possible values kFitTaylorOrderFirst, kFitTaylorOrderSecond. It applies only for Awmi fitting function.
Double_t fAlpha; //convergence coefficient, input parameter, it should be positive number and <=1, for details see references
Double_t fChi; //here the fitting functions return resulting chi square
Double_t *fPositionInitX; //[fNPeaks] array of initial values of x positions of 2D peaks, input parameters
Double_t *fPositionCalcX; //[fNPeaks] array of calculated values of x positions of 2D peaks, output parameters
Double_t *fPositionErrX; //[fNPeaks] array of error values of x positions of 2D peaks, output parameters
Double_t *fPositionInitY; //[fNPeaks] array of initial values of y positions of 2D peaks, input parameters
Double_t *fPositionCalcY; //[fNPeaks] array of calculated values of y positions of 2D peaks, output parameters
Double_t *fPositionErrY; //[fNPeaks] array of error values of y positions of 2D peaks, output parameters
Double_t *fPositionInitX1; //[fNPeaks] array of initial x positions of 1D ridges, input parameters
Double_t *fPositionCalcX1; //[fNPeaks] array of calculated x positions of 1D ridges, output parameters
Double_t *fPositionErrX1; //[fNPeaks] array of x positions errors of 1D ridges, output parameters
Double_t *fPositionInitY1; //[fNPeaks] array of initial y positions of 1D ridges, input parameters
Double_t *fPositionCalcY1; //[fNPeaks] array of calculated y positions of 1D ridges, output parameters
Double_t *fPositionErrY1; //[fNPeaks] array of y positions errors of 1D ridges, output parameters
Double_t *fAmpInit; //[fNPeaks] array of initial values of amplitudes of 2D peaks, input parameters
Double_t *fAmpCalc; //[fNPeaks] array of calculated values of amplitudes of 2D peaks, output parameters
Double_t *fAmpErr; //[fNPeaks] array of amplitudes errors of 2D peaks, output parameters
Double_t *fAmpInitX1; //[fNPeaks] array of initial values of amplitudes of 1D ridges in x direction, input parameters
Double_t *fAmpCalcX1; //[fNPeaks] array of calculated values of amplitudes of 1D ridges in x direction, output parameters
Double_t *fAmpErrX1; //[fNPeaks] array of amplitudes errors of 1D ridges in x direction, output parameters
Double_t *fAmpInitY1; //[fNPeaks] array of initial values of amplitudes of 1D ridges in y direction, input parameters
Double_t *fAmpCalcY1; //[fNPeaks] array of calculated values of amplitudes of 1D ridges in y direction, output parameters
Double_t *fAmpErrY1; //[fNPeaks] array of amplitudes errors of 1D ridges in y direction, output parameters
Double_t *fVolume; //[fNPeaks] array of calculated volumes of 2D peaks, output parameters
Double_t *fVolumeErr; //[fNPeaks] array of volumes errors of 2D peaks, output parameters
Double_t fSigmaInitX; //initial value of sigma x parameter
Double_t fSigmaCalcX; //calculated value of sigma x parameter
Double_t fSigmaErrX; //error value of sigma x parameter
Double_t fSigmaInitY; //initial value of sigma y parameter
Double_t fSigmaCalcY; //calculated value of sigma y parameter
Double_t fSigmaErrY; //error value of sigma y parameter
Double_t fRoInit; //initial value of correlation coefficient
Double_t fRoCalc; //calculated value of correlation coefficient
Double_t fRoErr; //error value of correlation coefficient
Double_t fTxyInit; //initial value of t parameter for 2D peaks (relative amplitude of tail), for details see html manual and references
Double_t fTxyCalc; //calculated value of t parameter for 2D peaks
Double_t fTxyErr; //error value of t parameter for 2D peaks
Double_t fSxyInit; //initial value of s parameter for 2D peaks (relative amplitude of step), for details see html manual and references
Double_t fSxyCalc; //calculated value of s parameter for 2D peaks
Double_t fSxyErr; //error value of s parameter for 2D peaks
Double_t fTxInit; //initial value of t parameter for 1D ridges in x direction (relative amplitude of tail), for details see html manual and references
Double_t fTxCalc; //calculated value of t parameter for 1D ridges in x direction
Double_t fTxErr; //error value of t parameter for 1D ridges in x direction
Double_t fTyInit; //initial value of t parameter for 1D ridges in y direction (relative amplitude of tail), for details see html manual and references
Double_t fTyCalc; //calculated value of t parameter for 1D ridges in y direction
Double_t fTyErr; //error value of t parameter for 1D ridges in y direction
Double_t fSxInit; //initial value of s parameter for 1D ridges in x direction (relative amplitude of step), for details see html manual and references
Double_t fSxCalc; //calculated value of s parameter for 1D ridges in x direction
Double_t fSxErr; //error value of s parameter for 1D ridges in x direction
Double_t fSyInit; //initial value of s parameter for 1D ridges in y direction (relative amplitude of step), for details see html manual and references
Double_t fSyCalc; //calculated value of s parameter for 1D ridges in y direction
Double_t fSyErr; //error value of s parameter for 1D ridges in y direction
Double_t fBxInit; //initial value of b parameter for 1D ridges in x direction (slope), for details see html manual and references
Double_t fBxCalc; //calculated value of b parameter for 1D ridges in x direction
Double_t fBxErr; //error value of b parameter for 1D ridges in x direction
Double_t fByInit; //initial value of b parameter for 1D ridges in y direction (slope), for details see html manual and references
Double_t fByCalc; //calculated value of b parameter for 1D ridges in y direction
Double_t fByErr; //error value of b parameter for 1D ridges in y direction
Double_t fA0Init; //initial value of background a0 parameter(background is estimated as a0+ax*x+ay*y)
Double_t fA0Calc; //calculated value of background a0 parameter
Double_t fA0Err; //error value of background a0 parameter
Double_t fAxInit; //initial value of background ax parameter(background is estimated as a0+ax*x+ay*y)
Double_t fAxCalc; //calculated value of background ax parameter
Double_t fAxErr; //error value of background ax parameter
Double_t fAyInit; //initial value of background ay parameter(background is estimated as a0+ax*x+ay*y)
Double_t fAyCalc; //calculated value of background ay parameter
Double_t fAyErr; //error value of background ay parameter
Bool_t *fFixPositionX; //[fNPeaks] array of logical values which allow to fix appropriate x positions of 2D peaks (not fit). However they are present in the estimated functional
Bool_t *fFixPositionY; //[fNPeaks] array of logical values which allow to fix appropriate y positions of 2D peaks (not fit). However they are present in the estimated functional
Bool_t *fFixPositionX1; //[fNPeaks] array of logical values which allow to fix appropriate x positions of 1D ridges (not fit). However they are present in the estimated functional
Bool_t *fFixPositionY1; //[fNPeaks] array of logical values which allow to fix appropriate y positions of 1D ridges (not fit). However they are present in the estimated functional
Bool_t *fFixAmp; //[fNPeaks] array of logical values which allow to fix appropriate amplitudes of 2D peaks (not fit). However they are present in the estimated functional
Bool_t *fFixAmpX1; //[fNPeaks] array of logical values which allow to fix appropriate amplitudes of 1D ridges in x direction (not fit). However they are present in the estimated functional
Bool_t *fFixAmpY1; //[fNPeaks] array of logical values which allow to fix appropriate amplitudes of 1D ridges in y direction (not fit). However they are present in the estimated functional
Bool_t fFixSigmaX; //logical value of sigma x parameter, which allows to fix the parameter (not to fit).
Bool_t fFixSigmaY; //logical value of sigma y parameter, which allows to fix the parameter (not to fit).
Bool_t fFixRo; //logical value of correlation coefficient, which allows to fix the parameter (not to fit).
Bool_t fFixTxy; //logical value of t parameter for 2D peaks, which allows to fix the parameter (not to fit).
Bool_t fFixSxy; //logical value of s parameter for 2D peaks, which allows to fix the parameter (not to fit).
Bool_t fFixTx; //logical value of t parameter for 1D ridges in x direction, which allows to fix the parameter (not to fit).
Bool_t fFixTy; //logical value of t parameter for 1D ridges in y direction, which allows to fix the parameter (not to fit).
Bool_t fFixSx; //logical value of s parameter for 1D ridges in x direction, which allows to fix the parameter (not to fit).
Bool_t fFixSy; //logical value of s parameter for 1D ridges in y direction, which allows to fix the parameter (not to fit).
Bool_t fFixBx; //logical value of b parameter for 1D ridges in x direction, which allows to fix the parameter (not to fit).
Bool_t fFixBy; //logical value of b parameter for 1D ridges in y direction, which allows to fix the parameter (not to fit).
Bool_t fFixA0; //logical value of a0 parameter, which allows to fix the parameter (not to fit).
Bool_t fFixAx; //logical value of ax parameter, which allows to fix the parameter (not to fit).
Bool_t fFixAy; //logical value of ay parameter, which allows to fix the parameter (not to fit).
public:
enum {
kFitOptimChiCounts =0,
kFitOptimChiFuncValues =1,
kFitOptimMaxLikelihood =2,
kFitAlphaHalving =0,
kFitAlphaOptimal =1,
kFitPower2 =2,
kFitPower4 =4,
kFitPower6 =6,
kFitPower8 =8,
kFitPower10 =10,
kFitPower12 =12,
kFitTaylorOrderFirst =0,
kFitTaylorOrderSecond =1,
kFitNumRegulCycles =100
};
TSpectrum2Fit(void); //default constructor
TSpectrum2Fit(Int_t numberPeaks);
virtual ~TSpectrum2Fit();
//auxiliary functions for 2. parameter fit functions
protected:
Double_t Deramp2(Double_t x,Double_t y,Double_t x0,Double_t y0,Double_t sigmax,Double_t sigmay,Double_t ro,Double_t txy,Double_t sxy,Double_t bx,Double_t by);
Double_t Derampx(Double_t x,Double_t x0,Double_t sigmax,Double_t tx,Double_t sx,Double_t bx);
Double_t Derbx(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sigmax,Double_t sigmay,Double_t txy,Double_t tx,Double_t bx,Double_t by);
Double_t Derby(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sigmax,Double_t sigmay,Double_t txy,Double_t ty,Double_t bx,Double_t by);
Double_t Derderi01(Double_t x,Double_t ax,Double_t x0,Double_t sigmax);
Double_t Derderi02(Double_t x,Double_t y,Double_t a,Double_t x0,Double_t y0,Double_t sigmax,Double_t sigmay,Double_t ro);
Double_t Derderj02(Double_t x,Double_t y,Double_t a,Double_t x0,Double_t y0,Double_t sigmax,Double_t sigmay,Double_t ro);
Double_t Derdersigmax(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sigmax,Double_t sigmay,Double_t ro);
Double_t Derdersigmay(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sigmax,Double_t sigmay,Double_t ro);
Double_t Derfc(Double_t x);
Double_t Deri01(Double_t x,Double_t ax,Double_t x0,Double_t sigmax,Double_t tx,Double_t sx,Double_t bx);
Double_t Deri02(Double_t x,Double_t y,Double_t a,Double_t x0,Double_t y0,Double_t sigmax,Double_t sigmay,Double_t ro,Double_t txy,Double_t sxy,Double_t bx,Double_t by);
Double_t Derj02(Double_t x,Double_t y,Double_t a,Double_t x0,Double_t y0,Double_t sigmax,Double_t sigmay,Double_t ro,Double_t txy,Double_t sxy,Double_t bx,Double_t by);
Double_t Derpa2(Double_t sx,Double_t sy,Double_t ro);
Double_t Derpro(Double_t a,Double_t sx,Double_t sy,Double_t ro);
Double_t Derpsigmax(Double_t a,Double_t sy,Double_t ro);
Double_t Derpsigmay(Double_t a,Double_t sx,Double_t ro);
Double_t Derro(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sx,Double_t sy,Double_t r);
Double_t Dersigmax(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sigmax,Double_t sigmay,Double_t ro,Double_t txy,Double_t sxy,Double_t tx,Double_t sx,Double_t bx,Double_t by);
Double_t Dersigmay(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sigmax,Double_t sigmay,Double_t ro,Double_t txy,Double_t sxy,Double_t ty,Double_t sy,Double_t bx,Double_t by);
Double_t Dersx(Int_t numOfFittedPeaks,Double_t x,const Double_t *parameter,Double_t sigmax);
Double_t Dersxy(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sigmax,Double_t sigmay);
Double_t Dersy(Int_t numOfFittedPeaks,Double_t x,const Double_t *parameter,Double_t sigmax);
Double_t Dertx(Int_t numOfFittedPeaks,Double_t x,const Double_t *parameter,Double_t sigmax,Double_t bx);
Double_t Dertxy(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sigmax,Double_t sigmay,Double_t bx,Double_t by);
Double_t Derty(Int_t numOfFittedPeaks,Double_t x,const Double_t *parameter,Double_t sigmax,Double_t bx);
Double_t Erfc(Double_t x);
Double_t Ourpowl(Double_t a,Int_t pw);
Double_t Shape2(Int_t numOfFittedPeaks,Double_t x,Double_t y,const Double_t *parameter,Double_t sigmax,Double_t sigmay,Double_t ro,Double_t a0,Double_t ax,Double_t ay,Double_t txy,Double_t sxy,Double_t tx,Double_t ty,Double_t sx,Double_t sy,Double_t bx,Double_t by);
void StiefelInversion(Double_t **a,Int_t size);
Double_t Volume(Double_t a,Double_t sx,Double_t sy,Double_t ro);
public:
void FitAwmi(Float_t **source);
void FitStiefel(Float_t **source);
void GetAmplitudes(Float_t *amplitudes, Float_t *amplitudesX1, Float_t *amplitudesY1);
void GetAmplitudeErrors(Float_t *amplitudeErrors, Float_t *amplitudeErrorsX1, Float_t *amplitudeErrorsY1);
void GetBackgroundParameters(Double_t &a0, Double_t &a0Err, Double_t &ax, Double_t &axErr, Double_t &ay, Double_t &ayErr);
Double_t GetChi() const {return fChi;}
void GetPositions(Float_t *positionsX, Float_t *positionsY, Float_t *positionsX1, Float_t *positionsY1);
void GetPositionErrors(Float_t *positionErrorsX, Float_t *positionErrorsY, Float_t *positionErrorsX1, Float_t *positionErrorsY1);
void GetRo(Double_t &ro, Double_t &roErr);
void GetSigmaX(Double_t &sigmaX, Double_t &sigmaErrX);
void GetSigmaY(Double_t &sigmaY, Double_t &sigmaErrY);
void GetTailParameters(Double_t &txy, Double_t &txyErr, Double_t &tx, Double_t &txErr, Double_t &ty, Double_t &tyErr, Double_t &bx, Double_t &bxErr, Double_t &by, Double_t &byErr, Double_t &sxy, Double_t &sxyErr, Double_t &sx, Double_t &sxErr, Double_t &sy, Double_t &syErr);
void GetVolumes(Float_t *volumes);
void GetVolumeErrors(Float_t *volumeErrors);
void SetBackgroundParameters(Double_t a0Init, Bool_t fixA0, Double_t axInit, Bool_t fixAx, Double_t ayInit, Bool_t fixAy);
void SetFitParameters(Int_t xmin,Int_t xmax,Int_t ymin,Int_t ymax, Int_t numberIterations, Double_t alpha, Int_t statisticType, Int_t alphaOptim, Int_t power, Int_t fitTaylor);
void SetPeakParameters(Double_t sigmaX, Bool_t fixSigmaX, Double_t sigmaY, Bool_t fixSigmaY, Double_t ro, Bool_t fixRo, const Float_t *positionInitX, const Bool_t *fixPositionX, const Float_t *positionInitY, const Bool_t *fixPositionY, const Float_t *positionInitX1, const Bool_t *fixPositionX1, const Float_t *positionInitY1, const Bool_t *fixPositionY1, const Float_t *ampInit, const Bool_t *fixAmp, const Float_t *ampInitX1, const Bool_t *fixAmpX1, const Float_t *ampInitY1, const Bool_t *fixAmpY1);
void SetTailParameters(Double_t tInitXY, Bool_t fixTxy, Double_t tInitX, Bool_t fixTx, Double_t tInitY, Bool_t fixTy, Double_t bInitX, Bool_t fixBx, Double_t bInitY, Bool_t fixBy, Double_t sInitXY, Bool_t fixSxy, Double_t sInitX, Bool_t fixSx, Double_t sInitY, Bool_t fixSy);
ClassDef(TSpectrum2Fit,1) //Spectrum2 Fitter using algorithm without matrix inversion and conjugate gradient method for symmetrical matrices (Stiefel-Hestens method)
};
#endif
|