AnalysisAlgorithm.cpp

00001 #include "AnalysisAlgorithm.h"
00002 #include "AnalysisService.h"
00003 #include "SctData/TestResult.h"
00004 #include "SctData/FitScanResult.h"
00005 #include "SctData/RawScanResult.h"
00006 #include "Sct/UniqueID.h"
00007 #include "SctData/ConfigurationVariable.h"
00008 #include "Sct/SctNames.h"
00009 #include "Sct/LogicErrors.h"
00010 #include "Sct/IOName.h"
00011 #include "Sct/IS/IOManagerIS.h"
00012 #include "Sct/ISProxy/IOManagerISProxy.h"
00013 #include "Sct/ISUtilities.h"
00014 #include "SummaryWriter/SummaryManager.h"
00015 #include "SummaryWriter/SummaryWriter.h"
00016 #include "CalibrationController/IS/TestData.h"
00017 #include "SummaryWriter/TestSummaryIS.h"
00018 #include "ISSummaryWriter/ISSummaryManager.h"
00019 
00020 #include <boost/date_time/posix_time/posix_time_types.hpp>
00021 #include <sstream>
00022 #include <string>
00023 
00024 using namespace std;
00025 using namespace boost;
00026 using namespace Sct;
00027 using namespace SctData;
00028 using namespace Sct::IS;
00029 using namespace boost::posix_time;
00030 
00031 namespace SctAnalysis {
00032 
00033 AnalysisAlgorithm::AnalysisAlgorithm() : prototype(*this), ioTime(0), analysisTime(0), 
00034     overheadTime(0), nCalls(0), nAnalyses(0) {
00035 }
00036 
00037 AnalysisAlgorithm::AnalysisAlgorithm(shared_ptr<const TestData> testData, const string& moduleName, const AnalysisAlgorithm& prototype) throw()
00038     : m_modulename(moduleName), m_test(testData), m_done(false),  prototype(prototype),
00039     ioTime(0), analysisTime(0), overheadTime(0), nCalls(0), nAnalyses(0) {
00040   int results_per_scan = (getTestData()->options.find("full")==std::string::npos) ? 1 : 3;
00041   scanData.resize(getTestData()->nScans * results_per_scan);
00042 }
00043 
00044 AnalysisAlgorithm::~AnalysisAlgorithm() throw() {
00045     boost::recursive_mutex::scoped_lock lock(m_access);
00046     //Need to explicitly delete so that lock is in force
00047     m_result.reset();
00048 }
00049 
00050 shared_ptr<const TestData> AnalysisAlgorithm::getTestData() const {
00051   if (!m_test.get()) throw Sct::InvariantViolatedError("Attempt to retrieve null TestData - probably from prototype algorithm",__FILE__,__LINE__);
00052   return m_test;
00053 }
00054 
00055 void AnalysisAlgorithm::setTestData(shared_ptr<const TestData> testdata){
00056   if (!m_test.get()) throw Sct::InvariantViolatedError("Attempt to set null TestData",__FILE__,__LINE__);
00057   m_test = testdata;
00058 }
00059 
00060 void AnalysisAlgorithm::checkTestResultExists() {
00061     if (m_result.get()==0){
00062     m_result = createTestResult();
00063     if (m_result.get()==0)
00064         throw IllegalStateError("AnalysisAlgorithm cannot initialize - no test exists", __FILE__, __LINE__);
00065     initializeTestResult();
00066     }
00067 }
00068 
00069 void AnalysisAlgorithm::initializeTestResult() {
00070     m_result->setRunNumber(getTestData()->runNumber);
00071     m_result->setModuleName(m_modulename);
00072     m_result->setTestVariable(*SctData::ConfigurationVariableIOHelper::getFromTypeRep(getTestData()->testVariable));
00073     m_result->getHeader().setStartTimeString(getTestData()->startTime);
00074 
00075     //Now add all the scans:
00076     for (unsigned int i=0; i<getTestData()->testPoints_size; ++i) {
00077         m_result->addScan(getTestData()->startScanNumber+i, getTestData()->testPoints[i]);
00078         //cout << "Analysis algorithm adding scan number ... "<<m_test->startScanNumber+i<<" to test"<<endl;
00079     }
00080 }
00081 
00082 void AnalysisAlgorithm::addFitScanResult(shared_ptr<Sct::IOName> name) {
00083     UniqueID id(name->getUniqueID());
00084     unsigned int index = id.getScanNumber() - getTestData()->startScanNumber;
00085     scanData[index].fitAvailable = true;
00086     scanData[index].fitName = name->getIOName();
00087 }
00088 
00089 void AnalysisAlgorithm::addRawScanResult(shared_ptr<Sct::IOName> name) {
00090     UniqueID id(name->getUniqueID());
00091     unsigned int index = id.getScanNumber() - getTestData()->startScanNumber;
00092     scanData[index].rawAvailable = true;
00093     scanData[index].rawName = name->getIOName();
00094 }
00095 
00096 void AnalysisAlgorithm::setFit(unsigned index, const std::string& fit){
00097     scanData[index].fitName=fit;
00098     scanData[index].fitAvailable=true;
00099 }
00100 
00101 void AnalysisAlgorithm::setRaw(unsigned index, const std::string& raw){
00102     scanData[index].rawName=raw;
00103     scanData[index].fitAvailable=true;
00104 }
00105 
00106 bool AnalysisAlgorithm::hasAllRaws() const {
00107     for (unsigned int i=0; i<scanData.size(); ++i) {
00108     if (!scanData[i].rawAvailable) return false;
00109     }
00110     return true;
00111 }
00112 
00113 bool AnalysisAlgorithm::hasAllFits() const {
00114     for (unsigned int i=0; i<scanData.size(); ++i) {
00115     if (!scanData[i].fitAvailable) return false;
00116     }
00117     return true;
00118 }
00119 
00120 void AnalysisAlgorithm::loadAllRaws() {
00121     for (unsigned int i=0; i<scanData.size(); ++i) {
00122     if (scanData[i].rawAvailable && !scanData[i].raw) 
00123         scanData[i].raw = dynamic_pointer_cast<RawScanResult>(IOManagerIS::instance().read(scanData[i].rawName, 0));
00124     }
00125 }
00126 
00127 
00128 void AnalysisAlgorithm::loadAllFits() {
00129     for (unsigned int i=0; i<scanData.size(); ++i) {
00130     if (scanData[i].fitAvailable && !scanData[i].fit) 
00131         scanData[i].fit = dynamic_pointer_cast<FitScanResult>(IOManagerIS::instance().read(scanData[i].fitName, 0));
00132     }
00133 }
00134 
00135 shared_ptr<RawScanResult> AnalysisAlgorithm::getRaw(unsigned int index) const {
00136     if (!scanData[index].rawAvailable || !scanData[index].raw) throw IllegalStateError("AnalysisAlgorithm::getRaw.  RawScanResult not available", __FILE__, __LINE__);
00137     return scanData[index].raw;
00138 }
00139 
00140 shared_ptr<FitScanResult> AnalysisAlgorithm::getFit(unsigned int index) const {
00141     if (!scanData[index].fitAvailable || !scanData[index].fit) throw IllegalStateError("AnalysisAlgorithm::getFit.  FitScanResult not available", __FILE__, __LINE__);
00142     return scanData[index].fit;
00143 }
00144 
00145 void AnalysisAlgorithm::checkForZeroTriggerBins(){
00146   for (unsigned int iscan=0; iscan<scanData.size(); ++iscan) {
00147     if (scanData[iscan].raw) {
00148       bool problem=false;
00149       const ScanPoints& points = scanData[iscan].raw->getPoints();
00150       for (unsigned ipoint=0; ipoint<points.getNPoints(); ++ipoint){
00151     if (points.getNEvents(ipoint)==0) problem=true; 
00152       }
00153       if (problem) {
00154     ostringstream comment;
00155     comment << "Problem: zero-trigger bin(s) in scan " << iscan << "\n"; 
00156     if (m_result) { 
00157       m_result->setProblem(true);
00158       m_result->addComment(comment.str());
00159     }else{
00160       throw Sct::IllegalStateError("No test result available ",__FILE__,__LINE__); 
00161     }
00162       }
00163     }
00164   }
00165 }
00166 
00167 void AnalysisAlgorithm::mergeDefects() {
00168     if (!m_result) return;
00169     for (unsigned int i=0; i<scanData.size(); ++i) {
00170     if (scanData[i].fit) {
00171         m_result->getDefects() += scanData[i].fit->getDefects();
00172     }
00173     }
00174 }
00175 
00176 void AnalysisAlgorithm::finish() {
00177     checkTestResultExists();
00178     checkForZeroTriggerBins();
00179     m_done=true;
00180     m_result->getHeader().setEndTime(second_clock::universal_time());
00181 
00182     m_result->getPassed() ? addPass() : addFailure();
00183 
00184     std::string options("SCAN_OPTIONS:");
00185     options+=getTestData()->options;
00186     m_result->addComment(options);
00187 
00188     //cout <<"Algorithm done"<<endl;
00189     try {
00190         Sct::IS::IOParamsIS param(AnalysisService::instance().getOutputISServerName());
00191         Sct::ISProxy::IOManagerISProxy::instance().write(*m_result, &param);
00192         //cout <<"TestResult published"<<endl;
00193     } catch (Throwable& e) {
00194         e.sendToMrs(MRS_ERROR);
00195     }
00196 
00197     try{
00198         TestSummaryIS t;
00199         t.dataString = SctData::TestSummary::SummaryManager::instance().write(*m_result);
00200         string name = AnalysisService::instance().getOutputISServerName();
00201         name += ".";
00202         name += "Summary.";
00203         name += (string) m_result->getUniqueID();
00204     Sct::ISUtilities::addOrUpdateOrThrow(name, t, __FILE__, __LINE__, MRS_ERROR);
00205     } catch (Throwable& e) {
00206         e.sendToMrs(MRS_ERROR);
00207     }
00208 
00209     try{
00210 
00211       //  This is a temporary workaround... just for testing purposes. BD 
00212       if ((m_result->getClassName()=="SctData::NPtGainTestResult") || (m_result->getClassName()=="SctData::NoiseOccupancyTestResult")) {
00213     SctData::ISTestSummary::ISSummaryManager::instance().write(*m_result);
00214       }
00215     } catch (Throwable& e) {
00216       e.sendToMrs(MRS_ERROR);
00217     }
00218 
00219 }
00220  
00221  AnalysisAlgorithm::ScanData::ScanData() : rawAvailable(false), fitAvailable(false){
00222  }
00223     
00224 string AnalysisAlgorithm::getStatus() const {
00225   boost::recursive_mutex::scoped_lock lock(m_status_access);
00226     ostringstream oss;
00227     oss << "Status: \n" << nAnalyses << " analyses done in " << analysisTime << "s\n" 
00228     << "I/O: " << ioTime << "s.  Overhead time: " << overheadTime << "s and called " << nCalls << " times\n"
00229     << "Total time: " << (analysisTime+ioTime+overheadTime) << "s average: " << ((analysisTime+ioTime+overheadTime)/nAnalyses) << endl;
00230     oss << "Passed : " << prototype.nPassed << ", Failed : " << prototype.nFailed << endl;
00231     return oss.str();
00232 }
00233 }

Generated on Mon Feb 6 14:01:16 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6