diff --git a/compact/cb_VTX.xml b/compact/cb_VTX_Barrel.xml similarity index 54% rename from compact/cb_VTX.xml rename to compact/cb_VTX_Barrel.xml index e3710b48a1bab94788682adfa332a6fbc2b8834f..4481871a36e43745bed69854eabea59b0f6615fe 100644 --- a/compact/cb_VTX.xml +++ b/compact/cb_VTX_Barrel.xml @@ -15,17 +15,17 @@ </display> <detectors> - <detector id="cb_VTX_ID" name="cb_VTX" type="cb_VTX" readout="cb_VTX_Hits" vis="cb_VTXVis" insideTrackingVloume="true"> - <dimensions rmin="cb_VTX_rmin" rmax="cb_VTX_rmax" length="cb_VTX_length"/> - <position x="cb_VTX_x_pos" y="cb_VTX_y_pos" z="cb_VTX_z_pos"/> - <layer repeat="cb_VTX_layer" vis="cb_VTX_layerVis"> + <detector id="cb_VTX_Barrel_ID" name="cb_VTX_Barrel" type="cb_VTX_Barrel" readout="cb_VTX_Barrel_Hits" vis="cb_VTX_BarrelVis" insideTrackingVloume="true"> + <dimensions rmin="cb_VTX_Barrel_rmin" rmax="cb_VTX_Barrel_rmax" length="cb_VTX_Barrel_length"/> + <position x="cb_VTX_Barrel_x_pos" y="cb_VTX_Barrel_y_pos" z="cb_VTX_Barrel_z_pos"/> + <layer repeat="cb_VTX_Barrel_layer" vis="cb_VTX_Barrel_layerVis"> <slice name="Silicon_slice" material="Si" sensitive="true"/> </layer> </detector> </detectors> <readouts> - <readout name="cb_VTX_Hits"> + <readout name="cb_VTX_Barrel_Hits"> <segmentation type="CartesianGridXY" grid_size_x="1.0*mm" grid_size_y="1.0*mm" /> <id>system:8,barrel:3,layer:4,module:8,x:32:-16,y:-16</id> </readout> diff --git a/compact/definitions.xml b/compact/definitions.xml index d8fcfa5a93d81935e46bdd6fbb109f9f6da401a7..5b7f7253d73e0d019c9093f04cb8e047291d3d52 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -68,7 +68,7 @@ Layer 4 subassembly ID: 29 Layer 5 subassembly ID: 30 </comment> - <constant name="cb_VTX_ID" value="25"/> + <constant name="cb_VTX_Barrel_ID" value="25"/> <comment> Unused values reserved for vertex: constant name="SiVertexSubAssemblyLayer1_ID" value="121" @@ -338,15 +338,15 @@ <constant name="VertexTrackerOuterBarrelLength" value="400.0*mm"/> - <constant name="cb_VTX_rmin" value="33.0*mm"/> - <constant name="cb_VTX_rmax" value="165.0*mm"/> - <constant name="cb_VTX_length" value="740.0*mm"/> + <constant name="cb_VTX_Barrel_rmin" value="33.0*mm"/> + <constant name="cb_VTX_Barrel_rmax" value="165.0*mm"/> + <constant name="cb_VTX_Barrel_length" value="740.0*mm"/> - <constant name="cb_VTX_x_pos" value="0.0*mm"/> - <constant name="cb_VTX_y_pos" value="0.0*mm"/> - <constant name="cb_VTX_z_pos" value="0.0*mm"/> + <constant name="cb_VTX_Barrel_x_pos" value="0.0*mm"/> + <constant name="cb_VTX_Barrel_y_pos" value="0.0*mm"/> + <constant name="cb_VTX_Barrel_z_pos" value="0.0*mm"/> - <constant name="cb_VTX_layer" value="6"/> + <constant name="cb_VTX_Barrel_layer" value="6"/> <comment> -------------------------- Silicon Tracker Parameters diff --git a/compact/display.xml b/compact/display.xml index 91e32bd2ac903ee605cfa2b6afa05326b4c0cf71..a51b7690debccbc28093e4ae88bc2cc9bc18070f 100644 --- a/compact/display.xml +++ b/compact/display.xml @@ -55,8 +55,8 @@ <vis name="cb_CTD_Si_layerVis" alpha="1.0" r= "0.9" g="1.0" b="0.1" showDaughters="true" visible="true"/> <vis name="ce_GEMVis" alpha="0.1" r= "0.1" g="0.0" b="1.0" showDaughters="true" visible="true"/> <vis name="cb_GEM_layerVis" alpha="0.8" r= "0.8" g="0.4" b="0.3" showDaughters="true" visible="true"/> - <vis name="cb_VTXVis" alpha="0.1" r= "0.1" g="0.0" b="1.0" showDaughters="true" visible="true"/> - <vis name="cb_VTX_layerVis" alpha="2.0" r= "0.0" g="0.2" b="0.8" showDaughters="true" visible="true"/> + <vis name="cb_VTX_BarrelVis" alpha="0.1" r= "0.1" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="cb_VTX_Barrel_layerVis" alpha="2.0" r= "0.0" g="0.2" b="0.8" showDaughters="true" visible="true"/> <vis name="ci_GEMVis" r= "0.8" g="0.4" b="0.3" alpha="0.8" showDaughters="true" visible="true"/> <vis name="ci_HCALVis" r= "0.6" g="0" b="0.6" alpha="1.0" showDaughters="true" visible="true"/> diff --git a/reference_detector.xml b/reference_detector.xml index 11d89f7190a33adf64829fde2b44daff854f5fb7..518c5ff1cc56ef89927f12e8a05934503baf1902 100644 --- a/reference_detector.xml +++ b/reference_detector.xml @@ -125,7 +125,7 @@ <include ref="compact/hcal.xml"/> <include ref="compact/forward_trd.xml"/> <include ref="compact/B0_tracker.xml"/> - <include ref="compact/cb_VTX.xml"/> + <include ref="compact/cb_VTX_Barrel.xml"/> <!-- <include ref="compact/ci_HCAL.xml"/> <include ref="compact/forward_rich.xml"/> diff --git a/src/cb_VTX.cpp b/src/cb_VTX.cpp deleted file mode 100644 index 398fba33f9f77af5aba8be9085952e6e2602f554..0000000000000000000000000000000000000000 --- a/src/cb_VTX.cpp +++ /dev/null @@ -1,217 +0,0 @@ -#include <XML/Helper.h> -#include "DDRec/Surface.h" -#include "DDRec/DetectorData.h" -#include "DD4hep/OpticalSurfaces.h" -#include "DD4hep/DetFactoryHelper.h" -#include "DD4hep/Printout.h" -////////////////////////////////// -// Central Barrel Vertex Detector -////////////////////////////////// - -using namespace std; -using namespace dd4hep; - -static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens) -{ - xml_det_t x_det = e; - string detName = x_det.nameStr(); - int detID = x_det.id(); - - xml_dim_t dim = x_det.dimensions(); - double RIn = dim.rmin(); - double ROut = dim.rmax(); - double SizeZ = dim.length(); - - xml_dim_t pos = x_det.position(); - - Material Vacuum = desc.material("Vacuum"); - - // Create Global Volume - Tube cb_VTX_GVol_Solid(RIn, ROut, SizeZ / 2.0, 0., 360.0 * deg); - Volume detVol("cb_VTX_GVol_Logic", cb_VTX_GVol_Solid, Vacuum); - detVol.setVisAttributes(desc.visAttributes(x_det.visStr())); - - ////////////////// - // Barrel Ladder - ////////////////// - xml_comp_t x_layer = x_det.child(_U(layer)); - const int repeat = x_layer.repeat(); - - xml_comp_t x_slice = x_layer.child(_U(slice)); - Material slice_mat = desc.material(x_slice.materialStr()); - - double x = 0.0 * cm; - double y = 0.0 * cm; - double z = 0.0 * cm; - int FDIV = 0; - double dR = 0.0; - double length = 0.0; - double phi = 0.0; - // Ladder Layer Parameters - double lay_Dx[6]; - double lay_Dy[6]; - double lay_Dz[6]; - double lay_Rin[6]; - lay_Dx[0] = 0.050 * mm; lay_Dy[0] = 2.0 * cm; lay_Dz[0] = 10.0 * cm; lay_Rin[0] = 3.5 * cm; - lay_Dx[1] = 0.050 * mm; lay_Dy[1] = 2.0 * cm; lay_Dz[1] = 11.0 * cm; lay_Rin[1] = 4.5 * cm; - lay_Dx[2] = 0.150 * mm; lay_Dy[2] = 4.0 * cm; lay_Dz[2] = 18.0 * cm; lay_Rin[2] = 6.5 * cm; - lay_Dx[3] = 0.150 * mm; lay_Dy[3] = 4.0 * cm; lay_Dz[3] = 24.0 * cm; lay_Rin[3] = 10.5 * cm; - lay_Dx[4] = 0.150 * mm; lay_Dy[4] = 4.0 * cm; lay_Dz[4] = 36.0 * cm; lay_Rin[4] = 13.5 * cm; - lay_Dx[5] = 0.150 * mm; lay_Dy[5] = 4.0 * cm; lay_Dz[5] = 48.0 * cm; lay_Rin[5] = 15.5 * cm; - - int i_layer = 0; - int i_module = 0; - // Loop over layers - for(int i = 0; i < repeat; i++) { - double cb_VTX_ladder_DZ = lay_Dz[i]; - double cb_VTX_ladder_DY = lay_Dy[i]; - double cb_VTX_ladder_Thickness = lay_Dx[i]; - dR = lay_Rin[i]; - length = 2.0 * 3.1415 * dR; - int laddersCount = length / cb_VTX_ladder_DY; - - for (int i = 0; i < 2; i++) { - double LN = cb_VTX_ladder_DY * laddersCount; - double LN1 = cb_VTX_ladder_DY * (laddersCount + 1.0 + i); - - if (LN/LN1 > 0.8) - laddersCount = laddersCount + 1; - } - - double cb_VTX_ladder_deltaphi = 2.0 * 3.1415926 / laddersCount; - - string ladderBoxName = detName + _toString(i, "_ladder_Solid_%d"); - string ladderName = detName + _toString(i, "_ladder_Logic_%d"); - Volume ladderVol(ladderName, Box(cb_VTX_ladder_Thickness * 0.5, cb_VTX_ladder_DY * 0.5, cb_VTX_ladder_DZ * 0.5), slice_mat); - ladderVol.setVisAttributes(desc,x_layer.visStr()); - sens.setType("tracker"); - ladderVol.setSensitiveDetector(sens); - i_layer++; - - for (int ia = 0; ia < laddersCount; ia++) { - phi = (ia * (cb_VTX_ladder_deltaphi)); - x = - dR * cos(phi); - y = - dR * sin(phi); - - RotationZYX ladder_rot = RotationZYX(cb_VTX_ladder_deltaphi * ia, 0.0, 0.0); - Position ladder_pos = Position(x, y, z); - string ladderName = detName + _toString(i, "_ladder_Phys_%d") + _toString(ia, "_%d"); - PlacedVolume ladderPV = detVol.placeVolume(ladderVol, Transform3D(ladder_rot, ladder_pos)); - i_module++; - ladderPV.addPhysVolID("layer", i_layer).addPhysVolID("module", i_module); - } - } - - // TODO: Pixels - - ////////////////// - // Endcaps Ladder - ////////////////// - int lay = 0; - int NUMF; - phi = 0.0; x = 0.0; y = 0.0; z = 0.0; - double Fdeltaphi, Ftheta, F2theta; - double RxF[10], RyF[10], RzF[10], RxF2[10], RyF2[10], RzF2[10]; - double Rzshift = 24.0 * cm; - double fVTX_END_EDY = 12.0 * cm; - double fVTX_END_EDZ = 0.05 * cm; - double fVTX_END_EDX1 = 6.0 * cm; - double fVTX_END_EDX2 = 4.0 * cm; - - for (lay = 0; lay < 3; lay++) { - if (lay == 3) { - fVTX_END_EDY = 18.0 * cm; - NUMF = 24; - Fdeltaphi = 15.0 * deg; - Ftheta = -40.0 * deg; - RxF[lay] = 1.3 * cm; - RyF[lay] = RxF[lay]; - RzF[lay] = -Rzshift - 5.5 * cm; - RxF2[lay] = 1.3 * cm; - RyF2[lay] = RxF2[lay]; - RzF2[lay] = Rzshift + 5.5 * cm; - } - if (lay == 2) { - NUMF = 20; - fVTX_END_EDY = 16.0 * cm; - Fdeltaphi = 18.0 * deg; - Ftheta = -38.0 * deg; - RxF[lay] = 1.1 * cm; - RyF[lay] = RxF[lay]; - RzF[lay] = -Rzshift - 5.5 * cm; - RxF2[lay] = 1.1 * cm; - RyF2[lay] = RxF2[lay]; - RzF2[lay] = Rzshift + 5.5 * cm; - } - if (lay == 1) { - NUMF = 18; - fVTX_END_EDY = 14.0 * cm; - Fdeltaphi = 20.0 * deg; - Ftheta = -45.0 * deg; - RxF[lay] = 1.0 * cm; - RyF[lay] = RxF[lay]; - RzF[lay] = -Rzshift + 1.0 * cm; - RxF2[lay] = 1.0 * cm; - RyF2[lay] = RxF2[lay]; - RzF2[lay] = Rzshift - 1.0 * cm; - } - if (lay == 0) { - NUMF = 12; - fVTX_END_EDY = 12.0 * cm; - Fdeltaphi = 30.0 * deg; - Ftheta = -55.0 * deg; - RxF[lay] = 0.8 * cm; - RyF[lay] = RxF[lay]; - RzF[lay] = -Rzshift + 7.0 * cm; - RxF2[lay] = 0.8 * cm; - RyF2[lay] = RxF2[lay]; - RzF2[lay] = Rzshift - 7.0 * cm; - } - - i_layer++; - // Electron going side Endcap - string logicladderENDEName = detName + _toString(lay, "_logic_ladder_END_E%d"); - Volume ladderENDEVol(logicladderENDEName,Trap(fVTX_END_EDZ,fVTX_END_EDY + lay * 2.0, fVTX_END_EDX1, fVTX_END_EDX2), slice_mat); - for (int ia = 0; ia < NUMF; ia++) { - phi = ia * Fdeltaphi; - x = -RxF[lay] * cos(phi); - y = -RyF[lay] * sin(phi); - z = RzF[lay]; - - RotationZYX ladder_ENDE_rot = RotationZYX(-90.0 + (Fdeltaphi * (ia + 1)), 0.0, Ftheta); - Position ladder_ENDE_pos = Position(x,y,z); - string ladderName = detName + _toString(lay, "_ladder_END_E_Phys_%d") + _toString(ia, "_%d"); - PlacedVolume ladderENDEPV = detVol.placeVolume(ladderENDEVol, Transform3D(ladder_ENDE_rot, ladder_ENDE_pos)); - i_module++; - ladderENDEPV.addPhysVolID("layer", i_layer).addPhysVolID("module", i_module); - } - - // Hadron going side Endcap - string logicladderENDHName = detName + _toString(lay, "_logic_ladder_END_H%d"); - Volume ladderENDHVol(logicladderENDHName,Trap(fVTX_END_EDZ, fVTX_END_EDY, fVTX_END_EDX1, fVTX_END_EDX2), slice_mat); - for (int ia = 0; ia < NUMF; ia++) { - phi = ia * Fdeltaphi; - x = -RxF2[lay] * cos(phi); - y = -RyF2[lay] * sin(phi); - z = RzF2[lay]; - - RotationZYX ladder_ENDH_rot = RotationZYX(-90.0 + (Fdeltaphi * (ia + 1)), 0.0, -Ftheta); - Position ladder_ENDH_pos = Position(x,y,z); - string ladderName = detName + _toString(lay, "_ladder_END_H_Phys_%d") + _toString(ia, "_%d"); - PlacedVolume ladderENDHPV = detVol.placeVolume(ladderENDHVol, Transform3D(ladder_ENDH_rot, ladder_ENDH_pos)); - i_module++; - ladderENDHPV.addPhysVolID("layer", i_layer).addPhysVolID("module", i_module); - } - } - - DetElement det(detName, detID); - Volume motherVol = desc.pickMotherVolume(det); - Transform3D tr(RotationZYX(0.0, 0.0, 0.0), Position(0.0, 0.0, pos.z())); - PlacedVolume detPV = motherVol.placeVolume(detVol, tr); - detPV.addPhysVolID("system", detID); - detPV.addPhysVolID("barrel", 1); - det.setPlacement(detPV); - return det; -} - -DECLARE_DETELEMENT(cb_VTX, createDetector) diff --git a/src/cb_VTX_Barrel.cpp b/src/cb_VTX_Barrel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..511f4a2680225097712db696bd1a759cb880cb51 --- /dev/null +++ b/src/cb_VTX_Barrel.cpp @@ -0,0 +1,117 @@ +#include <XML/Helper.h> +#include "DDRec/Surface.h" +#include "DDRec/DetectorData.h" +#include "DD4hep/OpticalSurfaces.h" +#include "DD4hep/DetFactoryHelper.h" +#include "DD4hep/Printout.h" +////////////////////////////////// +// Central Barrel Vertex Detector +////////////////////////////////// + +using namespace std; +using namespace dd4hep; + +static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens) +{ + xml_det_t x_det = e; + string detName = x_det.nameStr(); + int detID = x_det.id(); + + xml_dim_t dim = x_det.dimensions(); + double RIn = dim.rmin(); + double ROut = dim.rmax(); + double SizeZ = dim.length(); + + xml_dim_t pos = x_det.position(); + + Material Vacuum = desc.material("Vacuum"); + + // Create Global Volume + Tube cb_VTX_Barrel_GVol_Solid(RIn, ROut, SizeZ / 2.0, 0., 360.0 * deg); + Volume detVol("cb_VTX_Barrel_GVol_Logic", cb_VTX_Barrel_GVol_Solid, Vacuum); + detVol.setVisAttributes(desc.visAttributes(x_det.visStr())); + + ////////////////// + // Barrel Ladder + ////////////////// + xml_comp_t x_layer = x_det.child(_U(layer)); + const int repeat = x_layer.repeat(); + + xml_comp_t x_slice = x_layer.child(_U(slice)); + Material slice_mat = desc.material(x_slice.materialStr()); + + double x = 0.0 * cm; + double y = 0.0 * cm; + double z = 0.0 * cm; + int FDIV = 0; + double dR = 0.0; + double length = 0.0; + double phi = 0.0; + // Ladder Layer Parameters + double lay_Dx[6]; + double lay_Dy[6]; + double lay_Dz[6]; + double lay_Rin[6]; + lay_Dx[0] = 0.050 * mm; lay_Dy[0] = 2.0 * cm; lay_Dz[0] = 10.0 * cm; lay_Rin[0] = 3.5 * cm; + lay_Dx[1] = 0.050 * mm; lay_Dy[1] = 2.0 * cm; lay_Dz[1] = 11.0 * cm; lay_Rin[1] = 4.5 * cm; + lay_Dx[2] = 0.150 * mm; lay_Dy[2] = 4.0 * cm; lay_Dz[2] = 18.0 * cm; lay_Rin[2] = 6.5 * cm; + lay_Dx[3] = 0.150 * mm; lay_Dy[3] = 4.0 * cm; lay_Dz[3] = 24.0 * cm; lay_Rin[3] = 10.5 * cm; + lay_Dx[4] = 0.150 * mm; lay_Dy[4] = 4.0 * cm; lay_Dz[4] = 36.0 * cm; lay_Rin[4] = 13.5 * cm; + lay_Dx[5] = 0.150 * mm; lay_Dy[5] = 4.0 * cm; lay_Dz[5] = 48.0 * cm; lay_Rin[5] = 15.5 * cm; + + int i_layer = 0; + int i_module = 0; + // Loop over layers + for(int i = 0; i < repeat; i++) { + double cb_VTX_Barrel_ladder_DZ = lay_Dz[i]; + double cb_VTX_Barrel_ladder_DY = lay_Dy[i]; + double cb_VTX_Barrel_ladder_Thickness = lay_Dx[i]; + dR = lay_Rin[i]; + length = 2.0 * 3.1415 * dR; + int laddersCount = length / cb_VTX_Barrel_ladder_DY; + + for (int i = 0; i < 2; i++) { + double LN = cb_VTX_Barrel_ladder_DY * laddersCount; + double LN1 = cb_VTX_Barrel_ladder_DY * (laddersCount + 1.0 + i); + + if (LN/LN1 > 0.8) + laddersCount = laddersCount + 1; + } + + double cb_VTX_Barrel_ladder_deltaphi = 2.0 * 3.1415926 / laddersCount; + + string ladderBoxName = detName + _toString(i, "_ladder_Solid_%d"); + string ladderName = detName + _toString(i, "_ladder_Logic_%d"); + Volume ladderVol(ladderName, Box(cb_VTX_Barrel_ladder_Thickness * 0.5, cb_VTX_Barrel_ladder_DY * 0.5, cb_VTX_Barrel_ladder_DZ * 0.5), slice_mat); + ladderVol.setVisAttributes(desc,x_layer.visStr()); + sens.setType("tracker"); + ladderVol.setSensitiveDetector(sens); + i_layer++; + + for (int ia = 0; ia < laddersCount; ia++) { + phi = (ia * (cb_VTX_Barrel_ladder_deltaphi)); + x = - dR * cos(phi); + y = - dR * sin(phi); + + RotationZYX ladder_rot = RotationZYX(cb_VTX_Barrel_ladder_deltaphi * ia, 0.0, 0.0); + Position ladder_pos = Position(x, y, z); + string ladderName = detName + _toString(i, "_ladder_Phys_%d") + _toString(ia, "_%d"); + PlacedVolume ladderPV = detVol.placeVolume(ladderVol, Transform3D(ladder_rot, ladder_pos)); + i_module++; + ladderPV.addPhysVolID("layer", i_layer).addPhysVolID("module", i_module); + } + } + + // TODO: Pixels + + DetElement det(detName, detID); + Volume motherVol = desc.pickMotherVolume(det); + Transform3D tr(RotationZYX(0.0, 0.0, 0.0), Position(0.0, 0.0, pos.z())); + PlacedVolume detPV = motherVol.placeVolume(detVol, tr); + detPV.addPhysVolID("system", detID); + detPV.addPhysVolID("barrel", 1); + det.setPlacement(detPV); + return det; +} + +DECLARE_DETELEMENT(cb_VTX_Barrel, createDetector)