diff --git a/Configuration/Geometry/README.md b/Configuration/Geometry/README.md
index e3dae2f3d5a3f..31899907e468d 100644
--- a/Configuration/Geometry/README.md
+++ b/Configuration/Geometry/README.md
@@ -1,3 +1,5 @@
+The Run 3 geometry is automatically created using the script [generate2021Geometry.py](./scripts/generate2021Geometry.py).
+
The Phase2 geometries are automatically created using the script [generate2026Geometry.py](./scripts/generate2026Geometry.py).
Different versions of various subdetectors can be combined. The available versions are:
diff --git a/Configuration/Geometry/python/dict2021Geometry.py b/Configuration/Geometry/python/dict2021Geometry.py
index 9a2846643844b..faa2da8128569 100644
--- a/Configuration/Geometry/python/dict2021Geometry.py
+++ b/Configuration/Geometry/python/dict2021Geometry.py
@@ -1,4 +1,4 @@
-maxsections = 5
+maxSections = 5
commonDict = {
"abbrev" : "O",
@@ -30,7 +30,7 @@
5 : [
'Geometry/CMSCommonData/data/FieldParameters.xml',
],
- "era" : "run2_common, run3_common, phase2_common",
+ "era" : "run3_common, stage2L1Trigger_2021",
}
}
@@ -239,7 +239,6 @@
'from Geometry.TrackerGeometryBuilder.idealForDigiTrackerGeometry_cff import *',
'trackerGeometry.applyAlignment = cms.bool(False)',
],
- "era" : "phase2_tracker, trackingPhase2PU140",
}
}
@@ -299,7 +298,7 @@
'from Geometry.HcalCommonData.hcalDDDRecConstants_cfi import *',
'from Geometry.HcalEventSetup.hcalTopologyIdeal_cfi import *',
],
- "era" : "run2_HE_2017, run2_HF_2017, run2_HCAL_2017, run3_HB, phase2_hcal, hcalHardcodeConditions, hcalSkipPacker",
+ "era" : "run3_HB",
}
}
@@ -348,7 +347,7 @@
'from Geometry.CSCGeometryBuilder.idealForDigiCscGeometry_cff import *',
'from Geometry.DTGeometryBuilder.idealForDigiDtGeometry_cff import *',
],
- "era" : "phase2_muon, run3_GEM",
+ "era" : "run3_GEM",
},
}
@@ -492,12 +491,11 @@
"reco" :[
],
- "era" : "run3_common, phase2_timing, phase2_timing_layer",
},
}
allDicts = [ commonDict, trackerDict, caloDict, muonDict, forwardDict, ppsDict ]
detectorVersionDict = {
- ("O1","T1","C1","M1","F1", "P1") : "2021",
+ ("O1","T1","C1","M1","F1","P1") : "2021",
}
diff --git a/Configuration/Geometry/python/dict2026Geometry.py b/Configuration/Geometry/python/dict2026Geometry.py
index f9265a896a6cf..f1307be7da79d 100644
--- a/Configuration/Geometry/python/dict2026Geometry.py
+++ b/Configuration/Geometry/python/dict2026Geometry.py
@@ -1,4 +1,4 @@
-maxsections = 5
+maxSections = 5
commonDict = {
"abbrev" : "O",
@@ -29,7 +29,7 @@
5 : [
'Geometry/CMSCommonData/data/FieldParameters.xml',
],
- "era" : "run2_common, run3_common, phase2_common",
+ "era" : "phase2_common, phase2_trigger",
},
"O3" : {
1 : [
@@ -56,7 +56,7 @@
5 : [
'Geometry/CMSCommonData/data/FieldParameters.xml',
],
- "era" : "run2_common, run3_common, phase2_common",
+ "era" : "phase2_common, phase2_trigger",
},
"O4" : {
1 : [
@@ -83,8 +83,8 @@
5 : [
'Geometry/CMSCommonData/data/FieldParameters.xml',
],
- "era" : "run2_common, run3_common, phase2_common",
- },
+ "era" : "phase2_common, phase2_trigger",
+ },
"O5" : {
1 : [
'Geometry/CMSCommonData/data/materials/2021/v1/materials.xml',
@@ -110,8 +110,8 @@
5 : [
'Geometry/CMSCommonData/data/FieldParameters.xml',
],
- "era" : "run2_common, run3_common, phase2_common",
- },
+ "era" : "phase2_common, phase2_trigger",
+ },
"O6" : {
1 : [
'Geometry/CMSCommonData/data/materials/2021/v1/materials.xml',
@@ -137,8 +137,8 @@
5 : [
'Geometry/CMSCommonData/data/FieldParameters.xml',
],
- "era" : "run2_common, run3_common, phase2_common",
- },
+ "era" : "phase2_common, phase2_trigger",
+ },
}
trackerDict = {
@@ -502,7 +502,7 @@
'from Geometry.EcalMapping.EcalMapping_cfi import *',
'from Geometry.EcalMapping.EcalMappingRecord_cfi import *',
],
- "era" : "run2_HE_2017, run2_HF_2017, run2_HCAL_2017, run3_HB, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions, hcalSkipPacker",
+ "era" : "phase2_ecal, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions",
},
"C6" : {
1 : [
@@ -588,7 +588,7 @@
'from Geometry.EcalMapping.EcalMapping_cfi import *',
'from Geometry.EcalMapping.EcalMappingRecord_cfi import *',
],
- "era" : "run2_HE_2017, run2_HF_2017, run2_HCAL_2017, run3_HB, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions, hcalSkipPacker, phase2_hfnose",
+ "era" : "phase2_ecal, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions, phase2_hfnose",
},
"C8" : {
1 : [
@@ -661,7 +661,7 @@
'from Geometry.EcalMapping.EcalMapping_cfi import *',
'from Geometry.EcalMapping.EcalMappingRecord_cfi import *',
],
- "era" : "run2_HE_2017, run2_HF_2017, run2_HCAL_2017, run3_HB, phase2_hcal, phase2_hgcal, phase2_hgcalV9, phase2_hgcalV10, hcalHardcodeConditions, hcalSkipPacker",
+ "era" : "phase2_ecal, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions, phase2_hgcalV10",
},
"C9" : {
1 : [
@@ -734,7 +734,7 @@
'from Geometry.EcalMapping.EcalMapping_cfi import *',
'from Geometry.EcalMapping.EcalMappingRecord_cfi import *',
],
- "era" : "run2_HE_2017, run2_HF_2017, run2_HCAL_2017, run3_HB, phase2_hcal, phase2_hgcal, phase2_hgcalV9, phase2_hgcalV10, phase2_hgcalV11, hcalHardcodeConditions, hcalSkipPacker",
+ "era" : "phase2_ecal, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions, phase2_hgcalV10, phase2_hgcalV11",
},
"C10" : {
1 : [
@@ -819,7 +819,7 @@
'from Geometry.EcalMapping.EcalMapping_cfi import *',
'from Geometry.EcalMapping.EcalMappingRecord_cfi import *',
],
- "era" : "run2_HE_2017, run2_HF_2017, run2_HCAL_2017, run3_HB, phase2_hcal, phase2_hgcal, phase2_hgcalV9, phase2_hgcalV10, phase2_hgcalV11, phase2_hfnose, hcalHardcodeConditions, hcalSkipPacker",
+ "era" : "phase2_ecal, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions, phase2_hgcalV10, phase2_hgcalV11, phase2_hfnose",
},
"C11" : {
1 : [
@@ -892,7 +892,7 @@
'from Geometry.EcalMapping.EcalMapping_cfi import *',
'from Geometry.EcalMapping.EcalMappingRecord_cfi import *',
],
- "era" : "run2_HE_2017, run2_HF_2017, run2_HCAL_2017, run3_HB, phase2_hcal, phase2_hgcal, phase2_hgcalV9, phase2_hgcalV10, phase2_hgcalV11, phase2_hgcalV12, hcalHardcodeConditions, hcalSkipPacker",
+ "era" : "phase2_ecal, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions, phase2_hgcalV10, phase2_hgcalV11, phase2_hgcalV12",
},
"C12" : {
1 : [
@@ -977,7 +977,7 @@
'from Geometry.EcalMapping.EcalMapping_cfi import *',
'from Geometry.EcalMapping.EcalMappingRecord_cfi import *',
],
- "era" : "run2_HE_2017, run2_HF_2017, run2_HCAL_2017, run3_HB, phase2_hcal, phase2_hgcal, phase2_hgcalV9, phase2_hgcalV10, phase2_hgcalV11, phase2_hgcalV12, phase2_hfnose, hcalHardcodeConditions, hcalSkipPacker",
+ "era" : "phase2_ecal, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions, phase2_hgcalV10, phase2_hgcalV11, phase2_hgcalV12, phase2_hfnose",
},
"C13" : {
1 : [
@@ -1051,7 +1051,7 @@
'from Geometry.EcalMapping.EcalMapping_cfi import *',
'from Geometry.EcalMapping.EcalMappingRecord_cfi import *',
],
- "era" : "run2_HE_2017, run2_HF_2017, run2_HCAL_2017, run3_HB, phase2_hcal, phase2_hgcal, phase2_hgcalV9, phase2_hgcalV10, phase2_hgcalV11, phase2_hgcalV12, hcalHardcodeConditions, hcalSkipPacker",
+ "era" : "phase2_ecal, phase2_hcal, phase2_hgcal, phase2_hgcalV9, hcalHardcodeConditions, phase2_hgcalV10, phase2_hgcalV11, phase2_hgcalV12, phase2_hfnose",
},
}
@@ -1103,7 +1103,7 @@
'from Geometry.CSCGeometryBuilder.idealForDigiCscGeometry_cff import *',
'from Geometry.DTGeometryBuilder.idealForDigiDtGeometry_cff import *',
],
- "era" : "phase2_muon, run3_GEM",
+ "era" : "phase2_muon, phase2_GEM",
},
"M3" : {
1 : [
@@ -1148,7 +1148,7 @@
'from Geometry.CSCGeometryBuilder.idealForDigiCscGeometry_cff import *',
'from Geometry.DTGeometryBuilder.idealForDigiDtGeometry_cff import *',
],
- "era" : "phase2_muon, run3_GEM",
+ "era" : "phase2_muon, phase2_GEM",
},
"M4" : {
1 : [
@@ -1195,7 +1195,7 @@
'from Geometry.CSCGeometryBuilder.idealForDigiCscGeometry_cff import *',
'from Geometry.DTGeometryBuilder.idealForDigiDtGeometry_cff import *',
],
- "era" : "phase2_muon, run3_GEM",
+ "era" : "phase2_muon, phase2_GEM",
},
"M5" : {
1 : [
@@ -1288,7 +1288,7 @@
'from Geometry.CSCGeometryBuilder.idealForDigiCscGeometry_cff import *',
'from Geometry.DTGeometryBuilder.idealForDigiDtGeometry_cff import *',
],
- "era" : "phase2_muon, run3_GEM",
+ "era" : "phase2_muon, phase2_GEM",
},
"M7" : {
1 : [
@@ -1334,9 +1334,8 @@
'from Geometry.CSCGeometryBuilder.idealForDigiCscGeometry_cff import *',
'from Geometry.DTGeometryBuilder.idealForDigiDtGeometry_cff import *',
],
- "era" : "phase2_muon, run3_GEM",
+ "era" : "phase2_muon, phase2_GEM",
},
-
}
forwardDict = {
@@ -1472,7 +1471,6 @@
'from Geometry.ForwardGeometry.ForwardGeometry_cfi import *',
]
},
-
}
timingDict = {
diff --git a/Configuration/Geometry/python/generateGeometry.py b/Configuration/Geometry/python/generateGeometry.py
new file mode 100644
index 0000000000000..0df7f5edfdff6
--- /dev/null
+++ b/Configuration/Geometry/python/generateGeometry.py
@@ -0,0 +1,235 @@
+from __future__ import print_function
+from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, RawTextHelpFormatter, RawDescriptionHelpFormatter
+import sys, os, operator
+from pprint import pprint
+import filecmp
+
+# convenience definition
+# (from ConfigArgParse)
+class ArgumentDefaultsRawHelpFormatter(
+ ArgumentDefaultsHelpFormatter,
+ RawTextHelpFormatter,
+ RawDescriptionHelpFormatter):
+ """HelpFormatter that adds default values AND doesn't do line-wrapping"""
+pass
+
+class GeometryGenerator(object):
+ def __init__(self, scriptName, detectorVersionDefault, detectorPrefix, detectorYear, maxSections, allDicts, detectorVersionDict, deprecatedDets = None, deprecatedSubdets = None):
+ self.scriptName = scriptName
+ self.detectorVersionDefault = detectorVersionDefault
+ self.detectorPrefix = detectorPrefix
+ self.detectorYear = detectorYear
+ self.maxSections = maxSections
+ self.allDicts = allDicts
+ self.detectorVersionDict = detectorVersionDict
+ self.deprecatedDets = deprecatedDets
+ self.deprecatedSubdets = deprecatedSubdets
+
+ def generateGeom(self, detectorTuple, args):
+ detectorVersion = self.detectorPrefix+str(args.detectorVersionManual)
+ # reverse dict search if overall D# specified
+ if args.v_detector>0:
+ detectorVersion = self.detectorPrefix+str(args.v_detector)
+ if detectorVersion in self.detectorVersionDict.values():
+ detectorTuple = self.detectorVersionDict.keys()[self.detectorVersionDict.values().index(detectorVersion)]
+ else:
+ print("Unknown detector "+detectorVersion)
+ sys.exit(1)
+ elif detectorTuple in self.detectorVersionDict.keys():
+ detectorVersion = self.detectorVersionDict[detectorTuple]
+ else:
+ if not args.doTest: print("Detector "+str(detectorTuple)+" not found in dictionary, using "+("default" if args.detectorVersionManual==self.detectorVersionDefault else "provided")+" version number "+str(detectorVersion))
+
+ # check for deprecation
+ if self.deprecatedDets is not None and detectorVersion in self.deprecatedDets:
+ print("Error: "+detectorVersion+" is deprecated and cannot be used.")
+ sys.exit(1)
+ if self.deprecatedSubdets is not None:
+ for subdet in detectorTuple:
+ if subdet in self.deprecatedSubdets:
+ print("Error: "+subdet+" is deprecated and cannot be used.")
+ sys.exit(1)
+
+ # create output files
+ xmlName = "cmsExtendedGeometry"+self.detectorYear+detectorVersion+"XML_cfi.py"
+ xmlDD4hepName = "cmsExtendedGeometry"+self.detectorYear+detectorVersion+".xml"
+ simName = "GeometryExtended"+self.detectorYear+detectorVersion+"_cff.py"
+ recoName = "GeometryExtended"+self.detectorYear+detectorVersion+"Reco_cff.py"
+
+ # check directories
+ CMSSWBASE = os.getenv("CMSSW_BASE")
+ CMSSWRELBASE = os.getenv("CMSSW_RELEASE_BASE")
+ if CMSSWBASE is None: CMSSWBASE = ""
+ xmlDir = os.path.join(CMSSWBASE,"src","Geometry","CMSCommonData","python")
+ xmlDD4hepDir = os.path.join(CMSSWBASE,"src","Geometry","CMSCommonData","data","dd4hep")
+ simrecoDir = os.path.join(CMSSWBASE,"src","Configuration","Geometry","python")
+ if args.doTest:
+ if not os.path.isdir(xmlDir):
+ xmlDir = os.path.join(CMSSWRELBASE,"src","Geometry","CMSCommonData","python")
+ xmlDD4hepDir = os.path.join(CMSSWRELBASE,"src","Geometry","CMSCommonData","data","dd4hep")
+ else:
+ mvCommands = ""
+ if not os.path.isdir(xmlDir):
+ mvCommands += "mv "+xmlName+" "+xmlDir+"/\n"
+ else:
+ xmlName = os.path.join(xmlDir,xmlName)
+ if not os.path.isdir(xmlDD4hepDir):
+ mvCommands += "mv "+xmlDD4hepName+" "+xmlDD4hepDir+"/\n"
+ else:
+ xmlDD4hepName = os.path.join(xmlDD4hepDir,xmlDD4hepName)
+ if not os.path.isdir(simrecoDir):
+ mvCommands += "mv "+simName+" "+simrecoDir+"/\n"
+ mvCommands += "mv "+recoName+" "+simrecoDir+"/\n"
+ else:
+ simName = os.path.join(simrecoDir,simName)
+ recoName = os.path.join(simrecoDir,recoName)
+ if len(mvCommands)>0:
+ print("Warning: some geometry packages not checked out.\nOnce they are available, please execute the following commands manually:\n"+mvCommands)
+
+ # open files
+ xmlFile = open(xmlName,'w')
+ xmlDD4hepFile = open(xmlDD4hepName,'w')
+ simFile = open(simName,'w')
+ recoFile = open(recoName,'w')
+
+ # common preamble
+ preamble = "import FWCore.ParameterSet.Config as cms"+"\n"+"\n"
+ preamble += "# This config was generated automatically using "+self.scriptName+"\n"
+ preamble += "# If you notice a mistake, please update the generating script, not just this config"+"\n"+"\n"
+
+ # create XML config
+ xmlFile.write(preamble)
+ # extra preamble
+ xmlFile.write("XMLIdealGeometryESSource = cms.ESSource(\"XMLIdealGeometryESSource\","+"\n")
+ xmlFile.write(" geomXMLFiles = cms.vstring("+"\n")
+ for section in range(1,self.maxSections+1):
+ # midamble
+ if section==2:
+ xmlFile.write(" )+"+"\n"+" cms.vstring("+"\n")
+ for iDict,aDict in enumerate(self.allDicts):
+ if section in aDict[detectorTuple[iDict]].keys():
+ xmlFile.write('\n'.join([ " '"+aLine+"'," for aLine in aDict[detectorTuple[iDict]][section] ])+"\n")
+ # postamble
+ xmlFile.write(" ),"+"\n"+" rootNodeName = cms.string('cms:OCMS')"+"\n"+")"+"\n")
+ xmlFile.close()
+
+ # create DD4hep XML config
+ xmlDD4hepFile.write("\n"+
+ "\n"+
+ " \n"+
+ " \n"+
+ "\n"+
+ " \n")
+ for section in range(1,self.maxSections+1):
+ # midamble
+ for iDict,aDict in enumerate(self.allDicts):
+ if section in aDict[detectorTuple[iDict]].keys():
+ xmlDD4hepFile.write('\n'.join([ " " for aLine in aDict[detectorTuple[iDict]][section] ])+"\n")
+ # postamble
+ xmlDD4hepFile.write(" \n"+
+ ""+"\n")
+ xmlDD4hepFile.close()
+
+ # create sim config
+ simFile.write(preamble)
+ # always need XML
+ simFile.write("from Geometry.CMSCommonData."+os.path.basename(xmlName).replace(".py","")+" import *"+"\n")
+ for iDict,aDict in enumerate(self.allDicts):
+ if "sim" in aDict[detectorTuple[iDict]].keys():
+ simFile.write('\n'.join([ aLine for aLine in aDict[detectorTuple[iDict]]["sim"] ])+"\n")
+ simFile.close()
+
+ # create reco config
+ recoFile.write(preamble)
+ # always need sim
+ recoFile.write("from Configuration.Geometry."+os.path.basename(simName).replace(".py","")+" import *"+"\n\n")
+ for iDict,aDict in enumerate(self.allDicts):
+ if "reco" in aDict[detectorTuple[iDict]].keys():
+ recoFile.write("# "+aDict["name"]+"\n")
+ recoFile.write('\n'.join([ aLine for aLine in aDict[detectorTuple[iDict]]["reco"] ])+"\n\n")
+ recoFile.close()
+
+ from Configuration.StandardSequences.GeometryConf import GeometryConf
+ if not args.doTest: # todo: include these in unit test somehow
+ # specify Era customizations
+ # must be checked manually in:
+ # Configuration/StandardSequences/python/Eras.py
+ # Configuration/Eras/python/
+ # Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py (workflow definitions)
+ eraLine = ""
+ eraLineItems = []
+ for iDict,aDict in enumerate(self.allDicts):
+ if "era" in aDict[detectorTuple[iDict]].keys():
+ eraLineItems.append(aDict[detectorTuple[iDict]]["era"])
+ eraLine += ", ".join([ eraLineItem for eraLineItem in eraLineItems ])
+ print("The Era for this detector should contain:")
+ print(eraLine)
+
+ # specify GeometryConf
+ if not 'Extended'+self.detectorYear+detectorVersion in GeometryConf.keys():
+ print("Please add this line in Configuration/StandardSequences/python/GeometryConf.py:")
+ print(" 'Extended"+self.detectorYear+detectorVersion+"' : 'Extended"+self.detectorYear+detectorVersion+",Extended"+self.detectorYear+detectorVersion+"Reco',")
+
+ errorList = []
+
+ if args.doTest:
+ # tests for Configuration/Geometry
+ simFile = os.path.join(simrecoDir,simName)
+ if not os.path.isfile(simFile):
+ errorList.append(simName+" missing")
+ elif not filecmp.cmp(simName,simFile):
+ errorList.append(simName+" differs")
+ recoFile = os.path.join(simrecoDir,recoName)
+ if not os.path.isfile(recoFile):
+ errorList.append(recoName+" missing")
+ elif not filecmp.cmp(recoName,recoFile):
+ errorList.append(recoName+" differs")
+ # test for Configuration/StandardSequences
+ if not 'Extended'+self.detectorYear+detectorVersion in GeometryConf.keys():
+ errorList.append('Extended'+self.detectorYear+detectorVersion+" missing from GeometryConf")
+ # test for Geometry/CMSCommonData
+ xmlFile = os.path.join(xmlDir,xmlName)
+ if not os.path.isfile(xmlFile):
+ errorList.append(xmlName+" missing")
+ elif not filecmp.cmp(xmlName,xmlFile):
+ errorList.append(xmlName+" differs")
+ # test for dd4hep xml
+ xmlDD4hepFile = os.path.join(xmlDD4hepDir,xmlDD4hepName)
+ if not os.path.exists(xmlDD4hepFile):
+ errorList.append(xmlDD4hepName+" differs")
+ elif not filecmp.cmp(xmlDD4hepName,xmlDD4hepFile):
+ errorList.append(xmlDD4hepName+" differs")
+ return errorList
+
+ def run(self):
+ # define options
+ parser = ArgumentParser(formatter_class=ArgumentDefaultsRawHelpFormatter)
+ for aDict in self.allDicts:
+ parser.add_argument("-"+aDict["abbrev"], "--"+aDict["name"], dest="v_"+aDict["name"], default=aDict["default"], type=int, help="version for "+aDict["name"])
+ parser.add_argument("-V", "--version", dest="detectorVersionManual", default=self.detectorVersionDefault, type=int, help="manual detector version number")
+ parser.add_argument("-D", "--detector", dest="v_detector", default=0, type=int, help="version for whole detector, ignored if 0, overrides subdet versions otherwise")
+ parser.add_argument("-l", "--list", dest="doList", default=False, action="store_true", help="list known detector versions and exit")
+ parser.add_argument("-t", "--test", dest="doTest", default=False, action="store_true", help="enable unit test mode")
+ args = parser.parse_args()
+
+ # check options
+ if args.doList and not args.doTest:
+ pprint(sorted(self.detectorVersionDict.items(),key=operator.itemgetter(1)))
+ sys.exit(0)
+ elif args.doTest:
+ # list of errors
+ errorList = []
+ # run all known possibilities
+ for detectorTuple in self.detectorVersionDict:
+ errorTmp = self.generateGeom(detectorTuple,args)
+ errorList.extend(errorTmp)
+ if len(errorList)>0:
+ print('\n'.join([anError for anError in errorList]))
+ sys.exit(1)
+ else:
+ sys.exit(0)
+ else:
+ detectorTuple = tuple([aDict["abbrev"]+str(getattr(args,"v_"+aDict["name"])) for aDict in self.allDicts])
+ self.generateGeom(detectorTuple,args)
+ sys.exit(0)
+
diff --git a/Configuration/Geometry/scripts/generate2021Geometry.py b/Configuration/Geometry/scripts/generate2021Geometry.py
index d1435814d5e53..c128370fb0cda 100644
--- a/Configuration/Geometry/scripts/generate2021Geometry.py
+++ b/Configuration/Geometry/scripts/generate2021Geometry.py
@@ -1,196 +1,9 @@
-from __future__ import print_function
-from optparse import OptionParser
-import sys, os, operator
-from pprint import pprint
-import filecmp
-
from Configuration.Geometry.dict2021Geometry import *
+from Configuration.Geometry.generateGeometry import *
-# define global
-detectorVersionDefault = 2021
-
-def generateGeom(detectorTuple, options):
- doTest = bool(options.doTest)
-
- detectorVersion = str(options.detectorVersionManual)
- # reverse dict search if overall D# specified
- if options.v_detector>0:
- detectorVersion = str(options.v_detector)
- if detectorVersion in detectorVersionDict.values():
- detectorTuple = detectorVersionDict.keys()[detectorVersionDict.values().index(detectorVersion)]
- else:
- print("Unknown detector "+detectorVersion)
- sys.exit(1)
- elif detectorTuple in detectorVersionDict.keys():
- detectorVersion = detectorVersionDict[detectorTuple]
- else:
- if not doTest: print("Detector "+str(detectorTuple)+" not found in dictionary, using "+("default" if options.detectorVersionManual==detectorVersionDefault else "provided")+" version number "+str(detectorVersion))
-
- # create output files
- xmlName = "cmsExtendedGeometry"+detectorVersion+"XML_cfi.py"
- xmlDD4hepName = "cmsExtendedGeometry"+detectorVersion+".xml"
- simName = "GeometryExtended"+detectorVersion+"_cff.py"
- recoName = "GeometryExtended"+detectorVersion+"Reco_cff.py"
-
- # check directories
- CMSSWBASE = os.getenv("CMSSW_BASE")
- CMSSWRELBASE = os.getenv("CMSSW_RELEASE_BASE")
- if CMSSWBASE is None: CMSSWBASE = ""
- xmlDir = os.path.join(CMSSWBASE,"src","Geometry","CMSCommonData","python")
- xmlDD4hepDir = os.path.join(CMSSWBASE,"src","Geometry","CMSCommonData","data","dd4hep")
- simrecoDir = os.path.join(CMSSWBASE,"src","Configuration","Geometry","python")
- if doTest:
- if not os.path.isdir(xmlDir):
- xmlDir = os.path.join(CMSSWRELBASE,"src","Geometry","CMSCommonData","python")
- xmlDD4hepDir = os.path.join(CMSSWBASE,"src","Geometry","CMSCommonData","data","dd4hep")
- else:
- mvCommands = ""
- if not os.path.isdir(xmlDir):
- mvCommands += "mv "+xmlName+" "+xmlDir+"/\n"
- else:
- xmlName = os.path.join(xmlDir,xmlName)
- if not os.path.isdir(xmlDD4hepDir):
- mvCommands += "mv "+xmlDD4hepName+" "+xmlDD4hepDir+"/\n"
- else:
- xmlDD4hepName = os.path.join(xmlDD4hepDir,xmlDD4hepName)
- if not os.path.isdir(simrecoDir):
- mvCommands += "mv "+simName+" "+simrecoDir+"/\n"
- mvCommands += "mv "+recoName+" "+simrecoDir+"/\n"
- else:
- simName = os.path.join(simrecoDir,simName)
- recoName = os.path.join(simrecoDir,recoName)
- if len(mvCommands)>0:
- print("Warning: some geometry packages not checked out.\nOnce they are available, please execute the following commands manually:\n"+mvCommands)
-
- # open files
- xmlFile = open(xmlName,'w')
- xmlDD4hepFile = open(xmlDD4hepName,'w')
- simFile = open(simName,'w')
- recoFile = open(recoName,'w')
-
- # common preamble
- preamble = "import FWCore.ParameterSet.Config as cms"+"\n"+"\n"
- preamble += "# This config was generated automatically using generate2021Geometry.py"+"\n"
- preamble += "# If you notice a mistake, please update the generating script, not just this config"+"\n"+"\n"
-
- # create XML config
- xmlFile.write(preamble)
- # extra preamble
- xmlFile.write("XMLIdealGeometryESSource = cms.ESSource(\"XMLIdealGeometryESSource\","+"\n")
- xmlFile.write(" geomXMLFiles = cms.vstring("+"\n")
- for section in range(1,maxsections+1):
- # midamble
- if section==2:
- xmlFile.write(" )+"+"\n"+" cms.vstring("+"\n")
- for iDict,aDict in enumerate(allDicts):
- if section in aDict[detectorTuple[iDict]].keys():
- xmlFile.write('\n'.join([ " '"+aLine+"'," for aLine in aDict[detectorTuple[iDict]][section] ])+"\n")
- # postamble
- xmlFile.write(" ),"+"\n"+" rootNodeName = cms.string('cms:OCMS')"+"\n"+")"+"\n")
- xmlFile.close()
-
- # create DD4hep XML config
- xmlDD4hepFile.write("\n"+
- "\n"+
- " \n"+
- " \n"+
- "\n"+
- " \n")
- for section in range(1,maxsections+1):
- # midamble
- for iDict,aDict in enumerate(allDicts):
- if section in aDict[detectorTuple[iDict]].keys():
- xmlDD4hepFile.write('\n'.join([ " " for aLine in aDict[detectorTuple[iDict]][section] ])+"\n")
- # postamble
- xmlDD4hepFile.write(" \n"+
- ""+"\n")
- xmlDD4hepFile.close()
-
- # create sim config
- simFile.write(preamble)
- # always need XML
- simFile.write("from Geometry.CMSCommonData."+os.path.basename(xmlName).replace(".py","")+" import *"+"\n")
- for iDict,aDict in enumerate(allDicts):
- if "sim" in aDict[detectorTuple[iDict]].keys():
- simFile.write('\n'.join([ aLine for aLine in aDict[detectorTuple[iDict]]["sim"] ])+"\n")
- simFile.close()
-
- # create reco config
- recoFile.write(preamble)
- # always need sim
- recoFile.write("from Configuration.Geometry."+os.path.basename(simName).replace(".py","")+" import *"+"\n\n")
- for iDict,aDict in enumerate(allDicts):
- if "reco" in aDict[detectorTuple[iDict]].keys():
- recoFile.write("# "+aDict["name"]+"\n")
- recoFile.write('\n'.join([ aLine for aLine in aDict[detectorTuple[iDict]]["reco"] ])+"\n\n")
- recoFile.close()
-
- from Configuration.StandardSequences.GeometryConf import GeometryConf
- if not doTest: # todo: include these in unit test somehow
- # specify Era customizations
- # must be checked manually in:
- # Configuration/StandardSequences/python/Eras.py
- # Configuration/Eras/python/
- # Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py (workflow definitions)
- eraLine = ""
- eraLineItems = []
- for iDict,aDict in enumerate(allDicts):
- if "era" in aDict[detectorTuple[iDict]].keys():
- eraLineItems.append(aDict[detectorTuple[iDict]]["era"])
- eraLine += ", ".join([ eraLineItem for eraLineItem in eraLineItems ])
- print("The Era for this detector should contain:")
- print(eraLine)
-
- # specify GeometryConf
- if not 'Extended'+detectorVersion in GeometryConf.keys():
- print("Please add this line in Configuration/StandardSequences/python/GeometryConf.py:")
- print(" 'Extended"+detectorVersion+"' : 'Extended"+detectorVersion+",Extended"+detectorVersion+"Reco',")
+if __name__ == "__main__":
+ # create geometry generator object w/ 2021 content and run it
+ generator2021 = GeometryGenerator("generate2021Geometry.py",2021,"","",maxSections,allDicts,detectorVersionDict)
+ generator2021.run()
- errorList = []
- if doTest:
- # tests for Configuration/Geometry
- if not filecmp.cmp(simName,os.path.join(simrecoDir,simName)):
- errorList.append(simName+" differs");
- if not filecmp.cmp(recoName,os.path.join(simrecoDir,recoName)):
- errorList.append(recoName+" differs");
- # test for Configuration/StandardSequences
- if not 'Extended'+detectorVersion in GeometryConf.keys():
- errorList.append('Extended'+detectorVersion+" missing from GeometryConf")
- # test for Geometry/CMSCommonData
- if not filecmp.cmp(xmlName,os.path.join(xmlDir,xmlName)):
- errorList.append(xmlName+" differs");
- return errorList
-
-if __name__ == "__main__":
- # define options
- parser = OptionParser()
- for aDict in allDicts:
- parser.add_option("-"+aDict["abbrev"],"--"+aDict["name"],dest="v_"+aDict["name"],default=aDict["default"],help="version for "+aDict["name"]+" (default = %default)")
- parser.add_option("-V","--version",dest="detectorVersionManual",default=detectorVersionDefault,help="manual detector version number (default = %default)")
- parser.add_option("-D","--detector",dest="v_detector",default=0,help="version for whole detector, ignored if 0, overrides subdet versions otherwise (default = %default)")
- parser.add_option("-l","--list",dest="doList",default=False,action="store_true",help="list known detector versions and exit (default = %default)")
- parser.add_option("-t","--test",dest="doTest",default=False,action="store_true",help="enable unit test mode (default = %default)")
- (options, args) = parser.parse_args()
-
- # check options
- if options.doList and not options.doTest:
- pprint(sorted(detectorVersionDict.items(),key=operator.itemgetter(1)))
- sys.exit(0)
- elif options.doTest:
- # list of errors
- errorList = []
- # run all known possibilities
- for detectorTuple in detectorVersionDict:
- errorTmp = generateGeom(detectorTuple,options)
- errorList.extend(errorTmp)
- if len(errorList)>0:
- print('\n'.join([anError for anError in errorList]))
- sys.exit(1)
- else:
- sys.exit(0)
- else:
- detectorTuple = tuple([aDict["abbrev"]+str(getattr(options,"v_"+aDict["name"])) for aDict in allDicts])
- generateGeom(detectorTuple,options)
- sys.exit(0)
-
diff --git a/Configuration/Geometry/scripts/generate2026Geometry.py b/Configuration/Geometry/scripts/generate2026Geometry.py
index 8cec21e25e221..56fcdca08366f 100644
--- a/Configuration/Geometry/scripts/generate2026Geometry.py
+++ b/Configuration/Geometry/scripts/generate2026Geometry.py
@@ -1,180 +1,7 @@
-from __future__ import print_function
-from optparse import OptionParser
-import sys, os, operator
-from pprint import pprint
-import filecmp
-
from Configuration.Geometry.dict2026Geometry import *
+from Configuration.Geometry.generateGeometry import *
-# define global
-detectorVersionDefault = 999
-
-def generateGeom(detectorTuple, options):
- doTest = bool(options.doTest)
-
- detectorVersion = "D"+str(options.detectorVersionManual)
- # reverse dict search if overall D# specified
- if options.v_detector>0:
- detectorVersion = "D"+str(options.v_detector)
- if detectorVersion in detectorVersionDict.values():
- detectorTuple = detectorVersionDict.keys()[detectorVersionDict.values().index(detectorVersion)]
- else:
- print("Unknown detector "+detectorVersion)
- sys.exit(1)
- elif detectorTuple in detectorVersionDict.keys():
- detectorVersion = detectorVersionDict[detectorTuple]
- else:
- if not doTest: print("Detector "+str(detectorTuple)+" not found in dictionary, using "+("default" if options.detectorVersionManual==detectorVersionDefault else "provided")+" version number "+str(detectorVersion))
-
- # check for deprecation
- if detectorVersion in deprecatedDets:
- print("Error: "+detectorVersion+" is deprecated and cannot be used.")
- sys.exit(1)
- for subdet in detectorTuple:
- if subdet in deprecatedSubdets:
- print("Error: "+subdet+" is deprecated and cannot be used.")
- sys.exit(1)
-
- # create output files
- xmlName = "cmsExtendedGeometry2026"+detectorVersion+"XML_cfi.py"
- simName = "GeometryExtended2026"+detectorVersion+"_cff.py"
- recoName = "GeometryExtended2026"+detectorVersion+"Reco_cff.py"
-
- # check directories
- CMSSWBASE = os.getenv("CMSSW_BASE")
- CMSSWRELBASE = os.getenv("CMSSW_RELEASE_BASE")
- if CMSSWBASE is None: CMSSWBASE = ""
- xmlDir = os.path.join(CMSSWBASE,"src","Geometry","CMSCommonData","python")
- simrecoDir = os.path.join(CMSSWBASE,"src","Configuration","Geometry","python")
- if doTest:
- if not os.path.isdir(xmlDir):
- xmlDir = os.path.join(CMSSWRELBASE,"src","Geometry","CMSCommonData","python")
- else:
- mvCommands = ""
- if not os.path.isdir(xmlDir):
- mvCommands += "mv "+xmlName+" "+xmlDir+"/\n"
- else:
- xmlName = os.path.join(xmlDir,xmlName)
- if not os.path.isdir(simrecoDir):
- mvCommands += "mv "+simName+" "+simrecoDir+"/\n"
- mvCommands += "mv "+recoName+" "+simrecoDir+"/\n"
- else:
- simName = os.path.join(simrecoDir,simName)
- recoName = os.path.join(simrecoDir,recoName)
- if len(mvCommands)>0:
- print("Warning: some geometry packages not checked out.\nOnce they are available, please execute the following commands manually:\n"+mvCommands)
-
- # open files
- xmlFile = open(xmlName,'w')
- simFile = open(simName,'w')
- recoFile = open(recoName,'w')
-
- # common preamble
- preamble = "import FWCore.ParameterSet.Config as cms"+"\n"+"\n"
- preamble += "# This config was generated automatically using generate2026Geometry.py"+"\n"
- preamble += "# If you notice a mistake, please update the generating script, not just this config"+"\n"+"\n"
-
- # create XML config
- xmlFile.write(preamble)
- # extra preamble
- xmlFile.write("XMLIdealGeometryESSource = cms.ESSource(\"XMLIdealGeometryESSource\","+"\n")
- xmlFile.write(" geomXMLFiles = cms.vstring("+"\n")
- for section in range(1,maxsections+1):
- # midamble
- if section==2:
- xmlFile.write(" )+"+"\n"+" cms.vstring("+"\n")
- for iDict,aDict in enumerate(allDicts):
- if section in aDict[detectorTuple[iDict]].keys():
- xmlFile.write('\n'.join([ " '"+aLine+"'," for aLine in aDict[detectorTuple[iDict]][section] ])+"\n")
- # postamble
- xmlFile.write(" ),"+"\n"+" rootNodeName = cms.string('cms:OCMS')"+"\n"+")"+"\n")
- xmlFile.close()
-
- # create sim config
- simFile.write(preamble)
- # always need XML
- simFile.write("from Geometry.CMSCommonData."+os.path.basename(xmlName).replace(".py","")+" import *"+"\n")
- for iDict,aDict in enumerate(allDicts):
- if "sim" in aDict[detectorTuple[iDict]].keys():
- simFile.write('\n'.join([ aLine for aLine in aDict[detectorTuple[iDict]]["sim"] ])+"\n")
- simFile.close()
-
- # create reco config
- recoFile.write(preamble)
- # always need sim
- recoFile.write("from Configuration.Geometry."+os.path.basename(simName).replace(".py","")+" import *"+"\n\n")
- for iDict,aDict in enumerate(allDicts):
- if "reco" in aDict[detectorTuple[iDict]].keys():
- recoFile.write("# "+aDict["name"]+"\n")
- recoFile.write('\n'.join([ aLine for aLine in aDict[detectorTuple[iDict]]["reco"] ])+"\n\n")
- recoFile.close()
-
- from Configuration.StandardSequences.GeometryConf import GeometryConf
- if not doTest: # todo: include these in unit test somehow
- # specify Era customizations
- # must be checked manually in:
- # Configuration/StandardSequences/python/Eras.py
- # Configuration/Eras/python/
- # Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py (workflow definitions)
- eraLine = ""
- eraLineItems = []
- for iDict,aDict in enumerate(allDicts):
- if "era" in aDict[detectorTuple[iDict]].keys():
- eraLineItems.append(aDict[detectorTuple[iDict]]["era"])
- eraLine += ", ".join([ eraLineItem for eraLineItem in eraLineItems ])
- print("The Era for this detector should contain:")
- print(eraLine)
-
- # specify GeometryConf
- if not 'Extended2026'+detectorVersion in GeometryConf.keys():
- print("Please add this line in Configuration/StandardSequences/python/GeometryConf.py:")
- print(" 'Extended2026"+detectorVersion+"' : 'Extended2026"+detectorVersion+",Extended2026"+detectorVersion+"Reco',")
-
- errorList = []
-
- if doTest:
- # tests for Configuration/Geometry
- if not filecmp.cmp(simName,os.path.join(simrecoDir,simName)):
- errorList.append(simName+" differs");
- if not filecmp.cmp(recoName,os.path.join(simrecoDir,recoName)):
- errorList.append(recoName+" differs");
- # test for Configuration/StandardSequences
- if not 'Extended2026'+detectorVersion in GeometryConf.keys():
- errorList.append('Extended2026'+detectorVersion+" missing from GeometryConf")
- # test for Geometry/CMSCommonData
- if not filecmp.cmp(xmlName,os.path.join(xmlDir,xmlName)):
- errorList.append(xmlName+" differs");
- return errorList
-
if __name__ == "__main__":
- # define options
- parser = OptionParser()
- for aDict in allDicts:
- parser.add_option("-"+aDict["abbrev"],"--"+aDict["name"],dest="v_"+aDict["name"],default=aDict["default"],help="version for "+aDict["name"]+" (default = %default)")
- parser.add_option("-V","--version",dest="detectorVersionManual",default=detectorVersionDefault,help="manual detector version number (default = %default)")
- parser.add_option("-D","--detector",dest="v_detector",default=0,help="version for whole detector, ignored if 0, overrides subdet versions otherwise (default = %default)")
- parser.add_option("-l","--list",dest="doList",default=False,action="store_true",help="list known detector versions and exit (default = %default)")
- parser.add_option("-t","--test",dest="doTest",default=False,action="store_true",help="enable unit test mode (default = %default)")
- (options, args) = parser.parse_args()
-
- # check options
- if options.doList and not options.doTest:
- pprint(sorted(detectorVersionDict.items(),key=operator.itemgetter(1)))
- sys.exit(0)
- elif options.doTest:
- # list of errors
- errorList = []
- # run all known possibilities
- for detectorTuple in detectorVersionDict:
- errorTmp = generateGeom(detectorTuple,options)
- errorList.extend(errorTmp)
- if len(errorList)>0:
- print('\n'.join([anError for anError in errorList]))
- sys.exit(1)
- else:
- sys.exit(0)
- else:
- detectorTuple = tuple([aDict["abbrev"]+str(getattr(options,"v_"+aDict["name"])) for aDict in allDicts])
- generateGeom(detectorTuple,options)
- sys.exit(0)
-
+ # create geometry generator object w/ 2026 content and run it
+ generator2026 = GeometryGenerator("generate2026Geometry.py",999,"D","2026",maxSections,allDicts,detectorVersionDict,deprecatedDets,deprecatedSubdets)
+ generator2026.run()
diff --git a/Configuration/Geometry/test/BuildFile.xml b/Configuration/Geometry/test/BuildFile.xml
index 5da56db040113..23d2cc2bad224 100644
--- a/Configuration/Geometry/test/BuildFile.xml
+++ b/Configuration/Geometry/test/BuildFile.xml
@@ -1,4 +1,4 @@
-
-
-
-
+
+
+
+
diff --git a/Configuration/Geometry/test/TestDriver.cpp b/Configuration/Geometry/test/TestDriver.cpp
deleted file mode 100644
index b2991bd18ae57..0000000000000
--- a/Configuration/Geometry/test/TestDriver.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "FWCore/Utilities/interface/TestHelper.h"
-
-RUNTEST()
diff --git a/Configuration/Geometry/test/runtests.sh b/Configuration/Geometry/test/runtests.sh
deleted file mode 100755
index 5a9a11d276af4..0000000000000
--- a/Configuration/Geometry/test/runtests.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-python $CMSSW_BASE/src/Configuration/Geometry/scripts/generate2026Geometry.py -t
-python $CMSSW_BASE/src/Configuration/Geometry/scripts/generate2021Geometry.py -t
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D35.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D35.xml
index 9c80ced7c6f5e..52eaa3881d51f 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D35.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D35.xml
@@ -4,122 +4,121 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D41.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D41.xml
index ff2376cc689b8..d03e5e816b5c2 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D41.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D41.xml
@@ -4,121 +4,120 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D43.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D43.xml
index 443b066c30e93..d27f22760dd11 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D43.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D43.xml
@@ -4,122 +4,121 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D44.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D44.xml
new file mode 100644
index 0000000000000..30770072d2449
--- /dev/null
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D44.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D45.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D45.xml
index c3dedc04f74a0..2a60418e6fc84 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D45.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D45.xml
@@ -4,121 +4,120 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D46.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D46.xml
index 082fc61ff4674..66d5d31a66a34 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D46.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D46.xml
@@ -4,121 +4,120 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D47.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D47.xml
index da8229e30f03c..db82e96da8bb6 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D47.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D47.xml
@@ -4,128 +4,127 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D48.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D48.xml
index 4164bcfa3f30b..1a0e3701d418f 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D48.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D48.xml
@@ -4,121 +4,120 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D49.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D49.xml
index 36841cfe944bb..53d9c1fd76da0 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D49.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D49.xml
@@ -4,123 +4,122 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D50.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D50.xml
index 8d3311865262b..8a724dae0e8ce 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D50.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D50.xml
@@ -4,123 +4,122 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D51.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D51.xml
index 7f2c63befe4be..1d220cd6572e0 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D51.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D51.xml
@@ -4,123 +4,122 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D53.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D53.xml
new file mode 100644
index 0000000000000..bf11ed9ed8639
--- /dev/null
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D53.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D54.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D54.xml
index ad86d19727948..b688796327772 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D54.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D54.xml
@@ -4,123 +4,122 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D55.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D55.xml
index 49d72c7f969c9..87ccf291c63a7 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D55.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D55.xml
@@ -4,123 +4,122 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D56.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D56.xml
index cbcf818efb52b..40a37cfbf7c33 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D56.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D56.xml
@@ -4,123 +4,122 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D57.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D57.xml
index 8cad963dcb2eb..9dc681ecd127e 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D57.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D57.xml
@@ -4,123 +4,121 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D58.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D58.xml
index 4f3e569e2edaa..c0b39d3f6ef83 100644
--- a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D58.xml
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D58.xml
@@ -4,130 +4,128 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D59.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D59.xml
new file mode 100644
index 0000000000000..39cf53d894750
--- /dev/null
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D59.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+