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

AnalysisAlgorithm.cpp

00001 #include "AnalysisAlgorithm.h"
00002 #include "SctData/TestResult.h"
00003 #include "SctData/FitScanResult.h"
00004 #include "SctData/RawScanResult.h"
00005 #include "SctData/UniqueID.h"
00006 #include "SctData/ConfigurationVariable.h"
00007 #include "Sct/SctNames.h"
00008 #include "Sct/LogicErrors.h"
00009 #include "Sct/IOName.h"
00010 #include "Sct/IS/IOManagerIS.h"
00011 #include "Sct/ISProxy/IOManagerISProxy.h"
00012 #include "SummaryWriter/SummaryManager.h"
00013 #include "SummaryWriter/SummaryWriter.h"
00014 #include "CalibrationController/IS/TestData.h"
00015 #include "SummaryWriter/TestSummaryIS.h"
00016 
00017 #include <boost/date_time/posix_time/posix_time_types.hpp>
00018 #include <sstream>
00019 #include <string>
00020 
00021 using namespace std;
00022 using namespace boost;
00023 using namespace Sct;
00024 using namespace SctData;
00025 using namespace Sct::IS;
00026 using namespace boost::posix_time;
00027 
00028 namespace SctAnalysis {
00029 
00030 AnalysisAlgorithm::AnalysisAlgorithm() : m_test(*new TestData), prototype(*this), ioTime(0), analysisTime(0), 
00031     overheadTime(0), nCalls(0), nAnalyses(0) {
00032 }
00033 
00034 AnalysisAlgorithm::AnalysisAlgorithm(const TestData& testData, const string& moduleName, const AnalysisAlgorithm& prototype) throw()
00035     : m_modulename(moduleName), m_test(testData), scanData(testData.nScans), m_done(false),  prototype(prototype),
00036     ioTime(0), analysisTime(0), overheadTime(0), nCalls(0), nAnalyses(0) {
00037 }
00038 
00039 AnalysisAlgorithm::~AnalysisAlgorithm() throw() {
00040     boost::recursive_mutex::scoped_lock lock(m_access);
00041     //Need to explicitly delete so that lock is in force
00042     m_result.reset();
00043 }
00044 
00045 void AnalysisAlgorithm::checkTestResultExists() {
00046     if (m_result.get()==0){
00047     m_result = createTestResult();
00048     if (m_result.get()==0)
00049         throw IllegalStateError("AnalysisAlgorithm cannot initialize - no test exists", __FILE__, __LINE__);
00050     initializeTestResult();
00051     }
00052 }
00053 
00054 void AnalysisAlgorithm::initializeTestResult() {
00055     m_result->setRunNumber(m_test.runNumber);
00056     m_result->setModuleName(m_modulename);
00057     m_result->setTestVariable(*SctData::ConfigurationVariableIOHelper::getFromTypeRep(m_test.testVariable));
00058     m_result->getHeader().setStartTimeString(m_test.startTime);
00059 
00060     //Now add all the scans:
00061     for (unsigned int i=0; i<m_test.testPoints_size; ++i) {
00062         m_result->addScan(m_test.startScanNumber+i, m_test.testPoints[i]);
00063         //cout << "Analysis algorithm adding scan number ... "<<m_test->startScanNumber+i<<" to test"<<endl;
00064     }
00065 }
00066 
00067 void AnalysisAlgorithm::addFitScanResult(shared_ptr<Sct::IOName> name) {
00068     UniqueID id(name->getUniqueID());
00069     unsigned int index = id.getScanNumber() - getTestData().startScanNumber;
00070     scanData[index].fitAvailable = true;
00071     scanData[index].fitName = name->getIOName();
00072 }
00073 
00074 void AnalysisAlgorithm::addRawScanResult(shared_ptr<Sct::IOName> name) {
00075     UniqueID id(name->getUniqueID());
00076     unsigned int index = id.getScanNumber() - getTestData().startScanNumber;
00077     scanData[index].rawAvailable = true;
00078     scanData[index].rawName = name->getIOName();
00079 }
00080 
00081 bool AnalysisAlgorithm::hasAllRaws() const {
00082     for (unsigned int i=0; i<scanData.size(); ++i) {
00083     if (!scanData[i].rawAvailable) return false;
00084     }
00085     return true;
00086 }
00087 
00088 bool AnalysisAlgorithm::hasAllFits() const {
00089     for (unsigned int i=0; i<scanData.size(); ++i) {
00090     if (!scanData[i].fitAvailable) return false;
00091     }
00092     return true;
00093 }
00094 
00095 void AnalysisAlgorithm::loadAllRaws() {
00096     for (unsigned int i=0; i<scanData.size(); ++i) {
00097     if (scanData[i].rawAvailable && !scanData[i].raw) 
00098         scanData[i].raw = dynamic_pointer_cast<RawScanResult>(IOManagerIS::instance().read(scanData[i].rawName, 0));
00099     }
00100 }
00101 
00102 
00103 void AnalysisAlgorithm::loadAllFits() {
00104     for (unsigned int i=0; i<scanData.size(); ++i) {
00105     if (scanData[i].fitAvailable && !scanData[i].fit) 
00106         scanData[i].fit = dynamic_pointer_cast<FitScanResult>(IOManagerIS::instance().read(scanData[i].fitName, 0));
00107     }
00108 }
00109 
00110 shared_ptr<RawScanResult> AnalysisAlgorithm::getRaw(unsigned int index) const {
00111     if (!scanData[index].rawAvailable || !scanData[index].raw) throw IllegalStateError("AnalysisAlgorithm::getRaw.  RawScanResult not available", __FILE__, __LINE__);
00112     return scanData[index].raw;
00113 }
00114 
00115 shared_ptr<FitScanResult> AnalysisAlgorithm::getFit(unsigned int index) const {
00116     if (!scanData[index].fitAvailable || !scanData[index].fit) throw IllegalStateError("AnalysisAlgorithm::getFit.  FitScanResult not available", __FILE__, __LINE__);
00117     return scanData[index].fit;
00118 }
00119 
00120 void AnalysisAlgorithm::mergeDefects() {
00121     if (!m_result) return;
00122     for (unsigned int i=0; i<scanData.size(); ++i) {
00123     if (scanData[i].fit) {
00124         m_result->getDefects() += scanData[i].fit->getDefects();
00125     }
00126     }
00127 }
00128 
00129 
00130 void AnalysisAlgorithm::finish() {
00131     checkTestResultExists();
00132     m_done=true;
00133     m_result->getHeader().setEndTime(second_clock::universal_time());
00134 
00135     m_result->getPassed() ? addPass() : addFailure();
00136 
00137     cout <<"Algorithm done"<<endl;
00138     try {
00139         Sct::IS::IOParamsIS param(Sct::SctNames::getTestDataName());
00140         Sct::ISProxy::IOManagerISProxy::instance().write(*m_result, &param);
00141         cout <<"TestResult published"<<endl;
00142     } catch (Throwable& e) {
00143         e.sendToMrs(MRS_ERROR);
00144     }
00145 
00146     try{
00147         TestSummaryIS t;
00148         t.dataString = SctData::TestSummary::SummaryManager::instance().write(*m_result);
00149         string name = SctNames::getTestDataName();
00150         name += ".";
00151         name += "Summary.";
00152         name += m_result->getUniqueID();
00153         ISInfoDictionary& is = SctNames::getISDictionary();
00154         ISInfo::Status stat;
00155         /*ofstream f(name.c_str());
00156     f << t.dataString;
00157     f.close();*/
00158         if (is.contains(name.c_str())) {
00159         stat = is.update(name.c_str(), t);
00160         } else {
00161         stat = is.insert(name.c_str(), t);
00162         }
00163     } catch (Throwable& e) {
00164         e.sendToMrs(MRS_ERROR);
00165     }
00166 }
00167 
00168 AnalysisAlgorithm::ScanData::ScanData() : rawAvailable(false), fitAvailable(false){
00169 }
00170     
00171 string AnalysisAlgorithm::getStatus() const {
00172   boost::recursive_mutex::scoped_lock lock(m_status_access);
00173     ostringstream oss;
00174     oss << "Status: \n" << nAnalyses << " analyses done in " << analysisTime << "s\n" 
00175     << "I/O: " << ioTime << "s.  Overhead time: " << overheadTime << "s and called " << nCalls << " times\n"
00176     << "Total time: " << (analysisTime+ioTime+overheadTime) << "s average: " << ((analysisTime+ioTime+overheadTime)/nAnalyses) << endl;
00177     oss << "Passed : " << prototype.nPassed << ", Failed : " << prototype.nFailed << endl;
00178     return oss.str();
00179 }
00180 }

Generated on Thu Jul 15 09:50:42 2004 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5