/home/cern/BDSIM_new/src/BDSGeometryInterface.cc

00001 // Geometry Interface Class
00002 // ========================
00003 //
00004 // A class of functions to output Geant4/Mokka/BDSIM parameters for elements
00005 // - to include geometry, optics, fields, etc.
00006 
00007 #include "BDSGlobalConstants.hh"
00008 #include "BDSGeometryInterface.hh"
00009 #include "BDSAcceleratorComponent.hh"
00010 
00011 using namespace std;
00012 
00013 typedef list<BDSAcceleratorComponent*> BDSBeamline;
00014 extern BDSBeamline theBeamline;
00015 
00016 BDSGeometryInterface::BDSGeometryInterface(G4String filename):
00017   itsFileName(filename)
00018 {}
00019 
00020 BDSGeometryInterface::~BDSGeometryInterface()
00021 {}
00022 
00023 void BDSGeometryInterface::Optics()
00024 {
00025   ofstream optics;
00026   
00027   G4cout << "Generating Optics file to: " << itsFileName << " ..." << G4endl;
00028 
00029   optics.open(itsFileName);
00030 
00031   optics << setw(10) << "Type" 
00032          << setw(10) << "Name" 
00033          << setw(10) << "Length[m]" 
00034          << setw(10) << "S [m]" 
00035          << setw(10) << "Angle[rad]" 
00036          << setw(10) << "K1 [m^-2]" 
00037          << setw(10) << "K2 [m^-3]" 
00038          << setw(10) << "K3 [m^-4]"
00039          << setw(10) << "TILT"
00040          << setw(10) << "AperX [m]"
00041          << setw(10) << "AperY [m]"
00042          << setw(10) << "Aper_Type"
00043          << G4endl;
00044 
00045   list<BDSAcceleratorComponent*>::const_iterator iBeam;
00046   
00047   for(iBeam=theBeamline.begin();iBeam!=theBeamline.end();iBeam++)
00048     { 
00049       G4int aper_type; //1 = rect, 2 = circ, 3 = elispe
00050       if((*iBeam)->GetType() == "rcol" ) //RCOL
00051         aper_type=1;
00052       else if((*iBeam)->GetType() == "ecol") //ECOL
00053         {
00054           if((*iBeam)->GetAperX()==(*iBeam)->GetAperY()) 
00055             aper_type=2;
00056           else aper_type=3;
00057         }
00058       else aper_type=2; // circular is default
00059       
00060       optics.setf(ios::fixed, ios::floatfield);
00061       optics.setf(ios::showpoint);
00062       
00063       optics.precision(8);
00064       
00065       optics << setw(10) 
00066              << (*iBeam)->GetType() << " "
00067              << (*iBeam)->GetName() << " "
00068              << (*iBeam)->GetLength()/m  << " "
00069              << (*iBeam)->GetSPos()/m  << " "
00070              << (*iBeam)->GetAngle()   << " "
00071              << (*iBeam)->GetK1()   << " "
00072              << (*iBeam)->GetK2()   << " "
00073              << (*iBeam)->GetK3()   << " "
00074              << (*iBeam)->GetTilt() << " "
00075              << (*iBeam)->GetAperX()/m   << " "
00076              << (*iBeam)->GetAperY()/m   << " "
00077              << aper_type   << " "
00078              << G4endl;
00079         }
00080       optics.close();
00081 
00082 }
00083 
00084 
00085 void BDSGeometryInterface::Survey()
00086 {
00087   ofstream survey;
00088 
00089   G4cout << "Generating Survey: " << itsFileName << " ..." << G4endl;
00090 
00091   survey.open(itsFileName);
00092   survey << setw(10) << "Type" << " "
00093          << setw(10) << "Name" << " "
00094          << setw(10) << "Length[m]" << " "
00095          << setw(10) << "Arc len[m]" << " "
00096          << setw(10) << "X [m]" << " "
00097          << setw(10) << "Y [m]" << " "
00098          << setw(10) << "Z [m]" << " "
00099          << setw(10) << "Phi [rad]" << " "
00100          << setw(10) << "Theta [rad]"
00101          << setw(10) << "Psi [rad]" << " "
00102          << setw(10) << "AperX [m]" << " "
00103          << setw(10) << "AperY [m]" << " "
00104          << setw(10) << "Aper_Type" << " " 
00105          << setw(10) << "Angle[rad]" << " "
00106          << setw(10) << "K1 [m^-2]" << " " 
00107          << setw(10) << "K2 [m^-3]" << " " 
00108          << setw(10) << "K3 [m^-4]" << " "
00109 
00110          << G4endl;
00111   
00112   list<BDSAcceleratorComponent*>::const_iterator iBeam;
00113   G4double length(0.0);
00114   G4double arc_length(0.0);
00115   for(iBeam=theBeamline.begin();iBeam!=theBeamline.end();iBeam++)
00116     { 
00117       G4int aper_type; //1 = rect, 2 = circ, 3 = elispe
00118       if((*iBeam)->GetType() == 14 ) //RCOL
00119         aper_type=1;
00120       else if((*iBeam)->GetType() == 13) //ECOL
00121         if((*iBeam)->GetAperX()==(*iBeam)->GetAperY()) 
00122           aper_type=2;
00123         else aper_type=3;
00124       else aper_type=1;
00125       
00126       G4double phi, theta, psi;
00127       if((*iBeam)->GetRotation())
00128         {
00129           // sort out rounding errors where zz -> 1.000001, etc.
00130           if(fabs((*iBeam)->GetRotation()->zz())>1)
00131             {
00132               G4ThreeVector newZ = (*iBeam)->GetRotation()->rowZ();
00133               newZ.setZ(1.0);
00134               (*iBeam)->GetRotation()->setRows((*iBeam)->GetRotation()->rowX(),
00135                                                (*iBeam)->GetRotation()->rowY(),
00136                                                newZ);
00137             }
00138           
00139           phi = (*iBeam)->GetRotation()->getPhi();
00140           theta = (*iBeam)->GetRotation()->getTheta();
00141           psi = (*iBeam)->GetRotation()->getPsi();
00142           
00143         }
00144       else
00145         phi = theta = psi = 0.0;
00146       
00147       survey.setf(ios::fixed, ios::floatfield);
00148       survey.setf(ios::showpoint);
00149       
00150       survey.precision(7);
00151       
00152       survey << setw(10) << (*iBeam)->GetType() << " "
00153              << setw(10) << (*iBeam)->GetName() << " "
00154              << setw(10) << (*iBeam)->GetLength()/m  << " "
00155              << setw(10) << (*iBeam)->GetArcLength()/m  << " "
00156              << setw(10) << (*iBeam)->GetPosition().x()/m  << " "
00157              << setw(10) << (*iBeam)->GetPosition().y()/m  << " "
00158              << setw(10) << (*iBeam)->GetPosition().z()/m  << " "
00159              << setw(10) << phi/radian  << " "
00160              << setw(10) << theta/radian  << " "
00161              << setw(10) << psi/radian  << " "
00162              << setw(10) << (*iBeam)->GetAperX()/m   << " "
00163              << setw(10) << (*iBeam)->GetAperY()/m   << " "
00164              << setw(10) << aper_type  << " "
00165              << setw(10) << (*iBeam)->GetAngle()   << " "
00166              << setw(10) << (*iBeam)->GetK1()   << " "
00167              << setw(10) << (*iBeam)->GetK2()   << " "
00168              << setw(10) << (*iBeam)->GetK3()   << " "
00169              << G4endl;
00170       length+=(*iBeam)->GetLength()/m;
00171       arc_length+=(*iBeam)->GetArcLength()/m;
00172     }
00173   survey << "Total length = " << length << "m" << G4endl;
00174   survey << "Total arc length = " <<  arc_length << "m" << G4endl;
00175   survey.close();
00176 }

Generated on Wed Mar 5 17:25:22 2008 for BDSIM by  doxygen 1.5.3