CMS 3D CMS Logo

CSCFitAFEBThr.cc

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(unsigned int 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 //     std::cout<<" "<<ynorm[i];
00073   }
00074 //  std::cout<<std::endl;
00075   if(sum==0) {
00076     ndf=-4;
00077     return status;
00078   }
00079    
00080 
00081   int nbeg=inputx.size();
00082   for(unsigned int i=inputx.size()-1;i>=0;i--) {
00083     if(ynorm[i]<1.0) nbeg--;
00084     if(ynorm[i]==1.0) break;
00085   }
00086 
00087   for(unsigned int i=nbeg;i<inputx.size();i++) {
00088     if(ynorm[i]>0.0) {
00089       x.push_back(inputx[i]); 
00090       y.push_back(ynorm[i]);
00091 
00092       float p=inputy[i]/(float)dacoccup[i];
00093       float s=(float)dacoccup[i] * p * (1.0-p);
00094       s=sqrt(s)/(float)dacoccup[i];
00095       ery.push_back(s);
00096     }                          
00097   }
00098 
00100   ndf=x.size()-2; 
00101   if(ndf <=0) return status;
00102 
00104   float half=0.5;
00105   float dmin=999999.0;
00106   float diff;
00107   for(unsigned int i=0;i<x.size();i++) {
00108     diff=y[i]-half; if(diff<0.0) diff=-diff;
00109     if(diff<dmin) {dmin=diff; parinit[0]=x[i];}   // par[0] from data    
00110     //cout<<i+1<<" "<<x[i]<<" "<<y[i]<<" "<<ery[i]<<endl;
00111   }
00112 
00114   theOBJfun->setData(x,y); 
00115   theOBJfun->setErrors(ery);   
00116   theOBJfun->setNorm(1.0);
00117 
00118  // for(unsigned int i=0;i<x.size();i++) std::cout<<" "<<x[i]<<" "<<y[i]
00119  //                                               <<" "<<ery[i]<<std::endl; 
00120 
00122   FunctionMinimum fmin=theFitter->Minimize(*theOBJfun,parinit,erparinit,1,500,0.1);
00123 
00124   status = fmin.IsValid();
00125 
00126   if(status) { 
00127     mypar[0]=(float)fmin.Parameters().Vec()(0);
00128     mypar[1]=(float)fmin.Parameters().Vec()(1);
00129     ermypar[0]=(float)sqrt( fmin.Error().Matrix()(0,0) );
00130     ermypar[1]=(float)sqrt( fmin.Error().Matrix()(1,1) );
00131     ercorr=0;
00132     if(ermypar[0] !=0.0 && ermypar[1]!=0.0)
00133     ercorr=(float)fmin.Error().Matrix()(0,1)/(ermypar[0]*ermypar[1]);
00134 
00135     chisq  = fmin.Fval();
00136     ndf=y.size()-mypar.size();
00137     niter=fmin.NFcn();         
00138     edm=fmin.Edm();
00139   }
00140   else ndf=-3;
00141   return status;
00142 }

Generated on Tue Jun 9 17:40:41 2009 for CMSSW by  doxygen 1.5.4