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