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

BaseApp.cxx

Go to the documentation of this file.
00001 // $Id: BaseApp.cxx,v 1.2 2001/10/06 14:18:53 burnett Exp $
00002 //
00003 // file BaseApp.cc, a part of the Gismo project
00004 //
00005 //
00006 
00007 #include "BaseApp.h"
00008 
00009 #include "geometry/Box.h"
00010 #include "gismo/MCParticle.h"
00011 #include "gismo/PDT.h"
00012 #include "gismo/Field.h"
00013 #include <signal.h>
00014 #include <stdio.h>
00015 #ifdef _MSC_VER
00016   using namespace std;
00017 #endif
00018 
00019 BaseApp::BaseApp()
00020 : eventNumber(0)
00021 ,  _world(0)
00022 , _generator(0)
00023 {}
00024 
00025 BaseApp& 
00026 BaseApp::setBeam(const char* name, const Vector& p, const Point& r)
00027 {  
00028   return setGenerator( new Generator(name,p,r));
00029 }
00030 
00031 BaseApp&
00032 BaseApp::setWorld(World* w)
00033 { 
00034   if( _world )
00035     delete _world;
00036   _world=w;  return *this;
00037 }
00038 
00039 BaseApp&
00040 BaseApp::setGenerator(Generator * newgen)
00041 {
00042   if( _generator )
00043          delete _generator;
00044   _generator = newgen;
00045   return *this;
00046 } 
00047 BaseApp&
00048 BaseApp::addInteractor(Interactor* inter)
00049 {
00050  MCParticle::addInteractor(inter); return *this;
00051 }
00052 BaseApp::~BaseApp()
00053 {
00054   if(_world)delete _world;
00055   if(_generator)delete _generator;
00056 }
00057 World& BaseApp::world()
00058 {  if(!_world) FATAL("BaseApp: No world has been set!");
00059    return *_world;
00060 }
00061 Generator& BaseApp::generator()
00062 {
00063    if(!_generator) FATAL("BaseApp: no generator has been defined!");
00064    return *_generator;
00065 }
00066 //------------------------------------------------------------
00067 //  Some stuff for signals, that should be eventually done with
00068 //  C++ 
00069 #include <signal.h>
00070 #include <setjmp.h>
00071 
00072 static jmp_buf env;             /* holds environment to get back after trap */
00073 static int valid = 0;
00074 static int gotControlC=0;
00075 
00076 
00077 typedef void (*fptr)(int); // really need the (int)?
00078 void catcher( int sig, int /* code*/, struct sigcontext * /*scp*/ )
00079 {
00080   if( sig==SIGINT )
00081   {  // if single control-C, just set flag to stop run
00082      if( !gotControlC )
00083      {  gotControlC = 1;
00084         return;
00085      }
00086   }
00087   if(valid)
00088      longjmp(env, sig);
00089 
00090   FATAL("Invalid interrupt");
00091 }
00092 
00093 void setup_signals()
00094 {           // took off (ftpr) cast for catcher ??
00095         if( (int)signal(SIGINT, (fptr)catcher) == -1 )
00096                  FATAL("failure to setup signal SIGINT");
00097         if( (int)signal(SIGFPE, (fptr)catcher) == -1 )
00098                  FATAL("failure to setup signal SIGFPE");
00099 }
00100 
00101 static const char * error;
00102 
00103 const char*
00104 BaseApp::run(unsigned long nevent)
00105 {
00106   setup_signals();
00107   eventNumber=0;
00108   gotControlC = 0;
00109   while( nevent-- > 0)
00110   {  valid=1;
00111      int val;
00112      if( (val = setjmp(env)) != 0 )
00113      {  /* got here because of longjump with value val */
00114         if( val == SIGINT )
00115                  return "User abort";
00116         else
00117                  return "Run terminated: hardware trap ";
00118      }
00119      if( (error=trigger())!=0 ) return error;
00120      if( gotControlC ){
00121          WARNING("user pause of run");
00122          break;
00123      }
00124   }
00125   valid = 0;
00126   return 0;
00127 
00128 }
00129 void
00130 BaseApp::stop()
00131 {
00132   gotControlC=1;
00133 }
00134 
00135 const char *
00136 BaseApp::trigger()
00137 {
00138   if( !_generator ) return "no event source!";
00139   eventNumber++;
00140   clearEvent();
00141   clearResponse();
00142   MCParticle* thisEvent = _generator->getEvent();
00143   if( thisEvent==0 )
00144           return "end of data";
00145   beginEvent();
00146   const Medium* whereToStart =  _world->inside(_generator->position());
00147   if( ! whereToStart )
00148      FATAL("Inital position is outside known world\n");
00149   _generator->propagate(whereToStart);
00150   _world->generateResponse();
00151   endEvent();
00152   return 0;
00153 }
00154 void
00155 BaseApp::printMaterials(ostream& os)
00156 {
00157     os << "\n Print materials not yet implemented \n";
00158 };
00159 
00160 void
00161 BaseApp::clearEvent()
00162 {
00163 }
00164 void
00165 BaseApp::printPDT(ostream& os)
00166 {
00167   os << "============================ PDT ================================\n";
00168   GParticle::thePDT()->printOn(os);
00169 }
00170 
00171 void
00172 BaseApp::printEvent(ostream& os)
00173 {
00174   os << "=========================== event "
00175          << _generator->eventNumber() << "=====================\n";
00176   if( _generator)
00177                 os << *_generator;
00178   os << "\n===============================================================\n";
00179 }
00180 
00181 void 
00182 BaseApp::printResponse(ostream& os)
00183 {
00184   if(_world)
00185      _world->printResponse(os);
00186 }
00187 
00188 void 
00189 BaseApp::printDetector(ostream& os)
00190 {                    
00191   os <<  "======================= Detector ==============================\n";
00192   if(_world)
00193      _world->printOn(os);
00194   os << "\n===============================================================\n";
00195 
00196 }
00197 

Generated at Wed Nov 21 12:20:24 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000