00001
00002
00003 #include "../FluxSvc/EventSource.h"
00004
00005 #include "dom/DOM_Element.hpp"
00006 #include "xml/Dom.h"
00007 #include "GPS.h"
00008 #include "Orbit.h"
00009 #include "CLHEP/Random/RandExponential.h"
00010
00011 #include <strstream>
00012
00013 unsigned int EventSource::s_id = 0;
00014 double EventSource::s_total_area = 6.;
00015
00016 EventSource::EventSource (double aFlux, unsigned acode)
00017 : m_enabled(true), m_flux(aFlux), m_solid_angle(1.), m_code(acode)
00018 {
00019 std::strstream s;
00020
00021 s << "Source_" << (++s_id) << '\0';
00022 if (acode == 0) code(s_id);
00023
00024 m_name = s.str();
00025 s.freeze(false);
00026 }
00027
00028 EventSource::EventSource (const DOM_Element& xelem)
00029 : m_enabled(true), m_flux(1.0), m_solid_angle(1.), m_code(0)
00030 {
00031 m_name = xml::Dom::getAttribute(xelem, "name");
00032 m_flux = atof (xml::Dom::getAttribute(xelem, "flux").c_str());
00033
00034 std::string code_str = xml::Dom::getAttribute(xelem, "code");
00035 if (code_str != std::string("")) {
00036 m_code = atoi(code_str.c_str());
00037 }
00038 else {
00039 m_code = ++s_id;
00040 }
00041
00042
00043
00044 DOM_Element angles =
00045 xml::Dom::findFirstChildByName(xelem, "solid_angle");
00046
00047 if (angles != DOM_Element()) {
00048 double mincos = atof(xml::Dom::getAttribute(angles, "mincos").c_str());
00049 double maxcos = atof(xml::Dom::getAttribute(angles, "maxcos").c_str());
00050
00051 m_solid_angle = (maxcos - mincos)*2*M_PI;
00052 }
00053 else if (xml::Dom::findFirstChildByName(xelem, "direction") != DOM_Element())
00054 m_solid_angle = 1.;
00055 }
00056
00057
00058 EventSource::~EventSource()
00059 {}
00060
00061 double EventSource::flux (double time) const
00062 {
00063
00064
00065
00066 return m_flux;
00067 }
00068
00069 void EventSource::setFlux (double value) {
00070 m_flux = value;
00071 }
00072
00073
00074 double EventSource::rate (double time )const
00075 {
00076
00077
00078
00079 return enabled()? (solidAngle()*flux(time)*s_total_area) :0;
00080 }
00081
00082 void EventSource::setRate ( double rate )
00083 {
00084 setFlux( rate/(m_solid_angle*s_total_area) );
00085 }
00086
00087 Orbit* EventSource::makeOrbit () const
00088 {
00089 return new Orbit;
00090 }
00091
00092
00093
00094 std::string EventSource::fullTitle () const
00095 { return std::string("EventSource"); }
00096 std::string EventSource::displayTitle () const { return m_name; }