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