00001 #include "AnalysisAlgorithm.h"
00002 #include "SctData/TestResult.h"
00003 #include "SctData/FitScanResult.h"
00004 #include "SctData/RawScanResult.h"
00005 #include "SctData/ConfigurationVariable.h"
00006 #include "Sct/SctNames.h"
00007 #include "Sct/IS/IOManagerIS.h"
00008 #include "SummaryWriter/SummaryManager.h"
00009 #include "SummaryWriter/SummaryWriter.h"
00010 #include "CalibrationController/IS/TestData.h"
00011 #include "TestSummaryIS.h"
00012 #include <sstream>
00013 #include <string>
00014
00015 using namespace SctData;
00016 using std::string;
00017
00018 namespace SctAnalysis {
00019
00020 AnalysisAlgorithm::AnalysisAlgorithm() : m_test(*new TestData) {}
00021
00022 AnalysisAlgorithm::~AnalysisAlgorithm() throw() {
00023 boost::recursive_mutex::scoped_lock lock(m_access);
00024
00025 m_result.reset();
00026 }
00027
00028 void AnalysisAlgorithm::checkTestResultExists() const throw(Sct::LogicError) {
00029 if (m_result.get()==0){
00030 throw IllegalStateError("AnalysisAlgorithm cannot initialize - no test exists", __FILE__, __LINE__);
00031 }
00032 }
00033
00034 void AnalysisAlgorithm::initializeTestResult() throw(Sct::LogicError) {
00035 checkTestResultExists();
00036
00037 m_result->setRunNumber(m_test.runNumber);
00038 m_result->setModuleName(m_modulename);
00039 m_result->setTestVariable(*SctData::ConfigurationVariableIOHelper::getFromTypeRep(m_test.testVariable));
00040
00041
00042 for (unsigned int i=0; i<m_test.testPoints_size; ++i) {
00043 m_result->addScan(m_test.startScanNumber+i, m_test.testPoints[i]);
00044
00045 }
00046 }
00047
00048 void AnalysisAlgorithm::addFit(const string& name) throw(Sct::LogicError, Sct::IoError) {
00049 boost::recursive_mutex::scoped_lock lock(m_access);
00050 checkTestResultExists();
00051
00052 Sct::IS::IOParamsIS param(Sct::SctNames::getFittedDataName());
00053 boost::shared_ptr<const Sct::Streamable> ob = Sct::IS::IOManagerIS::instance().read(name, ¶m);
00054 boost::shared_ptr<const FitScanResult> fit = boost::dynamic_pointer_cast<const FitScanResult>(ob);
00055 if (!fit) throw InvalidArgumentError("AnalsisAlogrithm::addFit: " + name + " is not a valid FitScanResult", __FILE__, __LINE__);
00056 getTestResult()->addFit(fit);
00057 }
00058
00059 void AnalysisAlgorithm::addRaw(const string& name) throw(Sct::LogicError, Sct::IoError) {
00060 boost::recursive_mutex::scoped_lock lock(m_access);
00061 checkTestResultExists();
00062
00063 Sct::IS::IOParamsIS param(Sct::SctNames::getEventDataName());
00064 boost::shared_ptr<const Sct::Streamable> ob = Sct::IS::IOManagerIS::instance().read(name, ¶m);
00065 boost::shared_ptr<const RawScanResult> raw = boost::dynamic_pointer_cast<const RawScanResult>(ob);
00066 if (!raw) throw InvalidArgumentError("AnalsisAlogrithm::addRaw: " + name + " is not a valid RawScanResult", __FILE__, __LINE__);
00067 getTestResult()->addRaw(raw);
00068 }
00069
00070 void AnalysisAlgorithm::finish() throw(Sct::IoError, Sct::LogicError) {
00071 checkTestResultExists();
00072 m_done=true;
00073 cout <<"Algorithm done"<<endl;
00074 try {
00075 Sct::IS::IOParamsIS param(Sct::SctNames::getTestDataName());
00076 Sct::IS::IOManagerIS::instance().write(*m_result, ¶m);
00077 cout <<"TestResult published"<<endl;
00078 } catch (Throwable& e) {
00079 e.sendToMrs(MRS_ERROR);
00080 }
00081
00082 try{
00083 TestSummaryIS t;
00084 t.dataString = SctData::TestSummary::SummaryManager::instance().write(*m_result);
00085 string name = SctNames::getTestDataName();
00086 name += ".";
00087 name += "Summary.";
00088 name += m_result->getUniqueID();
00089 ISInfoDictionary& is = SctNames::getISDictionary();
00090 ISInfo::Status stat;
00091
00092 if (is.contains(name.c_str())) {
00093 stat = is.update(name.c_str(), t);
00094 } else {
00095 stat = is.insert(name.c_str(), t);
00096 }
00097 } catch (Throwable& e) {
00098 e.sendToMrs(MRS_ERROR);
00099 }
00100 }
00101 }