Go to the documentation of this file.00001 #include "Minuit2/VariableMetricMinimizer.h"
00002 #include "Minuit2/FunctionMinimum.h"
00003
00004 #include <OnlineDB/CSCCondDB/interface/CSCFitAFEBThr.h>
00005 #include <OnlineDB/CSCCondDB/interface/CSCThrTurnOnFcn.h>
00006
00007 #include <cmath>
00008 #include <vector>
00009 #include <iostream>
00010
00011 using namespace ROOT::Minuit2;
00012 using namespace std;
00013
00014 CSCFitAFEBThr::CSCFitAFEBThr() {
00015 theOBJfun = new CSCThrTurnOnFcn();
00016 theFitter = new VariableMetricMinimizer();
00017 }
00018
00019 CSCFitAFEBThr::~CSCFitAFEBThr() {
00020 delete theFitter;
00021 delete theOBJfun;
00022 }
00023
00024 bool CSCFitAFEBThr::ThresholdNoise(const std::vector<float> & inputx,
00025 const std::vector<float> & inputy,
00026 const int & npulses,
00027 std::vector<int> & dacoccup,
00028 std::vector<float> & mypar,
00029 std::vector<float> & ermypar,
00030 float & ercorr,
00031 float & chisq,
00032 int & ndf,
00033 int & niter,
00034 float & edm
00035 ) const {
00036 bool status = false;
00037
00038 std::vector<double> parinit(2,0);
00039 std::vector<double> erparinit(2,0);
00040
00042 parinit[0] = 30.0;
00043 parinit[1] = 2.0;
00044
00045 erparinit[0] = 20;
00046 erparinit[1] = 0.5;
00047
00049 std::vector<float> x;
00050 std::vector<float> y;
00051 std::vector<float> ynorm;
00052 std::vector<float> ery;
00053 x.clear();
00054 y.clear();
00055 ynorm.clear();
00056 ery.clear();
00057
00065
00066 int sum=0;
00067 float r;
00068 for(size_t i=0;i<inputx.size();i++) {
00069 if(inputy[i]>0.0) sum++;
00070 r=inputy[i]/(float)dacoccup[i];
00071 ynorm.push_back(r);
00072
00073 }
00074
00075 if(sum==0) {
00076 ndf=-4;
00077 return status;
00078 }
00079
00080
00081 int nbeg=inputx.size();
00082
00083
00084
00085
00086 for(size_t i=inputx.size();i>0;i--) {
00087 if(ynorm[i-1]<1.0) nbeg--;
00088 if(ynorm[i-1]==1.0) break;
00089 }
00090
00091 for(size_t i=nbeg;i<inputx.size();i++) {
00092 if(ynorm[i]>0.0) {
00093 x.push_back(inputx[i]);
00094 y.push_back(ynorm[i]);
00095
00096 float p=inputy[i]/(float)dacoccup[i];
00097 float s=(float)dacoccup[i] * p * (1.0-p);
00098 s=sqrt(s)/(float)dacoccup[i];
00099 ery.push_back(s);
00100 }
00101 }
00102
00104 ndf=x.size()-2;
00105 if(ndf <=0) return status;
00106
00108 float half=0.5;
00109 float dmin=999999.0;
00110 float diff;
00111 for(size_t i=0;i<x.size();i++) {
00112 diff=y[i]-half; if(diff<0.0) diff=-diff;
00113 if(diff<dmin) {dmin=diff; parinit[0]=x[i];}
00114
00115 }
00116
00118 theOBJfun->setData(x,y);
00119 theOBJfun->setErrors(ery);
00120 theOBJfun->setNorm(1.0);
00121
00122
00123
00124
00126 FunctionMinimum fmin=theFitter->Minimize(*theOBJfun,parinit,erparinit,1,500,0.1);
00127
00128 status = fmin.IsValid();
00129
00130 if(status) {
00131 mypar[0]=(float)fmin.Parameters().Vec()(0);
00132 mypar[1]=(float)fmin.Parameters().Vec()(1);
00133 ermypar[0]=(float)sqrt( fmin.Error().Matrix()(0,0) );
00134 ermypar[1]=(float)sqrt( fmin.Error().Matrix()(1,1) );
00135 ercorr=0;
00136 if(ermypar[0] !=0.0 && ermypar[1]!=0.0)
00137 ercorr=(float)fmin.Error().Matrix()(0,1)/(ermypar[0]*ermypar[1]);
00138
00139 chisq = fmin.Fval();
00140 ndf=y.size()-mypar.size();
00141 niter=fmin.NFcn();
00142 edm=fmin.Edm();
00143 }
00144 else ndf=-3;
00145 return status;
00146 }