00001 //============================================================================= 00002 // 00003 // --------------------------- 00004 // | Doxygen File Information | 00005 // --------------------------- 00006 // 00007 /** 00008 00009 \file MollerGlobalMagnetField.cc 00010 00011 $Revision: 1.3 $ 00012 $Date: 2006/03/01 17:03:16 $ 00013 00014 \authors Klaus Hans Grimm Juliette M. Mammei 00015 00016 */ 00017 //============================================================================= 00018 00019 //============================================================================= 00020 // ----------------------- 00021 // | CVS File Information | 00022 // ----------------------- 00023 // 00024 // Last Update: $Author: mammei $ 00025 // Update Date: $Date: 2010/08/17 09:48:30 $ 00026 // CVS/RCS Revision: $Revision: 1.3 $ 00027 // Status: $State: Exp $ 00028 // 00029 // =================================== 00030 // CVS Revision Log at end of file !! 00031 // =================================== 00032 // 00033 //============================================================================ 00034 00035 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 00036 00037 #include "MollerGlobalMagnetField.hh" 00038 #include "MollerGlobalMagnetFieldMessenger.hh" 00039 00040 #include "G4UImanager.hh" 00041 #include "G4UIcommand.hh" 00042 00043 #include "globals.hh" 00044 00045 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 00046 00047 MollerGlobalMagnetField::MollerGlobalMagnetField() 00048 { 00049 00050 G4cout << G4endl << "###### Calling MollerGlobalMagnetField::MollerGlobalMagnetField() " << G4endl << G4endl; 00051 00052 fieldMessenger = new MollerGlobalMagnetFieldMessenger(this); 00053 00054 G4String fPath = "."; 00055 if (getenv("MOLLERGEANTDIR")) 00056 fPath = getenv("MOLLERGEANTDIR"); 00057 else 00058 G4cout << "You do not have MOLLERGEANTDIR defined in your environment!" << G4endl; 00059 00060 00061 fMagneticField_MainMagnet = NULL; 00062 fMagneticField_MiniMagnet = NULL; 00063 00064 } 00065 00066 00067 void MollerGlobalMagnetField::ReadMagneticField() 00068 { 00069 00070 G4String fPath = "."; 00071 if (getenv("MOLLERGEANTDIR")) 00072 fPath = getenv("MOLLERGEANTDIR"); 00073 else 00074 G4cout << "You do not have MOLLERGEANTDIR defined in your environment!" << G4endl; 00075 00076 G4String upstreamFieldMap = (fPath+"/map_directory/"+upstreamFilename+".txt"); 00077 G4String hybridFieldMap = (fPath+"/map_directory/"+hybridFilename+".txt"); 00078 00079 G4cout<<"Field maps:"<<G4endl; 00080 G4cout<<upstreamFieldMap<<G4endl; 00081 G4cout<<hybridFieldMap<<G4endl; 00082 00083 BFieldScalingFactor_MainMagnet = 1.0; // default is 1.0 here 00084 fMagneticField_MainMagnet = new MollerMagnetFieldMap(); 00085 00086 if(fMagneticField_MainMagnet){ 00087 00088 fMagneticField_MainMagnet->SetFieldMap_RMin(0.015*m); 00089 fMagneticField_MainMagnet->SetFieldMap_RMax(0.375*m); 00090 fMagneticField_MainMagnet->SetFieldMap_RStepsize(0.002*m); 00091 00092 fMagneticField_MainMagnet->SetFieldMap_ZMin(9.5*m); 00093 fMagneticField_MainMagnet->SetFieldMap_ZMax(17.0*m); 00094 fMagneticField_MainMagnet->SetFieldMap_ZStepsize(0.1*m); 00095 00096 fMagneticField_MainMagnet->SetFieldMap_PhiMin(-25*degree); 00097 fMagneticField_MainMagnet->SetFieldMap_PhiMax(25*degree); 00098 fMagneticField_MainMagnet->SetFieldMap_PhiStepsize(1*degree); 00099 00100 fMagneticField_MainMagnet->InitializeGrid(); 00101 00102 fMagneticField_MainMagnet->ReadFieldMap(hybridFieldMap); 00103 //fMagneticField_MainMagnet->PrintFieldCheck("magfieldcheck_back.txt"); 00104 } 00105 00106 //--------------------------------------------------------------- 00107 // configuration values of the upstream field map 00108 //--------------------------------------------------------------- 00109 00110 BFieldScalingFactor_MiniMagnet = 1.25; // default is 1.25 here 00111 fMagneticField_MiniMagnet = new MollerMagnetFieldMap(); 00112 00113 if(fMagneticField_MiniMagnet){ 00114 00115 fMagneticField_MiniMagnet->SetFieldMap_RMin(0.015*m); 00116 fMagneticField_MiniMagnet->SetFieldMap_RMax(0.375*m); 00117 fMagneticField_MiniMagnet->SetFieldMap_RStepsize(0.002*m); 00118 00119 fMagneticField_MiniMagnet->SetFieldMap_ZMin(6.0*m); 00120 fMagneticField_MiniMagnet->SetFieldMap_ZMax(8.0*m); 00121 fMagneticField_MiniMagnet->SetFieldMap_ZStepsize(0.1*m); 00122 00123 fMagneticField_MiniMagnet->SetFieldMap_PhiMin(-25*degree); 00124 fMagneticField_MiniMagnet->SetFieldMap_PhiMax(25*degree); 00125 fMagneticField_MiniMagnet->SetFieldMap_PhiStepsize(1*degree); 00126 00127 fMagneticField_MiniMagnet->InitializeGrid(); 00128 00129 fMagneticField_MiniMagnet->ReadFieldMap(upstreamFieldMap); 00130 00131 //fMagneticField_MiniMagnet->PrintGridCheck("maggridcheck_front.txt"); 00132 } 00133 00134 G4cout << G4endl << "###### Leaving MollerGlobalMagnetField::MollerGlobalMagnetField " << G4endl << G4endl; 00135 } 00136 void MollerGlobalMagnetField::SetHybridMapFile(const G4String& nam) 00137 { 00138 hybridFilename = nam; 00139 } 00140 00141 void MollerGlobalMagnetField::SetUpstreamMapFile(const G4String& nam) 00142 { 00143 upstreamFilename = nam; 00144 } 00145 00146 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 00147 MollerGlobalMagnetField::~MollerGlobalMagnetField() 00148 { 00149 if (fMagneticField_MainMagnet) delete fMagneticField_MainMagnet; 00150 if (fMagneticField_MiniMagnet) delete fMagneticField_MiniMagnet; 00151 00152 delete fieldMessenger; 00153 } 00154 00155 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 00156 void MollerGlobalMagnetField::GetFieldValue(const G4double Point[4], G4double *Bfield ) const 00157 { 00158 00159 G4double myLocalPointInMainMagnet[4]; 00160 G4double myLocalPointInMiniMagnet[4]; 00161 00162 G4double myLocalBfieldInMainMagnet[3]; 00163 G4double myLocalBfieldInMiniMagnet[3]; 00164 00165 //--------------------------------------------------------------- 00166 // translation from global Point[4] into local magnet coordinates 00167 //--------------------------------------------------------------- 00168 // 00169 // No translation needed because for now, map is created with actual z positions 00170 // If add command to move fields, would do it here. 00171 00172 myLocalPointInMainMagnet[0] = Point[0]; // x-pos 00173 myLocalPointInMainMagnet[1] = Point[1]; // y-pos 00174 myLocalPointInMainMagnet[2] = Point[2]; // z-pos 00175 myLocalPointInMainMagnet[3] = Point[3]; // time 00176 00177 myLocalPointInMiniMagnet[0] = Point[0]; // x-pos 00178 myLocalPointInMiniMagnet[1] = Point[1]; // y-pos 00179 myLocalPointInMiniMagnet[2] = Point[2]; // z-pos 00180 myLocalPointInMiniMagnet[3] = Point[3]; // time 00181 00182 00183 // G4cout << " X pos [cm] = " << Point[0]/cm << " ,Y pos [cm] = " << Point[1]/cm << " ,Z pos [cm] = " << Point[2]/cm << G4endl; 00184 00185 00186 if(fMagneticField_MiniMagnet && fMagneticField_MainMagnet){ 00187 fMagneticField_MiniMagnet->GetFieldValue( myLocalPointInMiniMagnet, myLocalBfieldInMiniMagnet ); 00188 fMagneticField_MainMagnet->GetFieldValue( myLocalPointInMainMagnet, myLocalBfieldInMainMagnet ); 00189 00190 Bfield[0] = myLocalBfieldInMainMagnet[0]*BFieldScalingFactor_MainMagnet + myLocalBfieldInMiniMagnet[0]*BFieldScalingFactor_MiniMagnet; 00191 Bfield[1] = myLocalBfieldInMainMagnet[1]*BFieldScalingFactor_MainMagnet + myLocalBfieldInMiniMagnet[1]*BFieldScalingFactor_MiniMagnet; 00192 Bfield[2] = myLocalBfieldInMainMagnet[2]*BFieldScalingFactor_MainMagnet + myLocalBfieldInMiniMagnet[2]*BFieldScalingFactor_MiniMagnet; 00193 // printf("%f %f %f %f %f %f %f %f %f %f %f %f\n",Point[0],Point[1],Point[2], 00194 // myLocalBfieldInMainMagnet[0]*100,myLocalBfieldInMiniMagnet[0]*100,Bfield[0]*100, 00195 // myLocalBfieldInMainMagnet[1]*100,myLocalBfieldInMiniMagnet[1]*100,Bfield[1]*100, 00196 // myLocalBfieldInMainMagnet[2]*100,myLocalBfieldInMiniMagnet[2]*100,Bfield[2]*100); 00197 } 00198 else if(fMagneticField_MainMagnet && !fMagneticField_MiniMagnet){ 00199 fMagneticField_MainMagnet->GetFieldValue( myLocalPointInMainMagnet, myLocalBfieldInMainMagnet ); 00200 00201 Bfield[0] = myLocalBfieldInMainMagnet[0]*BFieldScalingFactor_MainMagnet; 00202 Bfield[1] = myLocalBfieldInMainMagnet[1]*BFieldScalingFactor_MainMagnet; 00203 Bfield[2] = myLocalBfieldInMainMagnet[2]*BFieldScalingFactor_MainMagnet; 00204 } 00205 else if(!fMagneticField_MainMagnet && fMagneticField_MiniMagnet){ 00206 fMagneticField_MiniMagnet->GetFieldValue( myLocalPointInMiniMagnet, myLocalBfieldInMiniMagnet ); 00207 00208 Bfield[0] = myLocalBfieldInMiniMagnet[0]*BFieldScalingFactor_MiniMagnet; 00209 Bfield[1] = myLocalBfieldInMiniMagnet[1]*BFieldScalingFactor_MiniMagnet; 00210 Bfield[2] = myLocalBfieldInMiniMagnet[2]*BFieldScalingFactor_MiniMagnet; 00211 } 00212 else{ 00213 Bfield[0] = 0.0*kilogauss; 00214 Bfield[1] = 0.0*kilogauss; 00215 Bfield[2] = 0.0*kilogauss; 00216 } 00217 00218 // G4cout << "------------------------------------------------------------------------" << G4endl; 00219 // G4cout << " X pos [cm] = " << Point[0]/cm << " , with X BField [kG] = " << Bfield[0] << G4endl; 00220 // G4cout << " Y pos [cm] = " << Point[1]/cm << " , with Y BField [kG] = " << Bfield[1] << G4endl; 00221 // G4cout << " Z pos [cm] = " << Point[2]/cm << " , with Z BField [kG] = " << Bfield[2] << G4endl; 00222 00223 } 00224 00225 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 00226 00227 //======================================================= 00228 // ----------------------- 00229 // | CVS File Information | 00230 // ----------------------- 00231 // 00232 // $Revisions$ 00233 // $Log: MollerGlobalMagnetField.cc,v $ 00234 // Revision 1.3 2006/03/01 17:03:16 grimm 00235 // Changed BFieldScalingFactor_MiniMagnet = -0.15434; // according to Juliette Mammei 00236 // Before the scaling factor was ~0.07 00237 // 00238 // Revision 1.2 2005/12/27 19:10:21 grimm 00239 // - Redesign of Doxygen header containing CVS info like revision and date 00240 // - Added CVS revision log at the end of file 00241 // 00242 //