src/BDSComponentFactory.cc

00001 #include "BDSComponentFactory.hh"
00002 #include "BDSExecOptions.hh"
00003 // elements
00004 //#include "BDSBeamPipe.hh"
00005 #include "BDSDrift.hh"
00006 #include "BDSPCLDrift.hh"
00007 #include "BDSSectorBend.hh"
00008 #include "BDSRBend.hh"
00009 #include "BDSKicker.hh"
00010 #include "BDSQuadrupole.hh"
00011 #include "BDSSextupole.hh"
00012 //#include "BDSSkewSextupole.hh"
00013 #include "BDSOctupole.hh"
00014 #include "BDSDecapole.hh"
00015 #include "BDSTMultipole.hh"
00016 #include "BDSRfCavity.hh"
00017 #include "BDSSolenoid.hh"
00018 #include "BDSSampler.hh"
00019 #include "BDSSamplerCylinder.hh"
00020 #include "BDSDump.hh"
00021 #include "BDSLaserWire.hh"
00022 #include "BDSLWCalorimeter.hh"
00023 #include "BDSMuSpoiler.hh"
00024 #include "BDSTransform3D.hh"
00025 #include "BDSElement.hh"
00026 #include "BDSComponentOffset.hh"
00027 #include "BDSCollimator.hh"
00028 //#include "BDSRealisticCollimator.hh"
00029 
00030 extern G4bool outline;
00031 
00032 #define DEBUG 1
00033 #ifdef DEBUG
00034 bool debug1 = true;
00035 #else
00036 bool debug1 = false;
00037 #endif
00038 
00039 BDSComponentFactory::BDSComponentFactory(){
00040   verbose = BDSExecOptions::Instance()->GetVerbose();
00041   //
00042   // compute magnetic rigidity brho
00043   // formula: B(Tesla)*rho(m) = p(GeV)/(0.299792458 * |charge(e)|)
00044   //
00045   // charge (in |e| units)
00046   _charge = BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGCharge();
00047   // momentum (in GeV/c)
00048   _momentum = BDSGlobalConstants::Instance()->GetBeamMomentum()/GeV;
00049   // rigidity (in T*m)
00050   _brho = BDSGlobalConstants::Instance()->GetFFact()*( _momentum / (0.299792458 * _charge));
00051   
00052   // rigidity (in Geant4 units)
00053   _brho *= (tesla*m);
00054   if (verbose || debug1) G4cout << "Rigidity (Brho) : "<< fabs(_brho)/(tesla*m) << " T*m"<<G4endl;
00055   //
00056   // beampipe default outer radius (if not overridden by "aper" option)
00057   //
00058   _bpRad=BDSGlobalConstants::Instance()->GetBeampipeRadius();
00059   if (verbose || debug1) G4cout<<"Default pipe outer radius= "<<_bpRad/m<< "m"
00060                               << G4endl;
00061 
00062   // I suspect FeRad is planned to be offered as an option for the inner radius
00063   // of the iron in case it is different from the beampipe outer radius
00064   // Not done yet.
00065   _FeRad = _bpRad;
00066   if (verbose || debug1) G4cout<<"Default magnet inner radius= "<<_FeRad/m<< "m"
00067                               << G4endl;
00068 
00069    // stuff for rescaling due to synchrotron radiation, IGNORING
00070   _synch_factor = 1;
00071   //
00072   _driftStartAper = _bpRad;
00073   _driftEndAper = _bpRad;
00074 }
00075 
00076 BDSComponentFactory::~BDSComponentFactory(){
00077 }
00078 
00079 BDSAcceleratorComponent* BDSComponentFactory::createComponent(std::list<struct Element>::iterator elementIter, std::list<struct Element>& beamline_list){
00080   G4cout << "BDSComponentFactory::createComponent() making iterators" << G4endl;  
00081   _elementIter = elementIter;
00082   _previousElementIter = elementIter; 
00083   _nextElementIter= elementIter; 
00084   if(_elementIter != beamline_list.begin()){
00085     G4cout << "BDSComponentFactory::createComponent() moving to previous element" << G4endl;  
00086     _previousElementIter--;
00087   } 
00088 
00089   _nextElementIter++;
00090   if(_nextElementIter == beamline_list.end()){
00091     G4cout << "BDSComponentFactory::createComponent() at the end, not moving to next element" << G4endl;  
00092     _nextElementIter--;
00093   } 
00094   G4cout << "BDSComponentFactory::createComponent() creating and returning component..." << G4endl;  
00095   return createComponent(*_elementIter, *_previousElementIter, *_nextElementIter);
00096 }
00097 
00098                                                                          
00099 BDSAcceleratorComponent* BDSComponentFactory::createComponent(Element aElement, Element previousElement, Element nextElement){
00100   G4cout << "BDSComponentFactory::createComponent() creating element..." << G4endl;  
00101   _element = aElement;
00102   G4cout << "BDSComponentFactory::createComponent() creating previous element..." << G4endl;  
00103   _previousElement = previousElement;  
00104   G4cout << "BDSComponentFactory::createComponent() creating next element..." << G4endl;  
00105   _nextElement = nextElement;
00106   return createComponent();
00107 }
00108 
00109 BDSAcceleratorComponent* BDSComponentFactory::createComponent(){
00110   G4cout << "BDSComponentFactory::createComponent() element name = " << _element.name << G4endl;  
00111   switch(_element.type){
00112   case _SAMPLER:
00113     G4cout << "BDSComponentFactory  - creating sampler" << G4endl;
00114     return createSampler(); break;
00115   case _DRIFT:
00116     G4cout << "BDSComponentFactory  - creating drift" << G4endl;
00117     return createDrift(); break; 
00118   case _PCLDRIFT:
00119     G4cout << "BDSComponentFactory  - creating pcl drift" << G4endl;
00120     return createPCLDrift(); break; 
00121   case _RF:
00122     G4cout << "BDSComponentFactory  - creating rf" << G4endl;
00123     return createRF(); break; 
00124   case _SBEND:
00125     G4cout << "BDSComponentFactory  - creating sbend" << G4endl;
00126     return createSBend(); break; 
00127   case _RBEND:
00128     G4cout << "BDSComponentFactory  - creating rbend" << G4endl;
00129     return createRBend(); break; 
00130   case _HKICK:
00131     G4cout << "BDSComponentFactory  - creating hkick" << G4endl;
00132     return createHKick(); break; 
00133   case _VKICK:
00134     G4cout << "BDSComponentFactory  - creating vkick" << G4endl;
00135     return createVKick(); break; 
00136   case _QUAD:
00137     G4cout << "BDSComponentFactory  - creating quadrupole" << G4endl;
00138     return createQuad(); break; 
00139   case _SEXTUPOLE:
00140     G4cout << "BDSComponentFactory  - creating sextupole" << G4endl;
00141     return createSextupole(); break; 
00142   case _OCTUPOLE:
00143     G4cout << "BDSComponentFactory  - creating octupole" << G4endl;
00144     return createOctupole(); break; 
00145   case _MULT:
00146     G4cout << "BDSComponentFactory  - creating multipole" << G4endl;
00147     return createMultipole(); break; 
00148   case _ELEMENT:    
00149     G4cout << "BDSComponentFactory  - creating element" << G4endl;
00150     return createElement(); break; 
00151   case _CSAMPLER:
00152     G4cout << "BDSComponentFactory  - creating csampler" << G4endl;
00153     return createCSampler(); break; 
00154   case _DUMP:
00155     G4cout << "BDSComponentFactory  - creating dump" << G4endl;
00156     return createDump(); break; 
00157   case _SOLENOID:
00158     G4cout << "BDSComponentFactory  - creating solenoid" << G4endl;
00159     return createSolenoid(); break; 
00160   case _ECOL:
00161     G4cout << "BDSComponentFactory  - creating ecol" << G4endl;
00162     return createECol(); break; 
00163   case _RCOL:
00164     G4cout << "BDSComponentFactory  - creating rcol" << G4endl;
00165     return createRCol(); break; 
00166   case _MUSPOILER:    
00167     G4cout << "BDSComponentFactory  - creating muspoiler" << G4endl;
00168     return createMuSpoiler(); break; 
00169   case _LASER:
00170     G4cout << "BDSComponentFactory  - creating laser" << G4endl;
00171     return createLaser(); break; 
00172   case _TRANSFORM3D:
00173     G4cout << "BDSComponentFactory  - creating transform3d" << G4endl;
00174     return createTransform3D(); break;  
00175   default:
00176     G4cout << "BDSComponentFactory: type: " << _element.type << G4endl; 
00177     //    G4Exception("Error: BDSComponentFactory: type not found.", "-1", FatalErrorInArgument, "");   
00178     return NULL;
00179     break;
00180   }
00181   
00182 }
00183 
00184 BDSAcceleratorComponent* BDSComponentFactory::createSampler(){
00185   return (new BDSSampler(_element.name, BDSGlobalConstants::Instance()->GetSamplerLength()));
00186 }
00187 
00188 BDSAcceleratorComponent* BDSComponentFactory::createCSampler(){
00189   if( _element.l < 1.E-4 ) _element.l = 1.0 ;
00190   return (new BDSSamplerCylinder( _element.name,
00191                                                   _element.l * m,
00192                                                   _element.r * m ));
00193 }
00194 
00195 BDSAcceleratorComponent* BDSComponentFactory::createDump(){
00196   return (new BDSDump( _element.name,
00197                                        BDSGlobalConstants::Instance()->GetSamplerLength(),_element.tunnelMaterial ));
00198 }
00199 
00200 BDSAcceleratorComponent* BDSComponentFactory::createDrift(){
00201   double aper(0), aperX(0), aperY(0);
00202   _element.phiAngleIn=0;
00203 
00204 
00205   if( _element.aper > 0 ) aper = _element.aper * m; //Set if aper specified for element
00206   if( _element.aperX > 0 ) aperX = _element.aperX * m; //Set if aperX specified for elemen
00207   if( _element.aperY > 0 ) aperY = _element.aperY * m; //Set if aperY specified for element
00208   if( (aperX>0) || (aperY>0)){  //aperX or aperY override aper, aper set to the largest of aperX or aperY
00209     aper=std::max(_element.aperX,_element.aperY);
00210   }
00211   
00212   if ( (aperX !=0) || (aperY != 0) || (aper != 0) || _element.phiAngleIn != 0 || _element.phiAngleOut !=0){
00213     if (aperX==0 && aperY==0 && aper==0){
00214       aperX=BDSGlobalConstants::Instance()->GetBeampipeRadius()/m;
00215       aperY=BDSGlobalConstants::Instance()->GetBeampipeRadius()/m;
00216       aper=BDSGlobalConstants::Instance()->GetBeampipeRadius()/m;
00217     }
00218     
00219     if(_element.l > BDSGlobalConstants::Instance()->GetLengthSafety()) // skip too short elements                                                                                                         
00220       {
00221 #ifdef DEBUG
00222         G4cout << "---->creating Drift,"
00223                << " name= " << _element.name
00224                << " l= " << _element.l << "m"
00225                << " aperX= " << aperX << "m"
00226                << " aperY= " << aperY << "m"
00227                << " aper = " << aper << "m"
00228                << " phiAngleIn= " << _element.phiAngleIn 
00229                << " phiAngleOut= " << _element.phiAngleOut 
00230                << G4endl;
00231 #endif
00232         
00233         //Create the phiAngleIn using BDSTransform3D
00234         
00235         
00236         
00237         G4bool aperset=true;
00238         if(!(_element.tunnelOffsetX)<1e6){
00239           return (new BDSDrift( _element.name,
00240                                               _element.l*m,
00241                                               _element.blmLocZ,
00242                                               _element.blmLocTheta,
00243                                               aperX, aperY, _element.tunnelMaterial, aperset, aper, BDSGlobalConstants::Instance()->GetTunnelOffsetX(), _element.phiAngleIn, _element.phiAngleOut));
00244         } else {
00245           return (new BDSDrift( _element.name,
00246                                               _element.l*m,
00247                                               _element.blmLocZ,
00248                                               _element.blmLocTheta,
00249                                               aperX, aperY, _element.tunnelMaterial, aperset, aper,_element.tunnelOffsetX*m, _element.phiAngleIn, _element.phiAngleOut) );
00250         }
00251         
00252       }
00253   } else {
00254     //Taper circular beam pipe between elements.                                                                                                                        
00255     _driftStartAper = _bpRad;
00256     _driftEndAper = _bpRad;
00257     if((_previousElement.type!=_ECOL)&&(_previousElement.type!=_RCOL)&&(_previousElement.type!=_MUSPOILER)){
00258       if( _previousElement.aper > 1.e-10*m ) _driftStartAper = _previousElement.aper * m;
00259     }
00260     if((_nextElement.type!=_ECOL)&&(_nextElement.type!=_RCOL)&&(_nextElement.type!=_MUSPOILER)){
00261       if( _nextElement.aper > 1.e-10*m ) _driftEndAper = _nextElement.aper * m;
00262     }
00263     if(_element.l > 0){// skip zero-length elements                                                                                                         
00264 #ifdef DEBUG
00265       G4cout << "---->creating Drift,"
00266                << " name= " << _element.name
00267                << " l= " << _element.l << "m"
00268                << " startAper= " << _bpRad/m << "m"
00269                << " endAper= " << _bpRad/m << "m"
00270                << G4endl;
00271 #endif
00272         if(!(_element.tunnelOffsetX<1e6)){
00273           return (new BDSDrift( _element.name,
00274                                 _element.l*m,
00275                                 _element.blmLocZ,
00276                                 _element.blmLocTheta,
00277                                 _driftStartAper, _driftEndAper, _element.tunnelMaterial, false));
00278         } else {
00279           return (new BDSDrift( _element.name,
00280                                 _element.l*m,
00281                                 _element.blmLocZ,
00282                                 _element.blmLocTheta,
00283                                 _driftStartAper, _driftEndAper, _element.tunnelMaterial, false, 0, _element.tunnelOffsetX ) );
00284         }
00285     } else {
00286       G4cerr << "---->NOT creating Drift,"
00287              << " name= " << _element.name
00288              << ", TOO SHORT LENGTH:"
00289              << " l= " << _element.l << "m"
00290              << G4endl;
00291       return NULL;
00292     }
00293   }
00294   G4cerr << "NOT creating drift..." << G4endl;
00295   return NULL;
00296 }
00297 
00298 BDSAcceleratorComponent* BDSComponentFactory::createPCLDrift(){
00299   G4double aper=0;
00300   //Check all apertures are set.
00301   if (_element.aperY>BDSGlobalConstants::Instance()->GetLengthSafety()){
00302     _element.aperYUp = _element.aperY;
00303     _element.aperYDown = _element.aperY;
00304   }
00305   
00306   if (_element.aperX<BDSGlobalConstants::Instance()->GetLengthSafety()){
00307     G4cerr << "Error: BDSDetectorConstruction.cc, in building PCLDrift, aperX = " << _element.aperX << " is less than lengthSafety." << G4endl;
00308     exit(1);
00309   } 
00310   if (_element.aperYUp<BDSGlobalConstants::Instance()->GetLengthSafety()){
00311     G4cerr << "Error: BDSDetectorConstruction.cc, in building PCLDrift, aperYUp = " << _element.aperYUp << " is less than lengthSafety." << G4endl;
00312     exit(1);
00313   } 
00314   if (_element.aperYDown<BDSGlobalConstants::Instance()->GetLengthSafety()){
00315     G4cerr << "Error: BDSDetectorConstruction.cc, in building PCLDrift, aperYDown = " << _element.aperYDown << " is less than lengthSafety." << G4endl;
00316     exit(1);
00317   } 
00318   
00319   if( (_element.aperX>0) || (_element.aperY>0)){  //aperX or aperY override aper, aper set to the largest of aperX or aperY
00320     aper=std::max(_element.aperX,_element.aperYUp+_element.aperDy);
00321     aper=std::max(aper,_element.aperYDown+_element.aperDy);
00322   }
00323   
00324   if(_element.l > BDSGlobalConstants::Instance()->GetLengthSafety()) // skip too short elements                                                                                                         
00325     {
00326       
00327       if(!(_element.tunnelOffsetX<1e6)){
00328         return (new BDSPCLDrift( _element.name,
00329                                                _element.l*m,
00330                                                _element.blmLocZ,
00331                                                _element.blmLocTheta,
00332                                                _element.aperX*m, _element.aperYUp*m, _element.aperYDown*m,_element.aperDy*m, _element.tunnelMaterial, aper, _element.tunnelRadius*m));
00333       } else {
00334         return (new BDSPCLDrift( _element.name,
00335                                                _element.l*m,
00336                                                _element.blmLocZ,
00337                                                _element.blmLocTheta,
00338                                                _element.aperX*m, _element.aperYUp*m, _element.aperYDown*m,_element.aperDy*m, _element.tunnelMaterial, aper, _element.tunnelRadius*m, _element.tunnelOffsetX*m));
00339       }
00340     } else {
00341     G4cerr << "Element too short!" << G4endl;
00342     return NULL;
00343   }
00344 }
00345 
00346 BDSAcceleratorComponent* BDSComponentFactory::createRF(){
00347   G4double aper = _bpRad;
00348   if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00349   
00350   if(_element.l > 0) // skip zero-length elements
00351     {
00352       return (new BDSRfCavity( _element.name,
00353                                              _element.l * m,
00354                                              aper,
00355                                              _element.gradient,
00356                                              _element.tunnelMaterial,
00357                                              _element.material ) );
00358     } else {
00359     G4cerr << "---->NOT creating RF,"
00360            << " name= " << _element.name
00361            << ", TOO SHORT LENGTH:"
00362            << " l= " << _element.l << "m"
00363            << G4endl;
00364     return NULL;
00365   }
00366 }
00367 
00368 BDSAcceleratorComponent* BDSComponentFactory::createSBend(){
00369   //
00370   // geometry
00371   //
00372   G4double aper = _bpRad;
00373   if( _element.aper > 0 ) aper = _element.aper * m; //Set if aper specified for element
00374   if( (_element.aperX>0) || (_element.aperY>0)){  //aperX or aperY override aper, aper set to the largest of aperX or aperY
00375     aper=std::max(_element.aperX,_element.aperY);
00376   }
00377   _FeRad = aper;
00378   
00379   if( _element.outR < aper/m)
00380     {
00381       G4cerr << _element.name << ": outer radius smaller than aperture: "
00382              << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00383       G4cerr << _element.name << ": setting outer radius to default = "
00384              << BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m)<< "m" << G4endl;
00385       _element.outR = BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m);
00386     }
00387   
00388   // arc length
00389   G4double length = _element.l*m;
00390   G4double magFieldLength = length;
00391   
00392   //
00393   // magnetic field
00394   //
00395   
00396   // MAD conventions:
00397   // 1) a positive bend angle represents a bend to the right, i.e.
00398   // towards negative x values (even for negative _charges??)
00399   // 2) a positive K1 = 1/|Brho| dBy/dx means horizontal focusing of
00400   // positive charges
00401   // CHECK SIGNS 
00402   //
00403   
00404   if( fabs(_element.angle) < 1.e-7 * rad ) {
00405     _element.angle=1e-7 * rad;
00406   }
00407   
00408   if(_element.B != 0){
00409     _bField = _element.B * tesla;
00410     G4double rho = _brho/_bField;
00411     _element.angle  = - 2.0*asin(magFieldLength/2.0/rho);
00412   }
00413   else{
00414     _element.angle *= -1;
00415     _bField = - 2 * _brho * sin(_element.angle/2.0) / magFieldLength;
00416     _element.B = _bField/tesla;
00417   }
00418   
00419   // synch factor??
00420   // B' = dBy/dx = Brho * (1/Brho dBy/dx) = Brho * k1
00421   // Brho is already in G4 units, but k1 is not -> multiply k1 by m^-2
00422   _bPrime = - _brho * (_element.k1 / (m*m)) * _synch_factor;
00423   //Should keep the correct geometry, therefore keep dipole withe zero angle.
00424   if( fabs(_element.angle) < 1.e-7 * rad ) {
00425     return (new BDSDrift( _element.name,
00426                                         _element.l*m, _element.blmLocZ, _element.blmLocTheta,
00427                                         aper, aper, _element.tunnelMaterial ) );
00428   }
00429   else {
00430     /*
00431       return (new BDSRBend( _element.name,
00432       _element.l*m,
00433       aper,
00434       _FeRad,
00435       _bField,
00436       _element.angle,
00437       _element.outR * m,
00438       _element.blmLocZ,
00439       _element.blmLocTheta,
00440       _element.tilt * rad,
00441       _bPrime,
00442       _element.material ) );
00443       
00444     */
00445     return (new BDSSectorBend( _element.name,
00446                                              length,
00447                                              aper,
00448                                              _FeRad,
00449                                              _bField,
00450                                              _element.angle,
00451                                              _element.outR * m,
00452                                              _element.blmLocZ,
00453                                              _element.blmLocTheta,
00454                                              _element.tilt,
00455                                              _bPrime,
00456                                              _element.tunnelMaterial,
00457                                              _element.material, _element.aperX*m, _element.aperY*m ) );
00458   }
00459 }
00460 
00461 BDSAcceleratorComponent* BDSComponentFactory::createRBend(){
00462   //
00463   // geometry
00464   //
00465   G4double aper = 2*_bpRad;
00466   if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00467   _FeRad = aper;
00468   
00469   if( _element.outR < aper/m)
00470     {
00471       G4cerr << _element.name << ": outer radius smaller than aperture: "
00472              << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00473       G4cerr << _element.name << ": setting outer radius to default = "
00474              << BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m)<< "m" << G4endl;
00475       _element.outR = BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m);
00476     }
00477   
00478   G4double length = _element.l*m; //geometrical length
00479   G4double magFieldLength = 2*std::min ( //length of magnetic field
00480                                         ((_element.l/_element.angle)*sin(_element.angle/2)
00481                                          - fabs(cos(_element.angle/2))*_element.outR*tan(_element.angle/2)/2), 
00482                                         ((_element.l/_element.angle)*sin(_element.angle/2)
00483                                          + fabs(cos(_element.angle/2))*_element.outR*tan(_element.angle/2)/2)
00484                                         )*m;
00485   
00486   //
00487   // magnetic field
00488   //
00489   
00490   // CHECK SIGNS OF B, B', ANGLE
00491   if(_element.B != 0){
00492     // angle = arc length/radius of curvature = L/rho = (B*L)/(B*rho)
00493     _bField = _element.B * tesla;
00494     G4double rho = _brho/_bField;
00495     //_element.angle  = - _bField * length / brho;
00496     _element.angle  = - 2.0*asin(length/2.0/rho);
00497   }
00498   else{
00499     _element.angle *= -1;
00500     // arc length = radius*angle
00501     //            = (geometrical length/(2.0*sin(angle/2))*angle
00502     G4double arclength = 0.5*magFieldLength * _element.angle / sin(_element.angle/2.0);
00503     // B = Brho/rho = Brho/(arc length/angle)
00504     _bField = - _brho * _element.angle / arclength;
00505     _element.B = _bField/tesla;
00506   }
00507   
00508   // synch factor???
00509   
00510   // B' = dBy/dx = Brho * (1/Brho dBy/dx) = Brho * k1
00511   // Brho is already in G4 units, but k1 is not -> multiply k1 by m^-2
00512   _bPrime = - _brho * (_element.k1 / (m*m)) * _synch_factor;
00513   
00514   if( fabs(_element.angle) < 1.e-7 * rad ) {
00515     return (new BDSDrift( _element.name,
00516                                         length,                                            
00517                                         _element.blmLocZ,
00518                                         _element.blmLocTheta,
00519                                         aper, aper, _element.tunnelMaterial ) );
00520   }
00521   else {
00522     return (new BDSRBend( _element.name,
00523                                         length,
00524                                         aper,
00525                                         _FeRad,
00526                                         _bField,
00527                                         _element.angle,
00528                                         _element.outR * m,
00529                                         _element.blmLocZ,
00530                                         _element.blmLocTheta,
00531                                         _element.tilt * rad,
00532                                         _bPrime,
00533                                         _element.tunnelMaterial,
00534                                         _element.material ) );
00535   }
00536 }
00537 
00538 BDSAcceleratorComponent* BDSComponentFactory::createHKick(){
00539   //
00540   // geometry
00541   //
00542   G4double aper = _bpRad;
00543   if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00544   _FeRad = aper;
00545   
00546   if( _element.outR < aper/m)
00547     {
00548       G4cerr << _element.name << ": outer radius smaller than aperture: "
00549              << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00550       G4cerr << _element.name << ": setting outer radius to default = "
00551              << BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m)<< "m" << G4endl;
00552       _element.outR = BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m);
00553     }
00554   
00555   G4double length = _element.l*m;
00556   //
00557   // magnetic field
00558   //
00559   if(_element.B != 0){
00560     // angle = arc length/radius of curvature = L/rho = (B*L)/(B*rho)
00561     _bField = _element.B * tesla;
00562     _element.angle  = -_bField * length / _brho;
00563   }
00564   else{
00565     // B = Brho/rho = Brho/(arc length/angle)
00566     _bField = - _brho * _element.angle / length;
00567     _element.B = _bField/tesla;
00568   }
00569   
00570   // synch factor??
00571   // B' = dBy/dx = Brho * (1/Brho dBy/dx) = Brho * k1
00572   // Brho is already in G4 units, but k1 is not -> multiply k1 by m^-2
00573   _bPrime = - _brho * (_element.k1 / (m*m)) * _synch_factor;
00574   
00575   if( fabs(_element.angle) < 1.e-7 * rad ) {
00576     G4cerr << "---->NOT creating Hkick,"
00577            << " name= " << _element.name
00578            << ", TOO SMALL ANGLE"
00579            << " angle= " << _element.angle << "rad"
00580            << ": REPLACED WITH Drift,"
00581            << " l= " << length/m << "m"
00582            << " aper= " << aper/m << "m"
00583            << " tunnel material " << _element.tunnelMaterial
00584            << G4endl;
00585     return (new BDSDrift( _element.name,
00586                                         length,
00587                                         _element.blmLocZ,
00588                                         _element.blmLocTheta,
00589                                         aper, aper, _element.tunnelMaterial ) );
00590   } 
00591   else {
00592     return (new BDSKicker( _element.name,
00593                                          length,
00594                                          aper,
00595                                          _FeRad,
00596                                          _bField,
00597                                          _element.angle,
00598                                          _element.outR * m,
00599                                          _element.tilt * rad,
00600                                          _bPrime,
00601                                          _element.tunnelMaterial,
00602                                          _element.material ) );
00603   }
00604 }
00605 
00606 BDSAcceleratorComponent* BDSComponentFactory::createVKick(){
00607   //
00608   // geometry
00609   //
00610   G4double aper = _bpRad;
00611   if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00612   G4double 
00613     _FeRad = aper;
00614   
00615   if( _element.outR < aper/m)
00616     {
00617       G4cerr << _element.name << ": outer radius smaller than aperture: "
00618              << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00619       G4cerr << _element.name << ": setting outer radius to default = "
00620              << BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m)<< "m" << G4endl;
00621       _element.outR = BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m);
00622     }
00623   G4double length = _element.l*m;
00624   //
00625   // magnetic field
00626   //
00627   if(_element.B != 0){
00628     // angle = arc length/radius of curvature = L/rho = (B*L)/(B*rho)
00629     _bField = _element.B * tesla;
00630     _element.angle  = -_bField * length / _brho;
00631   }
00632   else{
00633     // B = Brho/rho = Brho/(arc length/angle)
00634     _bField = - _brho * _element.angle / length;
00635     _element.B = _bField/tesla;
00636   }
00637   // synch factor???
00638   // B' = dBy/dx = Brho * (1/Brho dBy/dx) = Brho * k1
00639   // Brho is already in G4 units, but k1 is not -> multiply k1 by m^-2
00640   _bPrime = - _brho * (_element.k1 / (m*m)) * _synch_factor;
00641   
00642   if( fabs(_element.angle) < 1.e-7 * rad ) {
00643     G4cerr << "---->NOT creating Vkick,"
00644            << " name= " << _element.name
00645            << ", TOO SMALL ANGLE"
00646            << " angle= " << _element.angle << "rad"
00647            << ": REPLACED WITH Drift,"
00648            << " l= " << _element.l << "m"
00649            << " aper= " << aper/m << "m"
00650            << " tunnel material " << _element.tunnelMaterial
00651            << G4endl;
00652     
00653     return (new BDSDrift( _element.name,
00654                                         _element.l * m,
00655                                         _element.blmLocZ,
00656                                         _element.blmLocTheta,
00657                                                aper, aper, _element.tunnelMaterial ) );
00658   } 
00659   else {
00660     return (new BDSKicker( _element.name,
00661                                          _element.l * m,
00662                                          aper,
00663                                          _FeRad,
00664                                          _bField,
00665                                          _element.angle,
00666                                          _element.outR * m,
00667                                          (_element.tilt+pi/2)*rad,
00668                                          _bPrime,
00669                                          _element.tunnelMaterial,
00670                                          _element.material ) );
00671   }
00672 }
00673 
00674 BDSAcceleratorComponent* BDSComponentFactory::createQuad(){
00675   //
00676   // geometry
00677   //
00678   G4double aper = _bpRad;
00679   if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00680   _FeRad = aper;
00681   if( _element.outR < aper/m)
00682     {
00683       G4cerr << _element.name << ": outer radius smaller than aperture: "
00684              << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00685       G4cerr << _element.name << ": setting outer radius to default = "
00686              << BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m)<< "m" << G4endl;
00687       _element.outR = BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m);
00688     }
00689   
00690         //
00691         // magnetic field
00692         //
00693         // B' = dBy/dx = Brho * (1/Brho dBy/dx) = Brho * k1
00694         // Brho is already in G4 units, but k1 is not -> multiply k1 by m^-2
00695   _bPrime = - _brho * (_element.k1 / (m*m)) * _synch_factor;
00696   
00697         return (new BDSQuadrupole( _element.name,
00698                                                  _element.l * m,
00699                                                  aper,
00700                                                  _FeRad,
00701                                                  _bPrime, 
00702                                                  _element.tilt * rad,
00703                                                  _element.outR * m, 
00704                                                  _element.blmLocZ,
00705                                                  _element.blmLocTheta,
00706                                                  _element.tunnelMaterial,
00707                                                  _element.material,
00708                                                  _element.spec ) );
00709         
00710   }  
00711   
00712 BDSAcceleratorComponent* BDSComponentFactory::createSextupole(){
00713         //
00714         // geometry
00715         //
00716         G4double aper = _bpRad;
00717         if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00718         _FeRad = aper;
00719 
00720         if( _element.outR < aper/m)
00721           {
00722             G4cerr << _element.name << ": outer radius smaller than aperture: "
00723                    << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00724             G4cerr << _element.name << ": setting outer radius to default = "
00725                    << BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m)<< "m" << G4endl;
00726             _element.outR = BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m);
00727           }
00728 
00729         //
00730         // magnetic field
00731         //
00732 
00733         // B'' = d^2By/dx^2 = Brho * (1/Brho d^2By/dx^2) = Brho * k2
00734         // brho is in Geant4 units, but k2 is not -> multiply k2 by m^-3
00735         _bDoublePrime = - _brho * (_element.k2 / (m*m*m)) * _synch_factor;
00736 
00737 #ifdef DEBUG 
00738         G4cout << "---->creating Sextupole,"
00739                << " name= " << _element.name
00740                << " l= " << _element.l << "m"
00741                << " k2= " << _element.k2 << "m^-3"
00742                << " brho= " << fabs(_brho)/(tesla*m) << "T*m"
00743                << " B''= " << _bDoublePrime/(tesla/(m*m)) << "T/m^2"
00744                << " tilt= " << _element.tilt << "rad"
00745                << " aper= " << aper/m << "m"
00746                << " outR= " << _element.outR << "m"
00747                << " FeRad= " << _FeRad/m << "m"
00748                << " tunnel material " << _element.tunnelMaterial
00749                << " material= " << _element.material
00750                << G4endl;
00751 #endif
00752 
00753          return (new BDSSextupole( _element.name,
00754                                                 _element.l * m,
00755                                                 aper,
00756                                                 _FeRad,
00757                                                 _bDoublePrime,
00758                                                 _element.tilt * rad,
00759                                                 _element.outR * m,
00760                                                  _element.blmLocZ,
00761                                                  _element.blmLocTheta,
00762                                                  _element.tunnelMaterial,
00763                                                 _element.material ) );
00764       
00765 }
00766 
00767 BDSAcceleratorComponent* BDSComponentFactory::createOctupole(){
00768 
00769         //
00770         // geometry
00771         //
00772         G4double aper = _bpRad;
00773         if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00774         _FeRad = aper;
00775 
00776         if( _element.outR < aper/m)
00777           {
00778             G4cerr << _element.name << ": outer radius smaller than aperture: "
00779                    << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00780             G4cerr << _element.name << ": setting outer radius to default = "
00781                    << BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m)<< "m" << G4endl;
00782             _element.outR = BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m);
00783           }
00784 
00785         //
00786         // magnetic field
00787         //
00788 
00789         // B''' = d^3By/dx^3 = Brho * (1/Brho d^3By/dx^3) = Brho * k3
00790         // brho is in Geant4 units, but k3 is not -> multiply k3 by m^-4
00791         _bTriplePrime = - _brho * (_element.k3 / (m*m*m*m)) * _synch_factor;
00792 
00793 #ifdef DEBUG 
00794         G4cout << "---->creating Octupole,"
00795                << " name= " << _element.name
00796                << " l= " << _element.l << "m"
00797                << " k3= " << _element.k3 << "m^-4"
00798                << " brho= " << fabs(_brho)/(tesla*m) << "T*m"
00799                << " B'''= " << _bTriplePrime/(tesla/(m*m*m)) << "T/m^3"
00800                << " tilt= " << _element.tilt << "rad"
00801                << " aper= " << aper/m << "m"
00802                << " outR= " << _element.outR << "m"
00803                << " FeRad= " << _FeRad/m << "m"
00804                << " tunnel material " << _element.tunnelMaterial
00805                << " material= " << _element.material
00806                << G4endl;
00807 #endif
00808 
00809         return (new BDSOctupole( _element.name,
00810                                                _element.l * m,
00811                                                aper,
00812                                                _FeRad,
00813                                                _bTriplePrime,
00814                                                _element.tilt * rad,
00815                                                _element.outR * m,
00816                                                _element.blmLocZ,
00817                                                _element.blmLocTheta,
00818                                                 _element.tunnelMaterial,
00819                                                _element.material ) );
00820       
00821 }
00822 
00823 BDSAcceleratorComponent* BDSComponentFactory::createMultipole(){
00824   
00825   //
00826   // geometry
00827   //
00828   G4double aper = _bpRad;
00829   if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00830   
00831   _FeRad = aper;
00832   
00833   if( _element.outR < aper/m)
00834     {
00835       G4cerr << _element.name << ": outer radius smaller than aperture: "
00836              << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00837       G4cerr << _element.name << ": setting outer radius to default = "
00838              << BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m)<< "m" << G4endl;
00839       _element.outR = BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m);
00840     }
00841   
00842 #ifdef DEBUG 
00843   G4cout << "---->creating Multipole,"
00844          << " name= " << _element.name
00845          << " l= " << _element.l << "m"
00846          << " tilt= " << _element.tilt << "rad"
00847          << " aper= " << aper/m << "m"
00848          << " outR= " << _element.outR << "m"
00849          << " FeRad= " << _FeRad/m << "m"
00850          << " tunnel material " << _element.tunnelMaterial
00851          << " material= " << _element.material
00852          << G4endl;
00853 #endif
00854   
00855   //
00856   // magnetic field
00857   //
00858   std::list<double>::iterator kit;
00859   
00860 #ifdef DEBUG 
00861   G4cout << " knl={ ";
00862 #endif
00863   for(kit=(_element.knl).begin();kit!=(_element.knl).end();kit++)
00864     {
00865 #ifdef DEBUG 
00866       G4cout<<(*kit)<<", ";
00867 #endif
00868       (*kit) /= _element.l; 
00869     }
00870 #ifdef DEBUG 
00871   G4cout << "}";
00872 #endif
00873   
00874 #ifdef DEBUG 
00875   G4cout << " ksl={ ";
00876 #endif
00877   for(kit=(_element.ksl).begin();kit!=(_element.ksl).end();kit++)
00878     {
00879 #ifdef DEBUG 
00880       G4cout<<(*kit)<<" ";
00881 #endif
00882       (*kit) /= _element.l; 
00883     }
00884 #ifdef DEBUG 
00885   G4cout << "}" << G4endl;
00886 #endif
00887   
00888   return (new BDSTMultipole( _element.name,
00889                                            _element.l * m,
00890                                            aper,
00891                                            _FeRad,
00892                                            _element.tilt * rad,
00893                                            _element.outR * m,
00894                                            _element.knl,
00895                                            _element.ksl,
00896                                            _element.blmLocZ,
00897                                            _element.blmLocTheta,
00898                                            _element.tunnelMaterial, 
00899                                            _element.material 
00900                                            ) );
00901   
00902 }
00903 
00904 BDSAcceleratorComponent* BDSComponentFactory::createElement(){
00905 
00906         //
00907         // geometry
00908         //
00909         G4double aper = _bpRad;
00910         if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00911         
00912 /* Fix for element volume overlaps - do not set default outR!
00913         if( _element.outR < aper/m)
00914           {
00915             G4cerr << _element.name << ": outer radius smaller than aperture: "
00916                    << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00917             G4cerr << _element.name << ": setting outer radius to default = "
00918                    << "aper+22*cm"<<G4endl;
00919             _element.outR = 0.22;
00920           }
00921 */
00922 #ifdef DEBUG 
00923         G4cout << "---->creating Element,"
00924                << " name= " << _element.name
00925                << " l= " << _element.l << "m"
00926                << " aper= " << aper/m << "m"
00927                << " outR= " << _element.outR << "m"
00928                << " tunnel material " << _element.tunnelMaterial
00929                << " tunnel cavity material " << _element.tunnelCavityMaterial
00930                << " precision region " << _element.precisionRegion
00931                << G4endl;
00932 #endif
00933 
00934         if(_element.tunnelOffsetX<1e6){
00935           
00936           return (new BDSElement( _element.name,
00937                                                 _element.geometryFile,
00938                                                 _element.bmapFile,
00939                                                 _element.l * m,
00940                                                 aper,
00941                                                 _element.outR * m , _element.tunnelMaterial, _element.tunnelRadius, _element.tunnelOffsetX, _element.tunnelCavityMaterial, _element.precisionRegion ));
00942         } 
00943         else {
00944           return (new BDSElement( _element.name,
00945                                                 _element.geometryFile,
00946                                                 _element.bmapFile,
00947                                                 _element.l * m,
00948                                                 aper,
00949                                                 _element.outR * m , _element.tunnelMaterial, _element.tunnelRadius, (G4double)0, _element.tunnelCavityMaterial, _element.precisionRegion));
00950         }
00951         
00952 
00953 }
00954 
00955   BDSAcceleratorComponent* BDSComponentFactory::createSolenoid(){
00956 
00957         //
00958         // geometry
00959         //
00960         G4double aper = _bpRad;
00961         if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00962         
00963         _FeRad = aper;
00964 
00965         if( _element.outR < aper/m)
00966           {
00967             G4cerr << _element.name << ": outer radius smaller than aperture: "
00968                    << "aper= "<<aper/m<<"m outR= "<<_element.outR<<"m"<<G4endl;
00969             G4cerr << _element.name << ": setting outer radius to default = "
00970                    << BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m)<< "m" << G4endl;
00971             _element.outR = BDSGlobalConstants::Instance()->GetComponentBoxSize()/(2*m);
00972           }
00973 
00974         //
00975         // magnetic field
00976         //
00977         // B = B/Brho * Brho = ks * Brho
00978         // brho is in Geant4 units, but ks is not -> multiply ks by m^-1
00979         G4double _bField;
00980         if(_element.B != 0){
00981           _bField = _element.B * tesla;
00982           _element.ks  = (_bField/_brho) / m;
00983         }
00984         else{
00985           _bField = (_element.ks/m) * _brho;
00986           _element.B = _bField/tesla;
00987         }
00988 
00989 #ifdef DEBUG 
00990         G4cout << "---->creating Solenoid,"
00991                << " name= " << _element.name
00992                << " l= " << _element.l << "m"
00993                << " ks= " << _element.ks << "m^-1"
00994                << " brho= " << fabs(_brho)/(tesla*m) << "T*m"
00995                << " B= " << _bField/tesla << "T"
00996                << " aper= " << aper/m << "m"
00997                << " outR= " << _element.outR << "m"
00998                << " FeRad= " << _FeRad/m << "m"
00999                << " tunnel material " << _element.tunnelMaterial
01000                << " material= " << _element.material
01001                << G4endl;
01002 #endif
01003          return (new BDSSolenoid( _element.name,
01004                                                _element.l * m,
01005                                                aper,
01006                                                _FeRad,
01007                                                _bField,
01008                                                _element.outR*m,
01009                                                 _element.blmLocZ,
01010                                                 _element.blmLocTheta,
01011                                                 _element.tunnelMaterial,
01012                                                 _element.material
01013                                                 ) );
01014         
01015 }
01016 
01017   BDSAcceleratorComponent* BDSComponentFactory::createECol(){
01018 
01019         G4Material* theMaterial;
01020         if(_element.material != "")
01021           theMaterial = BDSMaterials::Instance()->GetMaterial( _element.material );
01022         else
01023           theMaterial = BDSMaterials::Instance()->GetMaterial( "Graphite" );
01024 
01025 #ifdef DEBUG 
01026         G4cout << "---->creating Ecol,"
01027                << " name= " << _element.name 
01028                << " xaper= " << _element.xsize <<"m"
01029                << " yaper= " << _element.ysize <<"m"
01030                << " material= " << _element.material
01031                << " tunnel material " << _element.tunnelMaterial
01032                << G4endl;
01033 #endif
01034 
01035         return (new BDSCollimator(_element.name,
01036                                                 _element.l * m,
01037                                                 _bpRad,
01038                                                 _element.xsize * m,
01039                                                 _element.ysize * m,
01040                                                 _ECOL,
01041                                                 theMaterial,
01042                                                 _element.outR*m,
01043                                                 _element.blmLocZ,
01044                                                 _element.blmLocTheta,
01045                                                 _element.tunnelMaterial) );
01046         
01047   }
01048 
01049 
01050   BDSAcceleratorComponent* BDSComponentFactory::createRCol(){
01051 
01052         G4Material* theMaterial;
01053         if(_element.material != "")
01054           theMaterial = BDSMaterials::Instance()->GetMaterial( _element.material );
01055         else
01056           theMaterial = BDSMaterials::Instance()->GetMaterial( "Graphite" );
01057 
01058 #ifdef DEBUG 
01059         G4cout << "---->creating Rcol,"
01060                << " name= " << _element.name 
01061                << " xaper= " << _element.xsize <<"m"
01062                << " yaper= " << _element.ysize <<"m"
01063                << " flatl= " << _element.flatlength <<"m"
01064                << " taper= " << _element.taperlength <<"m"
01065                << " material= " << _element.material
01066                << " tunnel material " << _element.tunnelMaterial
01067                << G4endl;
01068 #endif
01069 /*
01070         return (new BDSRealisticCollimator(
01071                                                 _element.name,
01072                                                 _bpRad,
01073                                                 _element.xsize * m,
01074                                                 _element.ysize * m,
01075                                                 _RCOL,
01076                                                 _element.flatlength * m,
01077                                                 _element.taperlength * m,
01078                                                 theMaterial,
01079                                                 _element.outR*m) );
01080 
01081 */
01082         return (new BDSCollimator( _element.name,
01083                                                   _element.l * m,
01084                                                   _bpRad,
01085                                                   _element.xsize * m,
01086                                                   _element.ysize * m,
01087                                                  _RCOL,
01088                                                   theMaterial,
01089                                                   _element.outR*m,
01090                                                  _element.blmLocZ,
01091                                                  _element.blmLocTheta,
01092                                                   _element.tunnelMaterial) );
01093       
01094   }
01095 
01096 
01097   BDSAcceleratorComponent* BDSComponentFactory::createMuSpoiler(){
01098 
01099 #ifdef DEBUG 
01100         G4cout << "---->creating muspoiler,"
01101                << " name= " << _element.name 
01102                << " length= " << _element.l
01103                << "B= " << _element.B
01104                << " tunnel material " << _element.tunnelMaterial
01105                << G4endl;
01106 #endif
01107         G4String name = _element.name;
01108         G4double length = _element.l*m;
01109         G4double _bField = _element.B * tesla;
01110         G4double beamPipeRadius;
01111         //        if(_element.aperSet){
01112         beamPipeRadius = _element.aper*m;
01113           //        } else {
01114           //          beamPipeRadius = BDSGlobalConstants::Instance()->GetBeampipeRadius();
01115           //        }
01116         G4double innerRadius;
01117         //        if (_element.inRset){
01118         innerRadius = _element.inR*m;
01119         //        } else {
01120         //          innerRadius = beamPipeRadius;
01121         //        }
01122         G4double outerRadius = _element.outR*m;
01123         
01124         G4cout << "BDSMuSpoiler: " << name << " " << length/m << " " << outerRadius/m << " " << innerRadius/m << " " << _bField/tesla << " " << beamPipeRadius/m << G4endl;
01125 
01126         return (new BDSMuSpoiler(name,
01127                                                length,
01128                                                beamPipeRadius,
01129                                                innerRadius,
01130                                                outerRadius,
01131                                                _bField, 
01132                                                _element.blmLocZ,
01133                                                _element.blmLocTheta,
01134                                                _element.tunnelMaterial));
01135       
01136   }
01137 
01138 BDSAcceleratorComponent* BDSComponentFactory::createLaser(){
01139         if(_element.l == 0) _element.l = 1e-8;
01140         
01141 #ifdef DEBUG 
01142         G4cout << "---->creating Laser,"
01143                << " name= "<< _element.name
01144                << " l=" << _element.l/m<<"m"
01145                << " lambda= " << _element.waveLength/m << "m"
01146                << " xSigma= " << _element.xsize/m << "m"
01147                << " ySigma= " << _element.ysize/m << "m"
01148                << " xdir= " << _element.xdir
01149                << " ydir= " << _element.ydir
01150                << " zdir= " << _element.zdir
01151                << G4endl;
01152 #endif
01153         
01154         G4ThreeVector direction = 
01155           G4ThreeVector(_element.xdir,_element.ydir,_element.zdir);
01156         G4ThreeVector position  = G4ThreeVector(0,0,0);
01157         
01158          return (new BDSLaserWire( _element.name,
01159                                                 _element.l,
01160                                                 _element.waveLength,
01161                                                 direction) );
01162         
01163 }
01164 
01165 BDSAcceleratorComponent* BDSComponentFactory::createTransform3D(){
01166         
01167 #ifdef DEBUG 
01168         G4cout << "---->creating Transform3d,"
01169                << " name= " << _element.name
01170                << " xdir= " << _element.xdir/m << "m"
01171                << " ydir= " << _element.ydir/m << "m"
01172                << " zdir= " << _element.zdir/m << "m"
01173                << " phi= " << _element.phi/rad << "rad"
01174                << " theta= " << _element.theta/rad << "rad"
01175                << " psi= " << _element.psi/rad << "rad"
01176                << G4endl;
01177 #endif
01178         
01179          return (new BDSTransform3D( _element.name,
01180                                                   _element.xdir *m,
01181                                                   _element.ydir *m,
01182                                                   _element.zdir *m,
01183                                                   _element.phi *rad,
01184                                                   _element.theta *rad,
01185                                                   _element.psi *rad ) );
01186         
01187       
01188 }
01189 
01190 

Generated on 27 Aug 2013 for BDSIM by  doxygen 1.4.7