Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // 27 // 28 // 28 // 29 // 29 // 30 30 31 31 32 #include "G4RTMessenger.hh" 32 #include "G4RTMessenger.hh" 33 33 34 #include "G4UIdirectory.hh" 34 #include "G4UIdirectory.hh" 35 #include "G4UIcmdWithABool.hh" 35 #include "G4UIcmdWithABool.hh" 36 #include "G4UIcmdWith3Vector.hh" 36 #include "G4UIcmdWith3Vector.hh" 37 #include "G4UIcmdWith3VectorAndUnit.hh" 37 #include "G4UIcmdWith3VectorAndUnit.hh" 38 #include "G4UIcmdWithADoubleAndUnit.hh" 38 #include "G4UIcmdWithADoubleAndUnit.hh" 39 #include "G4UIcmdWithAnInteger.hh" 39 #include "G4UIcmdWithAnInteger.hh" 40 #include "G4UIcmdWithAString.hh" 40 #include "G4UIcmdWithAString.hh" 41 #include "G4RTSteppingAction.hh" 41 #include "G4RTSteppingAction.hh" 42 #include "G4ThreeVector.hh" 42 #include "G4ThreeVector.hh" 43 #include "G4VisManager.hh" 43 #include "G4VisManager.hh" 44 #include "G4RayTracerViewer.hh" 44 #include "G4RayTracerViewer.hh" 45 #include "G4TheRayTracer.hh" 45 #include "G4TheRayTracer.hh" 46 46 47 #define G4warn G4cout << 48 << 49 G4RTMessenger* G4RTMessenger::fpInstance = 0; 47 G4RTMessenger* G4RTMessenger::fpInstance = 0; 50 48 51 G4RTMessenger* G4RTMessenger::GetInstance 49 G4RTMessenger* G4RTMessenger::GetInstance 52 (G4TheRayTracer* p1) 50 (G4TheRayTracer* p1) 53 { 51 { 54 if (!fpInstance) fpInstance = new G4RTMessen 52 if (!fpInstance) fpInstance = new G4RTMessenger(p1); 55 return fpInstance; 53 return fpInstance; 56 } 54 } 57 55 58 G4RTMessenger::G4RTMessenger(G4TheRayTracer* p 56 G4RTMessenger::G4RTMessenger(G4TheRayTracer* p1) 59 { 57 { 60 theDefaultTracer = p1; 58 theDefaultTracer = p1; 61 theTracer = theDefaultTracer; 59 theTracer = theDefaultTracer; 62 60 63 rayDirectory = new G4UIdirectory("/vis/rayTr 61 rayDirectory = new G4UIdirectory("/vis/rayTracer/"); 64 rayDirectory->SetGuidance("RayTracer command 62 rayDirectory->SetGuidance("RayTracer commands."); 65 63 66 fileCmd = new G4UIcmdWithAString("/vis/rayTr 64 fileCmd = new G4UIcmdWithAString("/vis/rayTracer/trace",this); 67 fileCmd->SetGuidance("Start the ray tracing. 65 fileCmd->SetGuidance("Start the ray tracing."); 68 fileCmd->SetGuidance("Define the name of out 66 fileCmd->SetGuidance("Define the name of output JPEG file."); 69 fileCmd->SetParameterName("fileName",true); 67 fileCmd->SetParameterName("fileName",true); 70 fileCmd->SetDefaultValue("g4RayTracer.jpeg") 68 fileCmd->SetDefaultValue("g4RayTracer.jpeg"); 71 fileCmd->AvailableForStates(G4State_Idle); 69 fileCmd->AvailableForStates(G4State_Idle); 72 70 73 columnCmd = new G4UIcmdWithAnInteger("/vis/r 71 columnCmd = new G4UIcmdWithAnInteger("/vis/rayTracer/column",this); 74 columnCmd->SetGuidance("Define the number of 72 columnCmd->SetGuidance("Define the number of horizontal pixels."); 75 columnCmd->SetParameterName("nPixel",false); 73 columnCmd->SetParameterName("nPixel",false); 76 columnCmd->SetRange("nPixel > 0"); 74 columnCmd->SetRange("nPixel > 0"); 77 75 78 rowCmd = new G4UIcmdWithAnInteger("/vis/rayT 76 rowCmd = new G4UIcmdWithAnInteger("/vis/rayTracer/row",this); 79 rowCmd->SetGuidance("Define the number of ve 77 rowCmd->SetGuidance("Define the number of vertical pixels."); 80 rowCmd->SetParameterName("nPixel",false); 78 rowCmd->SetParameterName("nPixel",false); 81 rowCmd->SetRange("nPixel > 0"); 79 rowCmd->SetRange("nPixel > 0"); 82 80 83 targetCmd = new G4UIcmdWith3VectorAndUnit("/ 81 targetCmd = new G4UIcmdWith3VectorAndUnit("/vis/rayTracer/target",this); 84 targetCmd->SetGuidance("Define the center po 82 targetCmd->SetGuidance("Define the center position of the target."); 85 targetCmd->SetParameterName("X","Y","Z",true 83 targetCmd->SetParameterName("X","Y","Z",true); 86 targetCmd->SetDefaultValue(G4ThreeVector(0., 84 targetCmd->SetDefaultValue(G4ThreeVector(0.,0.,0.)); 87 targetCmd->SetDefaultUnit("m"); 85 targetCmd->SetDefaultUnit("m"); 88 86 89 eyePosCmd = new G4UIcmdWith3VectorAndUnit("/ 87 eyePosCmd = new G4UIcmdWith3VectorAndUnit("/vis/rayTracer/eyePosition",this); 90 eyePosCmd->SetGuidance("Define the eye posit 88 eyePosCmd->SetGuidance("Define the eye position."); 91 eyePosCmd->SetGuidance("Eye direction is cal 89 eyePosCmd->SetGuidance("Eye direction is calculated from (target - eyePosition)."); 92 eyePosCmd->SetParameterName("X","Y","Z",true 90 eyePosCmd->SetParameterName("X","Y","Z",true); 93 eyePosCmd->SetDefaultValue(G4ThreeVector(0., 91 eyePosCmd->SetDefaultValue(G4ThreeVector(0.,0.,0.)); 94 eyePosCmd->SetDefaultUnit("m"); 92 eyePosCmd->SetDefaultUnit("m"); 95 93 96 lightCmd = new G4UIcmdWith3Vector("/vis/rayT 94 lightCmd = new G4UIcmdWith3Vector("/vis/rayTracer/lightDirection",this); 97 lightCmd->SetGuidance("Define the direction 95 lightCmd->SetGuidance("Define the direction of illumination light."); 98 lightCmd->SetGuidance("The vector needs not 96 lightCmd->SetGuidance("The vector needs not to be a unit vector, but it must not be a zero vector."); 99 lightCmd->SetParameterName("Px","Py","Pz",tr 97 lightCmd->SetParameterName("Px","Py","Pz",true); 100 lightCmd->SetDefaultValue(G4ThreeVector(0.1, 98 lightCmd->SetDefaultValue(G4ThreeVector(0.1,0.2,0.3)); 101 lightCmd->SetRange("Px != 0 || Py != 0 || Pz 99 lightCmd->SetRange("Px != 0 || Py != 0 || Pz != 0"); 102 100 103 spanXCmd = new G4UIcmdWithADoubleAndUnit("/v 101 spanXCmd = new G4UIcmdWithADoubleAndUnit("/vis/rayTracer/span",this); 104 spanXCmd->SetGuidance("Define the angle per 102 spanXCmd->SetGuidance("Define the angle per 100 pixels."); 105 spanXCmd->SetParameterName("span",true); 103 spanXCmd->SetParameterName("span",true); 106 spanXCmd->SetDefaultValue(50.); 104 spanXCmd->SetDefaultValue(50.); 107 spanXCmd->SetDefaultUnit("deg"); 105 spanXCmd->SetDefaultUnit("deg"); 108 spanXCmd->SetRange("span>0."); 106 spanXCmd->SetRange("span>0."); 109 107 110 headCmd = new G4UIcmdWithADoubleAndUnit("/vi 108 headCmd = new G4UIcmdWithADoubleAndUnit("/vis/rayTracer/headAngle",this); 111 headCmd->SetGuidance("Define the head direct 109 headCmd->SetGuidance("Define the head direction."); 112 headCmd->SetParameterName("headAngle",true); 110 headCmd->SetParameterName("headAngle",true); 113 headCmd->SetDefaultValue(270.); 111 headCmd->SetDefaultValue(270.); 114 headCmd->SetDefaultUnit("deg"); 112 headCmd->SetDefaultUnit("deg"); 115 headCmd->SetRange("headAngle>=0. && headAngl 113 headCmd->SetRange("headAngle>=0. && headAngle<360."); 116 114 117 attCmd = new G4UIcmdWithADoubleAndUnit("/vis 115 attCmd = new G4UIcmdWithADoubleAndUnit("/vis/rayTracer/attenuation",this); 118 attCmd->SetGuidance("Define the attenuation 116 attCmd->SetGuidance("Define the attenuation length for transparent material."); 119 attCmd->SetGuidance("Note that this value is 117 attCmd->SetGuidance("Note that this value is independent to the attenuation length for the optical photon processes."); 120 attCmd->SetParameterName("Length",true); 118 attCmd->SetParameterName("Length",true); 121 attCmd->SetDefaultValue(1.0); 119 attCmd->SetDefaultValue(1.0); 122 attCmd->SetDefaultUnit("m"); 120 attCmd->SetDefaultUnit("m"); 123 attCmd->SetRange("Length > 0."); 121 attCmd->SetRange("Length > 0."); 124 122 125 distCmd = new G4UIcmdWithABool("/vis/rayTrac 123 distCmd = new G4UIcmdWithABool("/vis/rayTracer/distortion",this); 126 distCmd->SetGuidance("Distortion effect of t 124 distCmd->SetGuidance("Distortion effect of the fish eye lens."); 127 distCmd->SetParameterName("flag",true); 125 distCmd->SetParameterName("flag",true); 128 distCmd->SetDefaultValue(false); 126 distCmd->SetDefaultValue(false); 129 127 130 transCmd = new G4UIcmdWithABool("/vis/rayTra 128 transCmd = new G4UIcmdWithABool("/vis/rayTracer/ignoreTransparency",this); 131 transCmd->SetGuidance("Ignore transparency e 129 transCmd->SetGuidance("Ignore transparency even if the alpha of G4Colour < 1."); 132 transCmd->SetParameterName("flag",true); 130 transCmd->SetParameterName("flag",true); 133 transCmd->SetDefaultValue(false); 131 transCmd->SetDefaultValue(false); 134 132 135 bkgColCmd = new G4UIcmdWith3Vector("/vis/ray 133 bkgColCmd = new G4UIcmdWith3Vector("/vis/rayTracer/backgroundColour",this); 136 bkgColCmd->SetGuidance("Command has been dep 134 bkgColCmd->SetGuidance("Command has been deprecated. Use /vis/viewer/set/background instead."); 137 bkgColCmd->SetParameterName("red","green","b 135 bkgColCmd->SetParameterName("red","green","blue",true); 138 bkgColCmd->SetDefaultValue(G4ThreeVector(1., 136 bkgColCmd->SetDefaultValue(G4ThreeVector(1.,1.,1.)); 139 } 137 } 140 138 141 G4RTMessenger::~G4RTMessenger() 139 G4RTMessenger::~G4RTMessenger() 142 { 140 { 143 delete columnCmd; 141 delete columnCmd; 144 delete rowCmd; 142 delete rowCmd; 145 delete targetCmd; 143 delete targetCmd; 146 delete eyePosCmd; 144 delete eyePosCmd; 147 delete lightCmd; 145 delete lightCmd; 148 delete spanXCmd; 146 delete spanXCmd; 149 delete headCmd; 147 delete headCmd; 150 delete attCmd; 148 delete attCmd; 151 delete distCmd; 149 delete distCmd; 152 delete transCmd; 150 delete transCmd; 153 delete fileCmd; 151 delete fileCmd; 154 delete bkgColCmd; 152 delete bkgColCmd; 155 delete rayDirectory; 153 delete rayDirectory; 156 } 154 } 157 155 158 G4String G4RTMessenger::GetCurrentValue(G4UIco 156 G4String G4RTMessenger::GetCurrentValue(G4UIcommand * command) 159 { 157 { 160 G4String currentValue; 158 G4String currentValue; 161 if(command==columnCmd) 159 if(command==columnCmd) 162 { currentValue = columnCmd->ConvertToString( 160 { currentValue = columnCmd->ConvertToString(theTracer->GetNColumn()); } 163 else if(command==rowCmd) 161 else if(command==rowCmd) 164 { currentValue = rowCmd->ConvertToString(the 162 { currentValue = rowCmd->ConvertToString(theTracer->GetNRow()); } 165 else if(command==targetCmd) 163 else if(command==targetCmd) 166 { currentValue = targetCmd->ConvertToString( 164 { currentValue = targetCmd->ConvertToString(theTracer->GetTargetPosition(),"m"); } 167 else if(command==eyePosCmd) 165 else if(command==eyePosCmd) 168 { currentValue = eyePosCmd->ConvertToString( 166 { currentValue = eyePosCmd->ConvertToString(theTracer->GetEyePosition(),"m"); } 169 else if(command==lightCmd) 167 else if(command==lightCmd) 170 { currentValue = lightCmd->ConvertToString(t 168 { currentValue = lightCmd->ConvertToString(theTracer->GetLightDirection()); } 171 else if(command==spanXCmd) 169 else if(command==spanXCmd) 172 { currentValue = spanXCmd->ConvertToString(t 170 { currentValue = spanXCmd->ConvertToString(theTracer->GetViewSpan(),"deg"); } 173 else if(command==headCmd) 171 else if(command==headCmd) 174 { currentValue = headCmd->ConvertToString(th 172 { currentValue = headCmd->ConvertToString(theTracer->GetHeadAngle(),"deg"); } 175 else if(command==attCmd) 173 else if(command==attCmd) 176 { currentValue = attCmd->ConvertToString(the 174 { currentValue = attCmd->ConvertToString(theTracer->GetAttenuationLength(),"m");} 177 else if(command==distCmd) 175 else if(command==distCmd) 178 { currentValue = distCmd->ConvertToString(th 176 { currentValue = distCmd->ConvertToString(theTracer->GetDistortion()); } 179 else if(command==transCmd) 177 else if(command==transCmd) 180 { currentValue = transCmd->ConvertToString(G 178 { currentValue = transCmd->ConvertToString(G4RTSteppingAction::GetIgnoreTransparency()); } 181 else if(command==bkgColCmd) 179 else if(command==bkgColCmd) 182 { currentValue = bkgColCmd->ConvertToString( 180 { currentValue = bkgColCmd->ConvertToString(theTracer->GetBackgroundColour()); } 183 return currentValue; 181 return currentValue; 184 } 182 } 185 183 186 void G4RTMessenger::SetNewValue(G4UIcommand * 184 void G4RTMessenger::SetNewValue(G4UIcommand * command,G4String newValue) 187 { 185 { 188 G4VisManager* pVisManager = G4VisManager::Ge 186 G4VisManager* pVisManager = G4VisManager::GetInstance(); 189 187 190 theTracer = theDefaultTracer; 188 theTracer = theDefaultTracer; 191 189 192 G4VViewer* pVViewer = pVisManager->GetCurren 190 G4VViewer* pVViewer = pVisManager->GetCurrentViewer(); 193 if (pVViewer) { 191 if (pVViewer) { 194 G4RayTracerViewer* pViewer = dynamic_cast< 192 G4RayTracerViewer* pViewer = dynamic_cast<G4RayTracerViewer*>(pVViewer); 195 if (pViewer) { 193 if (pViewer) { 196 theTracer = pViewer->GetTracer(); 194 theTracer = pViewer->GetTracer(); 197 } else { 195 } else { 198 G4warn << << 196 G4cout << 199 "G4RTMessenger::SetNewValue: Current viewer 197 "G4RTMessenger::SetNewValue: Current viewer is not of type RayTracer." 200 "\n Use \"/vis/viewer/select\" or \"/vis/op 198 "\n Use \"/vis/viewer/select\" or \"/vis/open\"." 201 << G4endl; 199 << G4endl; 202 } 200 } 203 } 201 } 204 202 205 if (theTracer == theDefaultTracer) { 203 if (theTracer == theDefaultTracer) { 206 G4warn << << 204 G4cout << 207 "G4RTMessenger::SetNewValue: No valid current 205 "G4RTMessenger::SetNewValue: No valid current viewer. Using default RayTracer." 208 << G4endl; 206 << G4endl; 209 } 207 } 210 208 211 if(command==columnCmd) 209 if(command==columnCmd) 212 { theTracer->SetNColumn(columnCmd->GetNewInt 210 { theTracer->SetNColumn(columnCmd->GetNewIntValue(newValue)); } 213 else if(command==rowCmd) 211 else if(command==rowCmd) 214 { theTracer->SetNRow(rowCmd->GetNewIntValue( 212 { theTracer->SetNRow(rowCmd->GetNewIntValue(newValue)); } 215 else if(command==targetCmd) 213 else if(command==targetCmd) 216 { theTracer->SetTargetPosition(targetCmd->Ge 214 { theTracer->SetTargetPosition(targetCmd->GetNew3VectorValue(newValue)); } 217 else if(command==eyePosCmd) 215 else if(command==eyePosCmd) 218 { theTracer->SetEyePosition(eyePosCmd->GetNe 216 { theTracer->SetEyePosition(eyePosCmd->GetNew3VectorValue(newValue)); } 219 else if(command==lightCmd) 217 else if(command==lightCmd) 220 { theTracer->SetLightDirection(lightCmd->Get 218 { theTracer->SetLightDirection(lightCmd->GetNew3VectorValue(newValue)); } 221 else if(command==spanXCmd) 219 else if(command==spanXCmd) 222 { theTracer->SetViewSpan(spanXCmd->GetNewDou 220 { theTracer->SetViewSpan(spanXCmd->GetNewDoubleValue(newValue)); } 223 else if(command==headCmd) 221 else if(command==headCmd) 224 { theTracer->SetHeadAngle(headCmd->GetNewDou 222 { theTracer->SetHeadAngle(headCmd->GetNewDoubleValue(newValue)); } 225 else if(command==attCmd) 223 else if(command==attCmd) 226 { theTracer->SetAttenuationLength(attCmd->Ge 224 { theTracer->SetAttenuationLength(attCmd->GetNewDoubleValue(newValue)); } 227 else if(command==distCmd) 225 else if(command==distCmd) 228 { theTracer->SetDistortion(distCmd->GetNewBo 226 { theTracer->SetDistortion(distCmd->GetNewBoolValue(newValue)); } 229 else if(command==bkgColCmd) 227 else if(command==bkgColCmd) 230 { 228 { 231 G4warn << "WARNING: /vis/rayTracer/backgroun << 229 G4cout << "WARNING: /vis/rayTracer/backgroundColour has been deprecated." 232 "\n Use \"/vis/viewer/set/background\" inst 230 "\n Use \"/vis/viewer/set/background\" instead." 233 << G4endl; 231 << G4endl; 234 } 232 } 235 else if(command==transCmd) 233 else if(command==transCmd) 236 { G4RTSteppingAction::SetIgnoreTransparency( 234 { G4RTSteppingAction::SetIgnoreTransparency(transCmd->GetNewBoolValue(newValue)); } 237 else if(command==fileCmd) 235 else if(command==fileCmd) 238 { theTracer->Trace(newValue); } 236 { theTracer->Trace(newValue); } 239 } 237 } 240 238 241 239 242 240 243 241 244 242 245 243