1 from __future__
import print_function
2 from argparse
import ArgumentParser, ArgumentDefaultsHelpFormatter, RawTextHelpFormatter, RawDescriptionHelpFormatter
3 import sys, os, operator
4 from pprint
import pprint
10 ArgumentDefaultsHelpFormatter,
12 RawDescriptionHelpFormatter):
13 """HelpFormatter that adds default values AND doesn't do line-wrapping""" 17 def __init__(self, scriptName, detectorVersionDefault, detectorPrefix, detectorYear, maxSections, allDicts, detectorVersionDict, deprecatedDets = None, deprecatedSubdets = None, detectorVersionType = int):
39 print(
"Unknown detector "+detectorVersion)
44 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))
48 print(
"Error: "+detectorVersion+
" is deprecated and cannot be used.")
51 for subdet
in detectorTuple:
53 print(
"Error: "+subdet+
" is deprecated and cannot be used.")
57 xmlName =
"cmsExtendedGeometry"+self.
detectorYear+detectorVersion+
"XML_cfi.py" 58 xmlDD4hepName =
"cmsExtendedGeometry"+self.
detectorYear+detectorVersion+
".xml" 59 simName =
"GeometryExtended"+self.
detectorYear+detectorVersion+
"_cff.py" 60 simDD4hepName =
"GeometryDD4hepExtended"+self.
detectorYear+detectorVersion+
"_cff.py" 61 recoName =
"GeometryExtended"+self.
detectorYear+detectorVersion+
"Reco_cff.py" 62 recoDD4hepName =
"GeometryDD4hepExtended"+self.
detectorYear+detectorVersion+
"Reco_cff.py" 65 CMSSWBASE = os.getenv(
"CMSSW_BASE")
66 CMSSWRELBASE = os.getenv(
"CMSSW_RELEASE_BASE")
67 if CMSSWBASE
is None: CMSSWBASE =
"" 68 xmlDir = os.path.join(CMSSWBASE,
"src",
"Geometry",
"CMSCommonData",
"python")
69 xmlDD4hepDir = os.path.join(CMSSWBASE,
"src",
"Geometry",
"CMSCommonData",
"data",
"dd4hep")
70 simrecoDir = os.path.join(CMSSWBASE,
"src",
"Configuration",
"Geometry",
"python")
71 simrecoDD4hepDir = os.path.join(CMSSWBASE,
"src",
"Configuration",
"Geometry",
"python")
73 if not os.path.isdir(xmlDir):
74 xmlDir = os.path.join(CMSSWRELBASE,
"src",
"Geometry",
"CMSCommonData",
"python")
75 xmlDD4hepDir = os.path.join(CMSSWRELBASE,
"src",
"Geometry",
"CMSCommonData",
"data",
"dd4hep")
78 if not os.path.isdir(xmlDir):
79 mvCommands +=
"mv "+xmlName+
" "+xmlDir+
"/\n" 81 xmlName = os.path.join(xmlDir,xmlName)
82 if not os.path.isdir(xmlDD4hepDir):
83 mvCommands +=
"mv "+xmlDD4hepName+
" "+xmlDD4hepDir+
"/\n" 85 xmlDD4hepName = os.path.join(xmlDD4hepDir,xmlDD4hepName)
86 if not os.path.isdir(simrecoDir):
87 mvCommands +=
"mv "+simName+
" "+simrecoDir+
"/\n" 88 mvCommands +=
"mv "+recoName+
" "+simrecoDir+
"/\n" 90 simName = os.path.join(simrecoDir,simName)
91 recoName = os.path.join(simrecoDir,recoName)
92 if not os.path.isdir(simrecoDD4hepDir):
93 mvCommands +=
"mv "+simDD4hepName+
" "+simrecoDD4hepDir+
"/\n" 94 mvCommands +=
"mv "+recoDD4hepName+
" "+simrecoDD4hepDir+
"/\n" 96 simDD4hepName = os.path.join(simrecoDD4hepDir,simDD4hepName)
97 recoDD4hepName = os.path.join(simrecoDD4hepDir,recoDD4hepName)
99 print(
"Warning: some geometry packages not checked out.\nOnce they are available, please execute the following commands manually:\n"+mvCommands)
102 xmlFile = open(xmlName,
'w')
103 xmlDD4hepFile = open(xmlDD4hepName,
'w')
104 simFile = open(simName,
'w')
105 simDD4hepFile = open(simDD4hepName,
'w')
106 recoFile = open(recoName,
'w')
107 recoDD4hepFile = open(recoDD4hepName,
'w')
110 preamble =
"import FWCore.ParameterSet.Config as cms"+
"\n"+
"\n" 111 preamble +=
"# This config was generated automatically using "+self.
scriptName+
"\n" 112 preamble +=
"# If you notice a mistake, please update the generating script, not just this config"+
"\n"+
"\n" 115 xmlFile.write(preamble)
117 xmlFile.write(
"XMLIdealGeometryESSource = cms.ESSource(\"XMLIdealGeometryESSource\","+
"\n")
118 xmlFile.write(
" geomXMLFiles = cms.vstring("+
"\n")
122 xmlFile.write(
" )+"+
"\n"+
" cms.vstring("+
"\n")
123 for iDict,aDict
in enumerate(self.
allDicts):
124 if section
in aDict[detectorTuple[iDict]].
keys():
125 xmlFile.write(
'\n'.
join([
" '"+aLine+
"'," for aLine
in aDict[detectorTuple[iDict]][section] ])+
"\n")
127 xmlFile.write(
" ),"+
"\n"+
" rootNodeName = cms.string('cms:OCMS')"+
"\n"+
")"+
"\n")
131 xmlDD4hepFile.write(
"<?xml version=\"1.0\"?>\n"+
133 " <open_geometry/>\n"+
134 " <close_geometry/>\n"+
136 " <IncludeSection>\n")
139 for iDict,aDict
in enumerate(self.
allDicts):
140 if section
in aDict[detectorTuple[iDict]].
keys():
141 xmlDD4hepFile.write(
'\n'.
join([
" <Include ref='"+aLine+
"'/>" for aLine
in aDict[detectorTuple[iDict]][section] ])+
"\n")
143 xmlDD4hepFile.write(
" </IncludeSection>\n"+
144 "</DDDefinition>"+
"\n")
145 xmlDD4hepFile.close()
148 simFile.write(preamble)
150 simFile.write(
"from Geometry.CMSCommonData."+os.path.basename(xmlName).
replace(
".py",
"")+
" import *"+
"\n")
151 for iDict,aDict
in enumerate(self.
allDicts):
152 if "sim" in aDict[detectorTuple[iDict]].
keys():
153 simFile.write(
'\n'.
join([ aLine
for aLine
in aDict[detectorTuple[iDict]][
"sim"] ])+
"\n")
157 simDD4hepFile.write(preamble)
159 simDD4hepFile.write(
"from Configuration.Geometry.GeometryDD4hep_cff"+
" import *"+
"\n")
160 simDD4hepFile.write(
"DDDetectorESProducer.confGeomXMLFiles = cms.FileInPath(\"Geometry/CMSCommonData/data/dd4hep/"+os.path.basename(xmlDD4hepName)+
"\")\n\n")
161 for iDict,aDict
in enumerate(self.
allDicts):
162 if "sim" in aDict[detectorTuple[iDict]].
keys():
163 simDD4hepFile.write(
'\n'.
join([ aLine
for aLine
in aDict[detectorTuple[iDict]][
"sim"] ])+
"\n")
164 simDD4hepFile.close()
167 recoFile.write(preamble)
169 recoFile.write(
"from Configuration.Geometry."+os.path.basename(simName).
replace(
".py",
"")+
" import *"+
"\n\n")
170 for iDict,aDict
in enumerate(self.
allDicts):
171 if "reco" in aDict[detectorTuple[iDict]].
keys():
172 recoFile.write(
"# "+aDict[
"name"]+
"\n")
173 recoFile.write(
'\n'.
join([ aLine
for aLine
in aDict[detectorTuple[iDict]][
"reco"] ])+
"\n\n")
177 recoDD4hepFile.write(preamble)
179 recoDD4hepFile.write(
"from Configuration.Geometry."+os.path.basename(simDD4hepName).
replace(
".py",
"")+
" import *"+
"\n\n")
180 for iDict,aDict
in enumerate(self.
allDicts):
181 if "reco" in aDict[detectorTuple[iDict]].
keys():
182 recoDD4hepFile.write(
"# "+aDict[
"name"]+
"\n")
183 recoDD4hepFile.write(
'\n'.
join([ aLine
for aLine
in aDict[detectorTuple[iDict]][
"reco"] ])+
"\n\n")
184 recoDD4hepFile.close()
186 from Configuration.StandardSequences.GeometryConf
import GeometryConf
195 for iDict,aDict
in enumerate(self.
allDicts):
196 if "era" in aDict[detectorTuple[iDict]].
keys():
197 eraLineItems.append(aDict[detectorTuple[iDict]][
"era"])
198 eraLine +=
", ".
join([ eraLineItem
for eraLineItem
in eraLineItems ])
199 print(
"The Era for this detector should contain:")
203 if not 'Extended'+self.
detectorYear+detectorVersion
in GeometryConf.keys():
204 print(
"Please add this line in Configuration/StandardSequences/python/GeometryConf.py:")
213 simFile = os.path.join(simrecoDir,simName)
214 if not os.path.isfile(simFile):
215 errorList.append(simName+
" missing")
216 elif not filecmp.cmp(simName,simFile):
217 errorList.append(simName+
" differs")
218 simDD4hepFile = os.path.join(simrecoDD4hepDir,simDD4hepName)
219 if not os.path.isfile(simDD4hepFile):
220 errorList.append(simDD4hepName+
" missing")
221 elif not filecmp.cmp(simDD4hepName,simDD4hepFile):
222 errorList.append(simDD4hepName+
" differs")
223 recoFile = os.path.join(simrecoDir,recoName)
224 if not os.path.isfile(recoFile):
225 errorList.append(recoName+
" missing")
226 elif not filecmp.cmp(recoName,recoFile):
227 errorList.append(recoName+
" differs")
228 recoDD4hepFile = os.path.join(simrecoDD4hepDir,recoDD4hepName)
229 if not os.path.isfile(recoDD4hepFile):
230 errorList.append(recoDD4hepName+
" missing")
231 elif not filecmp.cmp(recoDD4hepName,recoDD4hepFile):
232 errorList.append(recoDD4hepName+
" differs")
234 if not 'Extended'+self.
detectorYear+detectorVersion
in GeometryConf.keys():
235 errorList.append(
'Extended'+self.
detectorYear+detectorVersion+
" missing from GeometryConf")
237 xmlFile = os.path.join(xmlDir,xmlName)
238 if not os.path.isfile(xmlFile):
239 errorList.append(xmlName+
" missing")
240 elif not filecmp.cmp(xmlName,xmlFile):
241 errorList.append(xmlName+
" differs")
243 xmlDD4hepFile = os.path.join(xmlDD4hepDir,xmlDD4hepName)
244 if not os.path.exists(xmlDD4hepFile):
245 errorList.append(xmlDD4hepName+
" differs")
246 elif not filecmp.cmp(xmlDD4hepName,xmlDD4hepFile):
247 errorList.append(xmlDD4hepName+
" differs")
252 parser = ArgumentParser(formatter_class=ArgumentDefaultsRawHelpFormatter)
254 parser.add_argument(
"-"+aDict[
"abbrev"],
"--"+aDict[
"name"], dest=
"v_"+aDict[
"name"], default=aDict[
"default"], type=int, help=
"version for "+aDict[
"name"])
255 parser.add_argument(
"-V",
"--version", dest=
"detectorVersionManual", default=self.
detectorVersionDefault, type=int, help=
"manual detector version number")
256 parser.add_argument(
"-D",
"--detector", dest=
"v_detector", default=self.
detectorVersionNull, type=self.
detectorVersionType, help=
"version for whole detector, ignored if 0, overrides subdet versions otherwise")
257 parser.add_argument(
"-l",
"--list", dest=
"doList", default=
False, action=
"store_true", help=
"list known detector versions and exit")
258 parser.add_argument(
"-t",
"--test", dest=
"doTest", default=
False, action=
"store_true", help=
"enable unit test mode")
259 args = parser.parse_args()
262 if args.doList
and not args.doTest:
271 errorList.extend(errorTmp)
273 print(
'\n'.
join([anError
for anError
in errorList]))
278 detectorTuple =
tuple([aDict[
"abbrev"]+
str(getattr(args,
"v_"+aDict[
"name"]))
for aDict
in self.
allDicts])
def replace(string, replacements)
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
static std::string join(char **cmd)
def __init__(self, scriptName, detectorVersionDefault, detectorPrefix, detectorYear, maxSections, allDicts, detectorVersionDict, deprecatedDets=None, deprecatedSubdets=None, detectorVersionType=int)
def generateGeom(self, detectorTuple, args)