Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

EventSource.cxx

Go to the documentation of this file.
00001 //  $Header: /nfs/slac/g/glast/ground/cvs/FluxSvc/src/EventSource.cxx,v 1.8 2002/08/08 00:02:39 srobinsn Exp $
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.; // area in m^2
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); // automatically assign event codes...
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     // this is set by default to be overriden when the solid_angle 
00043     // element is present...
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   // Purpose and Method: This method returns the flux of the particular source.
00064   // Inputs  - current time
00065   // Outputs - flux, in units of (particles/(m^2*sr*sec))
00066     return m_flux;  // default if not overridden
00067 }
00068 
00069 void   EventSource::setFlux (double value) {
00070     m_flux = value;
00071 }
00072 
00073 
00074 double  EventSource::rate (double time )const
00075 {
00076   // Purpose and Method: This method returns the rate of particles entering the detector.
00077   // Inputs  - current time
00078   // Outputs - rate, in units of (particles/sec)
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 // UI titles
00094 std::string EventSource::fullTitle () const 
00095 { return std::string("EventSource");   }
00096 std::string EventSource::displayTitle () const  {  return m_name; }

Generated on Wed Oct 16 14:01:29 2002 by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001