00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "BesDetectorConstruction.hh"
00012 #include "BesMagneticField.hh"
00013
00014 #include "BesMdcConstruction.hh"
00015 #include "BesTofConstruction.hh"
00016 #include "BesEmcConstruction.hh"
00017 #include "BesMucConstruction.hh"
00018
00019 #include "G4VisAttributes.hh"
00020 #include "G4Colour.hh"
00021 #include "globals.hh"
00022 #include <cstdlib>
00023 #include <fstream>
00024 #include "ReadBoostRoot.hh"
00025 #include "GDMLProcessor.hh"
00026 #include "GDMLExpressionEvaluator.hh"
00027 #include "G4Box.hh"
00028 #include "G4Tubs.hh"
00029
00030 #include "G4BooleanSolid.hh"
00031 #include "G4Geo/BesG4Geo.h"
00032
00033 BesDetectorConstruction::BesDetectorConstruction()
00034 {
00035
00036
00037
00038 if(ReadBoostRoot::GetField())
00039 besField = new BesMagneticField();
00040
00041 mdc = new BesMdcConstruction();
00042 tof = new BesTofConstruction();
00043 emc = new BesEmcConstruction();
00044 muc = new BesMucConstruction();
00045 m_SCM = new BesSCM();
00046 m_Pip = new BesPip();
00047 m_pipeSCM = 2;
00048 lWorld=0;
00049 fWorld=0;
00050 }
00051
00052 BesDetectorConstruction::~BesDetectorConstruction()
00053 {
00054 G4cout<<"BesDetectorConstruction::~BesDetectorConstruction()"<<G4endl;
00055 if(ReadBoostRoot::GetField() && besField)
00056 delete besField;
00057 if(mdc) delete mdc;
00058 if(tof) delete tof;
00059 if(emc) delete emc;
00060 if(muc) delete muc;
00061 if(m_SCM) delete m_SCM;
00062 if(m_Pip) delete m_Pip;
00063 }
00064
00065 G4VPhysicalVolume* BesDetectorConstruction::Construct()
00066 {
00067 if(m_pipeSCM != 2)
00068 {
00069
00070 G4double a, z, density,abundance,fractionmass;
00071 G4double temperature, pressure;
00072 G4int iz,n,nel,ncomponents,natoms;
00073 G4String name,symbol;
00074 G4Isotope* U5 = new G4Isotope(name="U235", iz=92, n=235, a=235.01*g/mole);
00075 G4Isotope* U8 = new G4Isotope(name="U238", iz=92, n=238, a=238.03*g/mole);
00076
00077 G4Element* U = new G4Element(name="enriched Uranium",symbol="U",ncomponents=2);
00078 U->AddIsotope(U5, abundance= 90.*perCent);
00079 U->AddIsotope(U8, abundance= 10.*perCent);
00080
00081 a = 1.01*g/mole;
00082 G4Element* H = new G4Element(name="Hydrogen",symbol="H" , z= 1., a);
00083
00084 a = 12.01*g/mole;
00085 G4Element* C = new G4Element(name="Carbon" ,symbol="C" , z= 6., a);
00086
00087 a = 14.01*g/mole;
00088 G4Element* N = new G4Element(name="Nitrogen",symbol="N" , z= 7., a);
00089
00090 a = 16.00*g/mole;
00091 G4Element* O = new G4Element(name="Oxygen" ,symbol="O" , z= 8., a);
00092
00093 a=28.09*g/mole;
00094 G4Element* Si = new G4Element(name="Silicon",symbol="Si",z=14.,a);
00095
00096 a=126.90447*g/mole;
00097 G4Element* I = new G4Element(name="Iodine",symbol="I",z=53.,a);
00098
00099 a=132.90545*g/mole;
00100 G4Element* Cs = new G4Element(name="Cesium",symbol="Cs",z=55.,a);
00101
00102 density = 1.848*g/cm3;
00103 a = 9.012182*g/mole;
00104 G4Material* Beryllium = new G4Material(name="Beryllium",z=4.0,a,density);
00105
00106 density = 2.70*g/cm3;
00107 a = 26.98*g/mole;
00108 G4Material* Aluminium = new G4Material(name="Aluminium",z=13.,a,density);
00109
00110 density = 7.84*g/cm3;
00111 a = 55.845*g/mole;
00112 G4Material* Iron = new G4Material(name="Iron",z=26.0,a,density);
00113
00114 density = 8.96*g/cm3;
00115 a = 63.546*g/mole;
00116 G4Material* Copper = new G4Material(name="Copper",z=29.0,a,density);
00117
00118 density = 0.0001664*g/cm3;
00119 a = 4.0026*g/mole;
00120 G4Material* Hegas = new G4Material(name="Hegas",z=2.0,a,density);
00121
00122 density = 0.001879*g/cm3;
00123 G4Material* Propane = new G4Material(name="Propane",density,nel=2);
00124 Propane->AddElement(C, natoms=3);
00125 Propane->AddElement(H, natoms=8);
00126
00127 density = 4.53*g/cm3;
00128 G4Material* Cesiumiodide = new G4Material(name="Cesiumiodide",density,nel=2);
00129 Cesiumiodide->AddElement(I, natoms=1);
00130 Cesiumiodide->AddElement(Cs, natoms=1);
00131
00132 density = 0.00085144*g/cm3;
00133 G4Material* Mdcgas = new G4Material(name="Mdcgas",density,nel=2);
00134 Mdcgas->AddMaterial(Hegas, fractionmass = 0.1173);
00135 Mdcgas->AddMaterial(Propane, fractionmass = 0.8827);
00136
00137 density = 1.390*g/cm3;
00138 a = 39.95*g/mole;
00139 G4Material* liquidArgon = new G4Material(name="liquidArgon",z=18.0,a,density);
00140
00141 density = 11.35*g/cm3;
00142 a = 207.19*g/mole;
00143 G4Material* Lead = new G4Material(name="Lead",z=82.,a,density);
00144
00145 density = 1.0*g/cm3;
00146 G4Material* Water = new G4Material(name="Water", density, nel=2);
00147 Water->AddElement(H, natoms=2);
00148 Water->AddElement(O, natoms=1);
00149
00150 density = 1.032*g/cm3;
00151 G4Material* Scintillator = new G4Material(name="Scintillator", density, nel=2);
00152 Scintillator->AddElement(C, natoms=9);
00153 Scintillator->AddElement(H, natoms=10);
00154
00155 density = 2.200*g/cm3;
00156 G4Material* SiO2 = new G4Material(name="SiO2", density, nel=2);
00157 SiO2->AddElement(Si, natoms=1);
00158 SiO2->AddElement(O, natoms=2);
00159
00160 density = 1.290*mg/cm3;
00161 G4Material* Air = new G4Material(name="Air",density,nel=2);
00162 Air->AddElement(N, fractionmass = 0.7);
00163 Air->AddElement(O, fractionmass = 0.3);
00164
00165 density = 0.200*g/cm3;
00166 G4Material* Aerogel = new G4Material(name="Aerogel",density,nel=3);
00167 Aerogel->AddMaterial(SiO2, fractionmass = 0.625);
00168 Aerogel->AddMaterial(Water, fractionmass = 0.374);
00169 Aerogel->AddElement(C, fractionmass = 0.001);
00170
00171 density = 27.0*mg/cm3;
00172 pressure = 50.0*atmosphere;
00173 temperature = 325.0*kelvin;
00174 G4Material* CarbonicGas = new G4Material(name="CarbonicGas",density,nel=2,kStateGas,temperature,pressure);
00175 CarbonicGas->AddElement(C,natoms=1);
00176 CarbonicGas->AddElement(O,natoms=2);
00177
00178 density = 0.3*mg/cm3;
00179 pressure = 2.0*atmosphere;
00180 temperature = 500.0*kelvin;
00181 G4Material* WaterSteam = new G4Material(name="WaterSteam",density,nel=1,kStateGas,temperature,pressure);
00182 WaterSteam->AddMaterial(Water,fractionmass=1);
00183
00184 density = universe_mean_density;
00185 pressure = 3.e-18*pascal;
00186 temperature = 2.73*kelvin;
00187 G4Material* Galactic = new G4Material(name="Galactic", z=1., a=1.01*g/mole,
00188 density,kStateGas,temperature,pressure);
00189
00190 density = 1.0e-5*g/cm3;
00191 pressure = 2.e-2*bar;
00192 G4Material* Beam = new G4Material(name="Beam",density,nel=1,kStateGas,STP_Temperature,pressure);
00193 Beam->AddMaterial(Air,fractionmass=1.0);
00194
00195
00196 G4Box* sWorld = new G4Box("solidWorld",263.5*cm,263.5*cm,287.5*cm);
00197 lWorld = new G4LogicalVolume(sWorld,Air,"logicalWorld",0,0,0);
00198 fWorld = new G4PVPlacement(0,G4ThreeVector(0,0,0),lWorld,"physicWorld",0,false,0);
00199
00200 lWorld -> SetVisAttributes(G4VisAttributes::Invisible);
00201
00202 if( m_pipeSCM == 1 )
00203 {
00204 G4cout<<"construct beampipe and SCM with Geant4 classes"<<G4endl;
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 m_Pip->Construct(lWorld);
00229 m_SCM->Construct(lWorld);
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 }
00274 }
00275
00276 else if(m_pipeSCM == 2)
00277 {
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 SetVisAttributes("Pip_SCM");
00339
00340 }
00341
00342
00343 if(ReadBoostRoot::GetMdc())
00344 mdc->Construct(lWorld);
00345 if(ReadBoostRoot::GetTof())
00346 tof->Construct(lWorld);
00347 if(ReadBoostRoot::GetEmc())
00348 emc->Construct(lWorld);
00349 if(ReadBoostRoot::GetMuc())
00350 muc->Construct(lWorld);
00351
00352 G4cout<<"get world "<<fWorld->GetLogicalVolume()->GetNoDaughters()<<endl;
00353 for(int nd = 0; nd < fWorld->GetLogicalVolume()->GetNoDaughters(); nd++)
00354 {
00355 G4cout<<"daughter n: name :"<<nd<<" "<<fWorld->GetLogicalVolume()->GetDaughter(nd)->GetName()<<G4endl;
00356
00357 }
00358
00359 return fWorld;
00360 }
00361
00362 G4LogicalVolume* BesDetectorConstruction::FindLogicalVolume(const G4String& vn )
00363 {
00364 return const_cast<G4LogicalVolume*>( GDMLProcessor::GetInstance()->GetLogicalVolume(vn) );
00365 }
00366
00367 void BesDetectorConstruction::SetVisAttributes(G4String volumeName)
00368 {
00369 if(volumeName = "Pip_SCM")
00370 {
00371 BesG4Geo* aBesG4Geo = new BesG4Geo();
00372 fWorld=(G4VPhysicalVolume *)GDMLProcessor::GetInstance()->GetWorldVolume();
00373 if( fWorld == 0 ) {
00374 G4Exception(
00375 "World volume not set properly check your setup selection criteria or GDML input!");
00376 }
00377
00378
00379 lWorld = FindLogicalVolume("logicalWorld");
00380 lWorld -> SetVisAttributes(G4VisAttributes::Invisible);
00381
00382
00383
00384 G4LogicalVolume* logicalPip = FindLogicalVolume("logicalPip");
00385 G4LogicalVolume* logicalgoldLayer = FindLogicalVolume("logicalgoldLayer");
00386 G4LogicalVolume* logicalinnerBe = FindLogicalVolume("logicalinnerBe");
00387 G4LogicalVolume* logicaloilLayer = FindLogicalVolume("logicaloilLayer");
00388 G4LogicalVolume* logicalouterBe = FindLogicalVolume("logicalouterBe");
00389 G4LogicalVolume* logicalinnerBeSide = FindLogicalVolume("logicalinnerBeSide");
00390 G4LogicalVolume* logicalinnerAl = FindLogicalVolume("logicalinnerAl");
00391 G4LogicalVolume* logicalAlRing = FindLogicalVolume("logicalAlRing");
00392 G4LogicalVolume* logicalouterAl = FindLogicalVolume("logicalouterAl");
00393 G4LogicalVolume* logicalAgLayer = FindLogicalVolume("logicalAgLayer");
00394 G4LogicalVolume* logicalCuLayer = FindLogicalVolume("logicalCuLayer");
00395 G4LogicalVolume* logicalAlCover = FindLogicalVolume("logicalAlCover");
00396
00397 logicalPip->SetVisAttributes(G4VisAttributes::Invisible);
00398 logicalgoldLayer->SetVisAttributes(G4VisAttributes::Invisible);
00399 logicalinnerBe->SetVisAttributes(G4VisAttributes::Invisible);
00400 logicaloilLayer->SetVisAttributes(G4VisAttributes::Invisible);
00401 logicalouterBe->SetVisAttributes(G4VisAttributes::Invisible);
00402 logicalinnerBeSide->SetVisAttributes(G4VisAttributes::Invisible);
00403 logicalinnerAl->SetVisAttributes(G4VisAttributes::Invisible);
00404 logicalAlRing->SetVisAttributes(G4VisAttributes::Invisible);
00405 logicalouterAl->SetVisAttributes(G4VisAttributes::Invisible);
00406 logicalAgLayer->SetVisAttributes(G4VisAttributes::Invisible);
00407 logicalCuLayer->SetVisAttributes(G4VisAttributes::Invisible);
00408 logicalAlCover->SetVisAttributes(G4VisAttributes::Invisible);
00409
00410
00411 G4LogicalVolume* logicalSCM = FindLogicalVolume("logicalSCM");
00412 G4LogicalVolume* logicalinnCryo = FindLogicalVolume("logicalinnCryo");
00413 G4LogicalVolume* logicalouterCryo =FindLogicalVolume("logicalouterCryo");
00414 G4LogicalVolume* logicalendCryo = FindLogicalVolume("logicalendCryo");
00415 G4LogicalVolume* logicall1Adia = FindLogicalVolume("logicall1Adia");
00416 G4LogicalVolume* logicall2Adia = FindLogicalVolume("logicall2Adia");
00417 G4LogicalVolume* logicall3Adia = FindLogicalVolume("logicall3Adia");
00418 G4LogicalVolume* logicall4Adia = FindLogicalVolume("logicall4Adia");
00419 G4LogicalVolume* logicalinnShield = FindLogicalVolume("logicalinnShield");
00420 G4LogicalVolume* logicaloutShield = FindLogicalVolume("logicaloutShield");
00421 G4LogicalVolume* logicalendShield = FindLogicalVolume("logicalendShield");
00422 G4LogicalVolume* logicall1insu = FindLogicalVolume("logicall1insu");
00423 G4LogicalVolume* logicall2insu = FindLogicalVolume("logicall2insu");
00424 G4LogicalVolume* logicalcoil = FindLogicalVolume("logicalcoil");
00425 G4LogicalVolume* logicalendCoil = FindLogicalVolume("logicalendCoil");
00426 G4LogicalVolume* logicalsupp = FindLogicalVolume("logicalsupp");
00427 G4LogicalVolume* logicalpipe1 = FindLogicalVolume("logicalpipe1");
00428 G4LogicalVolume* logicalpipe2 = FindLogicalVolume("logicalpipe2");
00429 G4LogicalVolume* logicalpipe3 = FindLogicalVolume("logicalpipe3");
00430 G4LogicalVolume* logicaltub17 = FindLogicalVolume("logicaltub17");
00431 G4LogicalVolume* logicaltub19 = FindLogicalVolume("logicaltub19");
00432 G4LogicalVolume* logicaltub20 = FindLogicalVolume("logicaltub20");
00433 G4LogicalVolume* logicaltub22 = FindLogicalVolume("logicaltub22");
00434 G4LogicalVolume* logicaltub23 = FindLogicalVolume("logicaltub23");
00435 G4LogicalVolume* logicaltub25 = FindLogicalVolume("logicaltub25");
00436 G4LogicalVolume* logicalsub1 = FindLogicalVolume("logicalsub1");
00437 G4LogicalVolume* logicalsub2 = FindLogicalVolume("logicalsub2");
00438 G4LogicalVolume* logicalsub3 = FindLogicalVolume("logicalsub3");
00439 G4LogicalVolume* logicalhole1 = FindLogicalVolume("logicalhole1");
00440 G4LogicalVolume* logicalhole2 = FindLogicalVolume("logicalhole2");
00441 G4LogicalVolume* logicalhole3 = FindLogicalVolume("logicalhole3");
00442 G4LogicalVolume* logicalhole4 = FindLogicalVolume("logicalhole4");
00443 G4LogicalVolume* logicalhole5 = FindLogicalVolume("logicalhole5");
00444
00445
00446 logicalSCM->SetVisAttributes(G4VisAttributes::Invisible);
00447
00448 logicalinnCryo->SetVisAttributes(G4VisAttributes::Invisible);
00449
00450 logicalouterCryo->SetVisAttributes(G4VisAttributes::Invisible);
00451
00452 logicalendCryo->SetVisAttributes(G4VisAttributes::Invisible);
00453
00454
00455 logicall1Adia->SetVisAttributes(G4VisAttributes::Invisible);
00456
00457 logicall2Adia->SetVisAttributes(G4VisAttributes::Invisible);
00458
00459 logicall3Adia->SetVisAttributes(G4VisAttributes::Invisible);
00460
00461 logicall4Adia->SetVisAttributes(G4VisAttributes::Invisible);
00462
00463
00464 logicalinnShield->SetVisAttributes(G4VisAttributes::Invisible);
00465
00466 logicaloutShield->SetVisAttributes(G4VisAttributes::Invisible);
00467
00468 logicalendShield->SetVisAttributes(G4VisAttributes::Invisible);
00469
00470
00471
00472 logicall1insu->SetVisAttributes(G4VisAttributes::Invisible);
00473
00474 logicall2insu->SetVisAttributes(G4VisAttributes::Invisible);
00475
00476
00477 logicalcoil->SetVisAttributes(G4VisAttributes::Invisible);
00478
00479 logicalendCoil->SetVisAttributes(G4VisAttributes::Invisible);
00480
00481
00482 logicalsupp->SetVisAttributes(G4VisAttributes::Invisible);
00483
00484
00485 logicalpipe1->SetVisAttributes(G4VisAttributes::Invisible);
00486
00487 logicalpipe2->SetVisAttributes(G4VisAttributes::Invisible);
00488 logicalpipe3->SetVisAttributes(G4VisAttributes::Invisible);
00489
00490 logicaltub17->SetVisAttributes(G4VisAttributes::Invisible);
00491
00492 logicaltub19->SetVisAttributes(G4VisAttributes::Invisible);
00493
00494 logicaltub20->SetVisAttributes(G4VisAttributes::Invisible);
00495
00496 logicaltub22->SetVisAttributes(G4VisAttributes::Invisible);
00497
00498 logicaltub23->SetVisAttributes(G4VisAttributes::Invisible);
00499
00500 logicaltub25->SetVisAttributes(G4VisAttributes::Invisible);
00501
00502 logicalsub1->SetVisAttributes(G4VisAttributes::Invisible);
00503
00504 logicalsub2->SetVisAttributes(G4VisAttributes::Invisible);
00505
00506
00507 logicalsub3->SetVisAttributes(G4VisAttributes::Invisible);
00508
00509 logicalhole1->SetVisAttributes(G4VisAttributes::Invisible);
00510
00511 logicalhole2->SetVisAttributes(G4VisAttributes::Invisible);
00512
00513 logicalhole3->SetVisAttributes(G4VisAttributes::Invisible);
00514
00515 logicalhole4->SetVisAttributes(G4VisAttributes::Invisible);
00516
00517 logicalhole5->SetVisAttributes(G4VisAttributes::Invisible);
00518
00519 delete aBesG4Geo;
00520 }
00521 }