Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PPS] 2021 conditions for timing detectors geometry (resubmission after DD4hep) #31484

Merged
merged 70 commits into from
Dec 11, 2020
Merged
Show file tree
Hide file tree
Changes from 68 commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
df2d44e
change the way CMSSW calculates diamond detectors
Vetchu Aug 6, 2019
c23cf87
correct diamond detector software
Vetchu Aug 6, 2019
51cafa0
minor naming correction
Vetchu Aug 6, 2019
ae4d2cb
fix array
Vetchu Aug 6, 2019
da55fc0
CMS style
forthommel Jun 15, 2020
3a43178
Sanity check on geometry hierarchy
forthommel Jun 15, 2020
6150ff4
Generalised the tracks reconstruction algorithms multiplicity
forthommel Jun 15, 2020
45eff0c
Added a hash function for CTPPSDetId objects
forthommel Jun 15, 2020
47b2b9f
Code-format
forthommel Jun 15, 2020
b5645d8
One algo per station, not per channel
forthommel Jun 15, 2020
02cb9db
Algorithm launched after all hits are fed
forthommel Jun 15, 2020
518a250
Added 2021-like geometry.
jan-kaspar Jun 5, 2020
ed17cff
Indentation fix
forthommel Jun 15, 2020
f5e2148
Formatted XML files
forthommel Jun 18, 2020
efe2bec
Added eval=true to ConstantsSection of 2021 scenario DDLs
forthommel Jun 19, 2020
065320a
Updated the paths in the DDL parser steering component
forthommel Jun 23, 2020
b2b5b0a
Dropped z sign mitigation for diamond in direct proton simulation
forthommel Jul 14, 2020
c1ac29c
Dropped z sign mitigation for diamond in proton reconstruction algori…
forthommel Jul 14, 2020
87f2e74
Added copyNumber field to all PosPart
forthommel Jul 14, 2020
ce4dc3f
Dropped the CTPPS prefix for timing detectors assembly
forthommel Jul 14, 2020
345acaf
Updated path to timing stations assembly files
forthommel Jul 14, 2020
e41c354
Swapped z sign in timing station assemblies
forthommel Jul 15, 2020
6fd23e0
Merged pps-diam_geom_fixes-11_2_X from repository forthommel with cms…
ghugo83 Sep 8, 2020
6ca3437
Revert "Swapped z sign in timing station assemblies"
ghugo83 Sep 8, 2020
d4addbb
Revert "Updated path to timing stations assembly files"
ghugo83 Sep 8, 2020
cd4b027
Revert "Dropped the CTPPS prefix for timing detectors assembly"
ghugo83 Sep 8, 2020
858843c
Revert "Dropped z sign mitigation for diamond in proton reconstructio…
ghugo83 Sep 8, 2020
4de3ea8
Revert "Dropped z sign mitigation for diamond in direct proton simula…
ghugo83 Sep 8, 2020
4e0e871
Fix forgotten copyNumber in PosPart section, in 2021 XML file.
ghugo83 Sep 8, 2020
8ff7b07
Consistent naming of CTPPS_Timing_Stations_Assembly.xml among scenari…
ghugo83 Sep 8, 2020
43b521f
Merged parallel_oldDD_DD4hep from repository ghugo83 with cms-merge-t…
ghugo83 Sep 8, 2020
100b50d
Add 2021 scenario also for DD4hep, in parallel of old DD.
ghugo83 Sep 8, 2020
4a90808
Add 2021 bool and special DetId computation in the 2021 scenario case.
ghugo83 Sep 8, 2020
f4afe11
There should be no diff in old DD scenarios, remove change to Geometr…
ghugo83 Sep 8, 2020
dd09ff9
Merged parallel_oldDD_DD4hep from repository ghugo83 with cms-merge-t…
ghugo83 Sep 11, 2020
ff92f72
Remove printouts
ghugo83 Sep 11, 2020
b13fd32
scram build code-format
ghugo83 Sep 11, 2020
826deaa
Renamed legacy run 2 switch in DetGeomDesc
forthommel Sep 16, 2020
0e77af5
Matched builder too
forthommel Sep 16, 2020
26e0b8c
Adapted tag in PPS geometry builder
forthommel Sep 16, 2020
9f767ff
Also adapted legacy ESModule
forthommel Sep 16, 2020
ec4875e
Introduced flag in eras for safety
forthommel Sep 16, 2020
09867cc
Code-format/fixed comment method in ESModule PSet description filling
forthommel Sep 16, 2020
f831c50
Replace use of !is2021 by isRun2. isRun2 is set to true by default (t…
ghugo83 Sep 16, 2020
c302e5b
Replaced all remaining legacyRun2 mentions
forthommel Sep 16, 2020
5936844
Also change variable name in function + safer to also treat DB writer.
ghugo83 Sep 16, 2020
43055e5
Merge branch 'from-CMSSW_11_2_X_2020-11-12-1100' into pps-timing_2021…
forthommel Nov 12, 2020
eef4883
Clearing the algorithm before filling the event
forthommel Nov 15, 2020
be54112
Only clearing algorithms once at new event
forthommel Nov 16, 2020
6d265f4
Run2 tag now tracked
forthommel Nov 17, 2020
acf10f3
Updated versioning through xml file hierarchy
forthommel Nov 17, 2020
7f7b1fd
Matched python file to new 2021 scenario file path
forthommel Nov 17, 2020
ff042c8
Forgot a few untracked here and there
forthommel Nov 17, 2020
dad5041
Reverted isRun2 keyword to untracked for CondTool utolitary as it doe…
forthommel Nov 18, 2020
a1e5486
Merge branch 'from-CMSSW_11_3_X_2020-11-30-1100' into pps-timing_2021…
forthommel Dec 1, 2020
9b5a389
Specifying the isRun2 flag in ctppsGeometryESModule base object defin…
forthommel Dec 1, 2020
548dbb4
Importing CTPPSGeometryESModule already defined from ESModule's fillD…
forthommel Dec 1, 2020
cba5238
Small aesthetic changes
forthommel Dec 1, 2020
02dbab4
No spurious imports of ESProducer for the ctppsGeometryESModule defin…
forthommel Dec 1, 2020
497ac85
Forgot one isRun2 for dd4hep configuration
forthommel Dec 1, 2020
d317b66
Explicit type of isRun2 for ESProducer definition
forthommel Dec 2, 2020
695c0a6
Correcting all other ESProducer definitions
forthommel Dec 2, 2020
3762cb0
Merge branch 'master' into pps-timing_2021_geom-11_2_X
forthommel Dec 8, 2020
86e30ca
Added isRun2 private attribute to CTPPSCompositeESSource plugin
forthommel Dec 9, 2020
d1c66ae
Using the isRun2 flag when building geometry description from compact…
forthommel Dec 9, 2020
4e20215
Added isRun2 attribute to PPS composite geometry source
forthommel Dec 9, 2020
35a77e1
isRun2 is a bool and not an unsigned int
forthommel Dec 9, 2020
033388d
Fixed wrong isRun2 value for 2021 geometry tests
forthommel Dec 9, 2020
cc64919
Picking up isRun2 flag from base ESModule
forthommel Dec 9, 2020
c0145c7
Individual imports instead as import-delete
forthommel Dec 9, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions CalibPPS/ESProducers/plugins/CTPPSCompositeESSource.cc
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class CTPPSCompositeESSource : public edm::ESProducer, public edm::EventSetupRec
std::string opticsLabel_;
unsigned int generateEveryNEvents_;
unsigned int verbosity_;
const bool isRun2_;

// ES tokens
edm::ESGetToken<DDCompactView, IdealGeometryRecord> tokenCompactViewReal_, tokenCompactViewMisaligned_;
Expand Down Expand Up @@ -126,6 +127,7 @@ CTPPSCompositeESSource::CTPPSCompositeESSource(const edm::ParameterSet &conf)
opticsLabel_(conf.getParameter<std::string>("opticsLabel")),
generateEveryNEvents_(conf.getUntrackedParameter<unsigned int>("generateEveryNEvents")),
verbosity_(conf.getUntrackedParameter<unsigned int>("verbosity")),
isRun2_(conf.getParameter<bool>("isRun2")),
m_engine_(new CLHEP::HepJamesRandom(conf.getParameter<unsigned int>("seed"))) {
double l_int_sum = 0;

Expand Down Expand Up @@ -174,6 +176,7 @@ void CTPPSCompositeESSource::fillDescriptions(edm::ConfigurationDescriptions &de
desc.add<std::string>("lhcInfoLabel", "")->setComment("label of the LHCInfo record");
desc.add<std::string>("opticsLabel", "")->setComment("label of the optics record");
desc.add<unsigned int>("seed", 1)->setComment("random seed");
desc.add<bool>("isRun2", false)->setComment("use diamond's run 2 geometry definition?");
desc.addUntracked<unsigned int>("generateEveryNEvents", 1)->setComment("how often to switch conditions");
desc.addUntracked<unsigned int>("verbosity", 0);

Expand Down Expand Up @@ -259,7 +262,7 @@ void CTPPSCompositeESSource::buildDirectSimuData(const edm::ParameterSet &profil
//----------------------------------------------------------------------------------------------------

void CTPPSCompositeESSource::buildGeometry(const DDCompactView &cpv) {
std::unique_ptr<DetGeomDesc> idealGD = detgeomdescbuilder::buildDetGeomDescFromCompactView(cpv);
std::unique_ptr<DetGeomDesc> idealGD = detgeomdescbuilder::buildDetGeomDescFromCompactView(cpv, isRun2_);

for (auto &pb : profile_bins_) {
auto &p = pb.data;
Expand Down Expand Up @@ -470,4 +473,4 @@ std::unique_ptr<LHCInfo> CTPPSCompositeESSource::produceLhcInfo(const LHCInfoRcd

//----------------------------------------------------------------------------------------------------

DEFINE_FWK_EVENTSETUP_SOURCE(CTPPSCompositeESSource);
DEFINE_FWK_EVENTSETUP_SOURCE(CTPPSCompositeESSource);
6 changes: 4 additions & 2 deletions CondTools/Geometry/plugins/PPSGeometryBuilder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class PPSGeometryBuilder : public edm::one::EDAnalyzer<> {

bool fromDD4hep_;
std::string compactViewTag_;
bool isRun2_;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@forthommel - out of curiosity why cannot you rely on an iov to determine that?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ianna, thanks for your post-review! Indeed an IOV could have worked too, but as there is only one algorithmic change (i.e. a few hardcoded values becoming "dynamic") a simple flag is probably more efficient. But this discussion is indeed quite dated (3-4 months), and I cannot fully remember the various arguments (if any).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was a long discussion. Eventually we decided to introduce this flag instead of re-uploading the Run2 geometry payloads.

edm::ESGetToken<DDCompactView, IdealGeometryRecord> ddToken_;
edm::ESGetToken<cms::DDCompactView, IdealGeometryRecord> dd4hepToken_;
edm::ESWatcher<IdealGeometryRecord> watcherIdealGeometry_;
Expand All @@ -46,6 +47,7 @@ class PPSGeometryBuilder : public edm::one::EDAnalyzer<> {
PPSGeometryBuilder::PPSGeometryBuilder(const edm::ParameterSet& iConfig)
: fromDD4hep_(iConfig.getUntrackedParameter<bool>("fromDD4hep", false)),
compactViewTag_(iConfig.getUntrackedParameter<std::string>("compactViewTag", "XMLIdealGeometryESSource_CTPPS")),
isRun2_(iConfig.getUntrackedParameter<bool>("isRun2", false)),
ddToken_(esConsumes(edm::ESInputTag("", compactViewTag_))),
dd4hepToken_(esConsumes(edm::ESInputTag("", compactViewTag_))) {}

Expand All @@ -63,15 +65,15 @@ void PPSGeometryBuilder::analyze(const edm::Event& iEvent, const edm::EventSetup
auto const& myCompactView = iSetup.getData(ddToken_);

// Build geometry
geoInfoRoot = detgeomdescbuilder::buildDetGeomDescFromCompactView(myCompactView);
geoInfoRoot = detgeomdescbuilder::buildDetGeomDescFromCompactView(myCompactView, isRun2_);
}
// DD4hep
else {
// Get CompactView from IdealGeometryRecord
auto const& myCompactView = iSetup.getData(dd4hepToken_);

// Build geometry
geoInfoRoot = detgeomdescbuilder::buildDetGeomDescFromCompactView(myCompactView);
geoInfoRoot = detgeomdescbuilder::buildDetGeomDescFromCompactView(myCompactView, isRun2_);
}
}

Expand Down
3 changes: 2 additions & 1 deletion CondTools/Geometry/test/ppsgeometrywriter_DD4hep.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,12 @@
)

# geometry
process.load("Geometry.VeryForwardGeometry.dd4hep.geometryRPFromDD_2018_cfi")
process.load("Geometry.VeryForwardGeometry.dd4hep.geometryRPFromDD_2021_cfi")

# DB writer
process.ppsGeometryBuilder = cms.EDAnalyzer("PPSGeometryBuilder",
fromDD4hep = cms.untracked.bool(True),
isRun2 = cms.untracked.bool(False),
compactViewTag = cms.untracked.string('XMLIdealGeometryESSource_CTPPS')
)

Expand Down
3 changes: 2 additions & 1 deletion CondTools/Geometry/test/ppsgeometrywriter_oldDD.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,11 @@
)

# geometry
process.load("Geometry.VeryForwardGeometry.geometryRPFromDD_2018_cfi")
process.load("Geometry.VeryForwardGeometry.geometryRPFromDD_2021_cfi")

# DB writer
process.ppsGeometryBuilder = cms.EDAnalyzer("PPSGeometryBuilder",
isRun2 = cms.untracked.bool(False),
compactViewTag = cms.untracked.string('XMLIdealGeometryESSource_CTPPS')
)

Expand Down
9 changes: 9 additions & 0 deletions DataFormats/CTPPSDetId/interface/CTPPSDetId.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,4 +153,13 @@ class CTPPSDetId : public DetId {

std::ostream &operator<<(std::ostream &os, const CTPPSDetId &id);

namespace std {
template <>
struct hash<CTPPSDetId> {
typedef CTPPSDetId argument_type;
typedef std::size_t result_type;
result_type operator()(const argument_type &id) const noexcept { return std::hash<uint64_t>()(id.rawId()); }
};
} // namespace std

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0"?>
<DDDefinition xmlns="http://www.cern.ch/cms/DDL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.cern.ch/cms/DDL ../../../DetectorDescription/Schema/DDLSchema.xsd">
<ConstantsSection label="CTPPS_Timing_Stations_Assembly.xml" eval="true">
<!--positions of the stations from the IP5 to the first element of the station-->
<Constant name="CTPPS_Timing_Negative_Station_Position_z_1" value="-215.078*m"/>
<Constant name="CTPPS_Timing_Positive_Station_Position_z_1" value="215.078*m"/>
<Constant name="CTPPS_Timing_Negative_Station_Position_z_2" value="-215.7*m"/>
<Constant name="CTPPS_Timing_Positive_Station_Position_z_2" value="215.7*m"/>
</ConstantsSection>
<PosPartSection label="CTPPS_Timing_Stations_Assembly.xml">
<PosPart copyNumber="22">
<rParent name="cms:CMSE"/>
<rChild name="CTPPS_Timing_Positive_Station:CTPPS_Timing_Positive_Station"/>
<Translation x="0*mm" y="0*mm" z="[CTPPS_Timing_Positive_Station_Position_z_1]"/>
<rRotation name="rotations:000D"/>
</PosPart>
<PosPart copyNumber="16">
<rParent name="cms:CMSE"/>
<rChild name="CTPPS_Timing_Positive_Station:CTPPS_Timing_Positive_Station"/>
<Translation x="0*mm" y="0*mm" z="[CTPPS_Timing_Positive_Station_Position_z_2]"/>
<rRotation name="rotations:000D"/>
</PosPart>
<PosPart copyNumber="122">
<rParent name="cms:CMSE"/>
<rChild name="CTPPS_Timing_Negative_Station:CTPPS_Timing_Negative_Station"/>
<Translation x="0*mm" y="0*mm" z="[CTPPS_Timing_Negative_Station_Position_z_1]"/>
<rRotation name="rotations:180R"/>
</PosPart>
<PosPart copyNumber="116">
<rParent name="cms:CMSE"/>
<rChild name="CTPPS_Timing_Negative_Station:CTPPS_Timing_Negative_Station"/>
<Translation x="0*mm" y="0*mm" z="[CTPPS_Timing_Negative_Station_Position_z_2]"/>
<rRotation name="rotations:180R"/>
</PosPart>
</PosPartSection>
</DDDefinition>
154 changes: 154 additions & 0 deletions Geometry/VeryForwardData/data/2021/v1/RP_220_Left_Station.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<DDDefinition xmlns="http://www.cern.ch/cms/DDL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.cern.ch/cms/DDL ../../DDLSchema/DDLSchema.xsd">
<ConstantsSection label="RP_220_Left_Station.xml" eval="true">
<Constant name="RP_220_Left_Station_Length" value="6588*mm"/>
<!--Positions calculated from the wall closer to IP point-->
<Constant name="RP_220_Left_Prim_Vert_z" value="608*mm"/>
<Constant name="RP_220_Left_Prim_Hor_z" value="1058*mm"/>
<Constant name="RP_220_Left_Sec_Hor_z" value="5530*mm"/>
<Constant name="RP_220_Left_Sec_Vert_z" value="5980*mm"/>
<Constant name="RP_220_Left_Hor_Vac_Length" value="[RP_Device:RP_Device_Envelope_Radius]+[RP_Device:RP_Device_Length_y]/2-[RP_Horizontal_Device:RP_Device_Hor_Closed_Wall_Thick_Int]"/>
</ConstantsSection>
<SolidSection label="RP_220_Left_Station.xml">
<Tube rMin="0*mm" rMax="[RP_Device:RP_Device_Envelope_Radius]*1.1" dz="[RP_220_Left_Station_Length]/2" name="RP_220_Left_Station"/>
<Tube rMin="[RP_Device:RP_Device_Beam_Hole_Diam]/2" rMax="[RP_Device:RP_Device_Beam_Hole_Diam]/2+[RP_Device:RP_Device_Wall_Thickness]" dz="([RP_220_Left_Prim_Vert_z]-[RP_Device:RP_Device_Length_z]/2)/2" name="RP_220_Left_Station_Tube_1"/>
<Tube rMin="[RP_Device:RP_Device_Beam_Hole_Diam]/2" rMax="[RP_Device:RP_Device_Beam_Hole_Diam]/2+[RP_Device:RP_Device_Wall_Thickness]" dz="([RP_220_Left_Prim_Hor_z]-[RP_220_Left_Prim_Vert_z]-[RP_Device:RP_Device_Length_z])/2" name="RP_220_Left_Station_Tube_2"/>
<Tube rMin="[RP_Device:RP_Device_Beam_Hole_Diam]/2" rMax="[RP_Device:RP_Device_Beam_Hole_Diam]/2+[RP_Device:RP_Device_Wall_Thickness]" dz="([RP_220_Left_Sec_Hor_z]-[RP_220_Left_Prim_Hor_z]-[RP_Device:RP_Device_Length_z])/2" name="RP_220_Left_Station_Tube_3"/>
<Tube rMin="[RP_Device:RP_Device_Beam_Hole_Diam]/2" rMax="[RP_Device:RP_Device_Beam_Hole_Diam]/2+[RP_Device:RP_Device_Wall_Thickness]" dz="([RP_220_Left_Sec_Vert_z]-[RP_220_Left_Sec_Hor_z]-[RP_Device:RP_Device_Length_z])/2" name="RP_220_Left_Station_Tube_4"/>
<Tube rMin="[RP_Device:RP_Device_Beam_Hole_Diam]/2" rMax="[RP_Device:RP_Device_Beam_Hole_Diam]/2+[RP_Device:RP_Device_Wall_Thickness]" dz="([RP_220_Left_Station_Length]-[RP_220_Left_Sec_Vert_z]-[RP_Device:RP_Device_Length_z]/2)/2" name="RP_220_Left_Station_Tube_5"/>
<Tube rMin="0*mm" rMax="[RP_Device:RP_Device_Beam_Hole_Diam]/2" dz="[RP_220_Left_Station_Length]/2" name="RP_220_Left_Station_Vacuum_1"/>
<Tube rMin="0*mm" rMax="[RP_Device:RP_Device_RP_Hole_Diam]/2" dz="[RP_Device:RP_Device_Envelope_Radius]" name="RP_220_Left_Station_Vert_Vacuum"/>
<UnionSolid name="RP_220_Left_Station_Vacuum_2">
<rSolid name="RP_220_Left_Station_Vacuum_1"/>
<rSolid name="RP_220_Left_Station_Vert_Vacuum"/>
<rRotation name="RP_Transformations:RP_x_90_rot"/>
<Translation x="0*mm" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+[RP_220_Left_Prim_Vert_z])"/>
</UnionSolid>
<UnionSolid name="RP_220_Left_Station_Vacuum_3">
<rSolid name="RP_220_Left_Station_Vacuum_2"/>
<rSolid name="RP_220_Left_Station_Vert_Vacuum"/>
<rRotation name="RP_Transformations:RP_x_90_rot"/>
<Translation x="0*mm" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+[RP_220_Left_Sec_Vert_z])"/>
</UnionSolid>
<Tube rMin="0*mm" rMax="[RP_Device:RP_Device_RP_Hole_Diam]/2" dz="[RP_220_Left_Hor_Vac_Length]/2" name="RP_220_Left_Station_Hor_Vacuum"/>
<UnionSolid name="RP_220_Left_Station_Vacuum_4">
<rSolid name="RP_220_Left_Station_Vacuum_3"/>
<rSolid name="RP_220_Left_Station_Hor_Vacuum"/>
<rRotation name="RP_Transformations:RP_y_90_rot"/>
<Translation x="-(-[RP_220_Left_Hor_Vac_Length]/2+[RP_Device:RP_Device_Length_y]/2-[RP_Horizontal_Device:RP_Device_Hor_Closed_Wall_Thick_Int])" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+[RP_220_Left_Prim_Hor_z])"/>
</UnionSolid>
<UnionSolid name="RP_220_Left_Station_Vacuum_5">
<rSolid name="RP_220_Left_Station_Vacuum_4"/>
<rSolid name="RP_220_Left_Station_Hor_Vacuum"/>
<rRotation name="RP_Transformations:RP_y_90_rot"/>
<Translation x="-(-[RP_220_Left_Hor_Vac_Length]/2+[RP_Device:RP_Device_Length_y]/2-[RP_Horizontal_Device:RP_Device_Hor_Closed_Wall_Thick_Int])" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+[RP_220_Left_Sec_Hor_z])"/>
</UnionSolid>
</SolidSection>
<LogicalPartSection label="RP_220_Left_Station.xml">
<LogicalPart name="RP_220_Left_Station">
<rSolid name="RP_220_Left_Station"/>
<rMaterial name="RP_Materials:Air"/>
</LogicalPart>
<LogicalPart name="RP_220_Left_Station_Tube_1">
<rSolid name="RP_220_Left_Station_Tube_1"/>
<rMaterial name="RP_Materials:AISI-316L-Steel"/>
</LogicalPart>
<LogicalPart name="RP_220_Left_Station_Tube_2">
<rSolid name="RP_220_Left_Station_Tube_2"/>
<rMaterial name="RP_Materials:AISI-316L-Steel"/>
</LogicalPart>
<LogicalPart name="RP_220_Left_Station_Tube_3">
<rSolid name="RP_220_Left_Station_Tube_3"/>
<rMaterial name="RP_Materials:AISI-316L-Steel"/>
</LogicalPart>
<LogicalPart name="RP_220_Left_Station_Tube_4">
<rSolid name="RP_220_Left_Station_Tube_4"/>
<rMaterial name="RP_Materials:AISI-316L-Steel"/>
</LogicalPart>
<LogicalPart name="RP_220_Left_Station_Tube_5">
<rSolid name="RP_220_Left_Station_Tube_5"/>
<rMaterial name="RP_Materials:AISI-316L-Steel"/>
</LogicalPart>
<LogicalPart name="RP_220_Left_Station_Vacuum_5">
<rSolid name="RP_220_Left_Station_Vacuum_5"/>
<rMaterial name="RP_Materials:RP_Primary_Vacuum"/>
</LogicalPart>
</LogicalPartSection>
<PosPartSection label="RP_220_Left_Station.xml">
<PosPart copyNumber="1">
<rParent name="RP_220_Left_Station"/>
<rChild name="RP_Vertical_Device:RP_Device_Vert_Corp_3"/>
<Translation x="0*mm" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+[RP_220_Left_Prim_Vert_z])"/>
</PosPart>
<PosPart copyNumber="2">
<rParent name="RP_220_Left_Station"/>
<rChild name="RP_Vertical_Device:RP_Device_Vert_Corp_3"/>
<Translation x="0*mm" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+[RP_220_Left_Sec_Vert_z])"/>
</PosPart>
<PosPart copyNumber="1">
<rParent name="RP_220_Left_Station"/>
<rChild name="RP_Horizontal_Device:RP_Device_Hor_Corp_3"/>
<Translation x="0*mm" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+[RP_220_Left_Prim_Hor_z])"/>
</PosPart>
<PosPart copyNumber="2">
<rParent name="RP_220_Left_Station"/>
<rChild name="RP_Horizontal_Device:RP_Device_Hor_Corp_3"/>
<Translation x="0*mm" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+[RP_220_Left_Sec_Hor_z])"/>
</PosPart>
<PosPart copyNumber="1">
<rParent name="RP_220_Left_Station"/>
<rChild name="RP_220_Left_Station_Tube_1"/>
<Translation x="0*mm" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+([RP_220_Left_Prim_Vert_z]-[RP_Device:RP_Device_Length_z]/2)/2)"/>
</PosPart>
<PosPart copyNumber="1">
<rParent name="RP_220_Left_Station"/>
<rChild name="RP_220_Left_Station_Tube_2"/>
<Translation x="0*mm" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+([RP_220_Left_Prim_Vert_z]+[RP_220_Left_Prim_Hor_z])/2)"/>
</PosPart>
<PosPart copyNumber="1">
<rParent name="RP_220_Left_Station"/>
<rChild name="RP_220_Left_Station_Tube_4"/>
<Translation x="0*mm" y="0*mm" z="-(-[RP_220_Left_Station_Length]/2+([RP_220_Left_Sec_Hor_z]+[RP_220_Left_Sec_Vert_z])/2)"/>
</PosPart>
<PosPart copyNumber="1">
<rParent name="RP_220_Left_Station"/>
<rChild name="RP_220_Left_Station_Tube_5"/>
<Translation x="0*mm" y="0*mm" z="-([RP_220_Left_Station_Length]/2-([RP_220_Left_Station_Length]-[RP_220_Left_Sec_Vert_z]-[RP_Device:RP_Device_Length_z]/2)/2)"/>
</PosPart>
<PosPart copyNumber="1">
<rParent name="RP_220_Left_Station"/>
<rChild name="RP_220_Left_Station_Vacuum_5"/>
</PosPart>
<PosPart copyNumber="20">
<rParent name="RP_220_Left_Station_Vacuum_5"/>
<rChild name="RP_Box_020:RP_box_primary_vacuum"/>
<rRotation name="RP_Transformations:RP_y_180_rot"/>
<Translation x="0*mm" y="[RP_Dist_Beam_Cent:RP_220_Left_Det_Dist_0]+[RP_Box:RP_Box_primary_vacuum_y]/2" z="-([RP_220_Left_Prim_Vert_z]-[RP_220_Left_Station_Length]/2)"/>
</PosPart>
<PosPart copyNumber="21">
<rParent name="RP_220_Left_Station_Vacuum_5"/>
<rChild name="RP_Box_021:RP_box_primary_vacuum"/>
<rRotation name="RP_Transformations:RP_180_z_180_y_rot"/>
<Translation x="0*mm" y="-[RP_Dist_Beam_Cent:RP_220_Left_Det_Dist_1]-[RP_Box:RP_Box_primary_vacuum_y]/2" z="-([RP_220_Left_Prim_Vert_z]-[RP_220_Left_Station_Length]/2)"/>
</PosPart>
<PosPart copyNumber="10023">
<!-- the offset 10^4 indicates pixel RP -->
<rParent name="RP_220_Left_Station_Vacuum_5"/>
<rChild name="RP_Box_023:RP_box_primary_vacuum"/>
<rRotation name="RP_Transformations:RP_90_z_cw_180_y_rot"/>
<Translation x="-(-[RP_Dist_Beam_Cent:RP_220_Left_Det_Dist_3]-[RP_Box:RP_Box_primary_vacuum_y]/2)" y="0*mm" z="-([RP_220_Left_Sec_Hor_z]-[RP_220_Left_Station_Length]/2)"/>
</PosPart>
<PosPart copyNumber="24">
<rParent name="RP_220_Left_Station_Vacuum_5"/>
<rChild name="RP_Box_024:RP_box_primary_vacuum"/>
<rRotation name="RP_Transformations:RP_y_180_rot"/>
<Translation x="0*mm" y="[RP_Dist_Beam_Cent:RP_220_Left_Det_Dist_4]+[RP_Box:RP_Box_primary_vacuum_y]/2" z="-([RP_220_Left_Sec_Vert_z]-[RP_220_Left_Station_Length]/2)"/>
</PosPart>
<PosPart copyNumber="25">
<rParent name="RP_220_Left_Station_Vacuum_5"/>
<rChild name="RP_Box_025:RP_box_primary_vacuum"/>
<rRotation name="RP_Transformations:RP_180_z_180_y_rot"/>
<Translation x="0*mm" y="-[RP_Dist_Beam_Cent:RP_220_Left_Det_Dist_5]-[RP_Box:RP_Box_primary_vacuum_y]/2" z="-([RP_220_Left_Sec_Vert_z]-[RP_220_Left_Station_Length]/2)"/>
</PosPart>
</PosPartSection>
</DDDefinition>
Loading