00001
00002
00003
00004
00005
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;
00050 if((*iBeam)->GetType() == "rcol" )
00051 aper_type=1;
00052 else if((*iBeam)->GetType() == "ecol")
00053 {
00054 if((*iBeam)->GetAperX()==(*iBeam)->GetAperY())
00055 aper_type=2;
00056 else aper_type=3;
00057 }
00058 else aper_type=2;
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;
00118 if((*iBeam)->GetType() == 14 )
00119 aper_type=1;
00120 else if((*iBeam)->GetType() == 13)
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
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 }