00001 #include "StrobeDelayAlgorithm.h"
00002 #include "AnalysisAlgorithmMap.h"
00003 #include "SctData/StrobeDelayTestResult.h"
00004 #include "SctData/FitScanResult.h"
00005 #include "SctData/FitObject.h"
00006 #include "SctData/TopHatFitObject.h"
00007 #include "SctData/DefectList.h"
00008 #include "SctData/StandardDefects.h"
00009 #include <string>
00010
00011 using namespace std;
00012 using namespace boost;
00013 using namespace SctData;
00014 using namespace Sct;
00015
00016 namespace SctAnalysis {
00017
00018 bool StrobeDelayAlgorithm::inMap = AnalysisAlgorithmMap::instance().setAlgorithm("StrobeDelayTest", auto_ptr<AnalysisAlgorithm>(new StrobeDelayAlgorithm()));
00019
00020 shared_ptr<AnalysisAlgorithm> StrobeDelayAlgorithm::clone(shared_ptr<const TestData> testData, const string& moduleName) const throw(){
00021 return shared_ptr<AnalysisAlgorithm>(new StrobeDelayAlgorithm(testData, moduleName, *this));
00022 }
00023
00024 shared_ptr<TestResult> StrobeDelayAlgorithm::createTestResult() const {
00025 return shared_ptr<StrobeDelayTestResult> (new StrobeDelayTestResult()) ;
00026 }
00027
00028 void StrobeDelayAlgorithm::loadData() {
00029 loadAllFits();
00030 }
00031
00032 bool StrobeDelayAlgorithm::canAnalyze() const {
00033 return hasAllFits();
00034 }
00035
00036 void StrobeDelayAlgorithm::analyze() {
00037 const double fraction=0.4;
00038 StrobeDelayTestResult& result = *dynamic_pointer_cast<StrobeDelayTestResult>(getTestResult());
00039 const FitScanResult& fitted = *getFit(0);
00040 result.setScanVariable(fitted.getHeader().getVariable());
00041
00042 bool pass = true;
00043 bool problem = false;
00044 result.setNOptima(nChipModule);
00045 for (short unsigned int ichip=0; ichip<nChipModule; ++ichip ) {
00046 const DefectSeverity& severity = result.getDefects().defectSeverityAffectingElement(ModuleElement::Chip(ichip));
00047 if (severity>=SERIOUS) pass=false;
00048 FitObject& fit = fitted.getChipFit(ichip);
00049 try {
00050 dynamic_cast<TopHatFitObject&> (fit);
00051 } catch(std::exception& e) {
00052 throw InvariantViolatedError("StrobeDelayAlgorithm::optimize ERROR not a TopHat function", __FILE__, __LINE__);
00053 }
00054
00055 double rise_value=fit.getParameter(1), fall_value=fit.getParameter(3);
00056 double rise_width=fit.getParameter(2), fall_width=fit.getParameter(4);
00057
00058 result.setOptimum(ichip, rise_value + fraction*(fall_value-rise_value));
00059
00060 if (rise_value < 0) {
00061 result.getDefects().addDefect(Defect(StandardDefects::SD_LO, ModuleElement::Chip(ichip)));
00062 pass = false;
00063 ostringstream msg;
00064 msg << "Chip (0-11) #" << ichip << " mid-rise is at " << rise_value;
00065 result.addComment(msg.str());
00066 } else if (rise_value-rise_width < 1){
00067 problem=true;
00068 ostringstream msg;
00069 msg << "Chip (0-11) #" << ichip << " 1-sigma before mid-rise is at " << rise_value-rise_width;
00070 result.addComment(msg.str());
00071 }
00072 if (fall_value > 63) {
00073 result.getDefects().addDefect(Defect(StandardDefects::SD_HI, ModuleElement::Chip(ichip)));
00074 pass = false;
00075 ostringstream msg;
00076 msg << "Chip (0-11) #" << ichip << " mid-fall is at " << fall_value;
00077 result.addComment(msg.str());
00078 } else if (fall_value+fall_width>62){
00079 problem=true;
00080 ostringstream msg;
00081 msg << "Chip (0-11) #" << ichip << " 1-sigma after mid-fall is at " << fall_value+fall_width;
00082 result.addComment(msg.str());
00083 }
00084 }
00085 result.setPassed(result.getDefects().nChannelsAffected()<(128*2));
00086 result.setProblem(problem);
00087 }
00088
00089
00090 }