#ifndef __JACOUSTICS__JEVTTOOLKIT__ #define __JACOUSTICS__JEVTTOOLKIT__ #include #include "JAcoustics/JModel.hh" #include "JAcoustics/JEvt.hh" /** * \file * * Acoustic event fit toolkit. * \author mdejong */ namespace JACOUSTICS {} namespace JPP { using namespace JACOUSTICS; } namespace JACOUSTICS { /** * Get quality of fit.\n * The larger the quality, the better the fit. * * \param chi2 chi2 * \param NDF number of degrees of freedom * \return quality */ inline double getQuality(const double chi2, const int NDF) { return NDF - 0.25 * chi2 / NDF; } /** * Get number of emitters. * * \param __begin begin of events * \param __end end of events * \return number of emitters */ template inline size_t getNumberOfEmitters(T __begin, T __end) { std::set buffer; for (T i = __begin; i != __end; ++i) { if (!i->empty()) { buffer.insert(i->getID()); } } return buffer.size(); } /** * Get model parameters of string. * * \param fit fit parameters * \return model parameters */ inline JMODEL::JString getString(const JFit& fit) { return JMODEL::JString(fit.tx, fit.ty, fit.tx2, fit.ty2, fit.vs); } /** * Get fit parameters of string. * * \param id identifier * \param string model parameters * \return fit parameters */ inline JFit getFit(const int id, const JMODEL::JString& string) { return JFit(id, string.tx, string.ty, string.tx2, string.ty2, string.vs); } /** * Auxiliary data structure to convert event to model. */ struct getModel : public JModel { /** * Constructor. */ template getModel(const T& object); }; /** * Get model of detector. * * \param evt event */ template<> inline getModel::getModel(const JEvt& evt) { for (JEvt::const_iterator i = evt.begin(); i != evt.end(); ++i) { this->string[i->id] = getString(*i); } } /** * Auxiliary data structure to convert model to event. */ struct getEvt : public JEvt { /** * Constructor. * * \param header header * \param model model */ getEvt(const JHead& header, const JModel& model) : JEvt(header) { for (JModel::string_type::const_iterator i = model.string.begin(); i != model.string.end(); ++i) { this->push_back(getFit(i->first, i->second)); } } }; } #endif