3 # contact tylerdalion@gmail.com for any GDML/generate questions
4 # I would love to help!
6 # Each subroutine generates a fragment GDML file, and the last subroutine
7 # creates an XML file that make_gdml.pl will use to appropriately arrange
8 # the fragment GDML files to create the final desired DUNE GDML file,
9 # to be named by make_gdml output command
11 # If you are playing with different geometries, you can use the
12 # suffix command to help organize your work.
19 Math::BigFloat->precision(-16);
21 open(my $wout, '>', 'gdmlWireCenters.txt');
23 GetOptions( "help|h" => \$help,
24 "suffix|s:s" => \$suffix,
25 "output|o:s" => \$output,
26 "wires|w:s" => \$wires,
27 "protoDune|p:s" => \$protoDune,
28 "workspace|k:s" => \$workspace,
29 "simpleStSu|u:s" => \$simpleStSu);
33 # If the user requested help, print the usage notes and exit.
38 if ( ! defined $suffix )
40 # The user didn't supply a suffix, so append nothing to the file
46 # Otherwise, stick a "-" before the suffix, so that a suffix of
47 # "test" applied to filename.gdml becomes "filename-test.gdml".
48 $suffix = "-" . $suffix;
51 if ( ! defined $workspace )
54 if ( ! defined $protoDune )
58 print "\t\tCreating full geometry.\n";
60 elsif ( $protoDune == 1 )
62 print "\t\tCreating rough version of protoDUNE.\n";
63 if ( ! defined $simpleStSu )
67 elsif ( $simpleStSu == 1 )
69 print "\t\tUsing simple steel support geometry for protoDUNE.\n";
72 if($protoDune == 0 && $simpleStSu == 0)
74 print "\t\tThis version of the steel support is only compatible with protoDUNE.\n";
78 elsif ( $workspace == 1)
80 print "\t\tCreating smaller workspace geometry.\n";
82 # set wires on to be the default, unless given an input by the user
83 $wires_on = 1; # 1=on, 0=off
93 # options for different parameters
99 #++++++++++++++++++++++++ Begin defining variables +++++++++++++++++++++++++
101 ## The GDML is build from the inside out to avoid overlaps, but that means
102 ## that the larger dimensions (such as the cryostat dimensions) are calculated
103 ## to be slightly different than the parameters calculated and reported by
104 ## engineers. All of this error is within reason and for the better, since
105 ## we don't want this Geometry to be overly complex or long.
110 ##################################################################
111 ##################### Wire Plane Parameters ######################
114 $UWirePitch = 0.4669;
115 $VWirePitch = 0.4669;
116 $XWirePitch = 0.4792;
119 $nZChannelsPerAPA = 960;
121 # dune10kt 3mm version
122 if($Pitch3mmVersion==1){
126 $nZChannelsPerAPA = 2*(229.44/0.3 + 1);
129 # dune10kt ~45 deg UV wires version
130 if($UVAngle45Option==1){
145 $SinUAngle = sin( deg2rad($UAngle) );
146 $CosUAngle = cos( deg2rad($UAngle) );
147 $TanUAngle = tan( deg2rad($UAngle) );
149 $SinVAngle = sin( deg2rad($VAngle) );
150 $CosVAngle = cos( deg2rad($VAngle) );
151 $TanVAngle = tan( deg2rad($VAngle) );
153 $UWire_yint = $UWirePitch/$SinUAngle;
154 $UWire_zint = $UWirePitch/$CosUAngle;
156 $VWire_yint = $VWirePitch/$SinVAngle;
157 $VWire_zint = $VWirePitch/$CosVAngle;
159 $TPCWireThickness = 0.015;
161 $TPCWirePlaneThickness = $TPCWireThickness;
162 #height and length defined lower
166 ##################################################################
167 ################### Cryostat/APA parameters ######################
174 $nAPAs = $nAPAWide*$nAPAHigh*$nAPALong;
177 #$G10thickness = $inch/8;
178 $G10thickness = 0.335; #1/8 inch plus epoxy
179 $WrapCover = $inch/16;
181 #$SpaceAPAToCryoWall = 15;
182 #$SpaceAPAToFloor = 59.4 - 10.2; # 10.2cm just adjusts for how spaces are reported
183 #$SpaceAPAToTopLAr = 50.9 - 10.2;
184 #$UpstreamLArPadding = 311.4 - 10.2;
185 #$DownstreamLArPadding = 59.4 - 10.2;
187 $Argon_x = 854.8; #inside dimension of the cryostat
192 $APAToSouthCrWall = 27.7; #center APA to cryostat
193 $CPAToWestCrWall = 45.5; #center CPA to beam window side
194 $DetCentToFloor = 376.0; # center CPA to cryostat floor, y axis
195 $CPACentToWestWall = 396.2; # center CPA to beam window side, z axis
196 $CPACentToEastWall = 458.6;
197 $CPACentToSaleWall = 391.4; # center CPA to Saleve, x axis
198 $CPACentToJuraWall = 463.4; # center CPA to Jura, x axis
202 #Distance to upstream wall 3962 mm
203 #Distance to downstream wall 4586 mm
204 #Distance wall to wall 8548 mm
207 #Distance to Jura wall 4634 mm
208 #Distance to Saleve wall 3914 mm
209 #Distance wall to wall 8548 mm
212 #Distance to floor 3760.2 mm
213 #Distance to ceiling 4139.8 mm
214 #Floor to ceiling 7900
217 #InnerDrift is the max distance form the edge of the CPA to the edge of the first wire plane
218 #$InnerDrift = 359.4;
219 $InnerDrift = 357.135;
220 $APAFrame_x = 3*$inch; # ~2in -- this does not include the wire spacing
222 $TPCWireThickness = 0.015;
223 $TPCWirePlaneThickness = $TPCWireThickness;
224 #$APAWirePlaneSpacing = 0.4730488 + $TPCWirePlaneThickness; # center to center spacing between all of the wire planes (g, u, v, and x)
226 if($Pitch3mmVersion==1){
227 $APAWirePlaneSpacing = 0.3;
229 $APAWirePlaneSpacing = 3/16*$inch;
232 # At creation of the plane volumes, the y and z boundaries will be increased
233 # by this much at each of the 4 edges. this is so the corners of the wire
234 # tubes don't extrude. For all other purposes, the plane dimensions stay as originally defined
235 $UVPlaneBoundNudge = $TPCWireThickness;
239 # The following are all widths about the z center of an APA
241 $Zactive_z = ($nZChannelsPerAPA/2-1)*$XWirePitch;# + $TPCWireThickness;
242 $APAFrame_z = $APAphys_z - 2*(2*$G10thickness+$WrapCover);
243 $Vactive_z = $APAFrame_z;
244 $Uactive_z = $APAFrame_z + 2*$G10thickness;
245 $APAGap_z = 0.4; #separation between APAs (cover to cover) along the vertical axis
247 print "Zactive_z=".$Zactive_z."\n";
248 print "APAFrame_z=".$APAFrame_z."\n";
254 $ReadoutBoardOverlap = 7.61; #board overlaps wires, chop this off of their active height
256 $Zactive_y = $APAFrame_y + 0*$G10thickness - $ReadoutBoardOverlap;
257 $Vactive_y = $APAFrame_y + 1*$G10thickness - $ReadoutBoardOverlap;
258 $Uactive_y = $APAFrame_y + 2*$G10thickness - $ReadoutBoardOverlap;
259 # the last G10 board for the grid, then a cover. This is not "covered" by the board
260 $APAphys_y = $APAFrame_y + 4*$G10thickness + $WrapCover;
261 #$APAGap_y = 0.4; #separation between APAs (cover to cover) along the incident beam axis
263 # include APA spacing in y and z so volTPCs touch in y and z directions with correct APA
264 # spacing - this makes for smoother event generation.
266 print "Zactive_y=".$Zactive_y."\n";
267 print "APAphys_y=".$APAphys_y."\n";
271 $APA_UtoU_x = $APAFrame_x + 6*$APAWirePlaneSpacing + (6-1)*$TPCWirePlaneThickness; # thickness of APA between center U wire to center U wire
272 #$SpaceAPAToCryoWall = $APAToSouthCrWall - ($APA_UtoU_x + $TPCWireThickness)/2;
273 #$OuterDrift = $SpaceAPAToCryoWall - 20.; #Subtract some to avoid overlaping.
274 # outer wire planes (center to center)
275 #$TPCInner_x = $InnerDrift + $APAWirePlaneSpacing;# + $TPCWirePlaneThickness;
276 $TPCInner_x = $InnerDrift + 4*$APAWirePlaneSpacing + 4*$TPCWirePlaneThickness;
277 #$TPCOuter_x = $OuterDrift + $APAWirePlaneSpacing;# + $TPCWirePlaneThickness; Making it smaller than the distance to the wall.
278 $TPCOuter_x = 4*$APAWirePlaneSpacing + 4*$TPCWirePlaneThickness + 8;
280 print "TPCInner_x=".$TPCInner_x."\n";
281 print "TPCOuter_x=".$TPCOuter_x."\n";
282 print "APA_UtoU_x=".$APA_UtoU_x."\n";
284 $TPC_z = $APAphys_z;# + $APAGap_z;
285 $TPC_y = $APAphys_y;# + $APAGap_y;
287 #print "TPC_x=".$TPC_x."\n";
288 print "TPC_y=".$TPC_y."\n";
289 print "TPC_z=".$TPC_z."\n";
292 #$CPATube_ID = 4.747;
295 $Cathode_x = 0.13*$inch;
296 #$Cathode_y = $APAphys_y - $CPATube_OD;
297 #$Cathode_z = $APAphys_z - $CPATube_OD;
301 $APAToAPA = $APAFrame_x
303 + $Cathode_x; # center to center
305 $CPAToAPA = $APAFrame_x/2
306 + $TPCInner_x #2*$APAWirePlaneSpacing
307 + $Cathode_x/2; # center to center
309 $SpaceAPAToCryoWall = $CPACentToSaleWall
311 - ($APA_UtoU_x + $TPCWireThickness)/2;
313 print "SpaceAPAToCryoWall=".$SpaceAPAToCryoWall."\n";
314 print "APAToAPA=".$APAToAPA."\n";
315 print "CPAToAPA=".$CPAToAPA."\n";
317 $SteelThickness = 0.12; #half inch
318 $HeightGaseousAr = 80;
321 #$Argon_x = 854.8; #inside dimension of the cryostat
322 #$Argon_x = ($nAPAWide-1)*$APAToAPA
323 # + $APA_UtoU_x + $TPCWirePlaneThickness
324 # + 2*$SpaceAPAToCryoWall;
326 if($workspace==1){ # this is arbitrary for the workspace, but size down a little
327 $Argon_x = 2*$CPAToAPA + $Cathode_x + 2*$SpaceAPAToCryoWall;
330 #$Argon_y = 790.0; #inside dimension of the cryostat
331 #$Argon_y = $nAPAHigh*$APAphys_y
332 # + ($nAPAHigh-1)*$APAGap_y
333 # + $SpaceAPAToFloor + $SpaceAPAToTopLAr
334 # + $HeightGaseousAr;
335 # both liquid AND gaseous argon
337 #$Argon_z = 854.8; #inside dimension of the cryostat
338 #$Argon_z = $nAPALong*$APAphys_z
339 # + ($nAPALong-1)*$APAGap_z
340 # + $UpstreamLArPadding + $DownstreamLArPadding;
342 print "Argon_x=".$Argon_x."\n";
343 print "Argon_y=".$Argon_y."\n";
344 print "Argon_z=".$Argon_z."\n";
345 print "APAToAPA =".$APAToAPA."\n";
346 print "APAToSouthCrWall =".$APAToSouthCrWall."\n";
348 $APAToNorthCrWall = $Argon_x
349 - $APAToAPA - $APAToSouthCrWall;
351 #$CPAToEastCrWall = $Argon_z
352 # - ($Cathode_z - $CPATube_OD) - $CPAToWestCrWall;
354 $SpaceAPAToFloor = $DetCentToFloor - $APAphys_y/2;
356 $SpaceAPAToTopLAr = $Argon_y
361 $UpstreamLArPadding = $CPACentToWestWall +
362 - ($nAPALong*$APAphys_z + ($nAPALong-1)*$APAGap_z)/2;
364 $DownstreamLArPadding = $CPACentToEastWall +
365 - ($nAPALong*$APAphys_z + ($nAPALong-1)*$APAGap_z)/2;
367 $Cryostat_x = $Argon_x + 2*$SteelThickness;
368 $Cryostat_y = $Argon_y + 2*$SteelThickness;
369 $Cryostat_z = $Argon_z + 2*$SteelThickness;
371 print "Cryo_x=".$Cryostat_x."\n";
372 print "Cryo_y=".$Cryostat_y."\n";
373 print "Cryo_z=".$Cryostat_z."\n";
374 ##################################################################
375 ############## DetEnc and World relevant parameters #############
378 $SteelSupport_x = 62.8;
379 $SteelSupport_y = 62.8;
380 $SteelSupport_z = 62.8;
382 $FoamPadding = 80. - $SteelThickness;
383 $FracVolOfSteel = 0.08; #The steel support is not a solid block, but a mixture of air and steel
384 $FracMassOfSteel = $FracVolOfSteel/($FracVolOfSteel+1.205/7930*(1-$FracVolOfSteel)); #The steel support is not a solid block, but a mixture of air and steel
386 $SpaceSteelSupportToWall = 900;
387 $SpaceSteelSupportToCeiling = 900;
389 $DetEncWidth = ($Cryostat_x
390 + 2*($SteelSupport_x + $FoamPadding) + 2*$SpaceSteelSupportToCeiling);
391 $DetEncHeight = ($Cryostat_y
392 + 2*($SteelSupport_y + $FoamPadding) + 2*$SpaceSteelSupportToWall);
393 $DetEncLength = ($Cryostat_z
394 + 2*($SteelSupport_z + $FoamPadding) + 2*$SpaceSteelSupportToWall);
396 $posCryoInDetEnc_x = 0;
397 #$posCryoInDetEnc_y = - $DetEncHeight/2 + $SteelSupport_y + $FoamPadding + $Cryostat_y/2;
398 $posCryoInDetEnc_y = 0;
400 $RockThickness = 400;
402 # We want the world origin to be at the very front of the fiducial volume.
403 # move it to the front of the enclosure, then back it up through the concrete/foam,
404 # then through the Cryostat shell, then through the upstream dead LAr (including the
405 # dead LAr on the edge of the TPC, but this is covered in $UpstreamLArPadding).
406 # This is to be added to the z position of every volume in volWorld
408 $OriginZSet = $APAphys_z
411 + ($CPACentToEastWall - $CPACentToWestWall)/2;
412 $ZAssym=($CPACentToEastWall - $CPACentToWestWall)/2;
413 print "Z assym ".$ZAssym."\n";
414 #$OriginZSet = $DetEncLength/2
415 # - $SpaceSteelSupportToWall
419 # - $UpstreamLArPadding
420 # - ($APAphys_z - $Uactive_z)/2;
422 # We want the world origin to be vertically centered between the stacked APAs.
423 # This is to be added to the y position of every volume in volWorld
425 $OriginYSet = $APAphys_y/2
428 # + $SpaceSteelSupportToWall;
429 - $posCryoInDetEnc_y;
431 print "DetCentToFloor = ".$DetCentToFloor."\n";
432 #$OriginYSet = $DetEncHeight/2
440 #if($protoDune==1){ # bring the origin to the bottom of the APAs for protoDUNE
441 # $OriginYSet = $OriginYSet + $APAphys_y + $APAGap_y/2;
444 #$OriginXSet = ($APAToNorthCrWall - $APAToSouthCrWall)/2;
445 $OriginXSet = ($CPACentToJuraWall - $CPACentToSaleWall)/2;
447 print "OriginXSet =".$OriginXSet.", OriginYSet =".$OriginYSet.", OriginZSet =".$OriginZSet."\n";
449 #$OriginXSet = 0; # centered for now
451 #$Cathode_z = $Cathode_z/3 - $CPATube_OD;
453 ###################################################################
454 ######################## Beam Window 2 Parameters ###################
459 $BeamTheta2 = atan (sqrt(tan(deg2rad($theta2XZ))**2 +tan(deg2rad($thetaYZ))**2));
460 $BeamPhi2 = atan (tan(deg2rad($thetaYZ))/tan(deg2rad($theta2XZ)));
462 $thetaYZprime = rad2deg(atan(sin($BeamTheta2)*sin($BeamPhi2+deg2rad(180))/sqrt(cos($BeamTheta2)**2 + sin($BeamTheta2)**2*cos($BeamPhi2)**2)));
464 print "thetaYZprime =".$thetaYZprime."\n";
466 $DeltaXZ2 = tan($BeamTheta2)*cos($BeamPhi2);
467 $DeltaYZ2 = tan($BeamTheta2)*sin($BeamPhi2);
469 print "DeltaXZ2 = ".$DeltaXZ2."\n";
470 print "DeltaYZ2 = ".$DeltaYZ2."\n";
472 $BeamTheta2Deg = rad2deg($BeamTheta2);
473 $BeamPhi2Deg = rad2deg($BeamPhi2);
475 ######################### Beam Window 3 Parameters ###################
480 $BeamTheta3 = atan (sqrt(tan(deg2rad($theta3XZ))**2 +tan(deg2rad($thetaYZ))**2));
481 $BeamPhi3 = atan (tan(deg2rad($thetaYZ))/tan(deg2rad($theta3XZ)));
483 print "BeamTheta3 = ".$BeamTheta3."\n";
484 print "BeamPhi3 = ".$BeamPhi3."\n";
487 $thetaYZ3prime = rad2deg(atan(sin($BeamTheta3)*sin($BeamPhi3+deg2rad(180))/sqrt(cos($BeamTheta3)**2 + sin($BeamTheta3)**2*cos($BeamPhi3)**2)));
489 print "thetaYZ3prime =".$thetaYZ3prime."\n";
491 $DeltaXZ3 = tan($BeamTheta3)*cos($BeamPhi3);
492 $DeltaYZ3 = tan($BeamTheta3)*sin($BeamPhi3);
495 $BeamVaPipeRad = $BeamPipeRad - 0.2;
497 $BeamVaPipeLe = $BeamPipeLe;
500 $BeamWStPlateFF_x = - 41.0;
501 $BeamWStPlateFF_y = 125.7;
502 $BeamWStPlateFF_z = - ($Cryostat_z/2 + $FoamPadding + $SteelPlate);
503 print "BeamWStPlateFF_z = ".$BeamWStPlateFF_z."\n";
504 #$BeamWStPlateFF_z = -508.4;
506 $BeamWStPlateLe = $SteelPlate/cos($BeamTheta3)+0.001;
507 $BeamWStPlate_x = $BeamWStPlateFF_x - ($SteelPlate/2)*$DeltaXZ3;
508 $BeamWStPlate_y = $BeamWStPlateFF_y - ($SteelPlate/2)*$DeltaYZ3;
509 $BeamWStPlate_z = $BeamWStPlateFF_z + $SteelPlate/2;
511 $BeamWFoRemLe = $FoamPadding/cos($BeamTheta3)+0.001;
512 $BeamWFoRemPosDZ = $SteelPlate + $FoamPadding/2;
513 $BeamWFoRem_x = $BeamWStPlateFF_x - $BeamWFoRemPosDZ*$DeltaXZ3;
514 $BeamWFoRem_y = $BeamWStPlateFF_y - $BeamWFoRemPosDZ*$DeltaYZ3;
515 $BeamWFoRem_z = $BeamWStPlateFF_z + $BeamWFoRemPosDZ;
517 $BeamWStSuLe = ($SteelSupport_z - $SteelPlate)/cos($BeamTheta3)+0.001;
518 $BeamWStSuPosDZ = - ($SteelSupport_z - $SteelPlate)/2; # going upstream from the steel plate
519 $BeamWStSu_x = $BeamWStPlateFF_x - $BeamWStSuPosDZ*$DeltaXZ3;
520 $BeamWStSu_y = $BeamWStPlateFF_y - $BeamWStSuPosDZ*$DeltaYZ3;
521 $BeamWStSu_z = $BeamWStPlateFF_z + $BeamWStSuPosDZ;
523 $BeamWFoPosDZ = $SteelPlate + $FoamPadding - $BeamWFoLe*cos($BeamTheta3)/2;
524 $BeamWFo_x = $BeamWStPlateFF_x - $BeamWFoPosDZ*$DeltaXZ3;
525 $BeamWFo_y = $BeamWStPlateFF_y - $BeamWFoPosDZ*$DeltaYZ3 + $posCryoInDetEnc_y;
526 $BeamWFo_z = $BeamWStPlateFF_z + $BeamWFoPosDZ;
528 $BeamWGlPosDZ = $SteelPlate + $FoamPadding - ($BeamWFoLe + $BeamWGlLe/2)*cos($BeamTheta3);
529 $BeamWGl_x = $BeamWStPlateFF_x - $BeamWGlPosDZ*$DeltaXZ3;
530 $BeamWGl_y = $BeamWStPlateFF_y - $BeamWGlPosDZ*$DeltaYZ3 + $posCryoInDetEnc_y;
531 $BeamWGl_z = $BeamWStPlateFF_z + $BeamWGlPosDZ;
533 $BeamWVaPosDZ = $SteelPlate + $FoamPadding - ($BeamWFoLe + $BeamWGlLe + $BeamPipeLe/2)*cos($BeamTheta3);
534 $BeamWVa_x = $BeamWStPlateFF_x - $BeamWVaPosDZ*$DeltaXZ3;
535 $BeamWVa_y = $BeamWStPlateFF_y - $BeamWVaPosDZ*$DeltaYZ3 + $posCryoInDetEnc_y;
536 $BeamWVa_z = $BeamWStPlateFF_z + $BeamWVaPosDZ;
538 $BeamPlugRad = 10.48;
539 $BeamPlugNiRad = 9.72;
540 $BeamPlugUSAr = 1/cos($BeamTheta3); # 1 cm US LAr layer between beam plug and primary membrane
541 $BeamPlugLe = (44.6)/cos($BeamTheta3) - $BeamPlugUSAr; #with current geometry and 49.22 Dz the flange's front face just touches the active volume.
542 $BeamPlugNiLe = $BeamPlugLe-0.59/cos($BeamTheta3);
544 $BeamPlugPosDZ = $SteelPlate + $FoamPadding + $SteelThickness + $BeamPlugUSAr + $BeamPlugLe*cos($BeamTheta3)/2;
545 $BeamPlug_x = $BeamWStPlateFF_x - $BeamPlugPosDZ*$DeltaXZ3;
546 $BeamPlug_y = $BeamWStPlateFF_y - $BeamPlugPosDZ*$DeltaYZ3;
547 $BeamPlug_z = $BeamWStPlateFF_z + $BeamPlugPosDZ;
549 $BePlFlangePosDZ = $SteelPlate + $FoamPadding + $SteelThickness + $BeamPlugUSAr + $BeamPlugLe*cos($BeamTheta3); #This is Dz to the end of the beam plug pipe needed for x,y position.
550 $BePlFlange_x = $BeamWStPlateFF_x - $BePlFlangePosDZ*$DeltaXZ3;
551 $BePlFlange_y = $BeamWStPlateFF_y - $BePlFlangePosDZ*$DeltaYZ3;
552 $BePlFlange_z = $BeamWStPlateFF_z + $BePlFlangePosDZ + 1.8; # Adding the half the thickness of the flange.
554 #$BeamPlugERingPosZ = -$BeamPlugLe/2 + 6.83;
555 $BeamPlugERingPosZ = -$BeamPlugLe/2 + 5.5;
556 $BeamPlugNiPos_z = 0.59/2/cos($BeamTheta3);
558 print "BeamPlugLe = $BeamPlugLe"."\n";
559 print "BeamTheta3 = $BeamTheta3"."\n";
560 print "BeamWStPlate x=$BeamWStPlate_x".", y=$BeamWStPlate_y".", z=$BeamWStPlate_z"."\n";
561 print "BeamWStSu x=$BeamWStSu_x".", y=$BeamWStSu_y".", z=$BeamWStSu_z"."\n";
562 print "BeamWFoRem x=$BeamWFoRem_x".", y=$BeamWFoRem_y".", z=$BeamWFoRem_z"."\n";
563 print "BeamWFo x=$BeamWFo_x".", y=$BeamWFo_y".", z=$BeamWFo_z"."\n";
564 print "BeamWGl x=$BeamWGl_x".", y=$BeamWGl_y".", z=$BeamWGl_z"."\n";
565 print "BeamWVa x=$BeamWVa_x".", y=$BeamWVa_y".", z=$BeamWVa_z"."\n";
566 print "CPAToWestCrWall=$CPAToWestCrWall"."\n";
567 print "BeamPlug x=$BeamPlug_x".", y=$BeamPlug_y".", z=$BeamPlug_z"."\n";
568 print "BeamPlugFlange x=$BePlFlange_x".", y=$BePlFlange_y".", z=$BePlFlange_z"."\n";
570 $BeamTheta3Deg = rad2deg($BeamTheta3);
571 $BeamPhi3Deg = rad2deg($BeamPhi3);
574 $BWFFCoord3X = $BeamWStPlateFF_x - $BeamWStSuPosDZ*$DeltaXZ3*2
576 $BWFFCoord3Y = $BeamWStPlateFF_y - $BeamWStSuPosDZ*$DeltaYZ3*2
577 + $OriginYSet + $posCryoInDetEnc_y;
578 $BWFFCoord3Z = - ($Cryostat_z/2 + $SteelSupport_z + $FoamPadding)
580 print "BeamWStPlateFF_x=".$BeamWStPlateFF_x.", BeamWStPlateFF_y=".$BeamWStPlateFF_y."\n";
581 print "BeamWStSuPosDZ= $BeamWStSuPosDZ; "." DeltaYZ3=".$DeltaYZ3."\n";
582 print "BWFFCoord3X =".$BWFFCoord3X."\n";
583 print "BWFFCoord3Y =".$BWFFCoord3Y."\n";
584 print "BWFFCoord3Z =".$BWFFCoord3Z."\n";
586 $BW3StPlCoordX = $BeamWStPlateFF_x + $OriginXSet;
587 $BW3StPlCoordY = $BeamWStPlateFF_y + $OriginYSet + $posCryoInDetEnc_y;
588 $BW3StPlCoordZ = $BeamWStPlateFF_z + $OriginZSet;
590 print "BW3StPlCoordX =".$BW3StPlCoordX."\n";
591 print "BW3StPlCoordY =".$BW3StPlCoordY."\n";
592 print "BW3StPlCoordZ =".$BW3StPlCoordZ."\n";
595 ###################################################################
596 ######################## CRT Dimensions ##########################
598 $CRTPaddleWidth = 5.0;
599 $CRTPaddleHeight = 1.0;
600 $CRTPaddleLength = 322.5;
602 $CRTModWidth = 162.5;
604 $CRTModLength = 322.5;
606 # SuperModule Centers as per Survey Document
607 $CRT_DSTopLeft_x = 171.2;
608 $CRT_DSTopLeft_y = -473.88;
609 $CRT_DSTopLeftFr_z = 1042.13;
610 $CRT_DSTopLeftBa_z = 1050.13;
612 $CRT_DSBotLeft_x = 176.51;
613 $CRT_DSBotLeft_y = -840.6;
614 $CRT_DSBotLeftFr_z = 1041.74;
615 $CRT_DSBotLeftBa_z = 1050.13;
617 $CRT_DSTopRight_x = -176.23;
618 $CRT_DSTopRight_y = -474.85;
619 $CRT_DSTopRightFr_z = 1042.64;
620 $CRT_DSTopRightBa_z = 1050.85;
622 $CRT_DSBotRight_x = -169.6;
623 $CRT_DSBotRight_y = -840.55;
624 $CRT_DSBotRightFr_z = 1042.88;
625 $CRT_DSBotRightBa_z = 1051.93;
627 $CRT_USTopLeft_x = 393.6;
628 $CRT_USTopLeft_y = -401.33;
629 $CRT_USTopLeftFr_z = -295.05;
630 $CRT_USTopLeftBa_z = -286.85;
632 $CRT_USBotLeft_x = 394.14;
633 $CRT_USBotLeft_y = -734.48;
634 $CRT_USBotLeftFr_z = -320.24;
635 $CRT_USBotLeftBa_z = -310.88;
637 $CRT_USTopRight_x = -38.85;
638 $CRT_USTopRight_y = -400.85;
639 $CRT_USTopRightFr_z = -998.95;
640 $CRT_USTopRightBa_z = -990.97;
642 $CRT_USBotRight_x = -31.47;
643 $CRT_USBotRight_y = -735.13;
644 $CRT_USBotRightFr_z = -1022.25;
645 $CRT_USBotRightBa_z = -1015.01;
647 # Coordinates of Survey origin w.r.t. Steel Plate box center as per penetrations steel plate drawing (flange 1.2)
648 $CRTSurveyOrigin_x = -36.0;
649 $CRTSurveyOrigin_y = 534.43;
650 $CRTSurveyOrigin_z = -344.1;
652 # Distance between CRT module centers and CRT SuperModule Centers
653 $ModuleSMDist = 85.6;
654 $ModuleOff_z = 1; # approx. correction for the center of a Module. Survey measures Z to the outside surface. Negative for the most US CRTs (surveyed from behind).
655 $ModuleLongCorr = 5.6; # allign the the modules at the frame's edge
657 # Beam Spot on the inside of the cryostat
659 $BeamSpotDSS_x = -20.58;
660 $BeamSpotDSS_y = -425.41;
661 $BeamSpotDSS_z = -82.96;
663 $BeamSpot_x = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $BeamSpotDSS_x + $OriginXSet;;
664 $BeamSpot_y = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $BeamSpotDSS_y + $OriginYSet;;
665 $BeamSpot_z = $posCryoInDetEnc_z + $CRTSurveyOrigin_z + $BeamSpotDSS_z + $OriginZSet;;
667 print "BeamSpot_x =".$BeamSpot_x.", BeamSpot_y =".$BeamSpot_y.", BeamSpot_z =".$BeamSpot_z."\n";
669 ####################### End of Survey data ##########
675 my @posCRTDS_rot = ();
677 $posCRTDS_x[0] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSTopLeft_x - $ModuleSMDist;
678 $posCRTDS_y[0] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSTopLeft_y - $ModuleLongCorr;
679 $posCRTDS_z[0] = $CRTSurveyOrigin_z + $CRT_DSTopLeftBa_z + $ModuleOff_z;
680 $posCRTDS_rot[0] = "rPlus90AboutX";
682 $posCRTDS_x[1] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSTopLeft_x + $ModuleSMDist;
683 $posCRTDS_y[1] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSTopLeft_y - $ModuleLongCorr;
684 $posCRTDS_z[1] = $CRTSurveyOrigin_z + $CRT_DSTopLeftBa_z + $ModuleOff_z;
685 $posCRTDS_rot[1] = "rPlus90AboutX";
687 $posCRTDS_x[2] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSTopLeft_x - $ModuleLongCorr;
688 $posCRTDS_y[2] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSTopLeft_y - $ModuleSMDist;
689 $posCRTDS_z[2] = $CRTSurveyOrigin_z + $CRT_DSTopLeftFr_z + $ModuleOff_z;
690 $posCRTDS_rot[2] = "rMinus90AboutYMinus90AboutX";
692 $posCRTDS_x[3] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSTopLeft_x - $ModuleLongCorr;
693 $posCRTDS_y[3] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSTopLeft_y + $ModuleSMDist;
694 $posCRTDS_z[3] = $CRTSurveyOrigin_z + $CRT_DSTopLeftFr_z + $ModuleOff_z;
695 $posCRTDS_rot[3] = "rMinus90AboutYMinus90AboutX";
697 $posCRTDS_x[4] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSBotLeft_x - $ModuleSMDist;
698 $posCRTDS_y[4] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSBotLeft_y + $ModuleLongCorr;
699 $posCRTDS_z[4] = $CRTSurveyOrigin_z + $CRT_DSBotLeftFr_z + $ModuleOff_z;
700 $posCRTDS_rot[4] = "rPlus90AboutX";
702 $posCRTDS_x[5] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSBotLeft_x + $ModuleSMDist;
703 $posCRTDS_y[5] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSBotLeft_y + $ModuleLongCorr;
704 $posCRTDS_z[5] = $CRTSurveyOrigin_z + $CRT_DSBotLeftFr_z + $ModuleOff_z;
705 $posCRTDS_rot[5] = "rPlus90AboutX";
707 $posCRTDS_x[6] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSBotLeft_x - $ModuleLongCorr;
708 $posCRTDS_y[6] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSBotLeft_y - $ModuleSMDist;
709 $posCRTDS_z[6] = $CRTSurveyOrigin_z + $CRT_DSBotLeftBa_z + $ModuleOff_z;
710 $posCRTDS_rot[6] = "rMinus90AboutYMinus90AboutX";
712 $posCRTDS_x[7] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSBotLeft_x - $ModuleLongCorr;
713 $posCRTDS_y[7] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSBotLeft_y + $ModuleSMDist;
714 $posCRTDS_z[7] = $CRTSurveyOrigin_z + $CRT_DSBotLeftBa_z + $ModuleOff_z;
715 $posCRTDS_rot[7] = "rMinus90AboutYMinus90AboutX";
717 $posCRTDS_x[8] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSTopRight_x - $ModuleSMDist;
718 $posCRTDS_y[8] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSTopRight_y - $ModuleLongCorr;
719 $posCRTDS_z[8] = $CRTSurveyOrigin_z + $CRT_DSTopRightFr_z + $ModuleOff_z;
720 $posCRTDS_rot[8] = "rPlus90AboutX";
722 $posCRTDS_x[9] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSTopRight_x + $ModuleSMDist;
723 $posCRTDS_y[9] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSTopRight_y - $ModuleLongCorr;
724 $posCRTDS_z[9] = $CRTSurveyOrigin_z + $CRT_DSTopRightFr_z + $ModuleOff_z;
725 $posCRTDS_rot[9] = "rPlus90AboutX";
727 $posCRTDS_x[10] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSTopRight_x + $ModuleLongCorr;
728 $posCRTDS_y[10] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSTopRight_y - $ModuleSMDist;
729 $posCRTDS_z[10] = $CRTSurveyOrigin_z + $CRT_DSTopRightBa_z + $ModuleOff_z;
730 $posCRTDS_rot[10] = "rMinus90AboutYMinus90AboutX";
732 $posCRTDS_x[11] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSTopRight_x + $ModuleLongCorr;
733 $posCRTDS_y[11] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSTopRight_y + $ModuleSMDist;
734 $posCRTDS_z[11] = $CRTSurveyOrigin_z + $CRT_DSTopRightBa_z + $ModuleOff_z;
735 $posCRTDS_rot[11] = "rMinus90AboutYMinus90AboutX";
737 $posCRTDS_x[12] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSBotRight_x - $ModuleSMDist;
738 $posCRTDS_y[12] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSBotRight_y + $ModuleLongCorr;
739 $posCRTDS_z[12] = $CRTSurveyOrigin_z + $CRT_DSBotRightBa_z + $ModuleOff_z;
740 $posCRTDS_rot[12] = "rPlus90AboutX";
742 $posCRTDS_x[13] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSBotRight_x + $ModuleSMDist;
743 $posCRTDS_y[13] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSBotRight_y + $ModuleLongCorr;
744 $posCRTDS_z[13] = $CRTSurveyOrigin_z + $CRT_DSBotRightBa_z + $ModuleOff_z;
745 $posCRTDS_rot[13] = "rPlus90AboutX";
747 $posCRTDS_x[14] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSBotRight_x + $ModuleLongCorr;
748 $posCRTDS_y[14] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSBotRight_y - $ModuleSMDist;
749 $posCRTDS_z[14] = $CRTSurveyOrigin_z + $CRT_DSBotRightFr_z + $ModuleOff_z;
750 $posCRTDS_rot[14] = "rMinus90AboutYMinus90AboutX";
752 $posCRTDS_x[15] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_DSBotRight_x + $ModuleLongCorr;
753 $posCRTDS_y[15] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_DSBotRight_y + $ModuleSMDist;
754 $posCRTDS_z[15] = $CRTSurveyOrigin_z + $CRT_DSBotRightFr_z + $ModuleOff_z;
755 $posCRTDS_rot[15] = "rMinus90AboutYMinus90AboutX";
761 my @posCRTUS_rot = ();
764 $posCRTUS_x[0] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USTopLeft_x - $ModuleSMDist;
765 $posCRTUS_y[0] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USTopLeft_y - $ModuleLongCorr;
766 $posCRTUS_z[0] = $CRTSurveyOrigin_z + $CRT_USTopLeftBa_z + $ModuleOff_z;
767 $posCRTUS_rot[0] = "rPlus90AboutX";
769 $posCRTUS_x[1] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USTopLeft_x + $ModuleSMDist;
770 $posCRTUS_y[1] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USTopLeft_y - $ModuleLongCorr;
771 $posCRTUS_z[1] = $CRTSurveyOrigin_z + $CRT_USTopLeftBa_z + $ModuleOff_z;
772 $posCRTUS_rot[1] = "rPlus90AboutX";
774 $posCRTUS_x[2] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USTopLeft_x - $ModuleLongCorr;
775 $posCRTUS_y[2] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USTopLeft_y - $ModuleSMDist;
776 $posCRTUS_z[2] = $CRTSurveyOrigin_z + $CRT_USTopLeftFr_z + $ModuleOff_z;
777 $posCRTUS_rot[2] = "rMinus90AboutYMinus90AboutX";
779 $posCRTUS_x[3] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USTopLeft_x - $ModuleLongCorr;
780 $posCRTUS_y[3] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USTopLeft_y + $ModuleSMDist;
781 $posCRTUS_z[3] = $CRTSurveyOrigin_z + $CRT_USTopLeftFr_z + $ModuleOff_z;
782 $posCRTUS_rot[3] = "rMinus90AboutYMinus90AboutX";
784 $posCRTUS_x[4] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USBotLeft_x - $ModuleSMDist;
785 $posCRTUS_y[4] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USBotLeft_y + $ModuleLongCorr;
786 $posCRTUS_z[4] = $CRTSurveyOrigin_z + $CRT_USBotLeftFr_z + $ModuleOff_z;
787 $posCRTUS_rot[4] = "rPlus90AboutX";
789 $posCRTUS_x[5] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USBotLeft_x + $ModuleSMDist;
790 $posCRTUS_y[5] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USBotLeft_y + $ModuleLongCorr;
791 $posCRTUS_z[5] = $CRTSurveyOrigin_z + $CRT_USBotLeftFr_z + $ModuleOff_z;
792 $posCRTUS_rot[5] = "rPlus90AboutX";
794 $posCRTUS_x[6] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USBotLeft_x - $ModuleLongCorr;
795 $posCRTUS_y[6] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USBotLeft_y - $ModuleSMDist;
796 $posCRTUS_z[6] = $CRTSurveyOrigin_z + $CRT_USBotLeftBa_z + $ModuleOff_z;
797 $posCRTUS_rot[6] = "rMinus90AboutYMinus90AboutX";
799 $posCRTUS_x[7] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USBotLeft_x - $ModuleLongCorr;
800 $posCRTUS_y[7] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USBotLeft_y + $ModuleSMDist;
801 $posCRTUS_z[7] = $CRTSurveyOrigin_z + $CRT_USBotLeftBa_z + $ModuleOff_z;
802 $posCRTUS_rot[7] = "rMinus90AboutYMinus90AboutX";
804 $posCRTUS_x[8] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USTopRight_x - $ModuleSMDist;
805 $posCRTUS_y[8] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USTopRight_y - $ModuleLongCorr;
806 $posCRTUS_z[8] = $CRTSurveyOrigin_z + $CRT_USTopRightFr_z - $ModuleOff_z;
807 $posCRTUS_rot[8] = "rPlus90AboutX";
809 $posCRTUS_x[9] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USTopRight_x + $ModuleSMDist;
810 $posCRTUS_y[9] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USTopRight_y - $ModuleLongCorr;
811 $posCRTUS_z[9] = $CRTSurveyOrigin_z + $CRT_USTopRightFr_z - $ModuleOff_z;
812 $posCRTUS_rot[9] = "rPlus90AboutX";
814 $posCRTUS_x[10] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USTopRight_x + $ModuleLongCorr;
815 $posCRTUS_y[10] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USTopRight_y - $ModuleSMDist;
816 $posCRTUS_z[10] = $CRTSurveyOrigin_z + $CRT_USTopRightBa_z - $ModuleOff_z;
817 $posCRTUS_rot[10] = "rMinus90AboutYMinus90AboutX";
819 $posCRTUS_x[11] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USTopRight_x + $ModuleLongCorr;
820 $posCRTUS_y[11] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USTopRight_y + $ModuleSMDist;
821 $posCRTUS_z[11] = $CRTSurveyOrigin_z + $CRT_USTopRightBa_z - $ModuleOff_z;
822 $posCRTUS_rot[11] = "rMinus90AboutYMinus90AboutX";
824 $posCRTUS_x[12] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USBotRight_x - $ModuleSMDist;
825 $posCRTUS_y[12] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USBotRight_y + $ModuleLongCorr;
826 $posCRTUS_z[12] = $CRTSurveyOrigin_z + $CRT_USBotRightBa_z - $ModuleOff_z;
827 $posCRTUS_rot[12] = "rPlus90AboutX";
829 $posCRTUS_x[13] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USBotRight_x + $ModuleSMDist;
830 $posCRTUS_y[13] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USBotRight_y + $ModuleLongCorr;
831 $posCRTUS_z[13] = $CRTSurveyOrigin_z + $CRT_USBotRightBa_z - $ModuleOff_z;
832 $posCRTUS_rot[13] = "rPlus90AboutX";
834 $posCRTUS_x[14] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USBotRight_x + $ModuleLongCorr;
835 $posCRTUS_y[14] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USBotRight_y - $ModuleSMDist;
836 $posCRTUS_z[14] = $CRTSurveyOrigin_z + $CRT_USBotRightFr_z - $ModuleOff_z;
837 $posCRTUS_rot[14] = "rMinus90AboutYMinus90AboutX";
839 $posCRTUS_x[15] = $posCryoInDetEnc_x + $CRTSurveyOrigin_x + $CRT_USBotRight_x + $ModuleLongCorr;
840 $posCRTUS_y[15] = $posCryoInDetEnc_y + $CRTSurveyOrigin_y + $CRT_USBotRight_y + $ModuleSMDist;
841 $posCRTUS_z[15] = $CRTSurveyOrigin_z + $CRT_USBotRightFr_z - $ModuleOff_z;
842 $posCRTUS_rot[15] = "rMinus90AboutYMinus90AboutX";
844 ###################################################################
845 ######################## Paddle Dimensions ########################
847 $APAFrameZSide_y = 4*$inch;
848 $APAFrameYSide_z = 4*$inch;
849 $LightPaddle_x = 0.476;
850 $LightPaddle_y = 4*$inch;
851 $LightPaddle_z = $APAFrame_z - 2*$APAFrameYSide_z;
852 $nLightPaddlesPerAPA = 10; # 10, or 20 for double coverage (for now)
853 #$PaddleYInterval = (2*$APAphys_y+$APAGap_y-$LightPaddle_y-2*$APAFrameZSide_y)
854 # /(2*$nLightPaddlesPerAPA-1);
855 $PaddleYInterval = 59.2;
856 #$FrameToPaddleSpace = ($PaddleYInterval-$APAGap_y)/2;
857 $FrameToPaddleSpace = 30.412;
860 # $PaddleYInterval is defined so that the center-to-center distance in the
861 # y direction between paddles is uniform between vertically stacked APAs.
862 # $FrameToPaddleSpace is from the BOTTOM of the APA frame (4" in y direction)
863 # to the CENTER of a paddle, including the 4" part of the frame. This variable's
864 # primary purpose is to position the lowest paddle in each APA.
867 ####################################################################
868 ######################## ARAPUCA Dimensions ########################
870 $ArapucaOut_x = 16.0;
871 $ArapucaOut_y = 96.0;
872 $ArapucaOut_z = 10.0*$LightPaddle_z;
875 $ArapucaIn_z = 100.0;
876 $ArapucaAcceptanceWindow_x =1.0;
877 $ArapucaAcceptanceWindow_y =80.0;
878 $ArapucaAcceptanceWindow_z =100.0;
879 $pos_subtraction_arapuca_x = 2.0;
880 $gapCenterLeft_arapuca_z = 50.0;#if not simmetrical, positioning of windows for odd APAs needs to change
881 $gapCenterRight_arapuca_z = 100.0-$gapCenterLeft_arapuca_z;
887 $list_pos[0]=-$gapCenterLeft_arapuca_z-0.5*$ArapucaIn_z;
888 for($list=1; $list<8; $list++){
889 $list_pos[$list]=$list_pos[$i-1]-1.0*$ArapucaIn_z-2.0;
891 $list_pos[8]=$gapCenterRight_arapuca_z+0.5*$ArapucaIn_z;
892 for($list=9; $list<16; $list++){
893 $list_pos[$list]=$list_pos[$i-1]+$ArapucaIn_z+2.0;
896 #nAraAPAi is the number of the APA that the ith arapuca bar goes into and nSlotArai, its slot in that APA. These numbers are valid for the protodune-sp geometry.
901 #+++++++++++++++++++++++++ End defining variables ++++++++++++++++++++++++++
904 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
905 #+++++++++++++++++++++++++++++++++++++++++ usage +++++++++++++++++++++++++++++++++++++++++
906 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
910 print "Usage: $0 [-h|--help] [-o|--output <fragments-file>] [-s|--suffix <string>]\n";
911 print " if -o is omitted, output goes to STDOUT; <fragments-file> is input to make_gdml.pl\n";
912 print " -s <string> appends the string to the file names; useful for multiple detector versions\n";
913 print " -h prints this message, then quits\n";
918 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
919 #++++++++++++++++++++++++++++++++++++++ gen_Define +++++++++++++++++++++++++++++++++++++++
920 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
925 # Create the <define> fragment file name,
926 # add file to list of fragments,
928 $DEF = "dune10kt_v6_Def" . $suffix . ".gdml";
929 push (@gdmlFiles, $DEF);
931 open(DEF) or die("Could not open file $DEF for writing");
933 $UWireAngle = 90-$UAngle;
934 $VWireAngle = 90+$VAngle;
936 <?xml version='1.0'?>
946 <position name="posCryoInDetEnc" unit="cm" x="0" y="$posCryoInDetEnc_y" z="0"/>
947 <position name="posCenter" unit="cm" x="0" y="0" z="0"/>
948 <position name="posBeamWAr3" unit="cm" x="$BeamPlug_x" y="$BeamPlug_y" z="$BeamPlug_z"/>
949 <rotation name="rPlus90AboutX" unit="deg" x="90" y="0" z="0"/>
950 <rotation name="rMinus90AboutY" unit="deg" x="0" y="270" z="0"/>
951 <rotation name="rMinus90AboutYMinus90AboutX" unit="deg" x="270" y="270" z="0"/>
952 <rotation name="rPlusUAngleAboutX" unit="deg" x="$UWireAngle" y="0" z="0"/>
953 <rotation name="rPlusVAngleAboutX" unit="deg" x="$VWireAngle" y="0" z="0"/>
954 <rotation name="rPlus180AboutX" unit="deg" x="180" y="0" z="0"/>
955 <rotation name="rPlus180AboutY" unit="deg" x="0" y="180" z="0"/>
956 <rotation name="rPlus180AboutZ" unit="deg" x="0" y="0" z="180"/>
957 <rotation name="rPlus180AboutXPlus180AboutY" unit="deg" x="180" y="180" z="0"/>
958 <rotation name="rPlus90AboutXPlus90AboutZ" unit="deg" x="90" y="0" z="90"/>
959 <rotation name="rPlus180AboutXPlus180AboutZ" unit="deg" x="180" y="0" z="180"/>
960 <rotation name="rIdentity" unit="deg" x="0" y="0" z="0"/>
961 <rotation name="rBeamW2" unit="deg" x="0" y="-$BeamTheta2Deg" z="$BeamPhi2Deg"/>
962 <rotation name="rBeamWRev2" unit="deg" x="-11.342" y="8.03118195044" z="-55.1415281209"/>
963 <rotation name="rBeamW3" unit="deg" x="0" y="-$BeamTheta3Deg" z="$BeamPhi3Deg"/>
964 <rotation name="rBeamWRev3" unit="deg" x="-11.342" y="11.6190450403" z="-44.8829268772"/>
965 <position name="posArapucaSub0" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[0]]}"/>
966 <position name="posArapucaSub1" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[1]]}"/>
967 <position name="posArapucaSub2" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[2]]}"/>
968 <position name="posArapucaSub3" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[3]]}"/>
969 <position name="posArapucaSub4" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[4]]}"/>
970 <position name="posArapucaSub5" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[5]]}"/>
971 <position name="posArapucaSub6" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[6]]}"/>
972 <position name="posArapucaSub7" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[7]]}"/>
973 <position name="posArapucaSub8" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[8]]}"/>
974 <position name="posArapucaSub9" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[9]]}"/>
975 <position name="posArapucaSub10" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[10]]}"/>
976 <position name="posArapucaSub11" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[11]]}"/>
977 <position name="posArapucaSub12" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[12]]}"/>
978 <position name="posArapucaSub13" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[13]]}"/>
979 <position name="posArapucaSub14" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[14]]}"/>
980 <position name="posArapucaSub15" unit="mm" x="@{[$pos_subtraction_arapuca_x]}" y="0" z="@{[$list_pos[15]]}"/>
987 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
988 #+++++++++++++++++++++++++++++++++++++ gen_Materials +++++++++++++++++++++++++++++++++++++
989 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
994 # Create the <materials> fragment file name,
995 # add file to list of output GDML fragments,
997 $MAT = "dune10kt_v6_Materials" . $suffix . ".gdml";
998 push (@gdmlFiles, $MAT);
1001 open(MAT) or die("Could not open file $MAT for writing");
1003 # Add any materials special to this geometry by defining a mulitline string
1004 # and passing it to the gdmlMaterials::gen_Materials() function.
1005 $spdensity = 0.001205*(1-$FracVolOfSteel) + 7.9300*$FracVolOfSteel;
1006 $ssairfrac = (1-$FracMassOfSteel);
1008 <!-- preliminary values -->
1009 <material name="AirSteelMixture" formula="AirSteelMixture">
1010 <D value="$spdensity" unit="g/cm3"/>
1011 <fraction n="$FracMassOfSteel" ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
1012 <fraction n="$ssairfrac" ref="Air"/>
1016 # add the general materials used anywere
1017 print MAT gdmlMaterials::gen_Materials( $asmix );
1022 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1023 #++++++++++++++++++++++++++++++++++++++++ gen_TPC ++++++++++++++++++++++++++++++++++++++++
1024 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1035 my $TPCActive_x = $_[0] - 3*$APAWirePlaneSpacing -3*$TPCWirePlaneThickness;
1036 if( ($protoDune == 1) && ($_[3] eq 'Outer') ){
1037 $TPCActive_x = 3*($APAWirePlaneSpacing + $TPCWirePlaneThickness);
1039 my $TPCActive_y = $_[1] - $APAGap_y/2 - $ReadoutBoardOverlap + $G10thickness; #TODO: make the Active height more accurate
1040 my $TPCActive_z = $_[2];
1043 #constructs everything inside volTPC, namely
1044 # (moving from left to right, or from +x to -x)
1046 # -volTPCPlaneU: with wires angled from vertical slightly different than in V
1047 # -volTPCPlaneV: with wires angled from vertical slightly differently than in U
1048 # -volTPCPlaneX: with vertical wires
1051 # Create the TPC fragment file name,
1052 # add file to list of output GDML fragments,
1054 $TPC = "dune10kt_v6_TPC_${_[3]}" . $suffix . ".gdml";
1055 push (@gdmlFiles, $TPC);
1057 open(TPC) or die("Could not open file $TPC for writing");
1060 print $wout "\n\n\n----- Wires for $_[3] -----\n\n\n";
1063 # The standard XML prefix and starting the gdml
1065 <?xml version='1.0'?>
1070 # All the TPC solids save the wires.
1071 $uplact_y = $Uactive_y + $UVPlaneBoundNudge;
1072 $uplact_z = $Uactive_z + $UVPlaneBoundNudge;
1073 $vplact_y = $Vactive_y + $UVPlaneBoundNudge;
1074 $vplact_z = $Vactive_z + $UVPlaneBoundNudge;
1077 <box name="$_[3]" lunit="cm"
1081 <box name="${_[3]}UPlane" lunit="cm"
1082 x="$TPCWirePlaneThickness"
1085 <box name="${_[3]}VPlane" lunit="cm"
1086 x="$TPCWirePlaneThickness"
1089 <box name="${_[3]}ZPlane" lunit="cm"
1090 x="$TPCWirePlaneThickness"
1094 #if(${_[3]} eq "Inner"){
1096 # <box name="${_[3]}Active_NoCPA" lunit="cm"
1099 # z="$TPCActive_z"/>
1104 <box name="${_[3]}Active" lunit="cm"
1112 #++++++++++++++++++++++++++++ Wire Solids ++++++++++++++++++++++++++++++
1113 $wirerad = 0.5*$TPCWireThickness;
1116 <tube name="${_[3]}WireVert"
1124 # Set number of wires to default to zero, when $wires_on = 0, for a low memory
1125 # version. But if $wires_on = 1, calculate the number of wires on each side of each
1126 # plane to be used in the for loops
1128 my $NumberCornerUWires = 0;
1129 my $NumberSideUWires = 0;
1130 my $NumberCommonUWires = 0;
1131 my $NumberCornerVWires = 0;
1132 my $NumberSideVWires = 0;
1133 my $NumberCommonVWires = 0;
1134 my $NumberVerticalWires = 0;
1138 # Number of wires in one corner
1139 $NumberCornerUWires = int( $APAFrame_z/($UWirePitch/$CosUAngle) );
1141 $NumberCornerVWires = int( $APAFrame_z/($VWirePitch/$CosVAngle) );
1144 # Total number of wires touching one vertical (longer) side
1145 # Note that the total number of wires per plane is this + another set of corner wires
1146 $NumberSideUWires = int( $Uactive_y/$UWire_yint );
1147 if($Pitch3mmVersion==1){ $NumberSideUWires = $NumberSideUWires-1; }
1149 $NumberSideVWires = int( $Vactive_y/$VWire_yint );
1151 # Number of wires per side that aren't cut off by the corner
1152 $NumberCommonUWires = $NumberSideUWires - $NumberCornerUWires;
1154 $NumberCommonVWires = $NumberSideVWires - $NumberCornerVWires;
1156 # Number of wires on the vertical plane
1157 # Since APA Active z is defined in docdb 3383 to be distance
1158 # between outer vertical wires, + 1 since the floor of this
1159 # division will be one under, giving the amt of spaces, not wires
1160 $NumberVerticalWires = int( $Zactive_z/$XWirePitch ) + 1;
1161 #$NumberVerticalWires = 960;
1164 $nUchans = 2*$NumberCornerUWires;
1165 $nVchans = 2*$NumberCornerVWires;
1167 print $wout "$nUchans U channels\n";
1168 print $wout "$nVchans V channels\n";
1169 print $wout "$NumberVerticalWires Z channels per side\n";
1171 print $wout "$NumberCornerUWires U corner wires\n";
1172 print $wout "$NumberCommonUWires U common wires\n";
1173 print $wout "$NumberCornerVWires V corner wires\n";
1174 print $wout "$NumberCommonVWires V common wires\n";
1178 # hard codeed number will be a factor determined from engineering spreadsheets on wire endpoints,
1179 # but since that won't exist for a while, use this number to avoid overlaps
1180 my $FirstUWireOffset = .55 + $G10thickness + 2*$G10thickness*$TanUAngle - $UWire_zint;
1181 my $FirstVWireOffset = .5; # doesnt include a G10 board in width
1183 if($Pitch3mmVersion==1){
1184 my $FirstUWireOffset = .15 + $G10thickness + 2*$G10thickness*$TanUAngle - $UWire_zint;
1185 my $FirstVWireOffset = .15; # doesnt include a G10 board in width
1188 if($UVAngle45Option==1){$FirstVWireOffset = .7;}
1191 my $FirstTopUWire_yspan =
1194 + $FirstUWireOffset/$TanUAngle # walk us up to the first wire
1195 + $UWire_yint*($NumberSideUWires-1) # up to the top of the top common wire
1196 - $Uactive_z/$TanUAngle # back to the bottom of the top common wire
1197 + $UWire_yint); # nudge up to bottom of the first top corner wire
1199 my $FirstTopVWire_yspan =
1202 + $FirstVWireOffset/$TanVAngle # walk us up to the first wire
1203 + $VWire_yint*($NumberSideVWires-1) # up to the top of the top common wire
1204 - $Vactive_z/$TanVAngle # back to the bottom of the top common wire
1205 + $VWire_yint); # nudge up to bottom of the first top corner wire
1208 # The corner wires for the U plane
1211 for ($i = 0; $i < $NumberCornerUWires; $i++)
1213 $CornerUWireLength[$i] = ($FirstUWireOffset + $i*$UWire_zint)/$SinUAngle;
1216 <tube name="${_[3]}WireU$i"
1218 z="$CornerUWireLength[$i]"
1226 $CommonUWireLength = $Uactive_z/$SinUAngle;
1229 <tube name="${_[3]}WireUCommon"
1231 z="$CommonUWireLength"
1237 for ($i = 0; $i < $NumberCornerUWires; $i++)
1240 $TopCornerUWireLength[$i] = ($FirstTopUWire_yspan - $i*$UWire_yint)/$CosUAngle;
1242 $j = $i + $NumberSideUWires;
1245 <tube name="${_[3]}WireU$j"
1247 z="$TopCornerUWireLength[$i]"
1258 # The corner wires for the V plane
1261 for ($i = 0; $i < $NumberCornerVWires; ++$i)
1263 $CornerVWireLength[$i] = ($FirstVWireOffset + $i*$VWire_zint)/$SinVAngle;
1267 <tube name="${_[3]}WireV$i"
1269 z="$CornerVWireLength[$i]"
1278 # The wire used many times in the middle of the V plane
1279 # Same subtraction as U common
1281 $CommonVWireLength = $Vactive_z/$SinVAngle;
1284 <tube name="${_[3]}WireVCommon"
1286 z="$CommonVWireLength"
1292 for ($i = 0; $i < $NumberCornerVWires; $i++)
1295 $TopCornerVWireLength[$i] = ($FirstTopVWire_yspan - $i*$VWire_yint)/$CosVAngle;
1297 $j = $i + $NumberSideVWires;
1300 <tube name="${_[3]}WireV$j"
1302 z="$TopCornerVWireLength[$i]"
1313 # Begin structure and create the vertical wire logical volume
1317 <volume name="volTPCActive${_[3]}">
1318 <materialref ref="LAr"/>
1319 <solidref ref="${_[3]}Active"/>
1328 <volume name="volTPCWireVert${_[3]}">
1329 <materialref ref="Copper_Beryllium_alloy25"/>
1330 <solidref ref="${_[3]}WireVert"/>
1334 # Corner U wires logical volumes
1335 for ($i = 0; $i < $NumberCornerUWires; ++$i)
1338 <volume name="volTPCWireU$i${_[3]}">
1339 <materialref ref="Copper_Beryllium_alloy25"/>
1340 <solidref ref="${_[3]}WireU$i"/>
1346 # Top Corner U wires logical volumes
1347 for ($j = $NumberSideUWires; $j < $NumberSideUWires + $NumberCornerUWires; ++$j)
1350 <volume name="volTPCWireU$j${_[3]}">
1351 <materialref ref="Copper_Beryllium_alloy25"/>
1352 <solidref ref="${_[3]}WireU$j"/>
1358 # Common U wire logical volume, referenced many times
1360 <volume name="volTPCWireUCommon${_[3]}">
1361 <materialref ref="Copper_Beryllium_alloy25"/>
1362 <solidref ref="${_[3]}WireUCommon"/>
1367 # Corner V wires logical volumes
1368 for ($i = 0; $i < $NumberCornerVWires; ++$i)
1371 <volume name="volTPCWireV$i${_[3]}">
1372 <materialref ref="Copper_Beryllium_alloy25"/>
1373 <solidref ref="${_[3]}WireV$i"/>
1379 # Top Corner V wires logical volumes
1380 for ($j = $NumberSideVWires; $j < $NumberSideVWires + $NumberCornerVWires; ++$j)
1383 <volume name="volTPCWireV$j${_[3]}">
1384 <materialref ref="Copper_Beryllium_alloy25"/>
1385 <solidref ref="${_[3]}WireV$j"/>
1390 # Common V wire logical volume, referenced many times
1392 <volume name="volTPCWireVCommon${_[3]}">
1393 <materialref ref="Copper_Beryllium_alloy25"/>
1394 <solidref ref="${_[3]}WireVCommon"/>
1405 #+++++++++++++++++++++++++ Position physical wires ++++++++++++++++++++++++++
1407 # ++++++++++++++++++++++ U Plane +++++++++++++++++++++++
1409 # Create U plane logical volume
1411 <volume name="volTPCPlaneU${_[3]}">
1412 <materialref ref="LAr"/>
1413 <solidref ref="${_[3]}UPlane"/>
1417 print $wout "\n- Wires for U plane -\n\n";
1418 print $wout " Uplane_y: $Uactive_y\n";
1419 print $wout " Uplane_z: $Uactive_z\n";
1425 # Starting with the bottom left corner wires:
1426 # x=0 to center the wires in the plane
1427 # y positioning: (-0.5*$TPCWirePlaneHeight) starts the incremental increase
1428 # from the bottom of the plane, and trigonometry gives the increment
1429 # z positioning: Looking at the plane from the positive x direction,
1430 # (0.5*$TPCWirePlaneLength) starts the incremental increase from
1431 # the lower left corner.
1432 # rotation: same as common wire in code below
1434 $FirstU_ypos = - $Uactive_y/2 + $FirstUWireOffset/$TanUAngle/2;
1435 $FirstU_zpos = + $Uactive_z/2 - $FirstUWireOffset/2;
1437 for ($i = 0; $i < $NumberCornerUWires; ++$i)
1440 my $ypos = $FirstU_ypos + ($i)*0.5*$UWire_yint;
1441 my $zpos = $FirstU_zpos - ($i)*0.5*$UWire_zint;
1443 $pitch = ($ypos - $lastYpos) * $SinUAngle
1444 - ($zpos - $lastZpos) * $CosUAngle;
1446 $xrotUAang = 90-$UAngle;
1449 <volumeref ref="volTPCWireU$i${_[3]}"/>
1450 <position name="pos${_[3]}WireU$i" unit="cm" x="0" y="$ypos " z="$zpos"/>
1451 <rotation name="rUAngle$i" unit="deg" x="$xrotUAang" y="0" z="0"/>
1455 $topY = $ypos + ($CosUAngle*$CornerUWireLength[$i]/2);
1456 $bottomY = $ypos - ($CosUAngle*$CornerUWireLength[$i]/2);
1457 $edgeZ_p = $zpos + ($SinUAngle*$CornerUWireLength[$i]/2);
1458 $edgeZ_m = $zpos - ($SinUAngle*$CornerUWireLength[$i]/2);
1459 print $wout "U$i: ( $ypos , $zpos ) (pitch = $pitch)\n";
1460 print $wout " -- Y: $bottomY to $topY -- Z: $edgeZ_m to $edgeZ_p \n";
1468 # Moving upwards to the common wires:
1469 # x and z are zero to center the wires along a vertical axis
1470 # y positioning: The trick is positioning the lowest common wire so that the pitch
1471 # is consistent, then the increment is double the increment of
1472 # the corner wires since there is no z incriment.
1473 # rotation: wires in \\\\ direction, so +90deg to bring them to vertical and
1474 # +UAngle counterclockwise to arrive at proper orientation
1475 # Note that the counter maintains wire number (in pos. name) counting bottom to top
1478 my $StartCommonUWires_ypos = $lastYpos + $UWire_yint - abs( $lastZpos )/$TanUAngle;
1480 for ($i = $NumberCornerUWires; $i < $NumberSideUWires; ++$i)
1483 $j = $i - $NumberCornerUWires;
1484 my $ypos = $StartCommonUWires_ypos + $UWire_yint*($j);
1487 if ( $ypos < $lastYpos ){ print "WARNING: y position dropped from $lastYpos (wire U$lastWnum) to $ypos (wire U$i)\n"; }
1488 if ( $ypos == $lastYpos ){ print "WARNING: y position between wire U$lastWnum and U$lastWnum did not move: $ypos\n"; }
1491 $pitch = ($ypos - $lastYpos) * $SinUAngle - ($zpos - $lastZpos) * $CosUAngle ;
1493 $xrotUAang = 90-$UAngle;
1496 <volumeref ref="volTPCWireUCommon${_[3]}"/>
1497 <position name="pos${_[3]}WireU$i" unit="cm" x="0" y="$ypos " z="0"/>
1498 <rotation name="rUAngle$i" unit="deg" x="$xrotUAang" y="0" z="0"/>
1502 $topY = $ypos + ($CosUAngle*$CommonUWireLength/2);
1503 $bottomY = $ypos - ($CosUAngle*$CommonUWireLength/2);
1504 $edgeZ_p = + ($SinUAngle*$CommonUWireLength/2);
1505 $edgeZ_m = - ($SinUAngle*$CommonUWireLength/2);
1506 print $wout "U$i: ( $ypos , 0 ) (pitch = $pitch)\n";
1507 print $wout " -- Y: $bottomY to $topY -- Z: $edgeZ_m to $edgeZ_p \n";
1516 my $FirstTopUWire_zspan = $FirstTopUWire_yspan*$TanUAngle;
1517 my $StartTopUWires_ypos = + $Uactive_y/2 - $FirstTopUWire_yspan/2;
1518 my $StartTopUWires_zpos = - $Uactive_z/2 + $FirstTopUWire_zspan/2;
1520 # Finally moving to the corner wires on the top right:
1521 # x=0 to center the wires in the plane
1522 # y positioning: plug wire number into same equation
1523 # z positioning: start at z=0 and go negatively at the same z increment
1524 # rotation: same as common wire in code above
1525 # note that the counter maintains wire number shown in the position name
1527 for ($j = $NumberSideUWires; $j < $NumberSideUWires+$NumberCornerUWires; ++$j)
1530 $i = $j - $NumberSideUWires;
1532 my $ypos = $StartTopUWires_ypos + ($i)*0.5*$UWire_yint;
1533 my $zpos = $StartTopUWires_zpos - ($i)*0.5*$UWire_zint;
1536 if ( $ypos < $lastYpos ){ print "WARNING: y position dropped from $lastYpos (wire U$lastWnum) to $ypos (wire U$j)\n"; }
1537 if ( $ypos == $lastYpos ){ print "WARNING: y position between wire U$lastWnum and U$j did not move: $ypos\n"; }
1539 $pitch = ($ypos - $lastYpos) * $SinUAngle - ($zpos - $lastZpos) * $CosUAngle ;
1541 $xrotUAang = 90-$UAngle;
1544 <volumeref ref="volTPCWireU$j${_[3]}"/>
1545 <position name="pos${_[3]}WireU$j" unit="cm" x="0" y="$ypos " z="$zpos"/>
1546 <rotation name="rUAngle$j" unit="deg" x="$xrotUAang" y="0" z="0"/>
1550 $topY = $ypos + ($CosUAngle*$TopCornerUWireLength[$i]/2);
1551 $bottomY = $ypos - ($CosUAngle*$TopCornerUWireLength[$i]/2);
1552 $edgeZ_p = $zpos + ($SinUAngle*$TopCornerUWireLength[$i]/2);
1553 $edgeZ_m = $zpos - ($SinUAngle*$TopCornerUWireLength[$i]/2);
1554 print $wout "U$j: ( $ypos , $zpos ) (pitch = $pitch)\n";
1555 print $wout " -- Y: $bottomY to $topY -- Z: $edgeZ_m to $edgeZ_p \n";
1565 # ++++++++++++++++++++++ V Plane +++++++++++++++++++++++
1567 # End U plane and create V plane logical volume
1571 <volume name="volTPCPlaneV${_[3]}">
1572 <materialref ref="LAr"/>
1573 <solidref ref="${_[3]}VPlane"/>
1576 print $wout "\n- Wires for V plane -\n\n";
1577 print $wout " Vplane_y: $Vactive_y\n";
1578 print $wout " Vplane_z: $Vactive_z\n";
1584 # Starting with the bottom right corner wires:
1585 # x=0 to center the wires in the plane
1586 # y positioning: (-0.5*$TPCWirePlaneHeight) starts the incremental increase
1587 # from the bottom of the plane, and trigonometry gives the increment
1588 # z positioning: Looking at the plane from the positive x direction,
1589 # (-0.5*$TPCWirePlaneLength) starts the incremental increase from
1590 # the lower right corner.
1591 # rotation: same as common wire in code below
1593 $FirstV_ypos = - $Vactive_y/2 + $FirstVWireOffset/$TanVAngle/2;
1594 $FirstV_zpos = - $Vactive_z/2 + $FirstVWireOffset/2;
1596 for ($i = 0; $i < $NumberCornerVWires; ++$i)
1599 my $ypos = $FirstV_ypos + ($i)*0.5*$VWire_yint;
1600 my $zpos = $FirstV_zpos + ($i)*0.5*$VWire_zint;
1602 $xrotVAang = 90+$VAngle;
1605 <volumeref ref="volTPCWireV$i${_[3]}"/>
1606 <position name="pos${_[3]}WireV$i" unit="cm" x="0" y="$ypos " z="$zpos"/>
1607 <rotation name="rVAngle$i" unit="deg" x="$xrotVAang" y="0" z="0"/>
1611 $topY = $ypos + ($CosVAngle*$CornerVWireLength[$i]/2);
1612 $bottomY = $ypos - ($CosVAngle*$CornerVWireLength[$i]/2);
1613 $edgeZ_p = $zpos + ($SinVAngle*$CornerVWireLength[$i]/2);
1614 $edgeZ_m = $zpos - ($SinVAngle*$CornerVWireLength[$i]/2);
1615 print $wout "V$i: ( $ypos , $zpos ) \n";
1616 print $wout " -- Y: $bottomY to $topY -- Z: $edgeZ_m to $edgeZ_p \n";
1624 # Moving upwards to the common wires:
1625 # x and z are zero to center the wires along a vertical axis
1626 # y positioning: Plug wire number into the same corner ypos equation
1627 # rotation: wires in //// direction, so +90deg to bring them to vertical and
1628 # --VAngle counterclockwise to arrive at proper orientation
1629 # Note that the counter maintains wire number in the position name
1631 my $StartCommonVWires_ypos = $lastYpos + $VWire_yint - abs( $lastZpos )/$TanVAngle;
1633 for ($i = $NumberCornerVWires; $i < $NumberSideVWires; ++$i)
1636 $j = $i - $NumberCornerVWires;
1637 my $ypos = $StartCommonVWires_ypos + $VWire_yint*($j);
1639 $xrotVAang = 90+$VAngle;
1642 <volumeref ref="volTPCWireVCommon${_[3]}"/>
1643 <position name="pos${_[3]}WireV$i" unit="cm" x="0" y="$ypos " z="0"/>
1644 <rotation name="rVAngle$i" unit="deg" x="$xrotVAang" y="0" z="0"/>
1648 $topY = $ypos + ($CosVAngle*$CommonVWireLength/2);
1649 $bottomY = $ypos - ($CosVAngle*$CommonVWireLength/2);
1650 $edgeZ_p = + ($SinVAngle*$CommonVWireLength/2);
1651 $edgeZ_m = - ($SinVAngle*$CommonVWireLength/2);
1652 print $wout "V$i: ( $ypos , 0 ) \n";
1653 print $wout " -- Y: $bottomY to $topY -- Z: $edgeZ_m to $edgeZ_p \n";
1656 #$lastZpos = $zpos; always 0
1661 my $FirstTopVWire_zspan = $FirstTopVWire_yspan*$TanVAngle;
1662 my $StartTopVWires_ypos = + $Vactive_y/2 - $FirstTopVWire_yspan/2;
1663 my $StartTopVWires_zpos = + $Vactive_z/2 - $FirstTopVWire_zspan/2;
1665 # Finally moving to the corner wires on the top right:
1666 # x=0 to center the wires in the plane
1667 # y positioning: plug wire number into same equation
1668 # z positioning: start at z=0 and go positively at the same z increment
1669 # rotation: same as common wire in code above
1670 # note that the counter maintains wire number shown in the position name
1672 for ($j = $NumberSideVWires; $j < $NumberSideVWires+$NumberCornerVWires; ++$j)
1675 $i = $j - $NumberSideVWires;
1677 my $ypos = $StartTopVWires_ypos + ($i)*0.5*$VWire_yint;
1678 my $zpos = $StartTopVWires_zpos + ($i)*0.5*$VWire_zint;
1680 $xrotVAang = 90+$VAngle;
1683 <volumeref ref="volTPCWireV$j${_[3]}"/>
1684 <position name="pos${_[3]}WireV$j" unit="cm" x="0" y="$ypos " z="$zpos"/>
1685 <rotation name="rVAngle$j" unit="deg" x="$xrotVAang" y="0" z="0"/>
1689 $topY = $ypos + ($CosVAngle*$TopCornerVWireLength[$i]/2);
1690 $bottomY = $ypos - ($CosVAngle*$TopCornerVWireLength[$i]/2);
1691 $edgeZ_p = $zpos + ($SinVAngle*$TopCornerVWireLength[$i]/2);
1692 $edgeZ_m = $zpos - ($SinVAngle*$TopCornerVWireLength[$i]/2);
1693 print $wout "V$j: ( $ypos , $zpos ) \n";
1694 print $wout " -- Y: $bottomY to $topY -- Z: $edgeZ_m to $edgeZ_p \n";
1707 # ++++++++++++++++++++++ Z Plane +++++++++++++++++++++++
1709 # End V plane and create Z plane logical volume
1713 <volume name="volTPCPlaneZ${_[3]}">
1714 <materialref ref="LAr"/>
1715 <solidref ref="${_[3]}ZPlane"/>
1721 # This is the simplest plane, one loop creates all of the wires
1722 # x and y position at zero to center the wires
1723 # z position: moving from front of detector to back, in the positive z direction,
1724 # starting at (-0.5*$TPCWirePlaneLength), the right side looking from
1727 for ($i=0; $i<$NumberVerticalWires; ++$i)
1729 my $zpos = (-0.5*$Zactive_z) + $i*$XWirePitch + $TPCWireThickness/2;
1733 <volumeref ref="volTPCWireVert${_[3]}"/>
1734 <position name="pos${_[3]}WireZ$i" unit="cm" x="0" y="0 " z="$zpos"/>
1735 <rotationref ref="rPlus90AboutX"/>
1747 #+++++++++++++++++++++ ^^ Position physical wires Above ^^ +++++++++++++++++++++
1749 ## make the TPC active volume extend down to the G10 for the grid
1751 my $BottomOfAPA = - $TPC_y/2 + $APAGap_y/2;
1754 $posZplane[0] = -$_[0]/2 + $APAWirePlaneSpacing + $TPCWirePlaneThickness/2;
1755 $posZplane[1] = $BottomOfAPA + $WrapCover + 4*$G10thickness + $Zactive_y/2;
1758 $posVplane[0] = $posZplane[0] + $APAWirePlaneSpacing + $TPCWirePlaneThickness;
1759 $posVplane[1] = $BottomOfAPA + $WrapCover + 3*$G10thickness + $Vactive_y/2;
1760 $posVplane[2] = $posZplane[2];
1762 $posUplane[0] = $posVplane[0] + $APAWirePlaneSpacing + $TPCWirePlaneThickness;
1763 $posUplane[1] = $BottomOfAPA + $WrapCover + 2*$G10thickness + $Uactive_y/2;
1764 $posUplane[2] = $posZplane[2];
1766 $posTPCActive[0] = $posUplane[0] + $TPCWirePlaneThickness/2 + $TPCActive_x/2;
1767 $posTPCActive[1] = -$_[1]/2 + $TPCActive_y/2;
1768 $posTPCActive[2] = 0;
1770 #wrap up the TPC file
1772 <volume name="volTPC${_[3]}">
1773 <materialref ref="LAr"/>
1774 <solidref ref="${_[3]}"/>
1776 <volumeref ref="volTPCPlaneZ${_[3]}"/>
1777 <position name="pos${_[3]}PlaneZ" unit="cm"
1778 x="$posZplane[0]" y="$posZplane[1]" z="$posZplane[2]"/>
1779 <rotationref ref="rIdentity"/>
1782 <volumeref ref="volTPCPlaneV${_[3]}"/>
1783 <position name="pos${_[3]}PlaneV" unit="cm"
1784 x="$posVplane[0]" y="$posVplane[1]" z="$posVplane[2]"/>
1785 <rotationref ref="rIdentity"/>
1788 <volumeref ref="volTPCPlaneU${_[3]}"/>
1789 <position name="pos${_[3]}PlaneU" unit="cm"
1790 x="$posUplane[0]" y="$posUplane[1]" z="$posUplane[2]"/>
1791 <rotationref ref="rIdentity"/>
1795 # Option to omit the active volume on the outside for the prototype.
1796 if( !($killOuterActive==1 && $_[3] eq 'Outer') ){
1799 <volumeref ref="volTPCActive${_[3]}"/>
1800 <position name="pos${_[3]}Active" unit="cm"
1801 x="$posTPCActive[0]" y="$posTPCActive[1]" z="$posTPCActive[2]"/>
1802 <rotationref ref="rIdentity"/>
1815 } #end of sub gen_TPC
1819 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1820 #++++++++++++++++++++++++++++++++++++++ gen_Cryostat +++++++++++++++++++++++++++++++++++++
1821 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1826 # Create the cryostat fragment file name,
1827 # add file to list of output GDML fragments,
1829 $CRYO = "dune10kt_v6_Cryostat" . $suffix . ".gdml";
1830 push (@gdmlFiles, $CRYO);
1831 $CRYO = ">" . $CRYO;
1832 open(CRYO) or die("Could not open file $CRYO for writing");
1835 # The standard XML prefix and starting the gdml
1837 <?xml version='1.0'?>
1841 $APAFrameZSide_x = $APAFrame_x;
1842 $APAFrameZSide_y = 4*$inch;
1843 $APAFrameZSide_z = $APAFrame_z;
1845 $APAFrameYSide_x = $APAFrame_x;
1846 $APAFrameYSide_y = $APAFrame_y-2*$APAFrameZSide_y;
1847 $APAFrameYSide_z = 4*$inch;
1849 # Two outer Y supports will sandwich the light paddles
1850 $APAFrameYOuterSupport_x = ($APAFrame_x-$LightPaddle_x)/2;
1851 $APAFrameYOuterSupport_y = $APAFrame_y-2*$APAFrameZSide_y;
1852 $APAFrameYOuterSupport_z = 4*$inch;
1854 $EdgeFrameSteelThickness = 0.12*$inch;
1855 $InnerFrameSteelThickness = 0.062*$inch;
1858 $G10BoardYSide_x = $APAFrame_x;
1859 $G10BoardYSide_y = $APAFrame_y;
1860 $G10BoardYSide_z = $G10thickness;
1862 $G10BoardZSide_x = $APAFrame_x;
1863 $G10BoardZSide_y = $G10thickness;
1864 $G10BoardZSide_z = $APAFrame_z;
1867 $CathFrame_x = 2.5*$inch;
1868 $CathFrame_y = 237.51*$inch;
1869 $CathFrame_z = 91.14*$inch;
1871 $CathTop_x = 1.185*$inch;
1872 $CathTop_y = 76.42*$inch;
1873 $CathTop_z = 43.47*$inch;
1875 $CathMid_x = 1.185*$inch;
1876 $CathMid_y = 76.67*$inch;
1877 $CathMid_z = 43.47*$inch;
1879 $CathPos_z = $CathFrame_z/2 - $CathTop_z/2 - 1*$inch;
1880 $CathPos_x = $CathFrame_x/2 - $CathTop_x/2 + 0.001; # 0.001 is for clean cut
1881 $CathTopPos_y= $CathFrame_y/2 - $CathTop_y/2 - 3*$inch;
1882 $CathBotPos_y= -$CathFrame_y/2 + $CathTop_y/2 + 3*$inch;
1884 print "CathMidPos_y = $CathMidPos_y"."\n";
1886 # All the cryostat solids.
1889 <box name="Cryostat" lunit="cm"
1894 <cutTube name="BeamPlugMod" rmin="0" rmax="12.0" z="$BeamPlugLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="0" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
1896 <cutTube name="BeamPlug_0" rmin="0" rmax="$BeamPlugRad" z="$BeamPlugLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="0" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
1898 <cutTube name="BeamPlugNi_0" rmin="0" rmax="$BeamPlugNiRad" z="$BeamPlugNiLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="0" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
1900 <torus name="TorRing" rmin="0" rmax="1.7" rtor="10.1" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
1901 <tube name="TubeRing1" rmin="$BeamPlugNiRad" rmax="$BeamPlugRad" z="0.5" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
1902 <tube name="TubeRing2" rmin="$BeamPlugNiRad" rmax="$BeamPlugRad" z="3.4" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
1904 <tube name="TubeBePlFlangeOut" rmin="0" rmax="15" z="3.6" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
1905 <tube name="TubeBePlFlangeIn" rmin="0" rmax="8.25" z="3.2" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
1906 <tube name="TubeBePlFlangeCut" rmin="12.5" rmax="15.01" z="2.302" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
1907 <tube name="TubeBePlFlangeTPCRem" rmin="0." rmax="12.5" z="0.91" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
1909 <subtraction name="BPRing">
1910 <first ref="TorRing"/>
1911 <second ref="TubeRing2"/>
1913 <union name="BeamPlugERing">
1914 <first ref="BPRing"/>
1915 <second ref="TubeRing1"/>
1918 <subtraction name="BePlFlangeSolid">
1919 <first ref="TubeBePlFlangeOut"/>
1920 <second ref="TubeBePlFlangeCut"/>
1921 <position name="posSubBePlFlangeSolid" x="0" y="0" z="0.651" unit="cm"/>
1923 <subtraction name="BePlFlange">
1924 <first ref="BePlFlangeSolid"/>
1925 <second ref="TubeBePlFlangeIn"/>
1926 <position name="posSubBePlFlange" x="0" y="0" z="-0.20" unit="cm"/>
1931 for($i=0 ; $i<7 ; $i++){
1935 $BeamPlugERing_z = $BeamPlugERingPosZ + $i*5.7;
1936 $BeamPlugNiERing_z = $BeamPlugERingPosZ + $i*5.7 - $BeamPlugNiPos_z;
1939 <subtraction name="BeamPlug_$new_i">
1940 <first ref="BeamPlug_$old_i"/>
1941 <second ref="BeamPlugERing"/>
1942 <position name="posBeamPlugSubtr_$new_i" x="0" y="0" z="$BeamPlugERing_z" unit="cm"/>
1944 <subtraction name="BeamPlugNi_$new_i">
1945 <first ref="BeamPlugNi_$old_i"/>
1946 <second ref="BeamPlugERing"/>
1947 <position name="posBeamPlugNiSubtr_$new_i" x="0" y="0" z="$BeamPlugNiERing_z" unit="cm"/>
1953 <box name="ArgonInterior" lunit="cm"
1958 <box name="GaseousArgon" lunit="cm"
1960 y="$HeightGaseousAr"
1963 <subtraction name="SteelShell">
1964 <first ref="Cryostat"/>
1965 <second ref="ArgonInterior"/>
1968 <box name="Cathode" lunit="cm"
1975 # <box name="CathFrame" lunit="cm"
1978 # z="$CathFrame_z"/>
1980 # <box name="CathTop" lunit="cm"
1985 # <box name="CathMid" lunit="cm"
1990 # <subtraction name="Cath-1">
1991 # <first ref="CathFrame"/>
1992 # <second ref="CathTop"/>
1993 # <position name="posCath-1" x="$CathPos_x" y="$CathTopPos_y" z="$CathPos_z" unit="cm"/>
1995 # <subtraction name="Cath-2">
1996 # <first ref="Cath-1"/>
1997 # <second ref="CathTop"/>
1998 # <position name="posCath-2" x="-$CathPos_x" y="$CathTopPos_y" z="$CathPos_z" unit="cm"/>
2000 # <subtraction name="Cath-3">
2001 # <first ref="Cath-2"/>
2002 # <second ref="CathTop"/>
2003 # <position name="posCath-3" x="$CathPos_x" y="$CathTopPos_y" z="-$CathPos_z" unit="cm"/>
2005 # <subtraction name="Cath-4">
2006 # <first ref="Cath-3"/>
2007 # <second ref="CathTop"/>
2008 # <position name="posCath-4" x="-$CathPos_x" y="$CathTopPos_y" z="-$CathPos_z" unit="cm"/>
2011 # <subtraction name="Cath-5">
2012 # <first ref="Cath-4"/>
2013 # <second ref="CathMid"/>
2014 # <position name="posCath-5" x="$CathPos_x" y="$CathMidPos_y" z="$CathPos_z" unit="cm"/>
2016 # <subtraction name="Cath-6">
2017 # <first ref="Cath-5"/>
2018 # <second ref="CathMid"/>
2019 # <position name="posCath-6" x="-$CathPos_x" y="$CathMidPos_y" z="$CathPos_z" unit="cm"/>
2021 # <subtraction name="Cath-7">
2022 # <first ref="Cath-6"/>
2023 # <second ref="CathMid"/>
2024 # <position name="posCath-7" x="$CathPos_x" y="$CathMidPos_y" z="-$CathPos_z" unit="cm"/>
2026 # <subtraction name="Cath-8">
2027 # <first ref="Cath-7"/>
2028 # <second ref="CathMid"/>
2029 # <position name="posCath-8" x="-$CathPos_x" y="$CathMidPos_y" z="-$CathPos_z" unit="cm"/>
2033 # <subtraction name="Cath-9">
2034 # <first ref="Cath-8"/>
2035 # <second ref="CathTop"/>
2036 # <position name="posCath-9" x="$CathPos_x" y="$CathBotPos_y" z="$CathPos_z" unit="cm"/>
2038 # <subtraction name="Cath-10">
2039 # <first ref="Cath-9"/>
2040 # <second ref="CathTop"/>
2041 # <position name="posCath-10" x="-$CathPos_x" y="$CathBotPos_y" z="$CathPos_z" unit="cm"/>
2043 # <subtraction name="Cath-11">
2044 # <first ref="Cath-10"/>
2045 # <second ref="CathTop"/>
2046 # <position name="posCath-11" x="$CathPos_x" y="$CathBotPos_y" z="-$CathPos_z" unit="cm"/>
2048 # <subtraction name="Cath-12">
2049 # <first ref="Cath-11"/>
2050 # <second ref="CathTop"/>
2051 # <position name="posCath-12" x="-$CathPos_x" y="$CathBotPos_y" z="-$CathPos_z" unit="cm"/>
2055 # <subtraction name="InnerActive">
2056 # <first ref="InnerActive_NoCPA"/>
2057 # <second ref="Cath-12"/>
2058 # <position name="posCPAInnerRem" x="179.23175" y="-3.805" z="0." unit="cm"/>
2061 #################################
2063 <box name="boxFCEWmod" x="354.3" y="151.2" z="12.8" lunit="cm"/>
2064 <box name="boxFCEWHorSuppOut" x="354.3" y="15.2" z="10.2" lunit="cm"/>
2065 <box name="boxFCEWHorSuppInn" x="354.301" y="14.0" z="9.0" lunit="cm"/>
2066 <box name="boxFCEWRem" x="354.301" y="15.201" z="1.3" lunit="cm"/>
2067 <box name="boxFCEWFieldShaping" x="354.3" y="151.2" z="1.3" lunit="cm"/>
2068 <box name="boxFCEWVerSupp" x="15.2" y="151.2" z="1.3" lunit="cm"/>
2070 <subtraction name="FCEWHorSupp">
2071 <first ref="boxFCEWHorSuppOut"/>
2072 <second ref="boxFCEWHorSuppInn"/>
2074 <subtraction name="FCEWHorSuppBar">
2075 <first ref="FCEWHorSupp"/>
2076 <second ref="boxFCEWRem"/>
2077 <position name="posFCEWHorSuppBar" x="0" y="0" z="2." unit="cm"/>
2080 <box name="boxFCEW-BP-Subtract" x="50.8" y="151.2" z="1.301" lunit="cm"/>
2081 <tube name="tubBePlHolemod" rmin="0" rmax="15.25" z="12.801" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
2082 <tube name="tubBePlHoleFiSh" rmin="0" rmax="15.25" z="1.301" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
2083 <box name="boxFCEW-BPFla-VerSupp" x="50.8" y="151.2" z="1.3" lunit="cm"/>
2084 <box name="boxFCEW-BPFla-Subtr" x="25.4" y="64" z="1.301" lunit="cm"/>
2085 <tube name="tubFCEW-BPFla-Subtr" rmin="0" rmax="14.0" z="1.301" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
2086 <tube name="tubFCEW-BPVer-Subtr" rmin="0" rmax="12.5" z="1.301" deltaphi="360." startphi="0" aunit="deg" lunit="cm"/>
2088 <subtraction name="boxFCEW-BP-NoHole">
2089 <first ref="boxFCEWmod"/>
2090 <second ref="boxFCEW-BP-Subtract"/>
2091 <position name="posFCEW-BP-NoHole" x="147.8" y="0" z="5.7505" unit="cm"/>
2093 <subtraction name="boxFCEW-BP-mod">
2094 <first ref="boxFCEW-BP-NoHole"/>
2095 <second ref="tubBePlHolemod"/>
2096 <position name="posboxFCEW-BP-mod" x="146" y="41.6" z="0" unit="cm"/>
2098 <subtraction name="FCEW-BP-FieldShaping">
2099 <first ref="boxFCEWFieldShaping"/>
2100 <second ref="tubBePlHoleFiSh"/>
2101 <position name="posFCEW-BP-FieldShapingSol" x="146" y="41.6" z="0" unit="cm"/>
2104 <subtraction name="FCEW-BPFla-Ver">
2105 <first ref="boxFCEW-BPFla-VerSupp"/>
2106 <second ref="boxFCEW-BPFla-Subtr"/>
2107 <position name="posFCEW-BPFla-Ver" x="0." y="-11.6" z="0." unit="cm"/>
2109 <subtraction name="FCEW-BPFla">
2110 <first ref="FCEW-BPFla-Ver"/>
2111 <second ref="tubFCEW-BPFla-Subtr"/>
2112 <position name="posFCEW-BPFlaSolid" x="-1.35" y="41.4" z="0." unit="cm"/>
2115 <subtraction name="FCEW-BPVer">
2116 <first ref="boxFCEWVerSupp"/>
2117 <second ref="tubFCEW-BPVer-Subtr"/>
2118 <position name="posFCEW-BP-Ver" x="-14.9" y="43.3" z="0." unit="cm"/>
2121 <box name="boxFCMod" x="352" y="27.4" z="230" lunit="cm"/>
2122 <box name="boxShieldPlate" x="264" y="2" z="230" lunit="cm"/>
2123 <box name="boxFCXBarOut" x="352" y="15.2" z="7.6" lunit="cm"/>
2124 <box name="boxFCXBarRem" x="352.001" y="13.9" z="3.501" lunit="cm"/>
2125 <box name="boxFCXFieldBarRem" x="352.001" y="1.3" z="0.61" lunit="cm"/>
2126 <box name="boxFCZBarOut" x="3.8" y="7.6" z="115.4" lunit="cm"/>
2127 <box name="boxFCZBarRem" x="1.58" y="6.3" z="115.401" lunit="cm"/>
2128 <box name="boxFCFieldBarPlane" x="352" y="1.3" z="230" lunit="cm"/>
2130 <subtraction name="FCXBarOut-1">
2131 <first ref="boxFCXBarOut"/>
2132 <second ref="boxFCXBarRem"/>
2133 <position name="posFCXBarOutSol-1" x="0" y="0" z="2.05" unit="cm"/>
2135 <subtraction name="FCXBarOut-2">
2136 <first ref="FCXBarOut-1"/>
2137 <second ref="boxFCXBarRem"/>
2138 <position name="posFCXBarOutSol-2" x="0" y="0" z="-2.05" unit="cm"/>
2140 <subtraction name="FCXBarOut">
2141 <first ref="FCXBarOut-2"/>
2142 <second ref="boxFCXFieldBarRem"/>
2143 <position name="posFCXBarOut" x="0" y="-3.3" z="0" unit="cm"/>
2145 <subtraction name="FCZBarOut-1">
2146 <first ref="boxFCZBarOut"/>
2147 <second ref="boxFCZBarRem"/>
2148 <position name="posFCZBarOut-1" x="1.111" y="0" z="0" unit="cm"/>
2150 <subtraction name="FCZBar">
2151 <first ref="FCZBarOut-1"/>
2152 <second ref="boxFCZBarRem"/>
2153 <position name="posFCZBar" x="-1.111" y="0" z="0" unit="cm"/>
2159 $LigthPaddleSiPM_z = $LightPaddle_z + $SiPM_z;
2160 $APAFrameYSideHollow_x = $APAFrameYSide_x-2*$EdgeFrameSteelThickness;
2161 $APAFrameYSideHollow_y = $APAFrameYSide_y-2*$EdgeFrameSteelThickness;
2162 $APAFrameZSideHollow_x = $APAFrameZSide_x-2*$EdgeFrameSteelThickness;
2163 $APAFrameZSideHollow_y = $APAFrameZSide_y-2*$EdgeFrameSteelThickness;
2165 <box name="LightPaddle" lunit="cm"
2168 z="$LigthPaddleSiPM_z"/>
2170 <box name="ArapucaOut" lunit="mm"
2171 x="@{[$ArapucaOut_x]}"
2172 y="@{[$ArapucaOut_y]}"
2173 z="@{[$ArapucaOut_z]}"/>
2175 <box name="ArapucaIn" lunit="mm"
2176 x="@{[$ArapucaIn_x]}"
2177 y="@{[$ArapucaIn_y]}"
2178 z="@{[$ArapucaIn_z]}"/>
2180 <subtraction name="ArapucaWalls0">
2181 <first ref="ArapucaOut"/>
2182 <second ref="ArapucaIn"/>
2183 <positionref ref="posArapucaSub0"/>
2185 <subtraction name="ArapucaWalls1">
2186 <first ref="ArapucaWalls0"/>
2187 <second ref="ArapucaIn"/>
2188 <positionref ref="posArapucaSub1"/>
2190 <subtraction name="ArapucaWalls2">
2191 <first ref="ArapucaWalls1"/>
2192 <second ref="ArapucaIn"/>
2193 <positionref ref="posArapucaSub2"/>
2195 <subtraction name="ArapucaWalls3">
2196 <first ref="ArapucaWalls2"/>
2197 <second ref="ArapucaIn"/>
2198 <positionref ref="posArapucaSub3"/>
2200 <subtraction name="ArapucaWalls4">
2201 <first ref="ArapucaWalls3"/>
2202 <second ref="ArapucaIn"/>
2203 <positionref ref="posArapucaSub4"/>
2205 <subtraction name="ArapucaWalls5">
2206 <first ref="ArapucaWalls4"/>
2207 <second ref="ArapucaIn"/>
2208 <positionref ref="posArapucaSub5"/>
2210 <subtraction name="ArapucaWalls6">
2211 <first ref="ArapucaWalls5"/>
2212 <second ref="ArapucaIn"/>
2213 <positionref ref="posArapucaSub6"/>
2215 <subtraction name="ArapucaWalls7">
2216 <first ref="ArapucaWalls6"/>
2217 <second ref="ArapucaIn"/>
2218 <positionref ref="posArapucaSub7"/>
2220 <subtraction name="ArapucaWalls8">
2221 <first ref="ArapucaWalls7"/>
2222 <second ref="ArapucaIn"/>
2223 <positionref ref="posArapucaSub8"/>
2225 <subtraction name="ArapucaWalls9">
2226 <first ref="ArapucaWalls8"/>
2227 <second ref="ArapucaIn"/>
2228 <positionref ref="posArapucaSub9"/>
2230 <subtraction name="ArapucaWalls10">
2231 <first ref="ArapucaWalls9"/>
2232 <second ref="ArapucaIn"/>
2233 <positionref ref="posArapucaSub10"/>
2235 <subtraction name="ArapucaWalls11">
2236 <first ref="ArapucaWalls10"/>
2237 <second ref="ArapucaIn"/>
2238 <positionref ref="posArapucaSub11"/>
2240 <subtraction name="ArapucaWalls12">
2241 <first ref="ArapucaWalls11"/>
2242 <second ref="ArapucaIn"/>
2243 <positionref ref="posArapucaSub12"/>
2245 <subtraction name="ArapucaWalls13">
2246 <first ref="ArapucaWalls12"/>
2247 <second ref="ArapucaIn"/>
2248 <positionref ref="posArapucaSub13"/>
2250 <subtraction name="ArapucaWalls14">
2251 <first ref="ArapucaWalls13"/>
2252 <second ref="ArapucaIn"/>
2253 <positionref ref="posArapucaSub14"/>
2255 <subtraction name="ArapucaWalls">
2256 <first ref="ArapucaWalls14"/>
2257 <second ref="ArapucaIn"/>
2258 <positionref ref="posArapucaSub15"/>
2262 <box name="ArapucaAcceptanceWindow" lunit="mm"
2263 x="@{[$ArapucaAcceptanceWindow_x]}"
2264 y="@{[$ArapucaAcceptanceWindow_y]}"
2265 z="@{[$ArapucaAcceptanceWindow_z]}"/>
2267 <box name="APAFrameYSideHollow" lunit="cm"
2268 x="$APAFrameYSideHollow_x"
2269 y="$APAFrameYSideHollow_y"
2270 z="$APAFrameYSide_z"/>
2271 <box name="APAFrameYSideShell" lunit="cm"
2272 x="$APAFrameYSide_x"
2273 y="$APAFrameYSide_y"
2274 z="$APAFrameYSide_z"/>
2276 <subtraction name="APAFrameYSide">
2277 <first ref="APAFrameYSideShell"/>
2278 <second ref="APAFrameYSideHollow"/>
2279 <positionref ref="posCenter"/>
2280 <rotationref ref="rIdentity"/>
2283 <box name="APAFrameZSideHollow" lunit="cm"
2284 x="$APAFrameZSideHollow_x"
2285 y="$APAFrameZSideHollow_y"
2286 z="$APAFrameZSide_z"/>
2287 <box name="APAFrameZSideShell" lunit="cm"
2288 x="$APAFrameZSide_x"
2289 y="$APAFrameZSide_y"
2290 z="$APAFrameZSide_z"/>
2291 <subtraction name="APAFrameZSide">
2292 <first ref="APAFrameZSideShell"/>
2293 <second ref="APAFrameZSideHollow"/>
2294 <positionref ref="posCenter"/>
2295 <rotationref ref="rIdentity"/>
2298 <box name="APAFrameYOuterSupport" lunit="cm"
2299 x="$EdgeFrameSteelThickness"
2300 y="$APAFrameYOuterSupport_y"
2301 z="$APAFrameYOuterSupport_z"/>
2304 <box name="G10BoardYSideCenterSeg" lunit="cm"
2305 x="$G10BoardYSide_x"
2306 y="$G10BoardYSide_y"
2307 z="$G10BoardYSide_z"/>
2309 <box name="G10BoardZSideCenterSeg" lunit="cm"
2310 x="$G10BoardZSide_x"
2311 y="$G10BoardZSide_y"
2312 z="$G10BoardZSide_z"/>
2317 # Cryostat structure
2320 <volume name="volSteelShell">
2321 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni" />
2322 <solidref ref="SteelShell" />
2324 <volume name="volGaseousArgon">
2325 <materialref ref="ArGas"/>
2326 <solidref ref="GaseousArgon"/>
2329 <volume name="volBeamPlugNi">
2330 <materialref ref="NiGas1atm80K"/>
2331 <solidref ref="BeamPlugNi_7"/>
2333 <volume name="volBeamPlugG10">
2334 <materialref ref="G10"/>
2335 <solidref ref="BeamPlug_7"/>
2337 <volumeref ref="volBeamPlugNi"/>
2338 <position name="posBeamPlugNi" x="0" y="0" z="$BeamPlugNiPos_z" unit="cm"/>
2342 <volume name="volBeamPlugERing">
2343 <materialref ref="ALUMINUM_Al"/>
2344 <solidref ref="BeamPlugERing"/>
2347 <volume name="volBeamPlugMod">
2348 <materialref ref="LAr"/>
2349 <solidref ref="BeamPlugMod"/>
2351 <volumeref ref="volBeamPlugG10"/>
2352 <positionref ref="posCenter"/>
2356 for($i=0 ; $i<7 ; $i++){
2357 $BeamPlugERing_z = $BeamPlugERingPosZ + $i*5.7;
2359 <physvol name="volBeamPlugERing_$i">
2360 <volumeref ref="volBeamPlugERing"/>
2361 <position name="posBeamPlugERing_$i" x="0" y="0" z="$BeamPlugERing_z" unit="cm"/>
2368 <volume name="volBePlFlangeNi">
2369 <materialref ref="NiGas1atm80K"/>
2370 <solidref ref="TubeBePlFlangeIn"/>
2372 <volume name="volBePlFlange">
2373 <materialref ref="G10"/>
2374 <solidref ref="BePlFlange"/>
2376 <volume name="volCathode">
2377 <materialref ref="G10" />
2378 <solidref ref="Cathode" />
2382 for($i=0 ; $i<$nAPAs ; $i++){
2383 for($p=0 ; $p<10 ; $p++){
2385 <volume name="volOpDetSensitive_$i\-$p">
2386 <materialref ref="LAr"/>
2387 <solidref ref="LightPaddle"/>
2393 for($i=0 ; $i<$nAPAs ; $i++){
2394 if($i==$nAraAPA1 || $i==$nAraAPA2){
2396 <volume name="volArapuca_$i">
2397 <materialref ref="G10" />
2398 <solidref ref="ArapucaWalls" />
2401 for($p=0 ; $p<16 ; $p++){
2403 <volume name="volOpDetSensitive_Arapuca_$i\-$p">
2404 <materialref ref="LAr"/>
2405 <solidref ref="ArapucaAcceptanceWindow"/>
2412 #### End wall field cage module
2414 <volume name="volFCEWHorSuppBar">
2415 <materialref ref="FR4"/>
2416 <solidref ref="FCEWHorSuppBar"/>
2418 <volume name="volFCEWFieldBarPlane">
2419 <materialref ref="ALUMINUM_Al"/>
2420 <solidref ref="boxFCEWFieldShaping"/>
2422 <volume name="volFCEWVerSuppBar">
2423 <materialref ref="FR4"/>
2424 <solidref ref="boxFCEWVerSupp"/>
2426 <volume name="volFCEWmod">
2427 <materialref ref="LAr"/>
2428 <solidref ref="boxFCEWmod"/>
2429 <physvol name="volFCEWHorSuppBar-1">
2430 <volumeref ref="volFCEWHorSuppBar"/>
2431 <position name="posFCEWHorSuppBar-1" x="0" y="54.5" z="0" unit="cm"/>
2433 <physvol name="volFCEWHorSuppBar-2">
2434 <volumeref ref="volFCEWHorSuppBar"/>
2435 <position name="posFCEWHorSuppBar-2" x="0" y="-54.5" z="0" unit="cm"/>
2438 <volumeref ref="volFCEWFieldBarPlane"/>
2439 <position name="posFCEWFieldBarPlane" x="0" y="0" z="2" unit="cm"/>
2441 <physvol name="volFCEWVerSuppBar-1">
2442 <volumeref ref="volFCEWVerSuppBar"/>
2443 <position name="posFCEWVerSuppBar-1" x="-165.75" y="0" z="5.75" unit="cm"/>
2445 <physvol name="volFCEWVerSuppBar-2">
2446 <volumeref ref="volFCEWVerSuppBar"/>
2447 <position name="posFCEWVerSuppBar-2" x="74.2" y="0" z="5.75" unit="cm"/>
2449 <physvol name="volFCEWVerSuppBar-3">
2450 <volumeref ref="volFCEWVerSuppBar"/>
2451 <position name="posFCEWVerSuppBar-3" x="164.2" y="0" z="5.75" unit="cm"/>
2453 <physvol name="volFCEWVerSuppBar-4">
2454 <volumeref ref="volFCEWVerSuppBar"/>
2455 <position name="posFCEWVerSuppBar-4" x="-165.75" y="0" z="-5.75" unit="cm"/>
2457 <physvol name="volFCEWVerSuppBar-5">
2458 <volumeref ref="volFCEWVerSuppBar"/>
2459 <position name="posFCEWVerSuppBar-5" x="74.2" y="0" z="-5.75" unit="cm"/>
2461 <physvol name="volFCEWVerSuppBar-6">
2462 <volumeref ref="volFCEWVerSuppBar"/>
2463 <position name="posFCEWVerSuppBar-6" x="164.2" y="0" z="-5.75" unit="cm"/>
2469 ##### Beam plug end wall module
2473 <volume name="volFCEW-BP-FieldShaping">
2474 <materialref ref="ALUMINUM_Al"/>
2475 <solidref ref="FCEW-BP-FieldShaping"/>
2477 <volume name="volFCEW-BPFla">
2478 <materialref ref="FR4"/>
2479 <solidref ref="FCEW-BPFla"/>
2481 <volume name="volFCEW-BPVer">
2482 <materialref ref="FR4"/>
2483 <solidref ref="FCEW-BPVer"/>
2486 <volume name="volFCEW-BP-mod">
2487 <materialref ref="LAr"/>
2488 <solidref ref="boxFCEW-BP-mod"/>
2489 <physvol name="volFCEW-BP-HorSuppBar-1">
2490 <volumeref ref="volFCEWHorSuppBar"/>
2491 <position name="posFCEW-BP-HorSuppBar-1" x="0" y="64.5" z="0" unit="cm"/>
2493 <physvol name="volFCEW-BP-HorSuppBar-2">
2494 <volumeref ref="volFCEWHorSuppBar"/>
2495 <position name="posFCEW-BP-HorSuppBar-2" x="0" y="-54.5" z="0" unit="cm"/>
2498 <volumeref ref="volFCEW-BP-FieldShaping"/>
2499 <position name="posFCEW-BP-FieldShaping" x="0" y="0" z="2" unit="cm"/>
2501 <physvol name="volFCEW-BP-VerSuppBar-1">
2502 <volumeref ref="volFCEWVerSuppBar"/>
2503 <position name="posFCEW-BP-VerSuppBar-1" x="-74.2" y="0" z="5.75" unit="cm"/>
2505 <physvol name="volFCEW-BP-VerSuppBar-2">
2506 <volumeref ref="volFCEWVerSuppBar"/>
2507 <position name="posFCEW-BP-VerSuppBar-2" x="-164.2" y="0" z="5.75" unit="cm"/>
2509 <physvol name="volFCEW-BP-VerSuppBar-3">
2510 <volumeref ref="volFCEWVerSuppBar"/>
2511 <position name="posFCEW-BP-VerSuppBar-3" x="-74.2" y="0" z="-5.75" unit="cm"/>
2513 <physvol name="volFCEW-BP-VerSuppBar-4">
2514 <volumeref ref="volFCEWVerSuppBar"/>
2515 <position name="posFCEW-BP-VerSuppBar-4" x="-164.2" y="0" z="-5.75" unit="cm"/>
2517 <physvol name="volFCEW-BP-VerSuppBar-5">
2518 <volumeref ref="volFCEWVerSuppBar"/>
2519 <position name="posFCEW-BP-VerSuppBar-5" x="122.5" y="0" z="-5.75" unit="cm"/>
2522 <volumeref ref="volFCEW-BPVer"/>
2523 <position name="posFCEW-BPVer" x="169.4" y="0" z="-5.75" unit="cm"/>
2529 ##### Top and bottom field cage module volume
2533 <volume name="volFCXBarOut">
2534 <materialref ref="FR4"/>
2535 <solidref ref="FCXBarOut"/>
2537 <volume name="volFCZBar">
2538 <materialref ref="FR4"/>
2539 <solidref ref="FCZBar"/>
2541 <volume name="volFCFieldBarPlane">
2542 <materialref ref="ALUMINUM_Al"/>
2543 <solidref ref="boxFCFieldBarPlane"/>
2545 <volume name="volShieldPlate">
2546 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
2547 <solidref ref="boxShieldPlate"/>
2549 <volume name="volFCMod">
2550 <materialref ref="LAr"/>
2551 <solidref ref="boxFCMod"/>
2552 <physvol name="volFCXBarOut-1">
2553 <volumeref ref="volFCXBarOut"/>
2554 <position name="posFCXBarOut-1" x="0" y="-6.1" z="58" unit="cm"/>
2556 <physvol name="volFCXBarOut-2">
2557 <volumeref ref="volFCXBarOut"/>
2558 <position name="posFCXBarOut-2" x="0" y="-6.1" z="-58" unit="cm"/>
2561 <volumeref ref="volFCFieldBarPlane"/>
2562 <position name="posFCFieldBarPlane" x="0" y="-9.4" z="0" unit="cm"/>
2564 <physvol name="volFCZBar-1">
2565 <volumeref ref="volFCZBar"/>
2566 <position name="posFCZBar-1" x="141.6" y="-4.1" z="0" unit="cm"/>
2568 <physvol name="volFCZBar-2">
2569 <volumeref ref="volFCZBar"/>
2570 <position name="posFCZBar-2" x="-41" y="-4.1" z="0" unit="cm"/>
2572 <physvol name="volFCZBar-3">
2573 <volumeref ref="volFCZBar"/>
2574 <position name="posFCZBar-3" x="-143.5" y="-4.1" z="0" unit="cm"/>
2577 <volumeref ref="volShieldPlate"/>
2578 <position name="posShieldPlate" x="44" y="12.7" z="0" unit="cm"/>
2584 $posGaseousArgon_y = $Argon_y/2-$HeightGaseousAr/2;
2585 $BePlFlangeNi_z = $BePlFlange_z - 0.2;
2588 <volume name="volAPAFrameYSide">
2589 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
2590 <solidref ref="APAFrameYSide"/>
2593 <volume name="volAPAFrameZSide">
2594 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
2595 <solidref ref="APAFrameZSide"/>
2598 <volume name="volAPAFrameYOuterSupport">
2599 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
2600 <solidref ref="APAFrameYOuterSupport"/>
2603 <volume name="volG10BoardYSideCenterSeg">
2604 <materialref ref="G10"/>
2605 <solidref ref="G10BoardYSideCenterSeg"/>
2608 <volume name="volG10BoardZSideCenterSeg">
2609 <materialref ref="G10"/>
2610 <solidref ref="G10BoardZSideCenterSeg"/>
2613 <volume name="volCryostat">
2614 <materialref ref="LAr" />
2615 <solidref ref="Cryostat" />
2617 <volumeref ref="volGaseousArgon"/>
2618 <position name="posGaseousArgon" unit="cm" x="0" y="$posGaseousArgon_y" z="0"/>
2621 <volumeref ref="volSteelShell"/>
2622 <position name="posSteelShell" unit="cm" x="0" y="0" z="0"/>
2625 <volumeref ref="volBeamPlugMod"/>
2626 <positionref ref="posBeamWAr3"/>
2627 <rotationref ref="rBeamWRev3"/>
2630 <volumeref ref="volBePlFlange"/>
2631 <position name="posBePlFlange" unit="cm" x="$BePlFlange_x" y="$BePlFlange_y" z="$BePlFlange_z"/>
2634 <volumeref ref="volBePlFlangeNi"/>
2635 <position name="posBePlFlangeNi" x="$BePlFlange_x" y="$BePlFlange_y" z="$BePlFlangeNi_z" unit="cm"/>
2639 print "Beam Plug position x=".$BePlFlange_x." y=".$BePlFlange_y." z=".$BePlFlange_z."\n";
2640 # nested for loops to place the non-rotated AND rotated volTPC
2641 # x loop rotation: There are six drift volumes. Looking into the
2642 # detector from incident direction, and counting from right (-x) to
2643 # left (+x), odd number volumes need to be rotated 180deg about Y in
2644 # order for the cathode to be on the right of the APA.
2651 for($k=0 ; $k<$nAPALong ; $k++)
2653 $APACenter_z = - $Argon_z/2
2654 + $UpstreamLArPadding
2656 + $k*($APAphys_z+$APAGap_z);
2659 for($j=0 ; $j<$nAPAHigh ; $j++) # nAPAHigh always going to be 2
2660 { # $j=0 for bottom APAs
2662 $APACenter_y = - $Argon_y/2 + $SpaceAPAToFloor
2664 + $j*($APAphys_y+$APAGap_y);
2666 if( $workspace == 0 )
2669 for($i=0 ; $i<$nAPAWide ; $i++)
2672 $APACenter_x = - $Argon_x/2
2673 + $SpaceAPAToCryoWall + $APA_UtoU_x/2 + $TPCWirePlaneThickness/2
2676 $CPA_x = $APACenter_x + $CPAToAPA;
2677 # print "$i".", $nAPAWide".", CPA_x = $CPA_x"."\n";
2679 place_APA($APACenter_x, $APACenter_y, $APACenter_z, $apa_i, $j);
2680 place_OpDets($APACenter_x, $APACenter_y, $APACenter_z, $apa_i);
2681 $tpc_0 = 2*$apa_i+0;
2682 $tpc_1 = 2*$apa_i+1;
2685 $SelectTPC_0 = "Inner";
2686 $SelectTPC_1 = "Inner";
2687 $TPC_0_x = $TPCInner_x;
2688 $TPC_1_x = $TPCInner_x;
2689 $rot_0 = "rPlus180AboutY";
2690 $rot_1 = "rIdentity";
2691 if($i == 0) { $SelectTPC_0 = "Outer"; $TPC_0_x = $TPCOuter_x; }
2692 if($i == $nAPAWide-1) { $SelectTPC_1 = "Outer"; $TPC_1_x = $TPCOuter_x; }
2693 if($j == 0) { $rot_0 = "rPlus180AboutXPlus180AboutY";
2694 $rot_1 = "rPlus180AboutX"; } #put the readout end at the bottom for bottom APAs
2697 $posvolTPC0_x = $APACenter_x - $APAFrame_x/2 - $TPC_0_x/2;
2698 $posvolTPC1_x = $APACenter_x + $APAFrame_x/2 + $TPC_1_x/2;
2702 <volumeref ref="volTPC$SelectTPC_0"/>
2703 <position name="posTPC\-$tpc_0" unit="cm"
2707 <rotationref ref="$rot_0"/>
2710 <volumeref ref="volTPC$SelectTPC_1"/>
2711 <position name="posTPC\-$tpc_1" unit="cm"
2715 <rotationref ref="$rot_1"/>
2721 if( $i < $nAPAWide - 1 ){ # avoid placeing the last row of CPAs since the APAs are on the outside
2723 print "$cpa_i".". CPA_x = $CPA_x".", APACenter_y = $APACenter_y".", APACenter_z = $APACenter_z"."\n";
2724 $CPAmodbarGap = 1.8*$inch;
2725 $FCmodRight_x[$cpa_i] = $CPA_x + 3 + 352/2; # CPAmodCenter_x to FCmodCenter_x
2726 $FCmodLeft_x[$cpa_i] = $CPA_x - 3 - 352/2;
2727 $FCmodTop_y[$cpa_i] = $APACenter_y + 603.3/2 + $CPAmodbarGap + 9.4 + 1.83; # CPAmodCenter_y to FCmodCenter_y with 1.5 inch distance between CPA and module bars
2728 $FCmodBottom_y[$cpa_i] = $APACenter_y - 603.3/2 - $CPAmodbarGap - 9.4 - 1.83;
2729 $FCmod_z[$cpa_i] = $APACenter_z;
2731 $FCEWmodRight_x = $CPA_x + 3 + 354.3/2;
2732 $FCEWmodLeft_x = $CPA_x - 3 - 354.3/2;
2734 $FCEWmodUS_z = $APACenter_z - 231.5/2 - $CPAmodbarGap - 2; #CPAmodCenter_z to FCEWmod
2735 for($fcewy_i = 0; $fcewy_i < 4; $fcewy_i++){
2737 $FCEWmod_y[$fcewy_i] = $APACenter_y + (-3 + 2*$fcewy_i)*77; #distance between FCEW module is 2.8 cm (originally 0.8 cm)
2742 $FCEWmodDS_z = $APACenter_z + 231.5/2 + $CPAmodbarGap + 2;
2747 <volumeref ref="volCathode"/>
2748 <position name="posCathode\-$cpa_i" unit="cm"
2752 <rotationref ref="rIdentity"/>
2754 <physvol name="volFCModTopRight\-$cpa_i">
2755 <volumeref ref="volFCMod"/>
2756 <position name="posFCModTopRight\-$cpa_i" unit="cm"
2757 x="$FCmodRight_x[$cpa_i]"
2758 y="$FCmodTop_y[$cpa_i]"
2759 z="$FCmod_z[$cpa_i]"/>
2760 <rotationref ref="rPlus180AboutY"/>
2762 <physvol name="volFCModTopLeft\-$cpa_i">
2763 <volumeref ref="volFCMod"/>
2764 <position name="posFCModTopLeft\-$cpa_i" unit="cm"
2765 x="$FCmodLeft_x[$cpa_i]"
2766 y="$FCmodTop_y[$cpa_i]"
2767 z="$FCmod_z[$cpa_i]"/>
2768 <rotationref ref="rIdentity"/>
2770 <physvol name="volFCModBottomRight\-$cpa_i">
2771 <volumeref ref="volFCMod"/>
2772 <position name="posFCModBottomRight\-$cpa_i" unit="cm"
2773 x="$FCmodRight_x[$cpa_i]"
2774 y="$FCmodBottom_y[$cpa_i]"
2775 z="$FCmod_z[$cpa_i]"/>
2776 <rotationref ref="rPlus180AboutXPlus180AboutY"/>
2778 <physvol name="volFCModBottomLeft\-$cpa_i">
2779 <volumeref ref="volFCMod"/>
2780 <position name="posFCModBottomLeft\-$cpa_i" unit="cm"
2781 x="$FCmodLeft_x[$cpa_i]"
2782 y="$FCmodBottom_y[$cpa_i]"
2783 z="$FCmod_z[$cpa_i]"/>
2784 <rotationref ref="rPlus180AboutX"/>
2793 ################################## End Wall Field Cage Placement
2800 } # end if not the smaller workspace
2803 # Make the workspace have only one center APA with CPAs and the full drift on either side
2804 elsif( $workspace == 1 ){
2807 $CPA_0_x = $APACenter_x - $CPAToAPA;
2808 $CPA_1_x = $APACenter_x + $CPAToAPA;
2811 place_APA($APACenter_x, $APACenter_y, $APACenter_z, $apa_i, $j);
2812 place_OpDets($APACenter_x, $APACenter_y, $APACenter_z, $apa_i);
2814 $tpc_0 = 2*$apa_i+0;
2815 $tpc_1 = 2*$apa_i+1;
2818 $rot_0 = "rPlus180AboutY";
2819 $rot_1 = "rIdentity";
2820 if($j == 0) { $rot_0 = "rPlus180AboutXPlus180AboutY";
2821 $rot_1 = "rPlus180AboutX"; } #put the readout end at the bottom for bottom APAs
2823 $posvolTPCInner0_x = $APACenter_x - $APAFrame_x/2 - $TPCInner_x/2;
2824 $posvolTPCInner1_x = $APACenter_x + $APAFrame_x/2 + $TPCInner_x/2;
2828 <volumeref ref="volTPCInner"/>
2829 <position name="posTPC\-$tpc_0" unit="cm"
2830 x="$posvolTPCInner0_x"
2833 <rotationref ref="$rot_0"/>
2836 <volumeref ref="volTPCInner"/>
2837 <position name="posTPC\-$tpc_1" unit="cm"
2838 x="$posvolTPCInner1_x"
2841 <rotationref ref="$rot_1"/>
2845 <volumeref ref="volCathode"/>
2846 <position name="posCathode\-$apa_i-0" unit="cm"
2850 <rotationref ref="rIdentity"/>
2853 <volumeref ref="volCathode"/>
2854 <position name="posCathode\-$apa_i-1" unit="cm"
2858 <rotationref ref="rIdentity"/>
2863 } # if the smaller workspace
2871 for($fcewy_i = 0; $fcewy_i < 4; $fcewy_i++){
2874 <physvol name="volFCEWModUSLeft\-$fcewy_i">
2875 <volumeref ref="volFCEWmod"/>
2876 <position name="posFCEWModUSLeft\-$fcewy_i" unit="cm"
2878 y="$FCEWmod_y[$fcewy_i]"
2880 <rotationref ref="rPlus180AboutZ"/>
2885 <physvol name="volFCEWModUSRight\-$fcewy_i">
2886 <volumeref ref="volFCEWmod"/>
2887 <position name="posFCEWModUSRight\-$fcewy_i" unit="cm"
2889 y="$FCEWmod_y[$fcewy_i]"
2891 <rotationref ref="rIdentity"/>
2893 <physvol name="volFCEWModDSRight\-$fcewy_i">
2894 <volumeref ref="volFCEWmod"/>
2895 <position name="posFCEWModDSRight\-$fcewy_i" unit="cm"
2897 y="$FCEWmod_y[$fcewy_i]"
2899 <rotationref ref="rPlus180AboutX"/>
2901 <physvol name="volFCEWModDSLeft\-$fcewy_i">
2902 <volumeref ref="volFCEWmod"/>
2903 <position name="posFCEWModDSLeft\-$fcewy_i" unit="cm"
2905 y="$FCEWmod_y[$fcewy_i]"
2907 <rotationref ref="rPlus180AboutXPlus180AboutZ"/>
2912 $FCEWBPmod_x = $FCEWmodLeft_x + 2.8;
2913 $FCEWBPmod_y = $FCEWmod_y[2] + 0.9;
2914 $FCEWBPmod_z = $FCEWmodUS_z;
2916 $FCEWBPFla_x = $FCEWBPmod_x + 147.8;
2917 $FCEWBPFla_y = $FCEWBPmod_y + 0;
2918 $FCEWBPFla_z = $FCEWBPmod_z + 5.75;
2920 print "volFCEW-BPFla pos x=".$FCEWBPFla_x." y=".$FCEWBPFla_y." z=".$FCEWBPFla_z."\n";
2924 <volumeref ref="volFCEW-BP-mod"/>
2925 <position name="posFCEW-BP-mod" unit="cm"
2932 <volumeref ref="volFCEW-BPFla"/>
2933 <position name="posFCEW-BPFla" unit="cm"
2951 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2952 #++++++++++++++++++++++++++++++++++++ place_OpDets +++++++++++++++++++++++++++++++++++++++
2953 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2958 $APACenter_x = $_[0];
2959 $APACenter_y = $_[1];
2960 $APACenter_z = $_[2];
2965 for ($paddle = 0; $paddle<$nLightPaddlesPerAPA; $paddle++)
2968 # All Light Paddle centers will have the same
2969 # X coordinate as the center of the current APA
2970 # Z coordinate as the current TPC pair
2971 # The Y coordinate must be looped over:
2973 #the multiplication by j here is a temporary dirty trick to get around some strange behavior
2975 $Paddle_Y = $APACenter_y
2977 + $FrameToPaddleSpace
2978 + (1-$j)*($LightPaddle_y/2)
2979 + $PaddleYInterval*$paddle;
2981 if($apa_i==$nAraAPA1){
2982 if($paddle==$nSlotAra1) {$test=1;}
2983 } #where the arapuca bar goes for pDUNE
2984 if($apa_i==$nAraAPA2){
2985 if($paddle==$nSlotAra2) {$test=1;}
2989 # Alternate the paddle orientations
2990 if ( $paddle % 2 == 0 ) { $rot = "rIdentity"; }
2991 else { $rot = "rPlus180AboutY"; }
2993 $posvolOpDetSensitive_z = $APACenter_z + $SiPM_z/2;
2996 <volumeref ref="volOpDetSensitive_$apa_i\-$paddle"/>
2997 <position name="posPaddle\-$paddle\-TPC\-$i\-$j\-$k" unit="cm"
3000 z="$posvolOpDetSensitive_z"/>
3001 <rotationref ref="$rot"/>
3007 if ( $apa_i % 2 == 0 ) {
3009 $posArax = ($APACenter_x+0.05*$ArapucaOut_x-0.05*$ArapucaAcceptanceWindow_x-0.01);
3011 $rot = "rPlus180AboutY";
3012 $posArax = ($APACenter_x-0.05*$ArapucaOut_x+0.05*$ArapucaAcceptanceWindow_x+0.01);
3017 <volumeref ref="volArapuca_$apa_i"/>
3018 <position name="posArapuca$apa_i-TPC\-$i\-$j\-$k" unit="cm"
3019 x="@{[$APACenter_x]}"
3021 z="@{[$APACenter_z]}"/>
3022 <rotationref ref="$rot"/>
3025 for ($ara = 0; $ara<16; $ara++){
3028 <volumeref ref="volOpDetSensitive_Arapuca_$apa_i\-$ara"/>
3029 <position name="posOpArapuca$apa_i\-$ara\-TPC\-$i\-$j\-$k" unit="cm"
3032 z="@{[(0.1*$list_pos[$ara]+$APACenter_z)]}"/>
3038 }#end Paddle for-loop
3044 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3045 #++++++++++++++++++++++++++++++++++++++ place_APA ++++++++++++++++++++++++++++++++++++++++
3046 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3049 # Must be called only within gen_Cryostat(),
3052 # $_[0] = x APA physical center
3053 # $_[1] = y APA physical center
3054 # $_[2] = z APA physical center
3055 # $_[3] = APA number
3056 # $_[4] = 0 for APA with readout on bottom
3057 # 1 for APA with readout on top
3064 ####################################################################
3065 ################# APA Frame and Paddle Dimensions ##################
3067 # The center passed to this function is the physical APA center,
3068 # which is not quite the frame's center, since there are more boards
3069 # at the bottom. Transform them:
3071 $APAFrameCenter_x = $_[0];
3072 $APAFrameCenter_z = $_[2];
3074 # The bottom APAs are upside down relative to how the TPC is initially generated,
3075 # and the center needs to be slightly shifted since there is extra G10 on the
3076 # end that doesn't read out.
3078 if($_[4]==1) # top APAs
3080 $APAFrameCenter_y = $_[1] - $APAphys_y/2
3081 + $WrapCover + 4*$G10thickness
3084 elsif($_[4]==0) # bottom APAs
3086 $APAFrameCenter_y = $_[1] + $APAphys_y/2
3087 - $WrapCover - 4*$G10thickness
3090 else{ print "APA not labeled as top or bottom"; }
3092 $APAFrameZSide_x = $APAFrame_x;
3093 $APAFrameZSide_y = 4*$inch;
3094 $APAFrameZSide_z = $APAFrame_z;
3096 $APAFrameYSide_x = $APAFrame_x;
3097 $APAFrameYSide_y = $APAFrame_y-2*$APAFrameZSide_y;
3098 $APAFrameYSide_z = 4*$inch;
3100 # Two outer Y supports will sandwich the light paddles
3101 $APAFrameYOuterSupport_x = ($APAFrame_x-$LightPaddle_x)/2;
3102 $APAFrameYOuterSupport_y = $APAFrame_y-2*$APAFrameZSide_y;
3103 $APAFrameYOuterSupport_z = 4*$inch;
3105 # if there were an inner support to fill the hole
3106 $APAFrameYInnerSupport_x = $LightPaddle_x;
3108 $EdgeFrameSteelThickness = 0.12*$inch;
3109 $InnerFrameSteelThickness = 0.062*$inch;
3112 $G10BoardYSide_x = $APAFrame_x;
3113 $G10BoardYSide_y = $APAFrame_y;
3114 $G10BoardYSide_z = $G10thickness;
3116 $G10BoardZSide_x = $APAFrame_x;
3117 $G10BoardZSide_y = $G10thickness;
3118 $G10BoardZSide_z = $APAFrame_z;
3120 if($_[4]==1) # top APAs
3122 $posG10ZSideZ_y = $APAFrameCenter_y - $APAFrame_y/2 - (0+.5)*($G10BoardZSide_y);
3123 $posG10ZSideV_y = $APAFrameCenter_y - $APAFrame_y/2 - (1+.5)*($G10BoardZSide_y);
3124 $posG10ZSideU_y = $APAFrameCenter_y - $APAFrame_y/2 - (2+.5)*($G10BoardZSide_y);
3125 $posG10ZSideGrid_y = $APAFrameCenter_y - $APAFrame_y/2 - (3+.5)*($G10BoardZSide_y);
3127 elsif($_[4]==0) # bottom APAs
3129 $posG10ZSideZ_y = $APAFrameCenter_y + $APAFrame_y/2 + (0+.5)*($G10BoardZSide_y);
3130 $posG10ZSideV_y = $APAFrameCenter_y + $APAFrame_y/2 + (1+.5)*($G10BoardZSide_y);
3131 $posG10ZSideU_y = $APAFrameCenter_y + $APAFrame_y/2 + (2+.5)*($G10BoardZSide_y);
3132 $posG10ZSideGrid_y = $APAFrameCenter_y + $APAFrame_y/2 + (3+.5)*($G10BoardZSide_y);
3134 else{ print "APA not labeled as top or bottom"; }
3136 # First put in the frame
3140 # <volumeref ref="volAPAFrameYOuterSupport\-$APA_i"/>
3141 # <position name="posAPAFrameYOuterSupportNeg\-$APA_i" unit="cm"
3142 # x="$APAFrameCenter_x - ($APAFrameYOuterSupport_x + $APAFrameYInnerSupport_x/2 - $EdgeFrameSteelThickness/2)"
3143 # y="$APAFrameCenter_y"
3144 # z="$APAFrameCenter_z"/>
3145 # <rotationref ref="rIdentity"/>
3148 # <volumeref ref="volAPAFrameYOuterSupport\-$APA_i"/>
3149 # <position name="posAPAFrameYOuterSupportPos\-$APA_i" unit="cm"
3150 # x="$APAFrameCenter_x + ($APAFrameYOuterSupport_x + $APAFrameYInnerSupport_x/2 - $EdgeFrameSteelThickness/2)"
3151 # y="$APAFrameCenter_y"
3152 # z="$APAFrameCenter_z"/>
3153 # <rotationref ref="rIdentity"/>
3158 $posvolAPAFrameYSideNeg_z = $APAFrameCenter_z - $APAFrame_z/2 + $APAFrameYSide_z/2;
3159 $posvolAPAFrameYSidePos_z = $APAFrameCenter_z + $APAFrame_z/2 - $APAFrameYSide_z/2;
3160 $posvolAPAFrameZSidePos_y = $APAFrameCenter_y + $APAFrame_y/2 - $APAFrameZSide_y/2;
3161 $posvolAPAFrameZSideNeg_y = $APAFrameCenter_y - $APAFrame_y/2 + $APAFrameZSide_y/2;
3164 <volumeref ref="volAPAFrameYSide"/>
3165 <position name="posAPAFrameYSideNeg\-$APA_i" unit="cm"
3166 x="$APAFrameCenter_x"
3167 y="$APAFrameCenter_y"
3168 z="$posvolAPAFrameYSideNeg_z"/>
3169 <rotationref ref="rIdentity"/>
3172 <volumeref ref="volAPAFrameYSide"/>
3173 <position name="posAPAFrameYSidePos\-$APA_i" unit="cm"
3174 x="$APAFrameCenter_x"
3175 y="$APAFrameCenter_y"
3176 z="$posvolAPAFrameYSidePos_z"/>
3177 <rotationref ref="rIdentity"/>
3180 <volumeref ref="volAPAFrameZSide"/>
3181 <position name="posAPAFrameZSidePos\-$APA_i" unit="cm"
3182 x="$APAFrameCenter_x"
3183 y="$posvolAPAFrameZSidePos_y"
3184 z="$APAFrameCenter_z"/>
3185 <rotationref ref="rIdentity"/>
3188 <volumeref ref="volAPAFrameZSide"/>
3189 <position name="posAPAFrameZSideNeg\-$APA_i" unit="cm"
3190 x="$APAFrameCenter_x"
3191 y="$posvolAPAFrameZSideNeg_y"
3192 z="$APAFrameCenter_z"/>
3193 <rotationref ref="rIdentity"/>
3197 <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3198 - Add the *parts* of the G10 boards that exist directly in volCryostat.
3199 - There are two boards on each the up and downstream end,
3200 one each to wrap the U and V views around the APA frame
3201 - There are 4 on the bottom which anchor the U V and Z wires and the grid plane
3202 - The rest of the parts of the G10 boards must be placed directly in volTPC -->
3205 $posvolG10BoardYSideCenterSegVup_z = $APAFrameCenter_z - $APAFrame_z/2 - (0+.5)*($G10BoardYSide_z);
3206 $posvolG10BoardYSideCenterSegUup_z = $APAFrameCenter_z - $APAFrame_z/2 - (1+.5)*($G10BoardYSide_z);
3207 $posvolG10BoardYSideCenterSegVdo_z = $APAFrameCenter_z + $APAFrame_z/2 + (0+.5)*($G10BoardYSide_z);
3208 $posvolG10BoardYSideCenterSegUdo_z = $APAFrameCenter_z + $APAFrame_z/2 + (1+.5)*($G10BoardYSide_z);
3211 <volumeref ref="volG10BoardYSideCenterSeg"/>
3212 <position name="posG10BoardYSideCenterSeg\-Vup\-$APA_i" unit="cm"
3213 x="$APAFrameCenter_x"
3214 y="$APAFrameCenter_y"
3215 z="$posvolG10BoardYSideCenterSegVup_z"/>
3216 <rotationref ref="rIdentity"/>
3219 <volumeref ref="volG10BoardYSideCenterSeg"/>
3220 <position name="posG10BoardYSideCenterSeg\-Uup\-$APA_i" unit="cm"
3221 x="$APAFrameCenter_x"
3222 y="$APAFrameCenter_y"
3223 z="$posvolG10BoardYSideCenterSegUup_z"/>
3224 <rotationref ref="rIdentity"/>
3228 <volumeref ref="volG10BoardYSideCenterSeg"/>
3229 <position name="posG10BoardYSideCenterSeg\-Vdown\-$APA_i" unit="cm"
3230 x="$APAFrameCenter_x"
3231 y="$APAFrameCenter_y"
3232 z="$posvolG10BoardYSideCenterSegVdo_z"/>
3233 <rotationref ref="rIdentity"/>
3236 <volumeref ref="volG10BoardYSideCenterSeg"/>
3237 <position name="posG10BoardYSideCenterSeg\-Udown\-$APA_i" unit="cm"
3238 x="$APAFrameCenter_x"
3239 y="$APAFrameCenter_y"
3240 z="$posvolG10BoardYSideCenterSegUdo_z"/>
3241 <rotationref ref="rIdentity"/>
3245 <volumeref ref="volG10BoardZSideCenterSeg"/>
3246 <position name="posG10BoardZSideCenterSeg\-Z\-$APA_i" unit="cm"
3247 x="$APAFrameCenter_x"
3249 z="$APAFrameCenter_z"/>
3250 <rotationref ref="rIdentity"/>
3253 <volumeref ref="volG10BoardZSideCenterSeg"/>
3254 <position name="posG10BoardZSideCenterSeg\-V\-$APA_i" unit="cm"
3255 x="$APAFrameCenter_x"
3257 z="$APAFrameCenter_z"/>
3258 <rotationref ref="rIdentity"/>
3261 <volumeref ref="volG10BoardZSideCenterSeg"/>
3262 <position name="posG10BoardZSideCenterSeg\-U\-$APA_i" unit="cm"
3263 x="$APAFrameCenter_x"
3265 z="$APAFrameCenter_z"/>
3266 <rotationref ref="rIdentity"/>
3269 <volumeref ref="volG10BoardZSideCenterSeg"/>
3270 <position name="posG10BoardZSideCenterSeg\-Grid\-$APA_i" unit="cm"
3271 x="$APAFrameCenter_x"
3272 y="$posG10ZSideGrid_y"
3273 z="$APAFrameCenter_z"/>
3274 <rotationref ref="rIdentity"/>
3285 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3286 #+++++++++++++++++++++++++++++++++++++ gen_Enclosure +++++++++++++++++++++++++++++++++++++
3287 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3292 # Create the detector enclosure fragment file name,
3293 # add file to list of output GDML fragments,
3295 $ENCL = "dune10kt_v6_DetEnclosure" . $suffix . ".gdml";
3296 push (@gdmlFiles, $ENCL);
3297 $ENCL = ">" . $ENCL;
3298 open(ENCL) or die("Could not open file $ENCL for writing");
3301 # The standard XML prefix and starting the gdml
3303 <?xml version='1.0'?>
3308 # All the detector enclosure solids.
3309 $dimFoamPadBlock_x = $Cryostat_x + 2*$FoamPadding;
3310 $dimFoamPadBlock_y = $Cryostat_y + 2*$FoamPadding;
3311 $dimFoamPadBlock_z = $Cryostat_z + 2*$FoamPadding;
3312 $dimSteelSupportBlock_x = $Cryostat_x + 2*$FoamPadding + 2*$SteelSupport_x;
3313 $dimSteelSupportBlock_y = $Cryostat_y + 2*$FoamPadding + 2*$SteelSupport_y;
3314 $dimSteelSupportBlock_z = $Cryostat_z + 2*$FoamPadding + 2*$SteelSupport_z;
3315 $dimSteelPlateBlock_x = $Cryostat_x + 2*$FoamPadding + 2*$SteelPlate;
3316 $dimSteelPlateBlock_y = $Cryostat_y + 2*$FoamPadding + 2*$SteelPlate;
3317 $dimSteelPlateBlock_z = $Cryostat_z + 2*$FoamPadding + 2*$SteelPlate;
3320 $dimPitWidth = 1650;
3321 $dimStSuToDSPitWall = 160;
3322 $dimPitLength = $DetEncLength/2 + $dimSteelSupportBlock_z/2 + $dimStSuToDSPitWall;
3323 $dimEnclConcrete_y = $SpaceSteelSupportToWall + $dimPitDepth;
3324 $DetCentToJuraPit = 958;
3326 $dimPit_y = $dimPitDepth + 0.1; # try to avoid overlap
3327 $dimPit_z = $dimPitLength + 0.1;
3328 $posPitInConcrete_x = $DetCentToJuraPit - $dimPitWidth/2;
3329 $posPitInConcrete_y = $dimEnclConcrete_y/2 - $dimPitDepth/2 ;
3330 $posPitInConcrete_z = - $DetEncLength/2 + $dimPitLength/2 ;
3331 $posSurrConcrete_y = - $DetEncHeight/2 + $dimEnclConcrete_y/2 ;
3333 print "FoamPad x=$dimFoamPadBlock_x".", y=$dimFoamPadBlock_y".", z=$dimFoamPadBlock_z"."\n";
3334 print "SteelPlate x=$dimSteelPlateBlock_x".", y=$dimSteelPlateBlock_y".", z=$dimSteelPlateBlock_z"."\n";
3335 print "SteelSupport x=$dimSteelSupportBlock_x".", y=$dimSteelSupportBlock_y".", z=$dimSteelSupportBlock_z"."\n";
3338 <box name="FoamPadBlock" lunit="cm"
3339 x="$dimFoamPadBlock_x"
3340 y="$dimFoamPadBlock_y"
3341 z="$dimFoamPadBlock_z" />
3343 <box name="SteelPlateBlock" lunit="cm"
3344 x="$dimSteelPlateBlock_x"
3345 y="$dimSteelPlateBlock_y"
3346 z="$dimSteelPlateBlock_z" />
3348 <subtraction name="SteelPlateNoBW">
3349 <first ref="SteelPlateBlock"/>
3350 <second ref="FoamPadBlock"/>
3351 <positionref ref="posCenter"/>
3354 <subtraction name="FoamPaddingNoBW">
3355 <first ref="FoamPadBlock"/>
3356 <second ref="Cryostat"/>
3357 <positionref ref="posCenter"/>
3361 # <cutTube name="BeamWindowStPlate" rmin="0" rmax="$BeamPipeRad" z="$BeamWStPlateLe" startphi="0" deltaphi="360" lowX="-0.239669734044" lowY="0" lowZ="-0.970854478582" highX="0.239669734044" highY="0" highZ="0.970854478582" aunit="deg" lunit="cm"/>
3363 # <cutTube name="BeamWindowFoam" rmin="0" rmax="$BeamPipeRad" z="$BeamWFoLe" startphi="0" deltaphi="360" lowX="-0.239669734044" lowY="0" lowZ="-0.970854478582" highX="0.239669734044" highY="0" highZ="0.970854478582" aunit="deg" lunit="cm"/>
3367 <cutTube name="BeamWindowStPlate" rmin="0" rmax="$BeamPipeRad" z="$BeamWStPlateLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="3.41304459712e-17" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
3369 <cutTube name="BeamWindowFoam" rmin="0" rmax="$BeamPipeRad" z="$BeamWFoLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="3.41304459712e-17" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
3371 <cutTube name="BeamWindowFoamRem" rmin="0" rmax="$BeamPipeRad" z="$BeamWFoRemLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="3.41304459712e-17" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
3373 <cutTube name="BeamWindowStSu" rmin="0" rmax="$BeamPipeRad" z="$BeamWStSuLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="3.41304459712e-17" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
3375 <cutTube name="BeamWindowGlassWool" rmin="0" rmax="$BeamPipeRad" z="$BeamWGlLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="3.41304459712e-17" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
3377 <cutTube name="BeamPipe" rmin="0" rmax="$BeamPipeRad" z="$BeamPipeLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="3.41304459712e-17" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
3379 <cutTube name="BeamPipeVacuum" rmin="0" rmax="$BeamVaPipeRad" z="$BeamVaPipeLe" startphi="0" deltaphi="360" lowX="-0.278696241193" lowY="3.41304459712e-17" lowZ="-0.960379302747" highX="0.278696241193" highY="0" highZ="0.960379302747" aunit="deg" lunit="cm"/>
3381 <subtraction name="SteelPlate">
3382 <first ref="SteelPlateNoBW"/>
3383 <second ref="BeamWindowStPlate"/>
3384 <position name="posBWStPl" x="$BeamWStPlate_x" y="$BeamWStPlate_y" z="$BeamWStPlate_z" unit="cm"/>
3385 <rotationref ref="rBeamW3"/>
3388 <subtraction name="FoamPadding">
3389 <first ref="FoamPaddingNoBW"/>
3390 <second ref="BeamWindowFoamRem"/>
3391 <position name="posBWFoPa" x="$BeamWFoRem_x" y="$BeamWFoRem_y" z="$BeamWFoRem_z" unit="cm"/>
3392 <rotationref ref="rBeamW3"/>
3395 <box name="CRTPaddle" lunit="cm"
3397 y="$CRTPaddleHeight"
3398 z="$CRTPaddleLength"/>
3400 <box name="CRTModule" lunit="cm"
3405 <box name="DetEnclosure" lunit="cm"
3410 <box name="SurrConcreteBox" lunit="cm"
3412 y="$dimEnclConcrete_y"
3415 <box name="PitBox" lunit="cm"
3420 <subtraction name="SurrConcrete">
3421 <first ref="SurrConcreteBox"/>
3422 <second ref="PitBox"/>
3423 <position name="posPitInConcrete" x="$posPitInConcrete_x" y="$posPitInConcrete_y" z="$posPitInConcrete_z" unit="cm"/>
3428 if($simpleStSu == 1)
3432 <box name="SteelSupportBlock" lunit="cm"
3433 x="$dimSteelSupportBlock_x"
3434 y="$dimSteelSupportBlock_y"
3435 z="$dimSteelSupportBlock_z" />
3437 <subtraction name="SteelSupportNoBW">
3438 <first ref="SteelSupportBlock"/>
3439 <second ref="SteelPlateBlock"/>
3440 <positionref ref="posCenter"/>
3443 <subtraction name="SteelSupport">
3444 <first ref="SteelSupportNoBW"/>
3445 <second ref="BeamWindowStSu"/>
3446 <position name="posBWStSu" x="$BeamWStSu_x" y="$BeamWStSu_y" z="$BeamWStSu_z" unit="cm"/>
3447 <rotationref ref="rBeamW3"/>
3452 elsif($simpleStSu == 0)
3456 <box name="boxCryoTop" x="1016.8" y="1016.8" z="61.8" lunit="cm"/>
3457 <box name="boxCryoWallLg" x="1140.4" y="1075.6" z="61.8" lunit="cm"/>
3458 <box name="boxCryoWallSm" x="1016.8" y="1075.6" z="61.8" lunit="cm"/>
3459 <box name="box1" x="160" y="160" z="61.8" lunit="cm"/>
3460 <box name="box2" x="158.2" y="158.2" z="56.2" lunit="cm"/>
3461 <box name="box3" x="137.2" y="137.2" z="61.801" lunit="cm"/>
3462 <box name="box4" x="158.2" y="13.6" z="27.4" lunit="cm"/>
3463 <box name="box5" x="158.2" y="6.425" z="24.96" lunit="cm"/>
3464 <box name="box11" x="108.4" y="160" z="61.8" lunit="cm"/>
3465 <box name="box12" x="107.5" y="158.2" z="56.2" lunit="cm"/>
3466 <box name="box13" x="97" y="137.2" z="61.81" lunit="cm"/>
3467 <box name="box16" x="107.5" y="13.6" z="27.4" lunit="cm"/>
3468 <box name="box17" x="107.5" y="6.425" z="24.96" lunit="cm"/>
3469 <box name="box21" x="137.8" y="160" z="61.8" lunit="cm"/>
3470 <box name="box22" x="136.9" y="158.2" z="56.2" lunit="cm"/>
3471 <box name="box23" x="126.4" y="137.2" z="61.801" lunit="cm"/>
3472 <box name="box26" x="102.5" y="13.6" z="27.4" lunit="cm"/>
3473 <box name="box27" x="102.5" y="6.425" z="24.96" lunit="cm"/>
3474 <box name="box31" x="170.2" y="160" z="61.8" lunit="cm"/>
3475 <box name="box32" x="169.3" y="158.2" z="56.2" lunit="cm"/>
3476 <box name="box33" x="158.8" y="137.2" z="61.801" lunit="cm"/>
3477 <box name="box36" x="135.8" y="13.6" z="27.4" lunit="cm"/>
3478 <box name="box37" x="135.8" y="6.425" z="24.96" lunit="cm"/>
3481 <subtraction name="boxHoll">
3483 <second ref="box2"/>
3485 <subtraction name="boxLargeCent">
3486 <first ref="boxHoll"/>
3487 <second ref="box3"/>
3489 <subtraction name="boxBarI">
3491 <second ref="box5"/>
3492 <position name="posBoxBarI" x="0" y="3.5876" z="0" unit="cm"/>
3494 <subtraction name="boxBarCent">
3495 <first ref="boxBarI"/>
3496 <second ref="box5"/>
3497 <position name="posBoxBarCent" x="0" y="-3.5876" z="0" unit="cm"/>
3499 <union name="boxUniCent">
3500 <first ref="boxLargeCent"/>
3501 <second ref="boxBarCent"/>
3502 <position name="posBoxUniCent" x="0" y="0" z="-17.2" unit="cm"/>
3504 <union name="UnitCent">
3505 <first ref="boxUniCent"/>
3506 <second ref="boxBarCent"/>
3507 <position name="posUnitCent" x="0" y="0" z="-17.2" unit="cm"/>
3508 <rotation name="rotUnitCent" x="0" y="0" z="90" unit="deg"/>
3511 <subtraction name="boxTopHoll">
3512 <first ref="box11"/>
3513 <second ref="box12"/>
3514 <position name="posboxTopHoll" x="0.451" y="0" z="0" unit="cm"/>
3516 <subtraction name="boxLargeTop">
3517 <first ref="boxTopHoll"/>
3518 <second ref="box13"/>
3519 <position name="posboxLargeTop" x="5.701" y="0" z="0" unit="cm"/>
3521 <subtraction name="boxBarTopI">
3522 <first ref="box16"/>
3523 <second ref="box17"/>
3524 <position name="posboxBarTopI" x="0" y="3.5876" z="0" unit="cm"/>
3526 <subtraction name="boxBarTop">
3527 <first ref="boxBarTopI"/>
3528 <second ref="box17"/>
3529 <position name="posboxBarTop" x="0" y="-3.5876" z="0" unit="cm"/>
3531 <union name="boxUniTop">
3532 <first ref="boxLargeTop"/>
3533 <second ref="boxBarCent"/>
3534 <position name="posboxUni1" x="5.6" y="0" z="-17.2" unit="cm"/>
3535 <rotation name="rotUni1" x="0" y="0" z="90" unit="deg"/>
3537 <union name="UnitTop">
3538 <first ref="boxUniTop"/>
3539 <second ref="boxBarTop"/>
3540 <position name="posUniTop" x="0.45" y="0" z="-17.2" unit="cm"/>
3543 <subtraction name="boxCryoWallSmUS">
3544 <first ref="boxCryoWallSm"/>
3545 <second ref="BeamWindowStSu"/>
3546 <position name="posBWCryoWallUS" x="$BeamWStSu_x" y="$BeamWStSu_y" z="0." unit="cm"/>
3547 <rotationref ref="rBeamW3"/>
3550 <subtraction name="boxWallUHoll">
3551 <first ref="box21"/>
3552 <second ref="box22"/>
3553 <position name="posboxWallUHoll" x="0.451" y="0" z="0" unit="cm"/>
3555 <subtraction name="boxLargeWallU">
3556 <first ref="boxWallUHoll"/>
3557 <second ref="box23"/>
3558 <position name="posboxLargeWallU" x="5.701" y="0" z="0" unit="cm"/>
3560 <subtraction name="boxBarWallUI">
3561 <first ref="box26"/>
3562 <second ref="box27"/>
3563 <position name="posboxBarWallUI" x="0" y="3.5876" z="0" unit="cm"/>
3565 <subtraction name="boxBarWallU">
3566 <first ref="boxBarWallUI"/>
3567 <second ref="box27"/>
3568 <position name="posboxBarWallU" x="0" y="-3.5876" z="0" unit="cm"/>
3570 <union name="boxUniWallU">
3571 <first ref="boxLargeWallU"/>
3572 <second ref="boxBarCent"/>
3573 <position name="posboxUni2" x="-9.1" y="0" z="-17.2" unit="cm"/>
3574 <rotation name="rotUni2" x="0" y="0" z="90" unit="deg"/>
3576 <union name="UnitWallU">
3577 <first ref="boxUniWallU"/>
3578 <second ref="boxBarWallU"/>
3579 <position name="posUniWallU" x="-16.75" y="0" z="-17.2" unit="cm"/>
3582 <subtraction name="boxWallLHoll">
3583 <first ref="box31"/>
3584 <second ref="box32"/>
3585 <position name="posboxWallLHoll" x="0.451" y="0" z="0" unit="cm"/>
3587 <subtraction name="boxLargeWallL">
3588 <first ref="boxWallLHoll"/>
3589 <second ref="box33"/>
3590 <position name="posboxLargeWallL" x="5.701" y="0" z="0" unit="cm"/>
3592 <subtraction name="boxBarWallLI">
3593 <first ref="box36"/>
3594 <second ref="box37"/>
3595 <position name="posboxBarWallLI" x="0" y="3.5876" z="0" unit="cm"/>
3597 <subtraction name="boxBarWallL">
3598 <first ref="boxBarWallLI"/>
3599 <second ref="box37"/>
3600 <position name="posboxBarWallL" x="0" y="-3.5876" z="0" unit="cm"/>
3602 <union name="boxUniWallL">
3603 <first ref="boxLargeWallL"/>
3604 <second ref="boxBarCent"/>
3605 <position name="posboxUni3" x="-25.3" y="0" z="-17.2" unit="cm"/>
3606 <rotation name="rotUni3" x="0" y="0" z="90" unit="deg"/>
3608 <union name="UnitWallL">
3609 <first ref="boxUniWallL"/>
3610 <second ref="boxBarWallL"/>
3611 <position name="posUniWallL" x="-16.3" y="0" z="-17.2" unit="cm"/>
3622 # Detector enclosure structure
3625 <volume name="volBeamWinFoam">
3626 <materialref ref="ProtoDUNEBWFoam"/>
3627 <solidref ref="BeamWindowFoam"/>
3629 <volume name="volBeamWinGlassWool">
3630 <materialref ref="GlassWool"/>
3631 <solidref ref="BeamWindowGlassWool"/>
3633 <volume name="volBeamPipeVac">
3634 <materialref ref="Vacuum"/>
3635 <solidref ref="BeamPipeVacuum"/>
3637 <volume name="volBeamPipe">
3638 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
3639 <solidref ref="BeamPipe"/>
3641 <volumeref ref="volBeamPipeVac"/>
3642 <positionref ref="posCenter"/>
3645 <volume name="volFoamPadding">
3646 <materialref ref="ProtoDUNEFoam"/>
3647 <solidref ref="FoamPadding"/>
3649 <volume name="volSteelPlate">
3650 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
3651 <solidref ref="SteelPlate"/>
3653 <volume name="volSurrConcrete">
3654 <materialref ref="Concrete"/>
3655 <solidref ref="SurrConcrete"/>
3660 for($imod=0 ; $imod<16 ; $imod++){
3661 $modnum = $imod + 1;
3662 for($i=0 ; $i<64 ; $i++){
3664 $paddleid = "U$modnum"."_$padnum";
3666 <volume name="volAuxDetSensitive_CRTPaddle_$paddleid">
3667 <materialref ref="Polystyrene"/>
3668 <solidref ref="CRTPaddle"/>
3673 <volume name="volAuxDet_CRTModule_U$modnum">
3674 <materialref ref="Air"/>
3675 <solidref ref="CRTModule"/>
3677 for($i=0 ; $i<32 ; $i++){
3678 $paddle_x1 = - $CRTModWidth/2 + $CRTPaddleWidth*($i + 0.5);
3679 $paddle_x2 = - $CRTModWidth/2 + $CRTPaddleWidth*($i + 1);
3680 $paddle_y1 = $CRTPaddleHeight/2;
3681 $paddle_y2 = - $CRTPaddleHeight/2;
3685 $paddleid1 = "U$modnum"."_$padnum1";
3686 $paddleid2 = "U$modnum"."_$padnum2";
3689 <volumeref ref="volAuxDetSensitive_CRTPaddle_$paddleid1"/>
3690 <position name="posCRTPaddleSensitive_$paddleid1" unit="cm"
3694 <rotationref ref="rIdentity"/>
3697 <volumeref ref="volAuxDetSensitive_CRTPaddle_$paddleid2"/>
3698 <position name="posCRTPaddleSensitive_$paddleid2" unit="cm"
3702 <rotationref ref="rIdentity"/>
3711 for($imod=0 ; $imod<16 ; $imod++){
3712 $modnum = $imod + 1;
3713 for($i=0 ; $i<64 ; $i++){
3715 $paddleid = "D$modnum"."_$padnum";
3717 <volume name="volAuxDetSensitive_CRTPaddle_$paddleid">
3718 <materialref ref="Polystyrene"/>
3719 <solidref ref="CRTPaddle"/>
3724 <volume name="volAuxDet_CRTModule_D$modnum">
3725 <materialref ref="Air"/>
3726 <solidref ref="CRTModule"/>
3728 for($i=0 ; $i<32 ; $i++){
3729 $paddle_x1 = - $CRTModWidth/2 + $CRTPaddleWidth*($i + 0.5);
3730 $paddle_x2 = - $CRTModWidth/2 + $CRTPaddleWidth*($i + 1);
3731 $paddle_y1 = $CRTPaddleHeight/2;
3732 $paddle_y2 = - $CRTPaddleHeight/2;
3736 $paddleid1 = "D$modnum"."_$padnum1";
3737 $paddleid2 = "D$modnum"."_$padnum2";
3740 <volumeref ref="volAuxDetSensitive_CRTPaddle_$paddleid1"/>
3741 <position name="posCRTPaddleSensitive_$paddleid1" unit="cm"
3745 <rotationref ref="rIdentity"/>
3748 <volumeref ref="volAuxDetSensitive_CRTPaddle_$paddleid2"/>
3749 <position name="posCRTPaddleSensitive_$paddleid2" unit="cm"
3753 <rotationref ref="rIdentity"/>
3761 # for($i=0 ; $i<5 ; $i++){
3762 # for($j=0 ; $j<5 ; $j++){
3763 # $suffix = "$i"."-$j";
3766 if($simpleStSu == 0)
3769 <volume name="volUnitCent">
3770 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
3771 <solidref ref="UnitCent"/>
3773 <volume name="volUnitTop">
3774 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
3775 <solidref ref="UnitTop"/>
3777 <volume name="volUnitWallS">
3778 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
3779 <solidref ref="UnitWallU"/>
3781 <volume name="volUnitWallL">
3782 <materialref ref="STEEL_STAINLESS_Fe7Cr2Ni"/>
3783 <solidref ref="UnitWallL"/>
3790 <volume name="volSteelSupport_TB">
3791 <materialref ref="Air"/>
3792 <solidref ref="boxCryoTop"/>
3795 for($i=0 ; $i<5 ; $i++){
3796 for($j=0 ; $j<5 ; $j++){
3797 $xupos = -320+160*$i;
3798 $yupos = -320+160*$j;
3799 $stsuind = "$i"."-$j";
3801 <physvol name="volUnitTBCent_$stsuind">
3802 <volumeref ref="volUnitCent"/>
3803 <position name="posUnitTBCent_$stsuind" x="$xupos" y="$yupos" z="0" unit="cm"/>
3808 <physvol name="volUnitTBE_$i">
3809 <volumeref ref="volUnitTop"/>
3810 <position name="posUnitTBE_$i" x="454.2" y="$xupos" z="0" unit="cm"/>
3812 <physvol name="volUnitTBS_$i">
3813 <volumeref ref="volUnitTop"/>
3814 <position name="posUnitTBS_$i" x="$xupos" y="454.2" z="0" unit="cm"/>
3815 <rotation name="rotUnitTBS_$i" x="0" y="0" z="-90" unit="deg"/>
3817 <physvol name="volUnitTBW_$i">
3818 <volumeref ref="volUnitTop"/>
3819 <position name="posUnitTBW_$i" x="-454.2" y="$xupos" z="0" unit="cm"/>
3820 <rotation name="rotUnitTBW_$i" x="0" y="0" z="-180" unit="deg"/>
3822 <physvol name="volUnitTBN_$i">
3823 <volumeref ref="volUnitTop"/>
3824 <position name="posUnitTBN_$i" x="$xupos" y="-454.2" z="0" unit="cm"/>
3825 <rotation name="rotUnitTBN_$i" x="0" y="0" z="-270" unit="deg"/>
3836 <volume name="volSteelSupport_WS">
3837 <materialref ref="Air"/>
3838 <solidref ref="boxCryoWallSm"/>
3841 for($i=0 ; $i<5 ; $i++){
3842 for($j=0 ; $j<5 ; $j++){
3843 $xupos = -320+160*$i;
3844 $yupos = -320+160*$j;
3845 $stsuind = "$i"."-$j";
3847 <physvol name="volUnitWSCent_$stsuind">
3848 <volumeref ref="volUnitCent"/>
3849 <position name="posUnitWSCent_$stsuind" x="$xupos" y="$yupos" z="0" unit="cm"/>
3854 <physvol name="volUnitWSE_$i">
3855 <volumeref ref="volUnitTop"/>
3856 <position name="posUnitWSE_$i" x="454.2" y="$xupos" z="0" unit="cm"/>
3858 <physvol name="volUnitWSS_$i">
3859 <volumeref ref="volUnitWallS"/>
3860 <position name="posUnitWSS_$i" x="$xupos" y="468.9" z="0" unit="cm"/>
3861 <rotation name="rotUnitWSS_$i" x="0" y="0" z="-90" unit="deg"/>
3863 <physvol name="volUnitWSW_$i">
3864 <volumeref ref="volUnitTop"/>
3865 <position name="posUnitWSW_$i" x="-454.2" y="$xupos" z="0" unit="cm"/>
3866 <rotation name="rotUnitWSW_$i" x="0" y="0" z="-180" unit="deg"/>
3868 <physvol name="volUnitWSN_$i">
3869 <volumeref ref="volUnitWallS"/>
3870 <position name="posUnitWSN_$i" x="$xupos" y="-468.9" z="0" unit="cm"/>
3871 <rotation name="rotUnitWSN_$i" x="0" y="0" z="-270" unit="deg"/>
3881 <volume name="volSteelSupport_US">
3882 <materialref ref="Air"/>
3883 <solidref ref="boxCryoWallSmUS"/>
3886 for($i=0 ; $i<5 ; $i++){
3887 for($j=0 ; $j<5 ; $j++){
3888 $xupos = -320+160*$i;
3889 $yupos = -320+160*$j;
3890 $stsuind = "$i"."-$j";
3893 <physvol name="volUnitUSCent_$stsuind">
3894 <volumeref ref="volUnitCent"/>
3895 <position name="posUnitUSCent_$stsuind" x="$xupos" y="$yupos" z="0" unit="cm"/>
3896 <rotationref ref="rPlus180AboutY"/>
3901 <physvol name="volUnitUSE_$i">
3902 <volumeref ref="volUnitTop"/>
3903 <position name="posUnitUSE_$i" x="454.2" y="$xupos" z="0" unit="cm"/>
3904 <rotationref ref="rPlus180AboutX"/>
3906 <physvol name="volUnitUSS_$i">
3907 <volumeref ref="volUnitWallS"/>
3908 <position name="posUnitUSS_$i" x="$xupos" y="468.9" z="0" unit="cm"/>
3909 <rotation name="rotUnitUSS_$i" x="0" y="180" z="-90" unit="deg"/>
3911 <physvol name="volUnitUSW_$i">
3912 <volumeref ref="volUnitTop"/>
3913 <position name="posUnitUSW_$i" x="-454.2" y="$xupos" z="0" unit="cm"/>
3914 <rotation name="rotUnitUSW_$i" x="180" y="0" z="-180" unit="deg"/>
3916 <physvol name="volUnitUSN_$i">
3917 <volumeref ref="volUnitWallS"/>
3918 <position name="posUnitUSN_$i" x="$xupos" y="-468.9" z="0" unit="cm"/>
3919 <rotation name="rotUnitUSN_$i" x="0" y="180" z="-270" unit="deg"/>
3931 <volume name="volSteelSupport_LR">
3932 <materialref ref="Air"/>
3933 <solidref ref="boxCryoWallLg"/>
3936 for($i=0 ; $i<5 ; $i++){
3937 for($j=0 ; $j<5 ; $j++){
3938 $xupos = -320+160*$i;
3939 $yupos = -320+160*$j;
3940 $stsuind = "$i"."-$j";
3942 <physvol name="volUnitLRCent_$stsuind">
3943 <volumeref ref="volUnitCent"/>
3944 <position name="posUnitLRCent_$stsuind" x="$xupos" y="$yupos" z="0" unit="cm"/>
3949 <physvol name="volUnitLRE_$i">
3950 <volumeref ref="volUnitWallL"/>
3951 <position name="posUnitLRE_$i" x="485.1" y="$xupos" z="0" unit="cm"/>
3953 <physvol name="volUnitLRS_$i">
3954 <volumeref ref="volUnitWallS"/>
3955 <position name="posUnitLRS_$i" x="$xupos" y="468.9" z="0" unit="cm"/>
3956 <rotation name="rotUnitLRS_$i" x="0" y="0" z="-90" unit="deg"/>
3958 <physvol name="volUnitLRW_$i">
3959 <volumeref ref="volUnitWallL"/>
3960 <position name="posUnitLRW_$i" x="-485.1" y="$xupos" z="0" unit="cm"/>
3961 <rotation name="rotUnitLRW_$i" x="0" y="0" z="-180" unit="deg"/>
3963 <physvol name="volUnitLRN_$i">
3964 <volumeref ref="volUnitWallS"/>
3965 <position name="posUnitLRN_$i" x="$xupos" y="-468.9" z="0" unit="cm"/>
3966 <rotation name="rotUnitLRN_$i" x="0" y="0" z="-270" unit="deg"/>
3974 } # if(simpleStSu == 0)
3975 elsif($simpleStSu==1){
3977 <volume name="volSteelSupportMod">
3978 <materialref ref="AirSteelMixture"/>
3979 <solidref ref="SteelSupport"/>
3986 <volume name="volDetEnclosure">
3987 <materialref ref="Air"/>
3988 <solidref ref="DetEnclosure"/>
3994 <volumeref ref="volSteelSupportMod"/>
3995 <positionref ref="posCryoInDetEnc"/>
3999 elsif ($simpleStSu==0)
4001 $stsuTop_y = 506.9 + $posCryoInDetEnc_y;
4002 $stsuBot_y = -506.9 + $posCryoInDetEnc_y;
4003 $stsuOther_y = $posCryoInDetEnc_y;
4007 <physvol name="volSteelSupport_Top">
4008 <volumeref ref="volSteelSupport_TB"/>
4009 <position name="posSteelSupport_Top" x="0" y="$stsuTop_y" z="0" unit="cm"/>
4010 <rotation name="rotSteelSupport_Top" x="90" y="0" z="0" unit="deg"/>
4012 <physvol name="volSteelSupport_Bottom">
4013 <volumeref ref="volSteelSupport_TB"/>
4014 <position name="posSteelSupport_Bottom" x="0" y="$stsuBot_y" z="0" unit="cm"/>
4015 <rotation name="rotSteelSupport_Bottom" x="-90" y="0" z="0" unit="deg"/>
4018 <volumeref ref="volSteelSupport_US"/>
4019 <position name="posSteelSupport_US" x="0" y="$stsuOther_y" z="-539.3" unit="cm"/>
4021 <physvol name="volSteelSupport_DS">
4022 <volumeref ref="volSteelSupport_WS"/>
4023 <position name="posSteelSupport_DS" x="0" y="$stsuOther_y" z="539.3" unit="cm"/>
4025 <physvol name="volSteelSupport_LS">
4026 <volumeref ref="volSteelSupport_LR"/>
4027 <position name="posSteelSupport_LS" x="539.3" y="$stsuOther_y" z="0" unit="cm"/>
4028 <rotation name="rotSteelSupport_LS" x="0" y="-90" z="0" unit="deg"/>
4030 <physvol name="volSteelSupport_RS">
4031 <volumeref ref="volSteelSupport_LR"/>
4032 <position name="posSteelSupport_RS" x="-539.3" y="$stsuOther_y" z="0" unit="cm"/>
4033 <rotation name="rotSteelSupport_RS" x="0" y="90" z="0" unit="deg"/>
4041 <volumeref ref="volFoamPadding"/>
4042 <positionref ref="posCryoInDetEnc"/>
4045 <volumeref ref="volSteelPlate"/>
4046 <positionref ref="posCryoInDetEnc"/>
4049 <volumeref ref="volBeamWinFoam"/>
4050 <position name="posBeamWinFoam" unit="cm"
4054 <rotationref ref="rBeamWRev3"/>
4057 <volumeref ref="volBeamWinGlassWool"/>
4058 <position name="posBeamWinGlassWool" unit="cm"
4062 <rotationref ref="rBeamWRev3"/>
4065 <volumeref ref="volBeamPipe"/>
4066 <position name="posBeamPipe" unit="cm"
4070 <rotationref ref="rBeamWRev3"/>
4073 <volumeref ref="volCryostat"/>
4074 <positionref ref="posCryoInDetEnc"/>
4077 <volumeref ref="volSurrConcrete"/>
4078 <position name="posSurrConcrete" unit="cm"
4080 y="$posSurrConcrete_y"
4085 for($i=0 ; $i<16 ; $i++){
4087 $modid = "U$modnum";
4091 <volumeref ref="volAuxDet_CRTModule_$modid"/>
4092 <position name="posvolAuxDet_CRTModule_$modid" unit="cm"
4095 z="$posCRTUS_z[$i]"/>
4096 <rotationref ref="$posCRTUS_rot[$i]"/>
4101 for($i=0 ; $i<16 ; $i++){
4103 $modid = "D$modnum";
4107 <volumeref ref="volAuxDet_CRTModule_$modid"/>
4108 <position name="posvolAuxDet_CRTModule_$modid" unit="cm"
4111 z="$posCRTDS_z[$i]"/>
4112 <rotationref ref="$posCRTDS_rot[$i]"/>
4129 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4130 #+++++++++++++++++++++++++++++++++++++++ gen_World +++++++++++++++++++++++++++++++++++++++
4131 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4136 # Create the WORLD fragment file name,
4137 # add file to list of output GDML fragments,
4139 $WORLD = "dune10kt_v6_World" . $suffix . ".gdml";
4140 push (@gdmlFiles, $WORLD);
4141 $WORLD = ">" . $WORLD;
4142 open(WORLD) or die("Could not open file $WORLD for writing");
4145 # The standard XML prefix and starting the gdml
4147 <?xml version='1.0'?>
4152 # All the World solids.
4153 $dimWorld_x = $DetEncWidth+2*$RockThickness;
4154 $dimWorld_y = $DetEncHeight+2*$RockThickness;
4155 $dimWorld_z = $DetEncLength+2*$RockThickness;
4159 <box name="World" lunit="cm"
4169 <volume name="volWorld" >
4170 <materialref ref="Air"/>
4171 <solidref ref="World"/>
4174 <volumeref ref="volDetEnclosure"/>
4175 <position name="posDetEnclosure" unit="cm" x="$OriginXSet" y="$OriginYSet" z="$OriginZSet"/>
4183 # make_gdml.pl will take care of <setup/>
4190 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4191 #++++++++++++++++++++++++++++++++++++ write_fragments ++++++++++++++++++++++++++++++++++++
4192 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4194 sub write_fragments()
4196 # This subroutine creates an XML file that summarizes the the subfiles output
4197 # by the other sub routines - it is the input file for make_gdml.pl which will
4198 # give the final desired GDML file. Specify its name with the output option.
4199 # (you can change the name when running make_gdml)
4201 # This code is taken straigh from the similar MicroBooNE generate script, Thank you.
4203 if ( ! defined $output )
4205 $output = "-"; # write to STDOUT
4208 # Set up the output file.
4209 $OUTPUT = ">" . $output;
4210 open(OUTPUT) or die("Could not open file $OUTPUT");
4213 <?xml version='1.0'?>
4215 <!-- Input to Geometry/gdml/make_gdml.pl; define the GDML fragments
4216 that will be zipped together to create a detector description.
4223 <!-- These files contain GDML <constant></constant>
4224 blocks. They are read in separately, so they can be
4225 interpreted into the remaining GDML. See make_gdml.pl for
4231 foreach $filename (@defFiles)
4234 <filename> $filename </filename>
4244 <!-- The GDML file fragments to be zipped together. -->
4248 foreach $filename (@gdmlFiles)
4251 <filename> $filename </filename>
4267 # run the sub routines that generate the fragments
4269 gen_Define(); # generates definitions at beginning of GDML
4270 gen_Materials(); # generates materials to be used
4273 gen_TPC( $TPCInner_x, $TPC_y, $TPC_z, 'Inner');
4274 gen_TPC( $TPCOuter_x, $TPC_y, $TPC_z, 'Outer');
4278 gen_Cryostat(); # places (2*nAPAWide x nAPAHigh x nAPALong) volTPC,
4279 # half rotated 180 about Y
4280 gen_Enclosure(); # places two cryostats and concrete volumes
4282 gen_World(); # places the enclosure among DUSEL Rock
4285 write_fragments(); # writes the XML input for make_gdml.pl
4286 # which zips together the final GDML