-
Notifications
You must be signed in to change notification settings - Fork 45
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add functionality to track in a BeamPipeChain (#768)
### Briefly, what does this PR introduce? An option had been added to include sensitive elements at the start and/or end of beam pipe vacuum. This allows easy tracking of the shape and position of beam electrons/protons to compare with accelerator group and stand alone simulations. The segment in which scattered electrons of different kinematics can also be studied/verified. ### What kind of change does this PR introduce? - [ ] Bug fix (issue #__) - [x] New feature (issue #__) - [ ] Documentation update - [ ] Other: __ ### Please check if this PR fulfills the following: - [ ] Tests for the changes have been added - [ ] Documentation has been added / updated - [ ] Changes have been communicated to collaborators ### Does this PR introduce breaking changes? What changes might users need to make to their code? No ### Does this PR change default behavior? No --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
- Loading branch information
1 parent
335a7f7
commit b3588d6
Showing
8 changed files
with
250 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
|
||
<lccdd> | ||
|
||
<detectors> | ||
<detector | ||
id="BackwardsBeamline_ID" | ||
type="BeamPipeTracking" | ||
name="Pipe_tracker" | ||
readout="BackwardsBeamlineHits"> | ||
|
||
<slice | ||
pipe_id="0" | ||
grandmother="Pipe_Q1eR_to_B2BeR" | ||
mother="Pipe_to_Q1eR_vacuum" | ||
name="Pipe_to_Q1eR_tracker"/> | ||
|
||
<slice | ||
pipe_id="1" | ||
grandmother="Pipe_Q1eR_to_B2BeR" | ||
mother="Pipe_in_Q1eR_vacuum" | ||
name="Pipe_in_Q1eR_tracker"/> | ||
|
||
<slice | ||
pipe_id="2" | ||
grandmother="Pipe_Q1eR_to_B2BeR" | ||
mother="Pipe_in_Q2eR_vacuum" | ||
name="Pipe_in_Q2eR_tracker"/> | ||
|
||
<slice | ||
pipe_id="3" | ||
grandmother="Pipe_Q1eR_to_B2BeR" | ||
mother="Pipe_in_B2AeR_vacuum" | ||
name="Pipe_in_B2AeR_tracker"/> | ||
|
||
<slice | ||
pipe_id="4" | ||
grandmother="Pipe_Q1eR_to_B2BeR" | ||
mother="Pipe_in_B2BeR_vacuum" | ||
name="Pipe_in_B2BeR_tracker"/> | ||
|
||
<slice | ||
pipe_id="5" | ||
grandmother="Pipe_Q3eR_to_B7eR" | ||
mother="Pipe_in_Q3eR_vacuum" | ||
name="Pipe_in_Q3eR_tracker_start" | ||
end="false"/> | ||
|
||
<slice | ||
pipe_id="6" | ||
grandmother="Pipe_Q3eR_to_B7eR" | ||
mother="Pipe_in_Q3eR_vacuum" | ||
name="Pipe_in_Q3eR_tracker_end"/> | ||
|
||
<slice | ||
pipe_id="7" | ||
grandmother="Pipe_Q3eR_to_B7eR" | ||
mother="Pipe_in_Q4eR_vacuum" | ||
name="Pipe_in_Q4eR_tracker"/> | ||
|
||
</detector> | ||
|
||
<detector | ||
type="BeamPipeStop" | ||
name="Backwards_Pipe_Stop" | ||
grandmother="Pipe_Q3eR_to_B7eR" | ||
mother="Pipe_Q4eR_to_B3eR_vacuum" | ||
/> | ||
|
||
</detectors> | ||
|
||
<readouts> | ||
|
||
<readout name="BackwardsBeamlineHits"> | ||
<segmentation type="NoSegmentation"/> | ||
<id>system:8,pipe:8,end:2</id> | ||
</readout> | ||
|
||
</readouts> | ||
|
||
</lccdd> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,4 +13,6 @@ | |
<!-- Luminosity detector --> | ||
<include ref="lumi.xml"/> | ||
|
||
<include ref="beamline_tracking.xml"/> | ||
|
||
</lccdd> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// SPDX-License-Identifier: LGPL-3.0-or-later | ||
// Copyright (C) 2024 Simon Gardner | ||
|
||
//========================================================================== | ||
// | ||
// Places a small sensitive disk of vacuum at the end of beam pipes | ||
// | ||
//========================================================================== | ||
|
||
#include "DD4hep/DetFactoryHelper.h" | ||
#include "DD4hep/Printout.h" | ||
#include "TMath.h" | ||
#include <XML/Helper.h> | ||
|
||
using namespace std; | ||
using namespace dd4hep; | ||
|
||
static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector /* sens */) { | ||
|
||
using namespace ROOT::Math; | ||
xml_det_t x_det = e; | ||
string det_name = x_det.nameStr(); | ||
int det_id = x_det.id(); | ||
Material m_Vacuum = description.material("Vacuum"); | ||
string vis_name = dd4hep::getAttrOrDefault<std::string>(x_det, _Unicode(vis), "BeamPipeVis"); | ||
|
||
string grandmotherName = x_det.attr<string>(_Unicode(grandmother)); | ||
string motherName = x_det.attr<string>(_Unicode(mother)); | ||
bool detStart = getAttrOrDefault<bool>(x_det, _Unicode(end), true); | ||
DetElement mother = description.detector(grandmotherName).child(motherName); | ||
|
||
DetElement sdet(det_name, det_id); | ||
|
||
// Get the mother volume | ||
Volume mother_vol = mother.volume(); | ||
|
||
// Get mother volume shape as cone segment | ||
ConeSegment mother_shape = mother_vol.solid(); | ||
|
||
// Get the parameters of the mother volume | ||
double rOuter1 = mother_shape.rMax1(); | ||
double rOuter2 = mother_shape.rMax2(); | ||
double length = 2 * mother_shape.dZ(); | ||
|
||
double sensitive_thickness = 100 * mm; | ||
|
||
//Calculate R or cone after sensitive layer | ||
double rEnd = rOuter2 - (rOuter2 - rOuter1) * sensitive_thickness / length; | ||
double zPos = length / 2.0 - sensitive_thickness / 2.0; | ||
if (detStart) { | ||
rEnd = rOuter1 - (rOuter1 - rOuter2) * sensitive_thickness / length; | ||
zPos = -length / 2.0 + sensitive_thickness / 2.0; | ||
} | ||
|
||
ConeSegment s_start_disk(sensitive_thickness / 2, 0.0, rOuter2, 0.0, rEnd); | ||
Volume v_start_disk("stop_disk_" + motherName, s_start_disk, m_Vacuum); | ||
|
||
v_start_disk.setLimitSet(description, "kill_limits"); | ||
|
||
auto disk_placement = mother_vol.placeVolume(v_start_disk, Position(0.0, 0.0, zPos)); | ||
|
||
sdet.setPlacement(disk_placement); | ||
description.declareParent(det_name, mother); | ||
|
||
return sdet; | ||
} | ||
|
||
DECLARE_DETELEMENT(BeamPipeStop, create_detector) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
// SPDX-License-Identifier: LGPL-3.0-or-later | ||
// Copyright (C) 2024 Simon Gardner | ||
|
||
//========================================================================== | ||
// | ||
// Places a small sensitive disk of vacuum at the end of beam pipes | ||
// | ||
//========================================================================== | ||
|
||
#include "DD4hep/DetFactoryHelper.h" | ||
#include "DD4hep/Printout.h" | ||
#include "TMath.h" | ||
#include <XML/Helper.h> | ||
|
||
using namespace std; | ||
using namespace dd4hep; | ||
|
||
static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) { | ||
|
||
using namespace ROOT::Math; | ||
xml_det_t x_det = e; | ||
string det_name = x_det.nameStr(); | ||
int det_id = x_det.id(); | ||
Material m_Vacuum = description.material("Vacuum"); | ||
string vis_name = dd4hep::getAttrOrDefault<std::string>(x_det, _Unicode(vis), "BeamPipeVis"); | ||
|
||
sens.setType("tracker"); | ||
|
||
DetElement sdet(det_name, det_id); | ||
Assembly assembly(det_name + "_assembly"); | ||
|
||
// Grab info for beamline magnets | ||
for (xml_coll_t slice_coll(x_det, _Unicode(slice)); slice_coll; slice_coll++) { // pipes | ||
|
||
string grandmotherName = slice_coll.attr<string>(_Unicode(grandmother)); | ||
string motherName = slice_coll.attr<string>(_Unicode(mother)); | ||
bool detStart = getAttrOrDefault<bool>(slice_coll, _Unicode(end), true); | ||
int pipe_id = getAttrOrDefault<int>(slice_coll, _Unicode(pipe_id), 0); | ||
string slice_name = slice_coll.attr<string>(_Unicode(name)); | ||
DetElement mother = description.detector(grandmotherName).child(motherName); | ||
|
||
// Get the mother volume | ||
Volume mother_vol = mother.volume(); | ||
|
||
// Get mother volume shape as cone segment | ||
ConeSegment mother_shape = mother_vol.solid(); | ||
|
||
// Get the parameters of the mother volume | ||
double rOuter1 = mother_shape.rMax1(); | ||
double rOuter2 = mother_shape.rMax2(); | ||
double length = 2 * mother_shape.dZ(); | ||
|
||
double sensitive_thickness = 0.1 * mm; | ||
|
||
//Calculate R or cone after sensitive layer | ||
|
||
double rEnd = rOuter2 - (rOuter2 - rOuter1) * sensitive_thickness / length; | ||
double zPos = length / 2.0 - sensitive_thickness / 2.0; | ||
if (detStart) { | ||
rEnd = rOuter1 - (rOuter1 - rOuter2) * sensitive_thickness / length; | ||
zPos = -length / 2.0 + sensitive_thickness / 2.0; | ||
} | ||
|
||
ConeSegment s_start_disk(sensitive_thickness / 2, 0.0, rOuter2, 0.0, rEnd); | ||
Volume v_start_disk("v_start_disk_" + motherName, s_start_disk, m_Vacuum); | ||
v_start_disk.setSensitiveDetector(sens); | ||
|
||
auto disk_placement = mother_vol.placeVolume(v_start_disk, Position(0.0, 0.0, zPos)); | ||
disk_placement.addPhysVolID("end", detStart); | ||
disk_placement.addPhysVolID("pipe", pipe_id); | ||
disk_placement.addPhysVolID("system", det_id); | ||
|
||
DetElement slice_element(sdet, slice_name, pipe_id); | ||
|
||
slice_element.setPlacement(disk_placement); | ||
description.declareParent(slice_name, mother); | ||
} | ||
|
||
auto pv_assembly = description.worldVolume().placeVolume(assembly, Position(0.0, 0.0, 0.0)); | ||
pv_assembly.addPhysVolID("system", det_id); | ||
sdet.setPlacement(pv_assembly); | ||
|
||
return sdet; | ||
} | ||
|
||
DECLARE_DETELEMENT(BeamPipeTracking, create_detector) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters