00001 #include "StrobeDelayFitAlgorithm.h"
00002 #include "FitAlgorithmMap.h"
00003 #include "SctData/FitScanResult.h"
00004 #include "SctData/StrobeDelayVariable.h"
00005 #include "SctData/StandardDefects.h"
00006 #include "SctData/TopHatFitObject.h"
00007 #include <TH1.h>
00008
00009 using namespace SctData;
00010
00011 namespace SctFitter {
00012
00013 bool StrobeDelayFitAlgorithm::inMap = FitAlgorithmMap::instance().setAlgorithm(StrobeDelayVariable::instance().getVariableName(), auto_ptr<FitAlgorithm>(new StrobeDelayFitAlgorithm));
00014
00015 StrobeDelayFitAlgorithm::StrobeDelayFitAlgorithm() throw() {
00016 FitterMode mode = getMode();
00017 mode.fitNone();
00018 mode.fitChips();
00019 mode.doSummary(false);
00020 setMode(mode);
00021 }
00022
00023 auto_ptr<FitObject> StrobeDelayFitAlgorithm::getPrototype() const throw() {
00024 return auto_ptr<FitObject> (new TopHatFitObject());
00025 }
00026
00027 void StrobeDelayFitAlgorithm::guessParameters(const TH1& hist, FitObject& fitOb) const throw (LogicError, MathsError) {
00028 fitOb.setParameter(0, hist.GetMaximum() ) ;
00029
00030 fitOb.setParameter(1, findLevel(hist,0.5,true)) ;
00031 double p2 = findLevel(hist, 0.82, true) - fitOb.getParameter(1);
00032 if (p2<0.) p2=-p2;
00033 fitOb.setParameter(2, p2 ) ;
00034
00035
00036 fitOb.setParameter(3, findLevel(hist,0.5,false)) ;
00037 double p4 = findLevel(hist, 0.82, false) - fitOb.getParameter(3);
00038 if (p4<0.) p4=-p4;
00039 fitOb.setParameter(4, p4 ) ;
00040
00041 int lbin=findBin(hist, 0.01, true, false); if ( (lbin-1) >= 1 ) lbin--;
00042 int ubin=findBin(hist, 0.01, false, false); if ( (ubin+1) <= hist.GetNbinsX() ) ubin++;
00043 fitOb.setVarMin(0 , hist.GetBinLowEdge( lbin ) );
00044 fitOb.setVarMax(0 , hist.GetBinLowEdge( ubin + 1 ) );
00045 }
00046
00047 void StrobeDelayFitAlgorithm::checkForDefects(const FitObject& fo, const ModuleElement& element,
00048 DefectList& defects) const {
00049 if (fo.getNDF() && fo.getChiSquared()/fo.getNDF() > StandardDefects::BADFIT.getParameter() ) {
00050 cout << "Chi-squared: " << fo.getChiSquared() << " NDF: " << fo.getNDF() << endl;
00051 defects.addDefect(Defect(StandardDefects::BADFIT,element));
00052 }
00053 }
00054
00055 void StrobeDelayFitAlgorithm::checkForDefects(const TH1& hist, const ModuleElement& element,
00056 DefectList& defects) const throw (LogicError) {
00057 double maxVal = hist.GetMaximum();
00058 double minVal = hist.GetMinimum();
00059
00060 if ( maxVal < StandardDefects::DEAD.getParameter() ){
00061 defects.addDefect(Defect(StandardDefects::DEAD, element));
00062 if (debug()) {
00063 hist.Print();
00064 std::cout << "MAXVAL=" << maxVal << std::endl;
00065 }
00066 }
00067 if( minVal > StandardDefects::STUCKON.getParameter() ){
00068 defects.addDefect(Defect(StandardDefects::STUCKON, element));
00069 if (debug()) {
00070 std::cout << "MINVAL=" << minVal << std::endl;
00071 }
00072 }
00073 if( maxVal < StandardDefects::UNDER.getParameter() ){
00074 defects.addDefect(Defect(StandardDefects::UNDER,element));
00075 }else if( maxVal > StandardDefects::OVER.getParameter() ){
00076 defects.addDefect(Defect(StandardDefects::OVER,element));
00077 }
00078 }
00079
00080 void StrobeDelayFitAlgorithm::createSummaryHistograms(FitScanResult& fits) const throw() {
00081 }
00082
00083 }