00001 #include "RxThresholdAlgorithm.h"
00002 #include "AnalysisAlgorithmMap.h"
00003 #include "SctData/RxThresholdTestResult.h"
00004 #include "SctData/RawScanResult.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 #include "TH2.h"
00011
00012 using namespace std;
00013 using namespace boost;
00014 using namespace SctData;
00015 using namespace Sct;
00016
00017 namespace SctAnalysis {
00018
00019 bool RxThresholdAlgorithm::inMap = AnalysisAlgorithmMap::instance().setAlgorithm("RxThresholdTest", auto_ptr<AnalysisAlgorithm>(new RxThresholdAlgorithm()));
00020
00021 shared_ptr<AnalysisAlgorithm> RxThresholdAlgorithm::clone(const TestData& testData, const string& moduleName) const throw(){
00022 return shared_ptr<AnalysisAlgorithm>(new RxThresholdAlgorithm(testData, moduleName, *this));
00023 }
00024
00025 shared_ptr<TestResult> RxThresholdAlgorithm::createTestResult() const {
00026 return shared_ptr<RxThresholdTestResult> (new RxThresholdTestResult()) ;
00027 }
00028
00029 void RxThresholdAlgorithm::loadData() {
00030 loadAllRaws();
00031 }
00032
00033 bool RxThresholdAlgorithm::canAnalyze() const {
00034 return hasAllRaws();
00035 }
00036
00037 void RxThresholdAlgorithm::analyze() {
00038 RxThresholdTestResult& result = *dynamic_pointer_cast<RxThresholdTestResult>(getTestResult());
00039 const RawScanResult& raw = *getRaw(0);
00040 result.setScanVariable(raw.getHeader().getVariable());
00041
00042 const SctData::ScanPoints& points=raw.getPoints();
00043 bool ascending = points.ascending();
00044 bool pass = true;
00045 result.setNOptima(nLinkModule);
00046 for (short unsigned int ilink=0; ilink<nLinkModule; ++ilink ) {
00047 const TH2& data = raw.getScanData(ilink);
00048 const unsigned nx = data.GetNbinsX();
00049 const unsigned ny = data.GetNbinsY();
00050 double* projection = new double[ny];
00051 int start=-1;
00052 int stop =-1;
00053 for (unsigned iy=0; iy<ny; ++iy){
00054 const unsigned ipt = ascending ? iy : ny-iy-1;
00055 projection[ipt]=0;
00056 for (unsigned ix=0; ix<nx; ++ix){
00057 projection[iy]+=data.GetBinContent(ix+1,ipt+1);
00058 }
00059 double compare = points.getNEvents(ipt)*nx*0.75;
00060 if (ipt>0 && projection[ipt]<compare && projection[ipt-1]>compare) {
00061 std::cout << ipt << "=" << points[ipt] << " "
00062 << projection[ipt-1] << " -> " << projection[ipt]
00063 << " : " << compare << std::endl;
00064 if (start!=-1) pass=false;
00065 start=ipt;
00066 }
00067 compare = points.getNEvents(ipt)*nx*0.25;
00068 if (ipt>0 && projection[ipt]<compare && projection[ipt-1]>compare) {
00069 std::cout << ipt << "=" << points[ipt] << " "
00070 << projection[ipt-1] << " -> " << projection[ipt]
00071 << " : " << compare << std::endl;
00072 if (stop!=-1) pass=false;
00073 stop=ipt;
00074 }
00075 }
00076
00077 cout << "start = " << start << ", stop = " << stop << endl;
00078
00079 double optimum=-1;
00080 const double fraction= 0.5;
00081 const unsigned zero = ascending ? 0 : ny-1;
00082 const unsigned end = ascending ? ny-1 : 0;
00083
00084 if (start==-1&&stop==-1){
00085 optimum=points[zero]+fraction*(points[end]-points[zero]);
00086 } else if (start==-1){
00087 optimum=points[zero]+fraction*(points[stop]-points[zero]);
00088 } else if (stop==-1){
00089 optimum=points[start]+fraction*(points[end]-points[start]);
00090 }else{
00091 optimum=points[start]+fraction*(points[stop]-points[start]);
00092 }
00093 cout << "optimum=" << optimum << endl;
00094 result.setOptimum(ilink, optimum);
00095 }
00096 result.setPassed(pass);
00097 }
00098
00099
00100 }