00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "G4ITModelManager.hh"
00037 #include "G4ITType.hh"
00038 #include "G4UnitsTable.hh"
00039
00040 using namespace std;
00041
00042 G4ITModelManager::G4ITModelManager() : fIsInitialized(FALSE)
00043 {;}
00044
00045 G4ITModelManager::~G4ITModelManager()
00046 {
00047
00048 mapModels::iterator it ;
00049
00050 for(it = fModels.begin() ; it != fModels.end() ; it ++)
00051 {
00052 delete it->second;
00053 }
00054 fModels.clear();
00055 }
00056
00057 G4ITModelManager::G4ITModelManager(const G4ITModelManager& right)
00058 {
00059 mapModels::const_iterator it = right.fModels.begin();
00060
00061 for ( ; it != right.fModels.end() ; it++)
00062 {
00063 fModels[it->first] = it->second->Clone();
00064 }
00065
00066 fIsInitialized = right.fIsInitialized;
00067 }
00068
00069 G4ITModelManager& G4ITModelManager::operator=(const G4ITModelManager& rhs)
00070 {
00071 if (this == &rhs) return *this;
00072
00073 return *this;
00074 }
00075
00076 void G4ITModelManager::Initialize()
00077 {
00078 mapModels::iterator it = fModels.begin();
00079
00080 for( ; it != fModels.end() ; it ++)
00081 {
00082 G4VITModel* model = it ->second;
00083 if(model!=0)
00084 {
00085 model->Initialize();
00086 }
00087 }
00088 }
00089
00090 void G4ITModelManager::SetModel(G4VITModel* aModel, G4double startingTime)
00091 {
00092 assert(fIsInitialized == FALSE);
00093 if(fIsInitialized == true)
00094 {
00095 G4ExceptionDescription exceptionDescription ;
00096 exceptionDescription << "You are trying to insert a new model after initialization of th model manager.";
00097 G4Exception("G4ITModelManager::SetModel","ITModelManager001",
00098 FatalErrorInArgument,exceptionDescription);
00099 }
00100 fModels[startingTime] = aModel;
00101 }
00102
00103 G4VITModel* G4ITModelManager::GetModel(const G4double globalTime)
00104 {
00105 if(!fModels.empty())
00106 {
00107 mapModels::reverse_iterator rit = fModels.rbegin();
00108 if(rit != fModels.rend())
00109 {
00110 if(globalTime > rit->first)
00111 {
00112 return rit->second;
00113 }
00114 else
00115 {
00116 mapModels::iterator it = fModels.begin();
00117
00118 if(globalTime < it->first)
00119 {
00120 G4ExceptionDescription exceptionDescription ;
00121 exceptionDescription << "No model was found at time ";
00122 exceptionDescription << G4BestUnit(globalTime,"Time");
00123 exceptionDescription << ". The first model is registered at time : ";
00124 exceptionDescription << G4BestUnit(it->first,"Time") << ". ";
00125 G4Exception("G4ITModelManager::GetModel","ITModelManager003",
00126 FatalErrorInArgument,exceptionDescription);
00127 }
00128
00129 it = fModels.lower_bound(globalTime);
00130
00131 if(it != fModels.end()) return it->second;
00132 }
00133 }
00134 }
00135
00136 G4ExceptionDescription exceptionDescription ;
00137 exceptionDescription << "No model was found.";
00138 G4Exception("G4ITModelManager::GetModel","ITModelManager004",
00139 FatalErrorInArgument,exceptionDescription);
00140 return 0;
00141 }