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 "MyGlobalFieldMessenger.hh"
00030
00031 #include "MyGlobalField.hh"
00032 #include "G4UIdirectory.hh"
00033 #include "G4UIcmdWithAString.hh"
00034 #include "G4UIcmdWithAnInteger.hh"
00035 #include "G4UIcmdWithADoubleAndUnit.hh"
00036 #include "G4UIcmdWith3VectorAndUnit.hh"
00037 #include "G4UIcmdWithoutParameter.hh"
00038
00040
00041 MyGlobalFieldMessenger::MyGlobalFieldMessenger(MyGlobalField* pEMfield)
00042 : fGlobalField(pEMfield) {
00043 detDir = new G4UIdirectory("/field/");
00044 detDir->SetGuidance(" Field tracking control ");
00045
00046 fVerboseCMD = new G4UIcmdWithAnInteger("/field/verbose",this);
00047 fVerboseCMD->SetGuidance("Verbosity of getField command");
00048 fVerboseCMD->SetParameterName("verbose",true);
00049 fVerboseCMD->SetDefaultValue(1);
00050 fVerboseCMD->AvailableForStates(G4State_PreInit,G4State_Idle);
00051 fVerbose=1;
00052
00053 fGetFieldCMD =
00054 new G4UIcmdWith3VectorAndUnit("/field/getField",this);
00055 fGetFieldCMD->
00056 SetGuidance("Get the B field at the position.");
00057 fGetFieldCMD->SetParameterName("GlobalPosX","GlobalPosY","GlobalPosZ",false);
00058 fGetFieldCMD->SetUnitCategory("Length");
00059 fGetFieldCMD->AvailableForStates(G4State_Idle);
00060
00061 fStepperCMD = new G4UIcmdWithAnInteger("/field/setStepperType",this);
00062 fStepperCMD->SetGuidance("Select stepper type for field");
00063 fStepperCMD->SetParameterName("choice",true);
00064 fStepperCMD->SetDefaultValue(4);
00065 fStepperCMD->AvailableForStates(G4State_PreInit,G4State_Idle);
00066
00067 fUpdateCMD = new G4UIcmdWithoutParameter("/field/update",this);
00068 fUpdateCMD->SetGuidance("Update Field");
00069 fUpdateCMD->SetGuidance("This command MUST be applied before \"beamOn\" ");
00070 fUpdateCMD->SetGuidance("if you changed field settings.");
00071 fUpdateCMD->AvailableForStates(G4State_PreInit,G4State_Idle);
00072
00073 fMinStepCMD = new G4UIcmdWithADoubleAndUnit("/field/setMinStep",this);
00074 fMinStepCMD->SetGuidance("Define minimal step");
00075 fMinStepCMD->SetParameterName("min step",false,false);
00076 fMinStepCMD->SetDefaultUnit("mm");
00077 fMinStepCMD->AvailableForStates(G4State_PreInit,G4State_Idle);
00078
00079 fDeltaChordCMD = new G4UIcmdWithADoubleAndUnit("/field/setDeltaChord",this);
00080 fDeltaChordCMD->SetGuidance("Define delta chord");
00081 fDeltaChordCMD->SetParameterName("delta chord",false,false);
00082 fDeltaChordCMD->SetDefaultUnit("mm");
00083 fDeltaChordCMD->AvailableForStates(G4State_PreInit,G4State_Idle);
00084
00085 fDeltaOneStepCMD =
00086 new G4UIcmdWithADoubleAndUnit("/field/setDeltaOneStep",this);
00087 fDeltaOneStepCMD->SetGuidance("Define delta one step");
00088 fDeltaOneStepCMD->SetParameterName("delta one step",false,false);
00089 fDeltaOneStepCMD->SetDefaultUnit("mm");
00090 fDeltaOneStepCMD->AvailableForStates(G4State_PreInit,G4State_Idle);
00091
00092 fDeltaIntersectionCMD =
00093 new G4UIcmdWithADoubleAndUnit("/field/setDeltaIntersection",this);
00094 fDeltaIntersectionCMD->SetGuidance("Define delta intersection");
00095 fDeltaIntersectionCMD->SetParameterName("delta intersection",false,false);
00096 fDeltaIntersectionCMD->SetDefaultUnit("mm");
00097 fDeltaIntersectionCMD->AvailableForStates(G4State_PreInit,G4State_Idle);
00098
00099 fEpsMinCMD = new G4UIcmdWithADoubleAndUnit("/field/setEpsMin",this);
00100 fEpsMinCMD->SetGuidance("Define eps min");
00101 fEpsMinCMD->SetParameterName("eps min",false,false);
00102 fEpsMinCMD->SetDefaultUnit("mm");
00103 fEpsMinCMD->AvailableForStates(G4State_PreInit,G4State_Idle);
00104
00105 fEpsMaxCMD = new G4UIcmdWithADoubleAndUnit("/field/setEpsMax",this);
00106 fEpsMaxCMD->SetGuidance("Define eps max");
00107 fEpsMaxCMD->SetParameterName("eps max",false,false);
00108 fEpsMaxCMD->SetDefaultUnit("mm");
00109 fEpsMaxCMD->AvailableForStates(G4State_PreInit,G4State_Idle);
00110 }
00111
00112
00113 MyGlobalFieldMessenger::~MyGlobalFieldMessenger() {
00114 delete detDir;
00115
00116 delete fGetFieldCMD;
00117 delete fVerboseCMD;
00118
00119 delete fStepperCMD;
00120 delete fMinStepCMD;
00121 delete fDeltaChordCMD;
00122 delete fDeltaOneStepCMD;
00123 delete fDeltaIntersectionCMD;
00124 delete fEpsMinCMD;
00125 delete fEpsMaxCMD;
00126 delete fUpdateCMD;
00127 }
00128
00129
00130 void MyGlobalFieldMessenger::SetNewValue( G4UIcommand* command, G4String newValue) {
00131 if( command == fGetFieldCMD ) {
00132 G4ThreeVector aPos = fGetFieldCMD->GetNew3VectorValue(newValue);
00133 G4double aPosVec[3];
00134 aPosVec[0] = aPos.x();
00135 aPosVec[1] = aPos.y();
00136 aPosVec[2] = aPos.z();
00137
00138 G4double theField[6];
00139 fGlobalField->GetFieldValue(aPosVec, theField);
00140 if(fVerbose>0) {
00141 G4cout << "Point = [" << aPosVec[0]/mm << ", "
00142 << aPosVec[1]/mm << ", " << aPosVec[2]/mm << "] mm" << G4endl;
00143 G4cout << " Field = ["
00144 << theField[0]/tesla << ", " << theField[1]/tesla
00145 << ", " << theField[2]/tesla << "] T "
00146 << " [" << theField[3] << ", " << theField[4]
00147 << ", " << theField[5] << "] V/m" << G4endl;
00148 }
00149 else {
00150 G4cout << aPosVec[0]/mm << " " << aPosVec[1]/mm << " "
00151 << aPosVec[2]/mm << " " << theField[0]/tesla << " "
00152 << theField[1]/tesla << " " << theField[2]/tesla << " "
00153 << theField[3] << " " << theField[4] << " " << theField[5]
00154 << G4endl;
00155 }
00156 }
00157
00158 if( command == fVerboseCMD ) {
00159 fVerbose=fStepperCMD->GetNewIntValue(newValue);
00160 }
00161
00162 if( command == fStepperCMD ) {
00163 fGlobalField->SetStepperType(fStepperCMD->GetNewIntValue(newValue));
00164 }
00165 if( command == fUpdateCMD ) {
00166 fGlobalField->updateField();
00167 }
00168 if( command == fMinStepCMD ) {
00169 fGlobalField->SetMinStep(fMinStepCMD->GetNewDoubleValue(newValue));
00170 }
00171 if( command == fDeltaChordCMD ) {
00172 fGlobalField->SetDeltaChord(fDeltaChordCMD->GetNewDoubleValue(newValue));
00173 }
00174 if( command == fDeltaOneStepCMD ) {
00175 fGlobalField->
00176 SetDeltaOneStep(fDeltaOneStepCMD->GetNewDoubleValue(newValue));
00177 }
00178 if( command == fDeltaIntersectionCMD ) {
00179 fGlobalField->
00180 SetDeltaIntersection(fDeltaIntersectionCMD->GetNewDoubleValue(newValue));
00181 }
00182 if( command == fEpsMinCMD ) {
00183 fGlobalField->SetEpsMin(fEpsMinCMD->GetNewDoubleValue(newValue));
00184 }
00185 if( command == fEpsMaxCMD ) {
00186 fGlobalField->SetEpsMax(fEpsMaxCMD->GetNewDoubleValue(newValue));
00187 }
00188 }