Skip to content

Commit 4a010ff

Browse files
authored
Updated LumiSpecCAL segmentation (#804)
1 parent 63dda25 commit 4a010ff

File tree

4 files changed

+112
-49
lines changed

4 files changed

+112
-49
lines changed

compact/display.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,10 @@
6262
<comment>
6363
Luminosity Visualisation
6464
</comment>
65-
<vis name="LumiSpecCAL_ModuleVis" ref="AnlGold" alpha="0.5" visible="true" showDaughters="true"/>
66-
<vis name="LumiSpecCAL_FiberVis" ref="AnlRed" alpha="0.8" visible="true"/>
67-
<vis name="LumiSpecCAL_FiberHolderVis" ref="AnlBlue" alpha="1.0" visible="true"/>
65+
<vis name="LumiSpecCAL_LayerVis" ref="AnlOrange" alpha="0.2" visible="true" showDaughters = "false"/>
66+
<vis name="LumiSpecCAL_ModuleVis" ref="AnlGold" alpha="0.5" visible="true" showDaughters="false"/>
67+
<vis name="LumiSpecCAL_FiberVis" ref="AnlRed" alpha="0.8" visible="true"/>
68+
<vis name="LumiSpecCAL_FiberHolderVis" ref="AnlBlue" alpha="1.0" visible="true"/>
6869

6970

7071
<comment>

compact/far_backward/definitions.xml

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -271,21 +271,28 @@
271271
<constant name="LumiConverter_DZ" value="1*mm"/>
272272

273273
<!-- Lumi spectrometer CAL -->
274-
<constant name="LumiSpecCAL_SiPMSizeXY" value="3*mm"/>
275-
<constant name="LumiSpecCAL_SiPMNumX" value="20"/>
276-
<constant name="LumiSpecCAL_SiPMNumY" value="3"/>
274+
<constant name="LumiSpecCAL_SiPMSizeXY" value="4*mm"/>
275+
<constant name="LumiSpecCAL_SiPMNumX" value="14"/>
276+
<constant name="LumiSpecCAL_SiPMNumY" value="2"/>
277277
<constant name="LumiSpecCAL_ZLayers" value="20"/>
278278
<constant name="LumiSpecCAL_XYLayers" value="3"/>
279279
<comment>
280280
Note : Values/Notations for making modules pointing along z-axis.
281281
Rotation of modules wrt XY axis after construction.
282282
</comment>
283-
<constant name="LumiSpecCAL_ModSizeX" value="LumiSpecCAL_SiPMNumX*LumiSpecCAL_SiPMSizeXY"/>
284-
<constant name="LumiSpecCAL_ModSizeY" value="LumiSpecCAL_SiPMNumY*LumiSpecCAL_SiPMSizeXY"/>
285-
<constant name="LumiSpecCAL_DZ" value="LumiSpecCAL_ZLayers*LumiSpecCAL_ModSizeY"/>
286-
<constant name="LumiSpecCAL_DXY" value="LumiSpecCAL_XYLayers*LumiSpecCAL_ModSizeX"/>
287-
<constant name="LumiSpecCAL_ModSizeZ" value="LumiSpecCAL_DXY"/> <!-- fibre length -->
288283

284+
<constant name="LumiSpecCAL_SiPMSpaceXY" value="0.15*mm"/> <!-- mechanical space for adjacent SiPMs-->
285+
<constant name="LumiSpecCAL_LayerCoatX" value="0.25*cm"/> <!-- mechanical covering of layers, def without rotation-->
286+
<constant name="LumiSpecCAL_LayerCoatY" value="0.25*cm"/> <!-- mechanical covering of layers, def without rotation -->
287+
288+
<constant name="LumiSpecCAL_ModSizeX" value="LumiSpecCAL_SiPMNumX*(LumiSpecCAL_SiPMSizeXY + 2*LumiSpecCAL_SiPMSpaceXY)"/>
289+
<constant name="LumiSpecCAL_ModSizeY" value="LumiSpecCAL_SiPMNumY*(LumiSpecCAL_SiPMSizeXY + 2*LumiSpecCAL_SiPMSpaceXY)"/>
290+
291+
<!-- Add the size of layer coating to the overall size of CAL -->
292+
<constant name="LumiSpecCAL_DZ" value="LumiSpecCAL_ZLayers*(LumiSpecCAL_ModSizeY + 2.0*LumiSpecCAL_LayerCoatY)"/>
293+
<constant name="LumiSpecCAL_DXY" value="LumiSpecCAL_XYLayers*LumiSpecCAL_ModSizeX + 2.0*LumiSpecCAL_LayerCoatX"/>
294+
295+
<constant name="LumiSpecCAL_ModSizeZ" value="LumiSpecCAL_XYLayers*LumiSpecCAL_ModSizeX"/> <!-- fibre length -->
289296
<constant name="LumiSpecCAL_Z" value="-8*m + LumiSweepMag_Z - LumiSpecCAL_DZ/2.0"/>
290297
<constant name="LumiSpecCAL_FiveSigma" value="LumiBeamDiv_pref * fabs(LumiSpecCAL_Z)"/>
291298
<constant name="LumiSpecCAL_Y" value="LumiSpecCAL_FiveSigma + LumiSpecCAL_DXY/2.0"/>

compact/far_backward/lumi/spec_ScFi_cal.xml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,16 @@
44
<lccdd>
55

66
<detectors>
7-
<detector id="LumiSpecCAL_ID" name="LumiSpecCAL" type="EcalLumiSpecWScFi" vis="FFPreVis" readout="EcalLumiSpecHits" sizeXY="LumiSpecCAL_DXY" sizeZ="LumiSpecCAL_DZ" nmod_perlayer="LumiSpecCAL_XYLayers" nlayer="LumiSpecCAL_ZLayers" >
7+
<detector id="LumiSpecCAL_ID" name="LumiSpecCAL" type="EcalLumiSpecWScFi" vis="LumiSpecCAL_LayerVis" readout="EcalLumiSpecHits" sizeXY="LumiSpecCAL_DXY" sizeZ="LumiSpecCAL_DZ" nmod_perlayer="LumiSpecCAL_XYLayers" nlayer="LumiSpecCAL_ZLayers" >
88
<position x="0.0*cm" y="0.0*cm" z="0.0*cm"/>
99
<rotation x="0.0*rad" y="0.0*rad" z="0.0*rad"/>
10+
11+
<layer sizeX="LumiSpecCAL_XYLayers*LumiSpecCAL_ModSizeX + 2.0*LumiSpecCAL_LayerCoatX" sizeY="LumiSpecCAL_ModSizeY + 2.0*LumiSpecCAL_LayerCoatY" sizeZ="LumiSpecCAL_ModSizeZ" coatSizeX="LumiSpecCAL_LayerCoatX" coatSizeY="LumiSpecCAL_LayerCoatY" material="Polystyrene" vis="LumiSpecCAL_LayerVis"/>
12+
1013
<module sizex="LumiSpecCAL_ModSizeX" sizey="LumiSpecCAL_ModSizeY" sizez="LumiSpecCAL_ModSizeZ" material="WPowderplusEpoxy" vis="LumiSpecCAL_ModuleVis">
14+
15+
<block sizeX="LumiSpecCAL_SiPMSizeXY" sizeY="LumiSpecCAL_SiPMSizeXY" sizeZ="LumiSpecCAL_ModSizeZ" SpaceXY="LumiSpecCAL_SiPMSpaceXY"/>
16+
1117
<fiber
1218
material="Polystyrene"
1319
radius="LumiSpecCAL_FiberRadius"
@@ -30,7 +36,7 @@
3036
<readouts>
3137
<readout name="EcalLumiSpecHits">
3238
<segmentation type="NoSegmentation"/>
33-
<id>system:8,sector:4,orientation:4,layer:8,module:4,fiber_x:16,fiber_y:16</id>
39+
<id>system:8,sector:8,layer:8,module:8,block:8,fiber_x:4,fiber_y:4</id>
3440
</readout>
3541
</readouts>
3642

src/EcalLumiSpecWScFi_geo.cpp

Lines changed: 85 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,29 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
4949
xml_comp_t pos = x_det.position();
5050
xml_comp_t rot = x_det.rotation();
5151

52+
//function for module definition
5253
auto [modVol, modSize] = build_specScFiCAL_module(description, x_mod, sens);
5354

54-
// Position of first module, layer from center of CAL
55-
double mod_pos0 = -(detSizeXY / 2.0) + (modSize.x() / 2.0);
56-
double layer_pos0 = -(detSizeZ / 2.0) + (modSize.y() / 2.0);
55+
//layer definition before rotation
56+
xml_comp_t x_layer = x_det.child(_Unicode(layer));
57+
58+
double laySizeX = getAttrOrDefault(x_layer, _Unicode(sizeX), 1.0 * cm);
59+
double laySizeY = getAttrOrDefault(x_layer, _Unicode(sizeY), 1.0 * cm);
60+
double laySizeZ = getAttrOrDefault(x_layer, _Unicode(sizeZ), 1.0 * cm);
61+
double layerCoatSizeX = getAttrOrDefault(x_layer, _Unicode(coatSizeX), 1.0 * cm);
62+
double layerCoatSizeY = getAttrOrDefault(x_layer, _Unicode(coatSizeY), 1.0 * cm);
63+
64+
Material layMat = description.material(x_layer.attr<std::string>(_Unicode(material)));
5765

58-
Box layerBox(detSizeXY / 2, modSize.y() / 2, detSizeXY / 2);
59-
Volume layerVol("layer", layerBox, Air);
60-
layerVol.setVisAttributes(description.visAttributes(x_mod.attr<std::string>(_Unicode(vis))));
66+
Box layerBox(laySizeX / 2.0, laySizeY / 2.0, laySizeZ / 2.0);
67+
Volume layerVol("layer", layerBox, layMat);
68+
layerVol.setVisAttributes(description.visAttributes(x_det.attr<std::string>(_Unicode(vis))));
6169

62-
//Fill layer with modules
70+
// Position of first module, layer from center of CAL
71+
double mod_pos0 = -(detSizeXY / 2.0) + (modSize.x() / 2.0) + layerCoatSizeX;
72+
double layer_pos0 = -(detSizeZ / 2.0) + (modSize.y() / 2.0) + layerCoatSizeY;
73+
74+
//Fill uncoated layer with modules
6375
for (int mod_id = 0; mod_id < nmod_perlayer; mod_id++) {
6476

6577
//Build // to z-axis, then rotate
@@ -71,26 +83,27 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
7183
modPV.addPhysVolID("module", mod_id);
7284
} //imod-loop close
7385

86+
//sector definition
7487
Box sectorBox(detSizeXY / 2, detSizeXY / 2, detSizeZ / 2);
7588
Volume sectorVol(det_name + "_sector", sectorBox, Air);
7689
sectorVol.setVisAttributes(description.visAttributes(x_mod.attr<std::string>(_Unicode(vis))));
7790

78-
//Fill sector with layers
91+
//Fill sector with layers (coated)
7992
for (int layer_id = 0; layer_id < nlayer; layer_id++) {
8093

81-
double lay_pos_z = -layer_id * modSize.y() - layer_pos0;
94+
double lay_pos_z = -layer_id * (modSize.y() + 2.0 * layerCoatSizeY) - layer_pos0;
8295
double lay_pos_y = 0.0 * cm;
8396
double lay_pos_x = 0.0 * cm;
8497
int orientation = layer_id % 2 == 0;
8598

99+
//rotation
86100
RotationZYX lay_rot = RotationZYX(0, 0, -90.0 * degree);
87101
if (orientation)
88102
lay_rot *= RotationY(-90.0 * degree);
89103

90104
PlacedVolume layPV = sectorVol.placeVolume(
91105
layerVol, Transform3D(lay_rot, Position(lay_pos_x, lay_pos_y, lay_pos_z)));
92-
layPV.addPhysVolID("layer", layer_id).addPhysVolID("orientation", orientation);
93-
106+
layPV.addPhysVolID("layer", layer_id);
94107
} //layer_id-loop close
95108

96109
// loop over sectors(top, bottom)
@@ -134,30 +147,67 @@ static tuple<Volume, Position> build_specScFiCAL_module(const Detector& descript
134147
Volume modVol("module_vol", modShape, modMat);
135148

136149
modVol.setVisAttributes(description.visAttributes(mod_x.attr<std::string>(_Unicode(vis))));
137-
//----------------------------Scintillating fibers -----------------------------------------------------------
150+
151+
//--------------------------Block of fibers in a module------------------------------------------------------
152+
153+
//block fibers
154+
auto fiber_block = mod_x.child(_Unicode(block));
155+
156+
auto fb_sx = fiber_block.attr<double>(_Unicode(sizeX));
157+
auto fb_sy = fiber_block.attr<double>(_Unicode(sizeY));
158+
auto fb_sz = fiber_block.attr<double>(_Unicode(sizeZ));
159+
auto fb_SpaceXY = fiber_block.attr<double>(_Unicode(SpaceXY));
160+
161+
Position fbSize(fb_sx, fb_sy, fb_sz);
138162

139163
//fibers
140164
auto fiber_tube = mod_x.child(_Unicode(fiber));
141-
auto fr = fiber_tube.attr<double>(_Unicode(radius));
142-
auto fsx = fiber_tube.attr<double>(_Unicode(spacex));
143-
auto fsy = fiber_tube.attr<double>(_Unicode(spacey));
144-
auto fiberMat = description.material(fiber_tube.attr<std::string>(_Unicode(material)));
145-
Tube fiberShape(0., fr, modSize.z() / 2.0);
165+
166+
auto fr = fiber_tube.attr<double>(_Unicode(radius));
167+
auto fsx = fiber_tube.attr<double>(_Unicode(spacex));
168+
auto fsy = fiber_tube.attr<double>(_Unicode(spacey));
169+
170+
//fiber block description and placement in module
171+
Box fbShape(fbSize.x() / 2.0, fbSize.y() / 2.0, fbSize.z() / 2.0);
172+
Volume fbVol("fiberblock_volume", fbShape, modMat);
173+
fbVol.setVisAttributes(
174+
description.visAttributes(mod_x.attr<std::string>(_Unicode(vis)))); //same as module
175+
176+
int num_fbX = int(modSize.x() / (fbSize.x() + 2.0 * fb_SpaceXY));
177+
int num_fbY = int(modSize.y() / (fbSize.y() + 2.0 * fb_SpaceXY));
178+
179+
double fb_xpos0 = -(modSize.x() / 2.0) + (fbSize.x() / 2.0) + fb_SpaceXY;
180+
double fb_ypos0 = -(modSize.y() / 2.0) + (fbSize.y() / 2.0) + fb_SpaceXY;
181+
int nblock = 0;
182+
183+
for (int iy = 0; iy < num_fbY; iy++) {
184+
for (int ix = 0; ix < num_fbX; ix++) {
185+
double fb_pos_x = fb_xpos0 + ix * (fbSize.x() + 2.0 * fb_SpaceXY); //mm
186+
double fb_pos_y = fb_ypos0 + iy * (fbSize.y() + 2.0 * fb_SpaceXY); //mm
187+
double fb_pos_z = 0 * mm;
188+
189+
auto fbPV = modVol.placeVolume(fbVol, nblock, Position{fb_pos_x, fb_pos_y, fb_pos_z});
190+
fbPV.addPhysVolID("block", nblock++);
191+
}
192+
}
193+
194+
//fiber placement and description in blocks
195+
auto fiberMat = description.material(fiber_tube.attr<std::string>(_Unicode(material)));
196+
Tube fiberShape(0., fr, fbSize.z() / 2.0);
146197
Volume fiberVol("fiber_vol", fiberShape, fiberMat);
147198
fiberVol.setVisAttributes(description.visAttributes(fiber_tube.attr<std::string>(_Unicode(vis))));
148199
fiberVol.setSensitiveDetector(sens);
149200

150-
//double submod_sizexy = 2.0*fr; // size of square = diameter of tubes.
151-
int num_submodX = int(modSize.x() / (2 * fr + 2.0 * fsx));
152-
int num_submodY = int(modSize.y() / (2 * fr + 2.0 * fsy));
201+
int num_fX = int(fbSize.x() / (2 * fr + 2.0 * fsx));
202+
int num_fY = int(fbSize.y() / (2 * fr + 2.0 * fsy));
153203

154-
double submod_xpos0 = -modSize.x() / 2.0 + fr + fsx;
155-
double submod_ypos0 = -modSize.y() / 2.0 + fr + fsy;
156-
int nfibers = 0;
204+
double fiber_xpos0 = -(fbSize.x() / 2.0) + fr + fsx;
205+
double fiber_ypos0 = -(fbSize.y() / 2.0) + fr + fsy;
206+
int nfibers = 0;
157207

158208
//Fiber Holder
159209
auto fiberholder_x = mod_x.child(_Unicode(fiberholder));
160-
double fh_dz = 0.6 * mm; //thickness of fiber holder
210+
double fh_dz = 0.25 * mm; //thickness of fiber holder
161211

162212
double fh_outerbox_y = 2.0 * fr + 2.0 * fsy;
163213
double fh_outerbox_x = 2.0 * fr + 2.0 * fsx;
@@ -176,26 +226,25 @@ static tuple<Volume, Position> build_specScFiCAL_module(const Detector& descript
176226
int nfh = 0;
177227

178228
//placement of fibers and fiberholder
179-
for (int iy = 0; iy < num_submodY; iy++) {
180-
181-
for (int ix = 0; ix < num_submodX; ix++) {
229+
for (int iy = 0; iy < num_fY; iy++) {
230+
for (int ix = 0; ix < num_fX; ix++) {
182231

183-
double submod_pos_x = submod_xpos0 + ix * (2.0 * fr + 2.0 * fsx); //mm
184-
double submod_pos_y = submod_ypos0 + iy * (2.0 * fr + 2.0 * fsy); //mm
185-
double submod_pos_z = 0 * mm; //mm
232+
double fiber_pos_x = fiber_xpos0 + ix * (2.0 * fr + 2.0 * fsx); //mm
233+
double fiber_pos_y = fiber_ypos0 + iy * (2.0 * fr + 2.0 * fsy); //mm
234+
double fiber_pos_z = 0 * mm; //mm
186235

187236
//placement of fiber
188-
auto fiberPV = modVol.placeVolume(fiberVol, nfibers++,
189-
Position{submod_pos_x, submod_pos_y, submod_pos_z});
237+
auto fiberPV =
238+
fbVol.placeVolume(fiberVol, nfibers++, Position{fiber_pos_x, fiber_pos_y, fiber_pos_z});
190239
fiberPV.addPhysVolID("fiber_x", ix + 1).addPhysVolID("fiber_y", iy + 1);
191240

192241
//placement of fiber holder 6.6*cm apart c-to-c
193-
int num_holders = 4; // which means 4 regions
194-
double fh_pos_z0 = -1 * (modSize.z() / 2.0) + (fh_dz / 2.0);
242+
int num_holders = 6; // which means 4 regions
243+
double fh_pos_z0 = -1 * (fbSize.z() / 2.0) + (fh_dz / 2.0);
195244

196245
for (int iz = 0; iz < num_holders; iz++) {
197-
double fh_pos_z = fh_pos_z0 + iz * ((modSize.z() - fh_dz) / (num_holders - 1));
198-
modVol.placeVolume(fiberholderVol, nfh++, Position{submod_pos_x, submod_pos_y, fh_pos_z});
246+
double fh_pos_z = fh_pos_z0 + iz * ((fbSize.z() - fh_dz) / (num_holders - 1));
247+
fbVol.placeVolume(fiberholderVol, nfh++, Position{fiber_pos_x, fiber_pos_y, fh_pos_z});
199248
} //iz close
200249

201250
} //ix close

0 commit comments

Comments
 (0)