00001 #ifndef FITTING_ROUTINES_H
00002 #define FITTING_ROUTINES_H
00003
00004 #include "histogram.h"
00005 #define NCHIPS 16
00006 #define NCOLS 18
00007 #define NROWS 160
00008 #define NPIXELS (NCHIPS*NCOLS*NROWS)
00009 #define MAXBINS (HISTOGRAM_BIN_MAX)
00010
00011 typedef struct {
00012 float mu, sigma, a0, sigmaInv;
00013 } GaussianCurve;
00014
00015 typedef struct {
00016 unsigned int pixelId, tPixel, iterations;
00017 float chi2;
00018 GaussianCurve s;
00019 } PixelFit;
00020
00021 typedef struct {
00022 float *x, *y, *w;
00023 int n;
00024 } FitData;
00025
00026 #if 0
00027
00028 typedef struct {
00029 GaussianCurve s;
00030 float chi2;
00031 } PixelFit;
00032 #endif
00033
00034 typedef struct {
00035 float dt, tBegin, tFinal;
00036 } ManualSeek;
00037
00038 typedef struct {
00039 float deltaMu, deltaSigma;
00040 float muEpsilon, sigmaEpsilon;
00041 float sigmaMin;
00042 float concavitySmallness;
00043 int nIters, maxIters, converge, muConverge, sigmaConverge;
00044 int ndf;
00045 float chi2;
00046 float chi2CutOff;
00047 float muCutOff, sigmaCutOff;
00048 void * curve;
00049
00050 int extraIter;
00051 float (*findMinSigma)(FitData *pfd, GaussianCurve *ps, void *pFit);
00052 float (*findMinMu)(FitData *pfd, GaussianCurve *ps, void *pFit);
00053 float (*chiSquared)(FitData *pfd,GaussianCurve *s);
00054 int (*sGuess)(FitData *pfd,GaussianCurve *sParams,void *vpfit);
00055 int (*fitSCurve)(FitData *pfd, void *vpfit);
00056 ManualSeek manualSeekMu, manualSeekSigma;
00057 } Fit;
00058
00059 typedef struct {
00060 float x, y;
00061 } Point;
00062
00063
00064
00065 void loadFitArrayX(MDAT32 val[], UINT32 nBins);
00066 void loadFitArrayY(UINT32 binSize, void *baseAddr, UINT32 delta, UINT32 nBins);
00067
00068 void setSigma(GaussianCurve *ps,float sigma);
00069 float errf_ext(float x, GaussianCurve *psp);
00070 float *log_ext(float x, GaussianCurve *psp);
00071 float abs_ext(float x);
00072 int sGuess(FitData *pfd, GaussianCurve *pSParams, void *vpfit);
00073 float nextAbscissa(Point *pt);
00074 float parabolicAbscissa(Point *pt);
00075 int fitSCurveAim(FitData *pfd, void *vpfit);
00076 int fitSCurveCrawl(FitData *pfd, void *vpfit);
00077 int fitSCurveParabolicAlgorithm(FitData *pfd, void *vpfit);
00078 int fitSCurveBruteForce(FitData *pfd, void *vpfit);
00079 int defaultFit(Fit *pfit);
00080 PixelFit *fitModule(void *histBase,int nBins);
00081 float chiSquared(FitData *pfd,GaussianCurve *s);
00082 float logLikelihood(FitData *pfd, GaussianCurve *s);
00083 int extractGoodData(FitData *pfdi,FitData *pfdo);
00084
00085 extern far float data_weight[];
00086 extern far float data_errf[];
00087 extern far float data_logx[];
00088 extern far float inverse_lut_interval;
00089 extern far float inverse_weight_lut_interval;
00090
00091 #define WEIGHT_LUT_LENGTH 1001
00092 #define LUT_WIDTH 3500
00093 #define LUT_LENGTH (2*LUT_WIDTH+1)
00094
00095 typedef struct {
00096 int id, nBins, *binCount;
00097 float xStart, xFinal, dx;
00098 void (*fill)(void *pHist,float y);
00099 void (*close)(void *pHist);
00100 } Hist1F;
00101
00102 Hist1F *hist1FOpen(int nBins,float xStart,float xFinal);
00103
00104 float manualFindMinSigma(FitData *pfd, GaussianCurve *ps, void *pFit);
00105 float manualFindMinMu(FitData *pfd, GaussianCurve *ps, void *pFit);
00106
00107 #endif