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 #include "G4GeometryManager.hh"
00030
00031 #include "MyElementField.hh"
00032
00033
00034 #include "MyGlobalField.hh"
00035
00036 G4Navigator* MyElementField::aNavigator;
00037
00038 MyElementField::MyElementField(G4ThreeVector c, G4LogicalVolume* lv) {
00039 center = c;
00040
00041
00042 boundingBox=NULL;
00043
00044
00045
00046
00047
00048 minX = minY = minZ = -DBL_MAX;
00049 maxX = maxY = maxZ = DBL_MAX;
00050
00051 MyGlobalField::getObject()->addElementField(this);
00052
00053
00054 color = "1,1,1";
00055
00056 userLimits = new G4UserLimits();
00057
00058 lvolume = lv;
00059
00060
00061 maxStep = 1*mm;
00062
00063 userLimits->SetMaxAllowedStep(maxStep);
00064
00065 userLimits->SetUserMaxTrackLength(500.*m);
00066 userLimits->SetUserMaxTime(10*ms);
00067 userLimits->SetUserMinEkine(0.1*MeV);
00068
00069
00070 lvolume->SetUserLimits(userLimits);
00071 }
00072
00073
00074 void MyElementField::construct() {
00075 G4Navigator* theNavigator =
00076 G4TransportationManager::GetTransportationManager()->
00077 GetNavigatorForTracking();
00078
00079
00080
00081
00082 if (!aNavigator) {
00083 aNavigator = new G4Navigator();
00084 if ( theNavigator->GetWorldVolume() )
00085 aNavigator->SetWorldVolume(theNavigator->GetWorldVolume());
00086 }
00087
00088 G4GeometryManager* geomManager = G4GeometryManager::GetInstance();
00089
00090 if (!geomManager->IsGeometryClosed()) {
00091 geomManager->OpenGeometry();
00092 geomManager->CloseGeometry(true);
00093 }
00094
00095 aNavigator->LocateGlobalPointAndSetup(center,0,false);
00096
00097
00098 G4TouchableHistoryHandle fTouchable = aNavigator->
00099 CreateTouchableHistoryHandle();
00100
00101 G4int depth = fTouchable->GetHistoryDepth();
00102
00103
00104 for (G4int i = 0; i<depth; ++i) {
00105
00106
00107 if(fTouchable->GetVolume()->GetLogicalVolume() == lvolume) {
00108
00109
00110 break;
00111 }
00112
00113 fTouchable->MoveUpHistory();
00114 }
00115
00116
00117 global2local = fTouchable->GetHistory()->GetTopTransform();
00118
00119
00120 G4double local[4], global[4];
00121
00122 G4ThreeVector globalPosition;
00123 local[3] = 0.0;
00124 for (int i=0; i<2; ++i) {
00125 local[0] = (i==0 ? -1.0 : 1.0) * getMaxWidth()/2.;
00126 for (int j=0; j<2; ++j) {
00127 local[1] = (j==0 ? -1.0 : 1.0) * getMaxHeight()/2.;
00128 for (int k=0; k<2; ++k) {
00129 local[2] = (k==0 ? -1.0 : 1.0) * getMaxLength()/2.;
00130 G4ThreeVector localPosition(local[0],local[1],local[2]);
00131 globalPosition =
00132 global2local.Inverse().TransformPoint(localPosition);
00133 global[0] = globalPosition.x();
00134 global[1] = globalPosition.y();
00135 global[2] = globalPosition.z();
00136 setGlobalPoint(global);
00137
00138
00139 }
00140 }
00141 }
00142 }
00143
00144
00145 G4VisAttributes* MyElementField::getVisAttribute(G4String color) {
00146 G4VisAttributes* p = NULL;
00147 if(color.size() > 0 &&
00148 (isdigit(color.c_str()[0]) || color.c_str()[0] == '.')) {
00149 G4double red=0.0, green=0.0, blue=0.0;
00150 if (sscanf(color.c_str(),"%lf,%lf,%lf",&red,&green,&blue) == 3) {
00151 p = new G4VisAttributes(true,G4Color(red,green,blue));
00152 }
00153 else {
00154 G4cout << " Invalid color " << color << G4endl;
00155 }
00156 }
00157
00158 if (!p) p = new G4VisAttributes(G4VisAttributes::Invisible);
00159 p->SetDaughtersInvisible(false);
00160
00161 return p;
00162 }
00163
00164
00165 G4double const * MyElementField::getBoundingBox() {
00166 if(boundingBox==NULL) {
00167 boundingBox= new G4double[6];
00168 }
00169 boundingBox[0] = minX;
00170 boundingBox[1] = maxX;
00171 boundingBox[2] = minY;
00172 boundingBox[3] = maxY;
00173 boundingBox[4] = minZ;
00174 boundingBox[5] = maxZ;
00175 return boundingBox;
00176 }
00177
00178
00179 void MyElementField::setCenter(G4ThreeVector c) {
00180 center = c;
00181 }