00001 #include "FitterWorkerGroup.h"
00002 #include "Fitter.h"
00003 #include "FitAlgorithm.h"
00004 #include "FitAlgorithmMap.h"
00005
00006 #include "Sct/SctNames.h"
00007 #include "Sct/IS/IOManagerIS.h"
00008 #include "Sct/ISProxy/IOManagerISProxy.h"
00009 #include "Sct/IS/IONameIS.h"
00010 #include "SctData/FitScanResult.h"
00011 #include "SctData/RawScanResult.h"
00012 #include "SctData/ConfigurationVariable.h"
00013 #include "SctData/NullVariable.h"
00014 #include "SctData/DefaultVariable.h"
00015 #include "Sct/StdExceptionWrapper.h"
00016 #include "ScanResultWriter/dataTypes.h"
00017 #include <boost/timer.hpp>
00018
00019 using namespace std;
00020 using namespace SctService;
00021 using boost::shared_ptr;
00022 using boost::timer;
00023 using namespace SctData;
00024 using namespace Sct;
00025 using namespace Sct::IS;
00026
00027 namespace SctFitter {
00028
00029
00030 void FitterWorkerGroup::work(string name) throw() {
00031 using namespace SctData;
00032 timer t;
00033
00034 try {
00035 shared_ptr<const Serializable> ob ( IOManagerIS::instance().read(name) );
00036 shared_ptr<const RawScanResult> raw = dynamic_pointer_cast<const RawScanResult>(ob);
00037 if (!raw)
00038 throw InvalidArgumentError("Fitter::work(): Not a RawScanResult", __FILE__, __LINE__);
00039 Fitter::instance().addIOTime(t.elapsed());
00040 t.restart();
00041
00042
00043 Fitter::instance().setLastScanName(raw->getUniqueID());
00044 Fitter::instance().incrementFitsDone();
00045 m_calls++;
00046
00047 std::cout << "This is call number " << m_calls << " to this worker. Working on " << raw->getUniqueID() << " Q = "<< queueSize()<< std::endl;
00048
00049
00050 if (raw->getDataType()==SR_DT_RAWHIST) {
00051 std::cout << "Not fitting RawRod Scan" << std::endl;
00052 return;
00053 }
00054
00055
00056 if ((*raw).getHeader().getVariable().getVariableName()=="Default Variable" && (*raw).getHeader().getVariable() != *SctData::DefaultVariable::instance(41)) {
00057 std::cout << "Not fitting Default Variable " << std::endl;
00058 return;
00059 }
00060 if ((*raw).getHeader().getVariable()==SctData::NullVariable::instance()){
00061 std::cout << "Not fitting Null Variable " << std::endl;
00062 return;
00063 }
00064
00065 const FitAlgorithm& alg = FitAlgorithmMap::instance().getAlgorithm((*raw).getHeader().getVariable());
00066 std::auto_ptr<SctData::FitScanResult> fitted = alg.doFit(*raw);
00067
00068 Fitter::instance().scanDone(t.elapsed());
00069 t.restart();
00070
00071
00072 Sct::IS::IOParamsIS params(Sct::SctNames::getFittedDataName());
00073 Sct::ISProxy::IOManagerISProxy::instance().write(*fitted, ¶ms);
00074 Fitter::instance().addIOTime(t.elapsed());
00075 } catch (Sct::InvalidArgumentError& e) {
00076 e.sendToMrs();
00077 Fitter::instance().incrementFitErrors();
00078 } catch(Sct::Throwable& e) {
00079 e.sendToMrs(MRS_ERROR);
00080 Fitter::instance().incrementFitErrors();
00081 } catch(std::exception& e) {
00082 StdExceptionWrapper sew(e);
00083 sew.sendToMrs(MRS_ERROR);
00084 Fitter::instance().incrementFitErrors();
00085 } catch(...) {
00086 Error e("uncaught unknown exception", __FILE__, __LINE__);
00087 e.sendToMrs(MRS_ERROR);
00088 Fitter::instance().incrementFitErrors();
00089 }
00090 }
00091
00092 }