00001 #include "PartProduce.hh"
00002
00003 #include "G4LogicalVolume.hh"
00004 #include "G4VPhysicalVolume.hh"
00005 #include "G4PVPlacement.hh"
00006 #include "G4Trd.hh"
00007 #include "G4Box.hh"
00008 #include "G4Transform3D.hh"
00009 #include "G4UnionSolid.hh"
00010 #include "G4Trap.hh"
00011 #include "G4Tubs.hh"
00012 #include "G4Cons.hh"
00013 #include "G4SubtractionSolid.hh"
00014 #include "G4IntersectionSolid.hh"
00015 #include "G4VisAttributes.hh"
00016
00017 using namespace std;
00018
00019 G4double smallL = 0.01*mm;
00020 G4RotationMatrix rot_dummy(0*deg,0*deg,0*deg);
00021 bool checkOverlap = false;
00022 std::ostringstream Name;
00023
00024
00025 PartProduce::PartProduce()
00026 {
00027 IniParam();
00028 }
00029
00030 PartProduce::~PartProduce()
00031 {
00032 }
00033
00034 void PartProduce::IniParam()
00035 {
00036 tofPara = BesTofGeoParameter::GetInstance();
00037
00038
00039 containerOut_xdown = tofPara->Get("containerOut_xdown");
00040 containerOut_xup = tofPara->Get("containerOut_xup");
00041 containerOut_y = tofPara->Get("containerOut_y");
00042 containerOut_z = tofPara->Get("containerOut_z");
00043 container_thickness = tofPara->Get("container_thickness");
00044 container_lowBorder = tofPara->Get("container_lowBorder");
00045
00046 containerIn_xdown = tofPara->Get("containerIn_xdown");
00047 containerIn_xup = tofPara->Get("containerIn_xup");
00048 containerIn_y = tofPara->Get("containerIn_y");
00049 containerIn_z = tofPara->Get("containerIn_z");
00050
00051 upCover_xdown = tofPara->Get("upCover_xdown");
00052 upCover_xup = tofPara->Get("upCover_xup");
00053 upCover_y = tofPara->Get("upCover_y");
00054 upCover_z = tofPara->Get("upCover_z");
00055 upCover_posz = tofPara->Get("upCover_posz");
00056
00057 lowCover1_xdown = tofPara->Get("lowCover1_xdown");
00058 lowCover1_xup = tofPara->Get("lowCover1_xup");
00059 lowCover1_y = tofPara->Get("lowCover1_y");
00060 lowCover1_z = tofPara->Get("lowCover1_z");
00061 lowCover1_addx = tofPara->Get("lowCover1_addx");
00062 lowCover1_addz = tofPara->Get("lowCover1_addz");
00063 lowCover1_posz = tofPara->Get("lowCover1_posz");
00064
00065 lowCover2_xdown = tofPara->Get("lowCover2_xdown");
00066 lowCover2_xup = tofPara->Get("lowCover2_xup");
00067 lowCover2_y = tofPara->Get("lowCover2_y");
00068 lowCover2_z = tofPara->Get("lowCover2_z");
00069 lowCover2_posz = tofPara->Get("lowCover2_posz");
00070
00071 upFEE_xdown = tofPara->Get("upFEE_xdown");
00072 upFEE_xup = tofPara->Get("upFEE_xup");
00073 upFEE_y = tofPara->Get("upFEE_y");
00074 upFEE_z = tofPara->Get("upFEE_z");
00075 FEE_thickness = tofPara->Get("FEE_thickness");
00076 upFEE_posz = tofPara->Get("upFEE_posz");
00077
00078 upFEE_pcb_xdown = tofPara->Get("upFEE_pcb_xdown");
00079 upFEE_pcb_xup = tofPara->Get("upFEE_pcb_xup");
00080 upFEE_pcb_y = tofPara->Get("upFEE_pcb_y");
00081 upFEE_pcb_z = tofPara->Get("upFEE_pcb_z");
00082
00083 sideFEE_x = tofPara->Get("sideFEE_x");
00084 sideFEE_y = tofPara->Get("sideFEE_y");
00085 sideFEE_z = tofPara->Get("sideFEE_z");
00086 sideFEE_posl = tofPara->Get("sideFEE_posl");
00087
00088 sideFEE_pcb_x = tofPara->Get("sideFEE_pcb_x");
00089 sideFEE_pcb_y = tofPara->Get("sideFEE_pcb_y");
00090 sideFEE_pcb_z = tofPara->Get("sideFEE_pcb_z");
00091
00092 castingDie_x = tofPara->Get("castingDie_x");
00093 castingDie_y = tofPara->Get("castingDie_y");
00094 castingDie_z = tofPara->Get("castingDie_z");
00095 castingDie_addr = tofPara->Get("castingDie_addr");
00096 castingDie_subtractx = tofPara->Get("castingDie_subtractx");
00097 castingDie_subtract_posz = tofPara->Get("castingDie_subtract_posz");
00098 castingDie_posz1 = tofPara->Get("castingDie_posz1");
00099 castingDie_posz2 = tofPara->Get("castingDie_posz2");
00100
00101 chamber_in_posy = tofPara->Get("chamber_in_posy");
00102 chamber_out_posy = tofPara->Get("chamber_out_posy");
00103
00104 bracket_x = tofPara->Get("bracket_x");
00105 bracket_y = tofPara->Get("bracket_y");
00106 bracket_z = tofPara->Get("bracket_z");
00107 bracket_r = tofPara->Get("bracket_r");
00108 bracket_posx = tofPara->Get("bracket_posx");
00109
00110 upStopBlock_x = tofPara->Get("upStopBlock_x");
00111 upStopBlock_y = tofPara->Get("upStopBlock_y");
00112 upStopBlock_z = tofPara->Get("upStopBlock_z");
00113 upStopBlock_subtractr = tofPara->Get("upStopBlock_subtractr");
00114 upStopBlock_subtractposz = tofPara->Get("upStopBlock_subtractposz");
00115
00116 sideStopBlock_x = tofPara->Get("sideStopBlock_x");
00117 sideStopBlock_y = tofPara->Get("sideStopBlock_y");
00118 sideStopBlock_z = tofPara->Get("sideStopBlock_z");
00119 sideStopBlock_thickness = tofPara->Get("sideStopBlock_thickness");
00120 sideStopBlock_posz0 = tofPara->Get("sideStopBlock_posz0");
00121 sideStopBlock_posz1 = tofPara->Get("sideStopBlock_posz1");
00122
00123
00124 honeyComb_xdown = tofPara->Get("honeyComb_xdown");
00125 honeyComb_xup = tofPara->Get("honeyComb_xup");
00126 honeyComb_y = tofPara->Get("honeyComb_y");
00127 honeyComb_z = tofPara->Get("honeyComb_z");
00128 honeyComb_surface_y = tofPara->Get("honeyComb_surface_y");
00129 honeyComb_posz = tofPara->Get("honeyComb_posz");
00130
00131 tape_mrpc_xdown = tofPara->Get("tape_mrpc_xdown");
00132 tape_mrpc_xup = tofPara->Get("tape_mrpc_xup");
00133 tape_mrpc_y = tofPara->Get("tape_mrpc_y");
00134 tape_mrpc_z = tofPara->Get("tape_mrpc_z");
00135 tape_mrpc_posz = tofPara->Get("tape_mrpc_posz");
00136
00137 pcbBoard_xdown = tofPara->Get("pcbBoard_xdown");
00138 pcbBoard_xup = tofPara->Get("pcbBoard_xup");
00139 pcbBoard_y0 = tofPara->Get("pcbBoard_y0");
00140 pcbBoard_y1 = tofPara->Get("pcbBoard_y1");
00141 pcbBoard_z = tofPara->Get("pcbBoard_z");
00142
00143 strip_x[0] = tofPara->Get("strip_x[0]");
00144 strip_x[1] = tofPara->Get("strip_x[1]");
00145 strip_x[2] = tofPara->Get("strip_x[2]");
00146 strip_x[3] = tofPara->Get("strip_x[3]");
00147 strip_x[4] = tofPara->Get("strip_x[4]");
00148 strip_x[5] = tofPara->Get("strip_x[5]");
00149 strip_x[6] = tofPara->Get("strip_x[6]");
00150 strip_x[7] = tofPara->Get("strip_x[7]");
00151 strip_x[8] = tofPara->Get("strip_x[8]");
00152 strip_x[9] = tofPara->Get("strip_x[9]");
00153 strip_x[10] = tofPara->Get("strip_x[10]");
00154 strip_x[11] = tofPara->Get("strip_x[11]");
00155 strip_y = tofPara->Get("strip_y");
00156 strip_z = tofPara->Get("strip_z");
00157 strip_gap = tofPara->Get("strip_gap");
00158 strip_posz = tofPara->Get("strip_posz");
00159
00160 mylar_xdown = tofPara->Get("mylar_xdown");
00161 mylar_xup = tofPara->Get("mylar_xup");
00162 mylar_y = tofPara->Get("mylar_y");
00163 mylar_z = tofPara->Get("mylar_z");
00164 mylar_posz = tofPara->Get("mylar_posz");
00165
00166 glass0_xdown = tofPara->Get("glass0_xdown");
00167 glass0_xup = tofPara->Get("glass0_xup");
00168 glass0_y = tofPara->Get("glass0_y");
00169 glass0_z = tofPara->Get("glass0_z");
00170 glass0_posz = tofPara->Get("glass0_posz");
00171
00172 glass1_xdown = tofPara->Get("glass1_xdown");
00173 glass1_xup = tofPara->Get("glass1_xup");
00174 glass1_y = tofPara->Get("glass1_y");
00175 glass1_z = tofPara->Get("glass1_z");
00176 glass1_posz = tofPara->Get("glass1_posz");
00177
00178 gasLayer_xdown = tofPara->Get("gasLayer_xdown");
00179 gasLayer_xup = tofPara->Get("gasLayer_xup");
00180 gasLayer_y = tofPara->Get("gasLayer_y");
00181 gasLayer_z = tofPara->Get("gasLayer_z");
00182 gasLayer_posz = tofPara->Get("gasLayer_posz");
00183
00184 endcap_r = tofPara->Get("endcap_r");
00185 endcap_length = tofPara->Get("endcap_length");
00186 layer_posz = tofPara->Get("layer_posz");
00187 startAngle_east = tofPara->Get("startAngle_east");
00188 startAngle_west = tofPara->Get("startAngle_west");
00189 }
00190
00191
00192 G4VSolid* PartProduce::sd_containerOut(double smallL, string name)
00193 {
00194 G4Trd* solid_containerOut = new G4Trd(name, containerOut_xdown/2+smallL, containerOut_xup/2+smallL, containerOut_y/2+smallL, containerOut_y/2+smallL, containerOut_z/2+smallL);
00195 return solid_containerOut;
00196 }
00197
00198 G4VSolid* PartProduce::sd_containerIn(double smallL, string name)
00199 {
00200 G4Trd* solid_containerIn = new G4Trd(name, containerIn_xdown/2+smallL, containerIn_xup/2+smallL, containerIn_y/2+smallL, containerIn_y/2+smallL, containerIn_z/2+smallL);
00201 return solid_containerIn;
00202 }
00203
00204 G4LogicalVolume* PartProduce::lg_containerFrame(string name)
00205 {
00206 Name.str("");
00207 Name<<"solid_containerOut_"<<name;
00208 G4VSolid* solid_containerOut = sd_containerOut(0, Name.str());
00209 Name.str("");
00210 Name<<"solid_containerIn_"<<name;
00211 G4VSolid* solid_containerIn = sd_containerIn(smallL, Name.str());
00212
00213 double lz = (container_lowBorder-container_thickness)/2;
00214 G4ThreeVector translation_containerFrame(0,0,lz);
00215 G4Transform3D transform_containerFrame(rot_dummy, translation_containerFrame);
00216 Name.str("");
00217 Name<<"solid_containerFrame_"<<name;
00218 G4SubtractionSolid* solid_containerFrame = new G4SubtractionSolid(Name.str(), solid_containerOut, solid_containerIn, transform_containerFrame);
00219 G4LogicalVolume* logical_containerFrame = new G4LogicalVolume(solid_containerFrame, G4Material::GetMaterial("Aluminium"), name);
00220
00221 G4VisAttributes* vis = new G4VisAttributes();
00222 vis->SetColor(G4Color(0.5,0.5,0.6));
00223 logical_containerFrame->SetVisAttributes(vis);
00224
00225 return logical_containerFrame;
00226 }
00227
00228 G4VSolid* PartProduce::sd_upCover(double smallL, string name)
00229 {
00230 G4Trd* solid_upCover = new G4Trd(name, upCover_xdown/2+smallL, upCover_xup/2+smallL, upCover_y/2+smallL, upCover_y/2+smallL, upCover_z/2+smallL);
00231 return solid_upCover;
00232 }
00233
00234 G4VSolid* PartProduce::sd_lowCover1(double smallL, string name)
00235 {
00236 Name.str("");
00237 Name<<name<<"_1";
00238 G4Trd* solid_lowCover1_1 = new G4Trd(Name.str(), lowCover1_xdown/2+smallL, lowCover1_xup/2+smallL, lowCover1_y/2+smallL, lowCover1_y/2+smallL, lowCover1_z/2+smallL);
00239
00240 Name.str("");
00241 Name<<name<<"_2";
00242 G4Trd* solid_lowCover1_2 = new G4Trd(Name.str(), lowCover1_addx/2+smallL, lowCover1_addx/2+smallL, lowCover1_y/2+smallL, lowCover1_y/2+smallL, lowCover1_addz/2+smallL);
00243
00244 G4Transform3D transform_lowCover1(rot_dummy, G4ThreeVector(0,0,-(lowCover1_z+lowCover1_addz)/2));
00245 G4UnionSolid* solid_lowCover1 = new G4UnionSolid(name, solid_lowCover1_1, solid_lowCover1_2, transform_lowCover1);
00246 return solid_lowCover1;
00247 }
00248
00249 G4VSolid* PartProduce::sd_lowCover2(double smallL, string name)
00250 {
00251 G4Trd* solid_lowCover2 = new G4Trd(name, lowCover2_xdown/2+smallL, lowCover2_xup/2+smallL, lowCover2_y/2+smallL, lowCover2_y/2+smallL, lowCover2_z/2+smallL);
00252 return solid_lowCover2;
00253 }
00254
00255 G4LogicalVolume* PartProduce::lg_upCover(string name)
00256 {
00257 Name.str("");
00258 Name<<"solid_upCover_"<<name;
00259 G4VSolid* solid_upCover = sd_upCover(0, Name.str());
00260 G4LogicalVolume* logical_upCover = new G4LogicalVolume(solid_upCover, G4Material::GetMaterial("Aluminium"), name);
00261
00262 G4VisAttributes* vis = new G4VisAttributes();
00263 vis->SetColor(G4Color(0.5,0.5,0.6));
00264
00265 logical_upCover->SetVisAttributes(vis);
00266
00267 return logical_upCover;
00268 }
00269
00270 G4LogicalVolume* PartProduce::lg_lowCover1(string name)
00271 {
00272 Name.str("");
00273 Name<<"solid_lowCover1_"<<name;
00274 G4VSolid* solid_lowCover1 = sd_lowCover1(0, Name.str());
00275 G4LogicalVolume* logical_lowCover1 = new G4LogicalVolume(solid_lowCover1, G4Material::GetMaterial("Aluminium"), name);
00276
00277 G4VisAttributes* vis = new G4VisAttributes();
00278 vis->SetColor(G4Color(0.5,0.5,0.6));
00279
00280 logical_lowCover1->SetVisAttributes(vis);
00281
00282 return logical_lowCover1;
00283 }
00284
00285 G4LogicalVolume* PartProduce::lg_lowCover2(string name)
00286 {
00287 Name.str("");
00288 Name<<"solid_lowCover2_"<<name;
00289 G4VSolid* solid_lowCover2 = sd_lowCover2(0, Name.str());
00290 G4LogicalVolume* logical_lowCover2 = new G4LogicalVolume(solid_lowCover2, G4Material::GetMaterial("Aluminium"), name);
00291
00292 G4VisAttributes* vis = new G4VisAttributes();
00293 vis->SetColor(G4Color(0.5,0.5,0.6));
00294
00295 logical_lowCover2->SetVisAttributes(vis);
00296
00297 return logical_lowCover2;
00298 }
00299
00300 G4VSolid* PartProduce::sd_upFEE(double smallL, string name)
00301 {
00302 G4Trd* solid_upFEE = new G4Trd(name, upFEE_xdown/2+smallL, upFEE_xup/2+smallL, upFEE_y/2+smallL, upFEE_y/2+smallL, upFEE_z/2+smallL);
00303 return solid_upFEE;
00304 }
00305
00306 G4LogicalVolume* PartProduce::lg_upFEE_pcb(string name)
00307 {
00308 Name.str("");
00309 Name<<"solid_upFEE_pcb_"<<name;
00310 G4Trd* solid_upFEE_pcb = new G4Trd(Name.str(), upFEE_pcb_xdown/2, upFEE_pcb_xup/2, upFEE_pcb_y/2, upFEE_pcb_y/2, upFEE_pcb_z/2);
00311 G4LogicalVolume* logical_upFEE_pcb = new G4LogicalVolume(solid_upFEE_pcb, G4Material::GetMaterial("insulationBoard"), name);
00312
00313 G4VisAttributes* vis = new G4VisAttributes();
00314 vis->SetForceWireframe(true);
00315 vis->SetColor(G4Color(0.2, 1, 0));
00316 logical_upFEE_pcb->SetVisAttributes(vis);
00317
00318 return logical_upFEE_pcb;
00319 }
00320
00321 G4LogicalVolume* PartProduce::lg_upFEE(string name)
00322 {
00323 Name.str("");
00324 Name<<"solid_upFEE_"<<name;
00325 G4VSolid* solid_upFEE = sd_upFEE(0, Name.str());
00326 G4LogicalVolume* logical_upFEE = new G4LogicalVolume(solid_upFEE, G4Material::GetMaterial("Air"), name);
00327
00328 Name.str("");
00329 Name<<"solid_upFEE_out_"<<name;
00330 G4VSolid* solid_upFEE_out = sd_upFEE(-1*smallL, Name.str());
00331
00332 Name.str("");
00333 Name<<"solid_upFEE_in_"<<name;
00334 G4Trd* solid_upFEE_in = new G4Trd(Name.str(), upFEE_xdown/2-FEE_thickness, upFEE_xup/2-FEE_thickness, upFEE_y/2, upFEE_y/2, upFEE_z/2-FEE_thickness);
00335
00336 Name.str("");
00337 Name<<"solid_upFEE_box_"<<name;
00338 G4Transform3D transform_upFEE(rot_dummy, G4ThreeVector(0, -1*FEE_thickness, 0));
00339 G4SubtractionSolid* solid_upFEE_box = new G4SubtractionSolid(Name.str(), solid_upFEE_out, solid_upFEE_in, transform_upFEE);
00340
00341 Name.str("");
00342 Name<<"logical_upFEE_box_"<<name;
00343 G4LogicalVolume* logical_upFEE_box = new G4LogicalVolume(solid_upFEE_box, G4Material::GetMaterial("Aluminium"), Name.str());
00344
00345 Name.str("");
00346 Name<<"logical_upFEE_pcb_"<<name;
00347 G4LogicalVolume* logical_upFEE_pcb = lg_upFEE_pcb(Name.str());
00348
00349 Name.str("");
00350 Name<<"physical_upFEE_pcb_"<<name;
00351 new G4PVPlacement(0, G4ThreeVector(0,0,0), logical_upFEE_pcb, Name.str(), logical_upFEE, false, 0, checkOverlap);
00352
00353 Name.str("");
00354 Name<<"physical_upFEE_box_"<<name;
00355 new G4PVPlacement(0, G4ThreeVector(0,0,0), logical_upFEE_box, Name.str(), logical_upFEE, false, 0, checkOverlap);
00356
00357 G4VisAttributes* vis = new G4VisAttributes();
00358 vis->SetColor(G4Color(0.2,0.,1));
00359
00360 logical_upFEE_box->SetVisAttributes(vis);
00361
00362 G4VisAttributes* vis1 = new G4VisAttributes();
00363 vis1->SetVisibility(0);
00364 logical_upFEE->SetVisAttributes(vis1);
00365
00366 return logical_upFEE;
00367 }
00368
00369
00370 G4VSolid* PartProduce::sd_sideFEE(double smallL, string name)
00371 {
00372 G4Trd* solid_sideFEE = new G4Trd(name, sideFEE_x/2+smallL, sideFEE_x/2+smallL, sideFEE_y/2+smallL, sideFEE_y/2+smallL, sideFEE_z/2+smallL);
00373 return solid_sideFEE;
00374 }
00375
00376 G4LogicalVolume* PartProduce::lg_sideFEE_pcb(string name)
00377 {
00378 Name.str("");
00379 Name<<"solid_sideFEE_pcb_"<<name;
00380 G4Trd* solid_sideFEE_pcb = new G4Trd(Name.str(), sideFEE_pcb_x/2, sideFEE_pcb_x/2, sideFEE_pcb_y/2, sideFEE_pcb_y/2, sideFEE_pcb_z/2);
00381 G4LogicalVolume* logical_sideFEE_pcb = new G4LogicalVolume(solid_sideFEE_pcb, G4Material::GetMaterial("insulationBoard"), name);
00382
00383 G4VisAttributes* vis = new G4VisAttributes();
00384 vis->SetColor(G4Color(0.2, 1, 0));
00385 logical_sideFEE_pcb->SetVisAttributes(vis);
00386
00387 return logical_sideFEE_pcb;
00388 }
00389
00390 G4LogicalVolume* PartProduce::lg_sideFEE(string name)
00391 {
00392 Name.str("");
00393 Name<<"solid_sideFEE_"<<name;
00394 G4VSolid* solid_sideFEE = sd_sideFEE(0, Name.str());
00395 G4LogicalVolume* logical_sideFEE = new G4LogicalVolume(solid_sideFEE, G4Material::GetMaterial("Air"), name);
00396
00397 Name.str("");
00398 Name<<"solid_sideFEE_out_"<<name;
00399 G4VSolid* solid_sideFEE_out = sd_sideFEE(-1*smallL, Name.str());
00400
00401 Name.str("");
00402 Name<<"solid_sideFEE_in_"<<name;
00403 G4Trd* solid_sideFEE_in = new G4Trd(Name.str(), sideFEE_x/2, sideFEE_x/2, sideFEE_y/2-FEE_thickness, sideFEE_y/2-FEE_thickness, sideFEE_z/2-FEE_thickness);
00404
00405 Name.str("");
00406 Name<<"solid_sideFEE_box_"<<name;
00407 G4Transform3D transform_sideFEE(rot_dummy, G4ThreeVector(FEE_thickness, 0, 0));
00408 G4SubtractionSolid* solid_sideFEE_box = new G4SubtractionSolid(Name.str(), solid_sideFEE_out, solid_sideFEE_in, transform_sideFEE);
00409
00410 Name.str("");
00411 Name<<"logical_sideFEE_box_"<<name;
00412 G4LogicalVolume* logical_sideFEE_box = new G4LogicalVolume(solid_sideFEE_box, G4Material::GetMaterial("Aluminium"), Name.str());
00413
00414 Name.str("");
00415 Name<<"logical_sideFEE_pcb_"<<name;
00416 G4LogicalVolume* logical_sideFEE_pcb = lg_sideFEE_pcb(Name.str());
00417
00418 Name.str("");
00419 Name<<"physical_sideFEE_pcb_"<<name;
00420 new G4PVPlacement(0, G4ThreeVector(0,0,0), logical_sideFEE_pcb, Name.str(), logical_sideFEE, false, 0, checkOverlap);
00421
00422 Name.str("");
00423 Name<<"physical_sideFEE_box_"<<name;
00424 new G4PVPlacement(0, G4ThreeVector(0,0,0), logical_sideFEE_box, Name.str(), logical_sideFEE, false, 0, checkOverlap);
00425
00426 G4VisAttributes* vis = new G4VisAttributes();
00427 vis->SetColor(G4Color(0.2,0.,1));
00428
00429 logical_sideFEE_box->SetVisAttributes(vis);
00430
00431 G4VisAttributes* vis1 = new G4VisAttributes();
00432 vis1->SetVisibility(0);
00433 logical_sideFEE->SetVisAttributes(vis1);
00434
00435 return logical_sideFEE;
00436 }
00437
00438
00439 G4VSolid* PartProduce::sd_castingDie_outline(double smallL, string name)
00440 {
00441 Name.str("");
00442 Name<<name<<"_1";
00443
00444 G4Trd* solid_castingDie_outline_1 = new G4Trd(Name.str(), castingDie_x/2+smallL, castingDie_x/2+smallL, castingDie_y/2+smallL, castingDie_y/2+smallL, castingDie_z/2+smallL*10);
00445 Name.str("");
00446 Name<<name<<"_2";
00447 G4Tubs* solid_castingDie_outline_2 = new G4Tubs(Name.str(), 0, castingDie_addr+smallL, castingDie_z/2+smallL*10, 0*degree, 360*degree);
00448
00449
00450 G4Transform3D transform_castingDie_outline_1(rot_dummy, G4ThreeVector(castingDie_x/2-0.1*mm,0,0));
00451 Name.str("");
00452 Name<<name<<"_3";
00453 G4UnionSolid* solid_castingDie_outline_3 = new G4UnionSolid(Name.str(), solid_castingDie_outline_1, solid_castingDie_outline_2, transform_castingDie_outline_1);
00454
00455 G4Transform3D transform_castingDie_outline_2(rot_dummy, G4ThreeVector(-1*castingDie_x/2+0.1*mm,0,0));
00456 G4UnionSolid* solid_castingDie_outline = new G4UnionSolid(name, solid_castingDie_outline_3, solid_castingDie_outline_2, transform_castingDie_outline_2);
00457 return solid_castingDie_outline;
00458 }
00459
00460 G4LogicalVolume* PartProduce::lg_castingDie(string name)
00461 {
00462 Name.str("");
00463 Name<<"solid_castingDie_outline_"<<name;
00464 G4VSolid* solid_castingDie_outline = sd_castingDie_outline(0, Name.str());
00465
00466 Name.str("");
00467 Name<<"solid_castingDie_subtract_"<<name;
00468 G4Trd* solid_castingDie_subtract = new G4Trd(Name.str(), castingDie_subtractx/2, castingDie_subtractx/2, castingDie_y, castingDie_y, castingDie_z/2);
00469
00470 G4Transform3D transform_castingDie(rot_dummy, G4ThreeVector(0,0,-1*castingDie_subtract_posz));
00471 Name.str("");
00472 Name<<"solid_castingDie_"<<name;
00473 G4SubtractionSolid* solid_castingDie = new G4SubtractionSolid(Name.str(), solid_castingDie_outline, solid_castingDie_subtract, transform_castingDie);
00474 G4LogicalVolume* logical_castingDie = new G4LogicalVolume(solid_castingDie, G4Material::GetMaterial("Aluminium"), name);
00475
00476 G4VisAttributes* vis = new G4VisAttributes();
00477 vis->SetColor(G4Color(0.2,0.,1));
00478
00479
00480 logical_castingDie->SetVisAttributes(vis);
00481
00482 return logical_castingDie;
00483 }
00484
00485 G4LogicalVolume* PartProduce::lg_container(int flag, string name)
00486 {
00487 Name.str("");
00488 Name<<"solid_containerOut_"<<name;
00489 G4VSolid* solid_containerOut = sd_containerOut(smallL, Name.str());
00490
00491
00492 Name.str("");
00493 Name<<"solid_upCover_"<<name;
00494 G4VSolid* solid_upCover = sd_upCover(smallL, Name.str());
00495 G4ThreeVector translation_upCover(0, (containerOut_y+upCover_y)/2, (upCover_z-containerOut_z)/2-upCover_posz);
00496 G4Transform3D transform_upCover(rot_dummy, translation_upCover);
00497 Name.str("");
00498 Name<<"solid_container_"<<name<<"_1";
00499 G4UnionSolid* solid_container_1 = new G4UnionSolid(Name.str(), solid_containerOut, solid_upCover, transform_upCover);
00500
00501
00502 Name.str("");
00503 Name<<"solid_upFEE_"<<name;
00504 G4VSolid* solid_upFEE = sd_upFEE(smallL, Name.str());
00505 G4ThreeVector translation_upFEE(0, containerOut_y/2+upCover_y+upFEE_y/2, upCover_z-upFEE_posz-upFEE_z/2-upCover_posz-containerOut_z/2);
00506 G4Transform3D transform_upFEE(rot_dummy, translation_upFEE);
00507 Name.str("");
00508 Name<<"solid_container_"<<name<<"_2";
00509 G4UnionSolid* solid_container_2 = new G4UnionSolid(Name.str(), solid_container_1, solid_upFEE, transform_upFEE);
00510
00511
00512 Name.str("");
00513 Name<<"solid_sideFEE_"<<name;
00514 G4VSolid* solid_sideFEE = sd_sideFEE(smallL, Name.str());
00515
00516 double angle_containerFrameSide = atan((containerOut_xup-containerOut_xdown)/2/containerOut_z) *rad;
00517 double l_containerFrameSide = containerOut_z/cos(angle_containerFrameSide);
00518 double x_sideFEE = (l_containerFrameSide/2-sideFEE_posl)*sin(angle_containerFrameSide)+(containerOut_xup+containerOut_xdown)/4+sideFEE_x/2*cos(angle_containerFrameSide);
00519 double z_sideFEE = (l_containerFrameSide/2-sideFEE_posl)*cos(angle_containerFrameSide)-sideFEE_x/2*sin(angle_containerFrameSide);
00520 G4ThreeVector translation_sideFEE_left(-x_sideFEE, 0, z_sideFEE);
00521 G4RotationMatrix rot_sideFEE_left;
00522 rot_sideFEE_left.rotateY(-angle_containerFrameSide);
00523 G4Transform3D transform_sideFEE_left(rot_sideFEE_left, translation_sideFEE_left);
00524 Name.str("");
00525 Name<<"solid_container_"<<name<<"_3";
00526 G4UnionSolid* solid_container_3 = new G4UnionSolid(Name.str(), solid_container_2, solid_sideFEE, transform_sideFEE_left);
00527
00528 G4ThreeVector translation_sideFEE_right(x_sideFEE, 0, z_sideFEE);
00529 G4RotationMatrix rot_sideFEE_right;
00530 rot_sideFEE_right.rotateY(angle_containerFrameSide);
00531 G4Transform3D transform_sideFEE_right(rot_sideFEE_right, translation_sideFEE_right);
00532 Name.str("");
00533 Name<<"solid_container_"<<name<<"_4";
00534 G4UnionSolid* solid_container_4 = new G4UnionSolid(Name.str(), solid_container_3, solid_sideFEE, transform_sideFEE_right);
00535
00536
00537 Name.str("");
00538 Name<<"solid_castingDie_"<<name;
00539 G4VSolid* solid_castingDie = sd_castingDie_outline(smallL, Name.str());
00540
00541 G4RotationMatrix rot_castingDie;
00542 rot_castingDie.rotateX(90*deg);
00543 G4ThreeVector translation_castingDie_1(0, containerOut_y/2+upCover_y+castingDie_z/2, -containerOut_z/2+upCover_posz+castingDie_posz1);
00544 G4Transform3D transform_castingDie_1(rot_castingDie, translation_castingDie_1);
00545 Name.str("");
00546 Name<<"solid_container_"<<name<<"_5";
00547 G4UnionSolid* solid_container_5 = new G4UnionSolid(Name.str(), solid_container_4, solid_castingDie, transform_castingDie_1);
00548
00549 G4ThreeVector translation_castingDie_2(0, containerOut_y/2+upCover_y+castingDie_z/2, -containerOut_z/2+upCover_posz+castingDie_posz2);
00550 G4Transform3D transform_castingDie_2(rot_castingDie, translation_castingDie_2);
00551 Name.str("");
00552 Name<<"solid_container_"<<name<<"_6";
00553 G4UnionSolid* solid_container_6 = new G4UnionSolid(Name.str(), solid_container_5, solid_castingDie, transform_castingDie_2);
00554
00555
00556 G4VSolid* solid_lowCover;
00557 Name.str("");
00558 Name<<"solid_lowCover_"<<name;
00559 double z_lowCover;
00560 if(flag==0)
00561 {
00562 z_lowCover = (lowCover1_z-containerOut_z)/2-lowCover1_posz;
00563 solid_lowCover = sd_lowCover1(smallL, Name.str());
00564 }
00565 else if(flag==1)
00566 {
00567 z_lowCover = (lowCover2_z-containerOut_z)/2-lowCover2_posz;
00568 solid_lowCover = sd_lowCover2(smallL, Name.str());
00569 }
00570 else G4cout<<"!!!!!!!! Wrong lower Board !!!!!!!!!"<<G4endl;
00571
00572 G4ThreeVector translation_lowCover(0, -1*(containerOut_y+upCover_y)/2, z_lowCover);
00573 G4Transform3D transform_lowCover(rot_dummy, translation_lowCover);
00574 Name.str("");
00575 Name<<"solid_container_"<<name;
00576 G4UnionSolid* solid_container = new G4UnionSolid(Name.str(), solid_container_6, solid_lowCover, transform_lowCover);
00577 G4LogicalVolume* logical_container = new G4LogicalVolume(solid_container, G4Material::GetMaterial("Air"), name);
00578
00579 G4VisAttributes* vis = new G4VisAttributes();
00580 vis->SetColor(G4Color(0.5,0.5,0.6));
00581 vis->SetForceWireframe(true);
00582 logical_container->SetVisAttributes(vis);
00583
00584
00585 return logical_container;
00586 }
00587
00588
00589 G4LogicalVolume* PartProduce::lg_gasContainer(string name)
00590 {
00591 Name.str("");
00592 Name<<"solid_gasContainer_"<<name;
00593 G4VSolid* solid_gasContainer = sd_containerIn(0, Name.str());
00594 G4LogicalVolume* logical_gasContainer = new G4LogicalVolume(solid_gasContainer, G4Material::GetMaterial("MRPCGas"), name);
00595
00596 G4VisAttributes* vis = new G4VisAttributes();
00597
00598 vis->SetForceWireframe(true);
00599 logical_gasContainer->SetVisAttributes(vis);
00600
00601 return logical_gasContainer;
00602 }
00603
00604
00605 G4LogicalVolume* PartProduce::lg_bareChamber(string name)
00606 {
00607
00608 double xdown = pcbBoard_xdown;
00609 double xup = pcbBoard_xup;
00610 double y = honeyComb_y*2+tape_mrpc_y*2+pcbBoard_y0*2+pcbBoard_y1+mylar_y*4+glass0_y*4+glass1_y*10+gasLayer_y*12;
00611 double z = pcbBoard_z;
00612 Name.str("");
00613 Name<<"solid_bareChamber_"<<name;
00614 G4Trd* solid_bareChamber = new G4Trd(Name.str(), xdown/2.+smallL, xup/2.+smallL, y/2.+smallL, y/2.+smallL, z/2.+smallL);
00615 G4LogicalVolume* logical_bareChamber = new G4LogicalVolume(solid_bareChamber, G4Material::GetMaterial("MRPCGas"), name);
00616
00617 G4VisAttributes* vis = new G4VisAttributes();
00618
00619 vis->SetVisibility(0);
00620
00621 logical_bareChamber->SetVisAttributes(vis);
00622
00623 return logical_bareChamber;
00624 }
00625
00626
00627 G4LogicalVolume* PartProduce::lg_honeyComb(string name)
00628 {
00629 Name.str("");
00630 Name<<"solid_honeyComb_"<<name;
00631 G4Trd* solid_honeyComb = new G4Trd(Name.str(), honeyComb_xdown/2, honeyComb_xup/2, honeyComb_y/2, honeyComb_y/2, honeyComb_z/2);
00632 G4LogicalVolume* logical_honeyComb = new G4LogicalVolume(solid_honeyComb, G4Material::GetMaterial("honeycombCore"), name);
00633
00634
00635 Name.str("");
00636 Name<<"solid_honeyComb_surface_"<<name;
00637 G4Trd* solid_honeyComb_surface = new G4Trd(Name.str(), honeyComb_xdown/2, honeyComb_xup/2, honeyComb_surface_y/2, honeyComb_surface_y/2, honeyComb_z/2);
00638
00639 Name.str("");
00640 Name<<"logical_honeyComb_surface_"<<name;
00641 G4LogicalVolume* logical_honeyComb_surface = new G4LogicalVolume(solid_honeyComb_surface, G4Material::GetMaterial("insulationBoard"), Name.str());
00642
00643 Name.str("");
00644 Name<<"physical_honeyComb_surface_"<<name<<"_0";
00645 new G4PVPlacement(0, G4ThreeVector(0,(honeyComb_y-honeyComb_surface_y)/2.-smallL,0), logical_honeyComb_surface, Name.str(), logical_honeyComb, false, 0, checkOverlap);
00646
00647 Name.str("");
00648 Name<<"physical_honeyComb_surface_"<<name<<"_1";
00649 new G4PVPlacement(0, G4ThreeVector(0,-(honeyComb_y-honeyComb_surface_y)/2.+smallL,0), logical_honeyComb_surface, Name.str(), logical_honeyComb, false, 0, checkOverlap);
00650
00651 G4VisAttributes* vis1 = new G4VisAttributes();
00652 vis1->SetColor(G4Color::Green());
00653
00654 logical_honeyComb_surface->SetVisAttributes(vis1);
00655
00656 G4VisAttributes* vis = new G4VisAttributes();
00657 vis->SetColor(G4Color(0.55, 0.3, 0.3));
00658
00659 logical_honeyComb->SetVisAttributes(vis);
00660
00661 return logical_honeyComb;
00662 }
00663
00664 G4LogicalVolume* PartProduce::lg_tape_mrpc(string name)
00665 {
00666 Name.str("");
00667 Name<<"solid_tape_mrpc_"<<name;
00668 G4Trd* solid_tape_mrpc= new G4Trd(Name.str(),tape_mrpc_xdown/2,tape_mrpc_xup/2,tape_mrpc_y/2,tape_mrpc_y/2,tape_mrpc_z/2);
00669 G4LogicalVolume* logical_tape_mrpc = new G4LogicalVolume(solid_tape_mrpc,G4Material::GetMaterial("PET"), name);
00670
00671 G4VisAttributes* vis = new G4VisAttributes();
00672 vis->SetColor(G4Color(1, 1, 0));
00673
00674
00675 logical_tape_mrpc->SetVisAttributes(vis);
00676
00677 return logical_tape_mrpc;
00678 }
00679
00680 G4LogicalVolume* PartProduce::lg_pcbBoard(G4int flag, string name)
00681 {
00682 double pcbBoard_y;
00683 if(flag==0) pcbBoard_y=pcbBoard_y0;
00684 else pcbBoard_y=pcbBoard_y1;
00685
00686 Name.str("");
00687 Name<<"solid_pcbBoard_"<<name;
00688 G4Trd* solid_pcbBoard = new G4Trd(Name.str(),pcbBoard_xdown/2., pcbBoard_xup/2., pcbBoard_y/2., pcbBoard_y/2.,pcbBoard_z/2.);
00689 G4LogicalVolume* logical_pcbBoard = new G4LogicalVolume(solid_pcbBoard,G4Material::GetMaterial("insulationBoard"), name);
00690
00691 G4VisAttributes* vis = new G4VisAttributes();
00692 vis->SetColor(G4Color(0.2, 1, 0));
00693
00694
00695 logical_pcbBoard->SetVisAttributes(vis);
00696
00697 return logical_pcbBoard;
00698 }
00699
00700 G4AssemblyVolume* PartProduce::lg_strip(string name)
00701 {
00702 const G4int no=12;
00703 G4Trd* solid_strip[no];
00704 G4LogicalVolume* logical_strip[no];
00705 G4VisAttributes* vis = new G4VisAttributes();
00706 vis->SetColor(G4Color(1, 0, 0));
00707 vis->SetForceSolid(1);
00708 for(G4int i=0; i<no; i++)
00709 {
00710 Name.str("");
00711 Name<<"solid_strip_"<<name<<"_"<<i;
00712 solid_strip[i] = new G4Trd(Name.str(), strip_x[i]/2., strip_x[i]/2., strip_y/2., strip_y/2., strip_z/2.);
00713 Name.str("");
00714 Name<<name<<"_"<<i;
00715 logical_strip[i] = new G4LogicalVolume(solid_strip[i], G4Material::GetMaterial("Copper"), Name.str());
00716 logical_strip[i]->SetVisAttributes(vis);
00717 }
00718
00719 G4AssemblyVolume* logical_strip_unified = new G4AssemblyVolume();
00720 G4ThreeVector translation_strip;
00721 G4Transform3D transform_strip;
00722 for(G4int i=0; i<no; i++)
00723 {
00724 translation_strip.set(0, 0, (i-5.5)*(strip_z+strip_gap));
00725 transform_strip = G4Transform3D(rot_dummy, translation_strip);
00726 logical_strip_unified->AddPlacedVolume(logical_strip[i], transform_strip);
00727 }
00728
00729 return logical_strip_unified;
00730 }
00731
00732 G4LogicalVolume* PartProduce::lg_mylar(string name)
00733 {
00734 Name.str("");
00735 Name<<"solid_mylar_"<<name;
00736 G4Trd* solid_mylar = new G4Trd(Name.str(),mylar_xdown/2.,mylar_xup/2.,mylar_y/2.,mylar_y/2.,mylar_z/2.);
00737 G4LogicalVolume* logical_mylar = new G4LogicalVolume(solid_mylar,G4Material::GetMaterial("PET"), name);
00738
00739 G4VisAttributes* vis = new G4VisAttributes();
00740 vis->SetColor(G4Color(1, 0., 0.7));
00741
00742 logical_mylar->SetVisAttributes(vis);
00743
00744 return logical_mylar;
00745 }
00746
00747 G4LogicalVolume* PartProduce::lg_glass(G4int flag, string name)
00748 {
00749 double glass_xdown;
00750 double glass_xup;
00751 double glass_y;
00752 double glass_z;
00753 if(flag==0)
00754 {
00755 glass_xdown = glass0_xdown;
00756 glass_xup = glass0_xup;
00757 glass_y = glass0_y;
00758 glass_z = glass0_z;
00759 }
00760 else
00761 {
00762 glass_xdown = glass1_xdown;
00763 glass_xup = glass1_xup;
00764 glass_y = glass1_y;
00765 glass_z = glass1_z;
00766 }
00767
00768 Name.str("");
00769 Name<<"solid_glass_"<<name;
00770 G4Trd* solid_glass = new G4Trd(Name.str(), glass_xdown/2.,glass_xup/2. ,glass_y/2.,glass_y/2.,glass_z/2.);
00771 G4LogicalVolume* logical_glass = new G4LogicalVolume(solid_glass,G4Material::GetMaterial("SiO2"), name);
00772
00773 G4VisAttributes* vis = new G4VisAttributes();
00774 vis->SetColor(G4Color(0.2, 0.4, 1));
00775
00776 logical_glass->SetVisAttributes(vis);
00777
00778 return logical_glass;
00779 }
00780
00781 G4LogicalVolume* PartProduce::lg_gasLayer(string name)
00782 {
00783 Name.str("");
00784 Name<<"solid_gasLayer_"<<name;
00785 G4Trd* solid_gasLayer = new G4Trd(Name.str(),gasLayer_xdown/2.,gasLayer_xup/2.,gasLayer_y/2.,gasLayer_y/2.,gasLayer_z/2.);
00786 G4LogicalVolume* logical_gasLayer = new G4LogicalVolume(solid_gasLayer,G4Material::GetMaterial("MRPCGas"), name);
00787
00788 G4VisAttributes* vis = new G4VisAttributes();
00789 vis->SetColor(G4Color::Blue());
00790
00791
00792
00793 return logical_gasLayer;
00794 }
00795
00796 G4LogicalVolume* PartProduce::lg_bracket(string name)
00797 {
00798 Name.str("");
00799 Name<<"solid_bracket_"<<name<<"_1";
00800 G4Tubs* solid_bracket_1 = new G4Tubs(Name.str(), 0, bracket_r, bracket_z/2, 0*degree, 360*degree);
00801
00802 Name.str("");
00803 Name<<"solid_bracket_"<<name<<"_2";
00804 G4Trd* solid_bracket_2 = new G4Trd(Name.str(), bracket_x/2, bracket_x/2, bracket_x/2, bracket_x/2, bracket_y/2);
00805
00806 G4Transform3D transform_bracket(rot_dummy, G4ThreeVector(0, 0, (bracket_y+bracket_z)/2));
00807 Name.str("");
00808 Name<<"solid_bracket_"<<name;
00809 G4UnionSolid* solid_bracket = new G4UnionSolid(Name.str(), solid_bracket_1, solid_bracket_2, transform_bracket);
00810 G4LogicalVolume* logical_bracket = new G4LogicalVolume(solid_bracket, G4Material::GetMaterial("Nylon"), name);
00811
00812 G4VisAttributes* vis = new G4VisAttributes();
00813 vis->SetColor(G4Color(0.3, 0.3, 0.3));
00814
00815 logical_bracket->SetVisAttributes(vis);
00816
00817 return logical_bracket;
00818 }
00819
00820 G4LogicalVolume* PartProduce::lg_upStopBlock(string name)
00821 {
00822 Name.str("");
00823 Name<<"solid_upStopBlock_"<<name<<"_1";
00824 G4Trd* solid_upStopBlock_1 = new G4Trd(Name.str(), upStopBlock_x/2, upStopBlock_x/2, upStopBlock_y/2, upStopBlock_y/2, upStopBlock_z/2);
00825
00826 Name.str("");
00827 Name<<"solid_upStopBlock_"<<name<<"_2";
00828 G4Tubs* solid_upStopBlock_2 = new G4Tubs(Name.str(), 0, upStopBlock_subtractr+smallL, upStopBlock_x/2+smallL, 0*degree, 360*degree);
00829
00830 G4RotationMatrix rot_upStopBlock;
00831
00832 rot_upStopBlock.rotateY(90*degree);
00833 G4Transform3D transform_upStopBlock(rot_upStopBlock, G4ThreeVector(0,0,(upStopBlock_z-upStopBlock_subtractr)/2-upStopBlock_subtractposz));
00834
00835 Name.str("");
00836 Name<<"solid_upStopBlock_"<<name;
00837 G4SubtractionSolid* solid_upStopBlock = new G4SubtractionSolid(Name.str(), solid_upStopBlock_1, solid_upStopBlock_2, transform_upStopBlock);
00838 G4LogicalVolume* logical_upStopBlock = new G4LogicalVolume(solid_upStopBlock, G4Material::GetMaterial("Nylon"), name);
00839
00840 G4VisAttributes* vis = new G4VisAttributes();
00841 vis->SetColor(G4Color(0.3, 0.3, 0.3));
00842
00843 logical_upStopBlock->SetVisAttributes(vis);
00844
00845 return logical_upStopBlock;
00846 }
00847
00848 G4LogicalVolume* PartProduce::lg_sideStopBlock(string name)
00849 {
00850 Name.str("");
00851 Name<<"solid_sideStopBlock_"<<name<<"_1";
00852 G4Trd* solid_sideStopBlock_1 = new G4Trd(Name.str(), sideStopBlock_x/2, sideStopBlock_x/2, sideStopBlock_y/2, sideStopBlock_y/2, sideStopBlock_z/2);
00853
00854 Name.str("");
00855 Name<<"solid_sideStopBlock_"<<name<<"_2";
00856 G4Trd* solid_sideStopBlock_2 = new G4Trd(Name.str(), (sideStopBlock_x-sideStopBlock_thickness)/2+smallL, (sideStopBlock_x-sideStopBlock_thickness)/2+smallL, sideStopBlock_y/2+smallL, sideStopBlock_y/2+smallL, sideStopBlock_z/2-sideStopBlock_thickness);
00857
00858 G4Transform3D transform_upStopBlock(rot_dummy, G4ThreeVector(sideStopBlock_thickness/2, 0, 0));
00859
00860 Name.str("");
00861 Name<<"solid_sideStopBlock_"<<name;
00862 G4SubtractionSolid* solid_sideStopBlock = new G4SubtractionSolid(Name.str(), solid_sideStopBlock_1, solid_sideStopBlock_2, transform_upStopBlock);
00863 G4LogicalVolume* logical_sideStopBlock = new G4LogicalVolume(solid_sideStopBlock, G4Material::GetMaterial("Nylon"), name);
00864
00865 G4VisAttributes* vis = new G4VisAttributes();
00866 vis->SetColor(G4Color(0.3, 0.3, 0.3));
00867
00868 logical_sideStopBlock->SetVisAttributes(vis);
00869
00870 return logical_sideStopBlock;
00871 }
00872