Main Page   Modules   Namespace List   Class Hierarchy   Data Structures   File List   Namespace Members   Data Fields   Globals   Related Pages  

NPtGainAlgorithm.cpp

Go to the documentation of this file.
00001 #include "NPtGainAlgorithm.h"
00002 #include "AnalysisAlgorithmMap.h"
00003 #include "AnalysisService.h"
00004 #include "Sct/SctParameters.h"
00005 #include "SctData/NPtGainTestResult.h"
00006 #include "SctData/FitScanResult.h"
00007 #include "SctData/FitObject.h"
00008 #include "SctData/ResponseCurve.h"
00009 #include "SctData/ModuleDefect.h"
00010 #include "SctData/ModuleConfiguration.h"
00011 #include "SctData/ChipConfiguration.h"
00012 #include <boost/shared_ptr.hpp>
00013 
00014 using namespace Sct;
00015 using namespace SctData;
00016 using namespace boost;
00017 
00018 using std::auto_ptr;
00019 
00020 namespace SctAnalysis {
00021     
00022 
00023     shared_ptr<AnalysisAlgorithm> NPtGainAlgorithm::clone(const TestData& testData, const string& moduleName) const throw() {
00024     return shared_ptr<AnalysisAlgorithm>(new NPtGainAlgorithm(testData, moduleName));
00025     }
00026 
00027     shared_ptr<ResponseCurve> NPtGainAlgorithm::getResponseCurve(unsigned int nPts) throw(LogicError){
00028     if (nPts <= 3) {
00029         return shared_ptr<ResponseCurve> (new LinearResponseCurve());
00030     } else {
00031         return shared_ptr<ResponseCurve> (new ExponentialResponseCurve());
00032     }
00033     }
00034 
00035     void NPtGainAlgorithm::setResponseCurve(auto_ptr<ResponseCurve> rc) throw() {
00036     static shared_ptr<ResponseCurve> s_responseCurve=shared_ptr<ResponseCurve>(rc.release());
00037     }
00038 
00039 bool NPtGainAlgorithm::inMap = AnalysisAlgorithmMap::instance().setAlgorithm("NPtGainTest", auto_ptr<AnalysisAlgorithm>(new NPtGainAlgorithm()));
00040 
00041 void NPtGainAlgorithm::canAddFitScanResult(const string& name) throw(LogicError, IoError) {
00042     shared_ptr<NPtGainTestResult> result = dynamic_pointer_cast<NPtGainTestResult> ( getTestResult() );
00043     
00044     //cout << "NPtGainAlgorithm: adding fit: " << name <<endl;
00045 
00046     if (result.get()==0){
00047     //cout << "NPtGainAlgorithm: initialising fit" << endl;
00048     //Create and initialize an NPtGainTestResult
00049     result = shared_ptr<NPtGainTestResult> (new NPtGainTestResult());
00050     setTestResult(result);
00051     
00052     initializeTestResult();
00053     
00054     result->setChipDataSize(nChipModule);
00055     result->setChannelDataSize(nChannelModule);
00056 
00057     try{
00058         result->setSpecialScanPointValue(2.0);
00059     } catch (Sct::Throwable& e){
00060         e.sendToMrs(MRS_ERROR);
00061     }
00062     
00063     }
00064 
00065     addFit(name);
00066 
00067     //cout << result->hasAllFits() << endl;
00068 
00069     // we need all of the fits
00070     if ( !result->hasAllFits() ) return;
00071 
00072     //Do chips
00073     for (unsigned int i=0; i<nChipModule; ++i) {
00074         setupGraph(i, &FitScanResult::getChipFit, *result, result->getChipData(i), true);
00075         doFit(i, &FitScanResult::getChipFit, *result, result->getChipData(i));
00076     }
00077 
00078     //Do channels
00079     for (unsigned int i=0; i<nChannelModule; ++i) {
00080         setupGraph(i, &FitScanResult::getChannelFit, *result, result->getChannelData(i), false);
00081         doFit(i, &FitScanResult::getChannelFit, *result, result->getChannelData(i));
00082         doDefect(Channel(i), result->getDefects(), 
00083          result->getChannelData(i), result->getChipData(i/nChannelChip));
00084     }
00085     
00086     result->setPassed(true);
00087     
00088     finish();
00089 }
00090  
00091 //Setup the graphs - also prune points
00092 void NPtGainAlgorithm::setupGraph(unsigned int id, getFitFunction fitFunc, NPtGainTestResult& test, NPtGainTestResultData& testData, bool trimPoints) throw(LogicError) {
00093     shared_ptr<TGraph> g (new TGraph(test.getNScans()));
00094     if (!g)
00095         throw InvariantViolatedError("NPtGainTestResult::setupGraph couldn't make TGraph", __FILE__, __LINE__);
00096     
00097     unsigned int lastPoint = test.getNScans()-1;
00098     //Filter out points above 5fC if they are broad and we have more than 5 points
00099     if (trimPoints && test.getNScans() > 5) {
00100     double sigmaCut = 0;
00101     for (unsigned int i=0; i<test.getNScans(); ++i) {
00102         sigmaCut+= (test.getFit(i).get()->*fitFunc)(id).getParameter("Sigma");
00103     }
00104     sigmaCut *= 1.5/test.getNScans();   //We want 1.5*mean sigma
00105     for (unsigned int i=test.getNScans() - 1; i>4; --i) {
00106         if (test.getTestPointAt(i) > 5 && (test.getFit(i).get()->*fitFunc)(id).getParameter("Sigma") > sigmaCut) {
00107         lastPoint = i;
00108         }
00109     }
00110     //Note we should only trim points for chips...
00111     if (lastPoint != test.getNScans() - 1) {
00112         ostringstream oss;
00113         oss << "Points trimed from response curve for chip: " << id << ". Last point " << lastPoint << " with charge " << test.getTestPointAt(lastPoint);
00114         test.addComment(oss.str());
00115     }
00116     }
00117     
00118     for (unsigned int j = 0; j <= lastPoint; ++j) {
00119         g->SetPoint(j, test.getTestPointAt(j), (test.getFit(j).get()->*fitFunc)(id).getParameter("Mean"));
00120     }
00121     testData.graph = g;
00122 }
00123 
00124 void NPtGainAlgorithm::doFit(unsigned int id, getFitFunction fitFunc, NPtGainTestResult& test,
00125                               NPtGainTestResultData& testData) throw(LogicError) {
00126     shared_ptr<ResponseCurve> r=getResponseCurve(test.getNScans());
00127     testData.rc = r;
00128     
00129     //testData.graph->Fit(&testData.rc->getFunction(), "NQ", "", 0, 10);
00130     // replaced below with generalised fitting, 17/7/03 Alan Barr
00131 
00132     testData.rc->getFunction()->SetRange(0,10);
00133     AnalysisService::instance().getFitStrategy().fitTGraph(*testData.graph, *testData.rc->getFunction() );
00134     
00135     testData.gain = testData.rc->getGain(test.getSpecialScanPointValue());
00136 
00137     shared_ptr<const FitScanResult> specialFit = test.getFit(test.getSpecialScanIndex());
00138     //6250 is a magic number that converts noise to ENC
00139     if (testData.gain != 0) testData.noise = 6250 * (specialFit.get()->*fitFunc)(id).getParameter("Sigma") / testData.gain;
00140     else  testData.noise = 0;
00141     testData.offset= testData.rc->getFunction()->Eval(0.);
00142 }
00143 
00144 void NPtGainAlgorithm::doDefect(const ModuleElement& element, ModuleDefectList& defects, 
00145                 const NPtGainTestResultData& data,
00146                 const NPtGainTestResultData& comparisonData) throw(LogicError) {
00147     if (data.gain < ModuleDefect::LO_GAIN.getParameter() * comparisonData.gain)
00148         defects.addDefect(ModuleDefect::LO_GAIN, element);
00149     else if (data.gain > ModuleDefect::HI_GAIN.getParameter() * comparisonData.gain)
00150         defects.addDefect(ModuleDefect::HI_GAIN, element);
00151 
00152     if (data.offset < ModuleDefect::LO_OFFSET.getParameter())
00153         defects.addDefect(ModuleDefect::LO_OFFSET, element);
00154     else if (data.offset > ModuleDefect::HI_OFFSET.getParameter())
00155         defects.addDefect(ModuleDefect::HI_OFFSET, element);
00156 
00157     if (data.noise < ModuleDefect::UNBONDED.getParameter())
00158         defects.addDefect(ModuleDefect::UNBONDED, element);
00159     else if (data.noise < ModuleDefect::PARTBONDED.getParameter())
00160         defects.addDefect(ModuleDefect::PARTBONDED, element);
00161     else if (data.noise > ModuleDefect::NOISY.getParameter() * comparisonData.noise)
00162         defects.addDefect(ModuleDefect::NOISY, element);
00163 }
00164 }

Generated on Mon Dec 15 19:36:09 2003 for SCT DAQ/DCS Software by doxygen1.3-rc3