MollerGlobalMagnetField.cc

Go to the documentation of this file.
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 // 

Generated on 16 Jun 2013 for mollersim by  doxygen 1.6.1