00001
00002
00003
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
00068
00069 #include <signal.h>
00070 #include <setjmp.h>
00071
00072 static jmp_buf env;
00073 static int valid = 0;
00074 static int gotControlC=0;
00075
00076
00077 typedef void (*fptr)(int);
00078 void catcher( int sig, int , struct sigcontext * )
00079 {
00080 if( sig==SIGINT )
00081 {
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 {
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 {
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