00001 #include "BDSComponentFactory.hh"
00002 #include "BDSExecOptions.hh"
00003
00004
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
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
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
00043
00044
00045
00046 _charge = BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGCharge();
00047
00048 _momentum = BDSGlobalConstants::Instance()->GetBeamMomentum()/GeV;
00049
00050 _brho = BDSGlobalConstants::Instance()->GetFFact()*( _momentum / (0.299792458 * _charge));
00051
00052
00053 _brho *= (tesla*m);
00054 if (verbose || debug1) G4cout << "Rigidity (Brho) : "<< fabs(_brho)/(tesla*m) << " T*m"<<G4endl;
00055
00056
00057
00058 _bpRad=BDSGlobalConstants::Instance()->GetBeampipeRadius();
00059 if (verbose || debug1) G4cout<<"Default pipe outer radius= "<<_bpRad/m<< "m"
00060 << G4endl;
00061
00062
00063
00064
00065 _FeRad = _bpRad;
00066 if (verbose || debug1) G4cout<<"Default magnet inner radius= "<<_FeRad/m<< "m"
00067 << G4endl;
00068
00069
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
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;
00206 if( _element.aperX > 0 ) aperX = _element.aperX * m;
00207 if( _element.aperY > 0 ) aperY = _element.aperY * m;
00208 if( (aperX>0) || (aperY>0)){
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())
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
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
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){
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
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)){
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())
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)
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
00371
00372 G4double aper = _bpRad;
00373 if( _element.aper > 0 ) aper = _element.aper * m;
00374 if( (_element.aperX>0) || (_element.aperY>0)){
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
00389 G4double length = _element.l*m;
00390 G4double magFieldLength = length;
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
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
00420
00421
00422 _bPrime = - _brho * (_element.k1 / (m*m)) * _synch_factor;
00423
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
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
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
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;
00479 G4double magFieldLength = 2*std::min (
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
00488
00489
00490
00491 if(_element.B != 0){
00492
00493 _bField = _element.B * tesla;
00494 G4double rho = _brho/_bField;
00495
00496 _element.angle = - 2.0*asin(length/2.0/rho);
00497 }
00498 else{
00499 _element.angle *= -1;
00500
00501
00502 G4double arclength = 0.5*magFieldLength * _element.angle / sin(_element.angle/2.0);
00503
00504 _bField = - _brho * _element.angle / arclength;
00505 _element.B = _bField/tesla;
00506 }
00507
00508
00509
00510
00511
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
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
00558
00559 if(_element.B != 0){
00560
00561 _bField = _element.B * tesla;
00562 _element.angle = -_bField * length / _brho;
00563 }
00564 else{
00565
00566 _bField = - _brho * _element.angle / length;
00567 _element.B = _bField/tesla;
00568 }
00569
00570
00571
00572
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
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
00626
00627 if(_element.B != 0){
00628
00629 _bField = _element.B * tesla;
00630 _element.angle = -_bField * length / _brho;
00631 }
00632 else{
00633
00634 _bField = - _brho * _element.angle / length;
00635 _element.B = _bField/tesla;
00636 }
00637
00638
00639
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
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
00692
00693
00694
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
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
00731
00732
00733
00734
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
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
00787
00788
00789
00790
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
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
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
00908
00909 G4double aper = _bpRad;
00910 if( _element.aper > 1.e-10*m ) aper = _element.aper * m;
00911
00912
00913
00914
00915
00916
00917
00918
00919
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
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
00976
00977
00978
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
01071
01072
01073
01074
01075
01076
01077
01078
01079
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
01112 beamPipeRadius = _element.aper*m;
01113
01114
01115
01116 G4double innerRadius;
01117
01118 innerRadius = _element.inR*m;
01119
01120
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