CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
mps_alisetup.SetupAlignment Class Reference
Inheritance diagram for mps_alisetup.SetupAlignment:

Public Member Functions

def __init__ (self, argv)
 
def setup (self)
 

Private Member Functions

def _check_iov_definition (self)
 
def _construct_paths (self)
 
def _create_additional_pede_jobs (self)
 
def _create_config (self)
 
def _create_input_db (self)
 
def _create_mass_storage_directory (self)
 
def _create_mille_jobs (self)
 
def _create_pede_jobs (self)
 
def _create_tracker_tree (self)
 
def _create_weight_configs (self)
 
def _fetch_dataset_directory (self)
 
def _fetch_datasets (self)
 
def _fetch_defaults (self)
 
def _fetch_essentials (self)
 
def _fetch_external_datasets (self)
 
def _fetch_pede_settings (self)
 
def _fill_general_options (self)
 
def _handle_process_call (self, command, verbose=False)
 

Private Attributes

 _args
 
 _argv
 
 _cms_process
 
 _common_weights
 
 _config
 
 _config_template
 
 _datasets
 
 _external_datasets
 
 _first_pede_config
 
 _first_run
 
 _general_options
 
 _global_tag
 
 _mille_script
 
 _mps_dir_name
 
 _mss_dir
 
 _override_gt
 
 _pede_script
 
 _reco_geometry
 
 _tracker_tree_path
 
 _weight_configs
 
 _weight_dict
 

Detailed Description

Class encapsulating the alignment campaign setup procedure.

Definition at line 40 of file mps_alisetup.py.

Constructor & Destructor Documentation

◆ __init__()

def mps_alisetup.SetupAlignment.__init__ (   self,
  argv 
)
Constructor

Arguments:
- `argv`: command line arguments

Definition at line 43 of file mps_alisetup.py.

43  def __init__(self, argv):
44  """Constructor
45 
46  Arguments:
47  - `argv`: command line arguments
48  """
49 
50  self._argv = argv # raw command line arguments
51  self._args = None # parsed command line arguments
52  self._config = None # ConfigParser object
53  self._mss_dir = None # mass storage directory
54  self._datasets = collections.OrderedDict() # final dataset configs
55  self._first_run = None # first run for start geometry
56  self._cms_process = None # cms.Process extracted from CMSSW config
57  self._override_gt = None # snippet to append to config
58  self._pede_script = None # path to pede batch script template
59  self._weight_dict = collections.OrderedDict() # dictionary with dataset weights
60  self._mille_script = None # path to mille batch script template
61  self._mps_dir_name = None # MP campaign name (mp<ID>)
62  self._common_weights = {} # dictionary with dataset weights from [weights] section
63  self._weight_configs = [] # list with combinations of dataset weights
64  self._general_options = {} # general options extracted from ini file
65  self._external_datasets = collections.OrderedDict() # external dataset configs
66  self._first_pede_config = True # does a pede job exist already?
67 
68  self._create_config()
69  self._fill_general_options()
70  self._fetch_datasets()
71  self._construct_paths()
72  self._create_mass_storage_directory()
73  self._fetch_pede_settings()
74  self._create_weight_configs()
75 
76 
def __init__(self, dataset, job_number, job_id, job_name, isDA, isMC, applyBOWS, applyEXTRACOND, extraconditions, runboundary, lumilist, intlumi, maxevents, gt, allFromGT, alignmentDB, alignmentTAG, apeDB, apeTAG, bowDB, bowTAG, vertextype, tracktype, refittertype, ttrhtype, applyruncontrol, ptcut, CMSSW_dir, the_dir)

Member Function Documentation

◆ _check_iov_definition()

def mps_alisetup.SetupAlignment._check_iov_definition (   self)
private
Check consistency of input alignment payloads and IOV definition.
Returns a dictionary with the information needed to override possibly
problematic input taken from the global tag.

Definition at line 539 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._cms_process, mps_alisetup.SetupAlignment._first_run, createfilelist.int, print(), and str.

Referenced by mps_alisetup.SetupAlignment._create_input_db().

539  def _check_iov_definition(self):
540  """
541  Check consistency of input alignment payloads and IOV definition.
542  Returns a dictionary with the information needed to override possibly
543  problematic input taken from the global tag.
544  """
545 
546  print("Checking consistency of IOV definition...")
547  iovs = mps_tools.make_unique_runranges(self._cms_process.AlignmentProducer)
548 
549  inputs = {
550  "TrackerAlignmentRcd": None,
551  "TrackerSurfaceDeformationRcd": None,
552  "TrackerAlignmentErrorExtendedRcd": None,
553  }
554 
555  for condition in self._cms_process.GlobalTag.toGet.value():
556  if condition.record.value() in inputs:
557  inputs[condition.record.value()] = {
558  "tag": condition.tag.value(),
559  "connect": ("pro"
560  if not condition.hasParameter("connect")
561  else condition.connect.value())
562  }
563 
564  inputs_from_gt = [record for record in inputs if inputs[record] is None]
565  inputs.update(
566  mps_tools.get_tags(self._cms_process.GlobalTag.globaltag.value(),
567  inputs_from_gt))
568 
569  if int(self._first_run) != iovs[0]: # simple consistency check
570  if iovs[0] == 1 and len(iovs) == 1:
571  print("Single IOV output detected in configuration and", end=' ')
572  print("'FirstRunForStartGeometry' is not 1.")
573  print("Creating single IOV output from input conditions in run", end=' ')
574  print(self._first_run+".")
575  for inp in inputs: inputs[inp]["problematic"] = True
576  else:
577  print("Value of 'FirstRunForStartGeometry' has to match first", end=' ')
578  print("defined output IOV:", end=' ')
579  print(self._first_run, "!=", iovs[0])
580  sys.exit(1)
581 
582  for inp in inputs.values():
583  inp["iovs"] = mps_tools.get_iovs(inp["connect"], inp["tag"])
584 
585  # check consistency of input with output
586  problematic_gt_inputs = {}
587  input_indices = {key: len(value["iovs"]) -1
588  for key,value in inputs.items()}
589  for iov in reversed(iovs):
590  for inp in inputs:
591  if inputs[inp].pop("problematic", False):
592  problematic_gt_inputs[inp] = inputs[inp]
593  if inp in problematic_gt_inputs: continue
594  if input_indices[inp] < 0:
595  print("First output IOV boundary at run", iov, end=' ')
596  print("is before the first input IOV boundary at", end=' ')
597  print(inputs[inp]["iovs"][0], "for '"+inp+"'.")
598  print("Please check your run range selection.")
599  sys.exit(1)
600  input_iov = inputs[inp]["iovs"][input_indices[inp]]
601  if iov < input_iov:
602  if inp in inputs_from_gt:
603  problematic_gt_inputs[inp] = inputs[inp]
604  print("Found problematic input taken from global tag.")
605  print("Input IOV boundary at run",input_iov, end=' ')
606  print("for '"+inp+"' is within output IOV starting", end=' ')
607  print("with run", str(iov)+".")
608  print("Deriving an alignment with coarse IOV", end=' ')
609  print("granularity starting from finer granularity", end=' ')
610  print("leads to wrong results.")
611  print("A single IOV input using the IOV of", end=' ')
612  print("'FirstRunForStartGeometry' ("+self._first_run+")", end=' ')
613  print("is automatically created and used.")
614  continue
615  print("Found input IOV boundary at run",input_iov, end=' ')
616  print("for '"+inp+"' which is within output IOV starting", end=' ')
617  print("with run", str(iov)+".")
618  print("Deriving an alignment with coarse IOV granularity", end=' ')
619  print("starting from finer granularity leads to wrong", end=' ')
620  print("results.")
621  print("Please check your run range selection.")
622  sys.exit(1)
623  elif iov == input_iov:
624  input_indices[inp] -= 1
625 
626  # check consistency of 'TrackerAlignmentRcd' with other inputs
627  input_indices = {key: len(value["iovs"]) -1
628  for key,value in inputs.items()
629  if (key != "TrackerAlignmentRcd")
630  and (inp not in problematic_gt_inputs)}
631  for iov in reversed(inputs["TrackerAlignmentRcd"]["iovs"]):
632  for inp in input_indices:
633  input_iov = inputs[inp]["iovs"][input_indices[inp]]
634  if iov < input_iov:
635  print("Found input IOV boundary at run",input_iov, end=' ')
636  print("for '"+inp+"' which is within 'TrackerAlignmentRcd'", end=' ')
637  print("IOV starting with run", str(iov)+".")
638  print("Deriving an alignment with inconsistent IOV boundaries", end=' ')
639  print("leads to wrong results.")
640  print("Please check your input IOVs.")
641  sys.exit(1)
642  elif iov == input_iov:
643  input_indices[inp] -= 1
644 
645  print(" -> IOV consistency check successful.")
646  print("="*75)
647 
648  return problematic_gt_inputs
649 
650 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
#define str(s)

◆ _construct_paths()

def mps_alisetup.SetupAlignment._construct_paths (   self)
private
Determine directory paths and create the ones that are needed.

Definition at line 123 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._mille_script, mps_alisetup.SetupAlignment._mps_dir_name, mps_alisetup.SetupAlignment._pede_script, helper.checked_out_MPS(), and print().

123  def _construct_paths(self):
124  """Determine directory paths and create the ones that are needed."""
125 
126  mpsTemplates = os.path.join("src", "Alignment",
127  "MillePedeAlignmentAlgorithm", "templates")
128  if checked_out_MPS()[0]:
129  mpsTemplates = os.path.join(os.environ["CMSSW_BASE"], mpsTemplates)
130  else:
131  mpsTemplates = os.path.join(os.environ["CMSSW_RELEASE_BASE"], mpsTemplates)
132  self._mille_script = os.path.join(mpsTemplates, "mps_runMille_template.sh")
133  self._pede_script = os.path.join(mpsTemplates, "mps_runPede_rfcp_template.sh")
134 
135  # get working directory name
136  currentDir = os.getcwd()
137  match = re.search(re.compile('mpproduction\/mp(.+?)$', re.M|re.I),currentDir)
138  if match:
139  self._mps_dir_name = 'mp'+match.group(1)
140  else:
141  print("Current location does not seem to be a MillePede campaign directory:", end=' ')
142  print(currentDir)
143  sys.exit(1)
144 
145 
def checked_out_MPS()
Definition: helper.py:5
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

◆ _create_additional_pede_jobs()

def mps_alisetup.SetupAlignment._create_additional_pede_jobs (   self)
private
Create pede jobs in addition to already existing ones. Return GT
override snippet.

Definition at line 444 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._config_template, mps_alisetup.SetupAlignment._create_pede_jobs(), mps_alisetup.SetupAlignment._datasets, tkal_create_file_lists.FileListCreator._datasets, mps_alisetup.SetupAlignment._first_pede_config, mps_alisetup.SetupAlignment._first_run, mps_alisetup.SetupAlignment._global_tag, mps_alisetup.SetupAlignment._reco_geometry, GetRecoTauVFromDQM_MC_cff.next, print(), and contentValuesCheck.values.

Referenced by mps_alisetup.SetupAlignment.setup().

444  def _create_additional_pede_jobs(self):
445  """
446  Create pede jobs in addition to already existing ones. Return GT
447  override snippet.
448  """
449 
450  # do some basic checks
451  if not os.path.isdir("jobData"):
452  print("No jobData-folder found.", end=' ')
453  print("Properly set up the alignment before using the -w option.")
454  sys.exit(1)
455  if not os.path.exists("mps.db"):
456  print("No mps.db found.", end=' ')
457  print("Properly set up the alignment before using the -w option.")
458  sys.exit(1)
459 
460  firstDataset = next(iter(self._datasets.values()))
461  config_template = firstDataset["configTemplate"]
462  collection = firstDataset["collection"]
463 
464  try:
465  with open(config_template,"r") as f: tmpFile = f.read()
466  except IOError:
467  print("The config-template '"+config_template+"' cannot be found.")
468  sys.exit(1)
469 
470  tmpFile = re.sub('setupGlobaltag\s*\=\s*[\"\'](.*?)[\"\']',
471  'setupGlobaltag = \"'+self._global_tag+'\"',
472  tmpFile)
473  tmpFile = re.sub('setupRecoGeometry\s*\=\s*[\"\'](.*?)[\"\']',
474  'setupRecoGeometry = \"'+self._reco_geometry+'\"',
475  tmpFile)
476  tmpFile = re.sub('setupCollection\s*\=\s*[\"\'](.*?)[\"\']',
477  'setupCollection = \"'+collection+'\"',
478  tmpFile)
479  tmpFile = re.sub(re.compile("setupRunStartGeometry\s*\=\s*.*$", re.M),
480  "setupRunStartGeometry = "+self._first_run,
481  tmpFile)
482  self._config_template = tmpFile
483 
484  # first pede job exists already in this mode:
485  self._first_pede_config = False
486  self._create_pede_jobs()
487 
488 
489 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

◆ _create_config()

def mps_alisetup.SetupAlignment._create_config (   self)
private
Create ConfigParser object from command line arguments.

Definition at line 96 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._args, tkal_create_file_lists.FileListCreator._args, mps_alisetup.SetupAlignment._argv, mps_alisetup.SetupAlignment._config, and SiPixelLorentzAngle_cfi.read.

96  def _create_config(self):
97  """Create ConfigParser object from command line arguments."""
98 
99  helpEpilog ="""Builds the config-templates from a universal
100  config-template for each dataset specified in .ini-file that is passed
101  to this script. Then calls mps_setup.py for all datasets."""
102  parser = argparse.ArgumentParser(
103  description = ("Setup the alignment as configured in the "
104  "alignment_config file."),
105  epilog = helpEpilog)
106  parser.add_argument("-v", "--verbose", action="store_true",
107  help="display detailed output of mps_setup")
108  parser.add_argument("-w", "--weight", action="store_true",
109  help=("creates additional merge job(s) with "
110  "(possibly new) weights from .ini-config"))
111  parser.add_argument("alignmentConfig",
112  help=("name of the .ini config file that specifies "
113  "the datasets to be used"))
114 
115  self._args = parser.parse_args(self._argv)
116  self._config = ConfigParser.ConfigParser()
117  self._config.optionxform = str # default would give lowercase options
118  # -> not wanted
119  self._config.read(self._args.alignmentConfig)
120  self._config.config_path = self._args.alignmentConfig
121 
122 

◆ _create_input_db()

def mps_alisetup.SetupAlignment._create_input_db (   self)
private
Create sqlite file with single-IOV tags and use it to override the
GT. If the GT is already customized by the user, the customization has
higher priority. Creates a snippet to be appended to the configuration
file.

Definition at line 509 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._check_iov_definition(), mps_alisetup.SetupAlignment._first_run, mps_alisetup.SetupAlignment._override_gt, createfilelist.int, and print().

Referenced by mps_alisetup.SetupAlignment._create_pede_jobs().

509  def _create_input_db(self):
510  """
511  Create sqlite file with single-IOV tags and use it to override the
512  GT. If the GT is already customized by the user, the customization has
513  higher priority. Creates a snippet to be appended to the configuration
514  file.
515  """
516 
517  run_number = int(self._first_run)
518  if not run_number > 0:
519  print("'FirstRunForStartGeometry' must be positive, but is", run_number)
520  sys.exit(1)
521 
522  input_db_name = os.path.abspath("alignment_input.db")
523  tags = mps_tools.create_single_iov_db(self._check_iov_definition(),
524  run_number, input_db_name)
525 
526  self._override_gt = ""
527  for record,tag in tags.items():
528  if self._override_gt == "":
529  self._override_gt \
530  += ("\nimport "
531  "Alignment.MillePedeAlignmentAlgorithm.alignmentsetup."
532  "SetCondition as tagwriter\n")
533  self._override_gt += ("\ntagwriter.setCondition(process,\n"
534  " connect = \""+tag["connect"]+"\",\n"
535  " record = \""+record+"\",\n"
536  " tag = \""+tag["tag"]+"\")\n")
537 
538 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

◆ _create_mass_storage_directory()

def mps_alisetup.SetupAlignment._create_mass_storage_directory (   self)
private
Create MPS mass storage directory where, e.g., mille binaries are
stored.

Definition at line 179 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._general_options, mps_alisetup.SetupAlignment._mps_dir_name, mps_alisetup.SetupAlignment._mss_dir, and print().

179  def _create_mass_storage_directory(self):
180  """
181  Create MPS mass storage directory where, e.g., mille binaries are
182  stored.
183  """
184 
185  # set directory on eos
186  self._mss_dir = self._general_options.get("massStorageDir",
187  "/eos/cms/store/group/alca_millepede/")
188  self._mss_dir = os.path.join(self._mss_dir, "MPproductionFiles",
189  self._mps_dir_name)
190 
191  cmd = ["mkdir", "-p", self._mss_dir]
192 
193  # create directory
194  if not self._general_options.get("testMode", False):
195  try:
196  with open(os.devnull, "w") as dump:
197  subprocess.check_call(cmd, stdout = dump, stderr = dump)
198  except subprocess.CalledProcessError:
199  print("Failed to create mass storage directory:", self._mss_dir)
200  sys.exit(1)
201 
202 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

◆ _create_mille_jobs()

def mps_alisetup.SetupAlignment._create_mille_jobs (   self)
private
Create the mille jobs based on the [dataset:<name>] sections.

Definition at line 252 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._datasets, tkal_create_file_lists.FileListCreator._datasets, mps_alisetup.SetupAlignment._general_options, mps_monitormerge.items, print(), and str.

Referenced by mps_alisetup.SetupAlignment.setup().

252  def _create_mille_jobs(self):
253  """Create the mille jobs based on the [dataset:<name>] sections."""
254 
255  gt_regex = re.compile('setupGlobaltag\s*\=\s*[\"\'](.*?)[\"\']')
256  sg_regex = re.compile("setupRunStartGeometry\s*\=\s*.*$", re.M)
257  collection_regex = re.compile('setupCollection\s*\=\s*[\"\'](.*?)[\"\']')
258  recogeom_regex = re.compile('setupRecoGeometry\s*\=\s*[\"\'](.*?)[\"\']')
259  czt_regex = re.compile('setupCosmicsZeroTesla\s*\=\s*.*$', re.M)
260  cdm_regex = re.compile('setupCosmicsDecoMode\s*\=\s*.*$', re.M)
261  pw_regex = re.compile('setupPrimaryWidth\s*\=\s*.*$', re.M)
262  json_regex = re.compile('setupJson\s*\=\s*.*$', re.M)
263 
264  first_dataset = True
265  for name, dataset in self._datasets.items():
266  print("="*75)
267  # Build config from template/Fill in variables
268  try:
269  with open(dataset["configTemplate"],"r") as f:
270  tmpFile = f.read()
271  except IOError:
272  print("The config-template called", end=' ')
273  print(dataset["configTemplate"], "cannot be found.")
274  sys.exit(1)
275 
276  tmpFile = re.sub(gt_regex,
277  'setupGlobaltag = \"'+dataset["globaltag"]+'\"',
278  tmpFile)
279  tmpFile = re.sub(recogeom_regex,
280  'setupRecoGeometry = \"'+dataset["recogeometry"]+'\"',
281  tmpFile)
282  tmpFile = re.sub(sg_regex,
283  "setupRunStartGeometry = "+
284  self._general_options["FirstRunForStartGeometry"], tmpFile)
285  tmpFile = re.sub(collection_regex,
286  'setupCollection = \"'+dataset["collection"]+'\"',
287  tmpFile)
288  if "ALCARECOTkAlCosmics" in dataset["collection"]:
289  if dataset['cosmicsZeroTesla']:
290  tmpFile = re.sub(czt_regex,
291  'setupCosmicsZeroTesla = True',
292  tmpFile)
293  else :
294  tmpFile = re.sub(czt_regex,
295  'setupCosmicsZeroTesla = False',
296  tmpFile)
297 
298  if dataset['cosmicsDecoMode']:
299  tmpFile = re.sub(cdm_regex,
300  'setupCosmicsDecoMode = True',
301  tmpFile)
302  else:
303  tmpFile = re.sub(cdm_regex,
304  'setupCosmicsDecoMode = False',
305  tmpFile)
306 
307  if dataset['primaryWidth'] > 0.0:
308  tmpFile = re.sub(pw_regex,
309  'setupPrimaryWidth = '+str(dataset["primaryWidth"]),
310  tmpFile)
311  if dataset['json'] != '':
312  tmpFile = re.sub(json_regex,
313  'setupJson = \"'+dataset["json"]+'\"',
314  tmpFile)
315 
316  thisCfgTemplate = "tmp.py"
317  with open(thisCfgTemplate, "w") as f:
318  f.write(tmpFile)
319 
320 
321  # Set mps_setup append option for datasets following the first one
322  append = "-a"
323  if first_dataset:
324  append = ""
325  first_dataset = False
326  self._config_template = tmpFile
327  self._cms_process = mps_tools.get_process_object(thisCfgTemplate)
328  self._create_input_db()
329 
330  with open(thisCfgTemplate, "a") as f: f.write(self._override_gt)
331 
332 
333  # create mps_setup command
334  command = ["mps_setup.py",
335  "-m",
336  append,
337  "-M", self._general_options["pedeMem"],
338  "-N", name,
339  self._mille_script,
340  thisCfgTemplate,
341  dataset["inputFileList"],
342  str(dataset["njobs"]),
343  self._general_options["classInf"],
344  self._general_options["jobname"],
345  self._pede_script,
346  "cmscafuser:"+self._mss_dir]
347  if dataset["numberOfEvents"] > 0:
348  command.extend(["--max-events", str(dataset["numberOfEvents"])])
349  command = [x for x in command if len(x.strip()) > 0]
350 
351  # Some output:
352  print("Creating jobs for dataset:", name)
353  print("-"*75)
354  print("Baseconfig: ", dataset["configTemplate"])
355  print("Collection: ", dataset["collection"])
356  if "ALCARECOTkAlCosmics" in dataset["collection"]:
357  print("cosmicsDecoMode: ", dataset["cosmicsDecoMode"])
358  print("cosmicsZeroTesla: ", dataset["cosmicsZeroTesla"])
359  print("Globaltag: ", dataset["globaltag"])
360  print("RecoGeometry: ", dataset["recogeometry"])
361  print("Number of jobs: ", dataset["njobs"])
362  print("Inputfilelist: ", dataset["inputFileList"])
363  if dataset["json"] != "":
364  print("Jsonfile: ", dataset["json"])
365  if self._args.verbose:
366  print("Pass to mps_setup: ", " ".join(command))
367 
368  # call the command and toggle verbose output
369  self._handle_process_call(command, self._args.verbose)
370 
371  # remove temporary file
372  self._handle_process_call(["rm", thisCfgTemplate])
373 
374 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
static std::string join(char **cmd)
Definition: RemoteFile.cc:21
#define str(s)

◆ _create_pede_jobs()

def mps_alisetup.SetupAlignment._create_pede_jobs (   self)
private
Create pede jobs from the given input.

Definition at line 375 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._args, tkal_create_file_lists.FileListCreator._args, mps_alisetup.SetupAlignment._cms_process, mps_alisetup.SetupAlignment._config_template, mps_alisetup.SetupAlignment._create_input_db(), mps_alisetup.SetupAlignment._create_tracker_tree(), mps_alisetup.SetupAlignment._first_pede_config, mps_alisetup.SetupAlignment._handle_process_call(), mps_alisetup.SetupAlignment._override_gt, mps_alisetup.SetupAlignment._tracker_tree_path, mps_alisetup.SetupAlignment._weight_configs, join(), print(), and str.

Referenced by mps_alisetup.SetupAlignment._create_additional_pede_jobs(), and mps_alisetup.SetupAlignment.setup().

375  def _create_pede_jobs(self):
376  """Create pede jobs from the given input."""
377 
378  for setting in self._pede_settings:
379  print()
380  print("="*75)
381  if setting is None:
382  print("Creating pede job{}.".format(
383  "s" if len(self._pede_settings)*len(self._weight_configs) > 1 else ""))
384  print("-"*75)
385  else:
386  print("Creating pede jobs using settings from '{0}'.".format(setting))
387  for weight_conf in self._weight_configs:
388  # blank weights
389  self._handle_process_call(["mps_weight.pl", "-c"])
390 
391  thisCfgTemplate = "tmp.py"
392  with open(thisCfgTemplate, "w") as f: f.write(self._config_template)
393  if self._override_gt is None:
394  self._cms_process = mps_tools.get_process_object(thisCfgTemplate)
395  self._create_input_db()
396  with open(thisCfgTemplate, "a") as f: f.write(self._override_gt)
397 
398  for name,weight in weight_conf:
399  self._handle_process_call(["mps_weight.pl", "-N", name, weight], True)
400 
401  if not self._first_pede_config:
402  # create new mergejob
403  self._handle_process_call(["mps_setupm.pl"], self._args.verbose)
404 
405  # read mps.db to find directory of new mergejob
406  lib = mpslib.jobdatabase()
407  lib.read_db()
408 
409  # short cut for jobm path
410  jobm_path = os.path.join("jobData", lib.JOBDIR[-1])
411 
412  # delete old merge-config
413  command = ["rm", "-f", os.path.join(jobm_path, "alignment_merge.py")]
414  self._handle_process_call(command, self._args.verbose)
415 
416  # create new merge-config
417  command = [
418  "mps_merge.py",
419  "-w", thisCfgTemplate,
420  os.path.join(jobm_path, "alignment_merge.py"),
421  jobm_path,
422  str(lib.nJobs),
423  ]
424  if setting is not None: command.extend(["-a", setting])
425  print("-"*75)
426  print(" ".join(command))
427  self._handle_process_call(command, self._args.verbose)
428  self._create_tracker_tree()
429  if self._first_pede_config:
430  os.symlink(self._tracker_tree_path,
431  os.path.abspath(os.path.join(jobm_path,
432  ".TrackerTree.root")))
433  self._first_pede_config = False
434 
435  # store weights configuration
436  with open(os.path.join(jobm_path, ".weights.pkl"), "wb") as f:
437  cPickle.dump(weight_conf, f, 2)
438  print("="*75)
439 
440  # remove temporary file
441  self._handle_process_call(["rm", thisCfgTemplate])
442 
443 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
static std::string join(char **cmd)
Definition: RemoteFile.cc:21
#define str(s)

◆ _create_tracker_tree()

def mps_alisetup.SetupAlignment._create_tracker_tree (   self)
private
Method to create hidden 'TrackerTree.root'.

Definition at line 651 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._first_run, mps_alisetup.SetupAlignment._global_tag, and print().

Referenced by mps_alisetup.SetupAlignment._create_pede_jobs().

651  def _create_tracker_tree(self):
652  """Method to create hidden 'TrackerTree.root'."""
653 
654  if self._global_tag is None or self._first_run is None:
655  print("Trying to create the tracker tree before setting the global", end=' ')
656  print("tag or the run to determine the geometry IOV.")
657  sys.exit(1)
658 
659  config = mpsv_iniparser.ConfigData()
660  config.jobDataPath = "." # current directory
661  config.globalTag = self._global_tag
662  #config.recoGeometry = self._reco_geometry
663  config.firstRun = self._first_run
664  self._tracker_tree_path = mpsv_trackerTree.check(config)
665 
666 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

◆ _create_weight_configs()

def mps_alisetup.SetupAlignment._create_weight_configs (   self)
private
Extract different weight configurations from `self._config`.

Definition at line 203 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._common_weights, mps_alisetup.SetupAlignment._weight_configs, mps_alisetup.SetupAlignment._weight_dict, mps_setup.append, and mkLumiAveragedPlots.tuple.

203  def _create_weight_configs(self):
204  """Extract different weight configurations from `self._config`."""
205 
206  weights_list = [[(name, weight) for weight in self._weight_dict[name]]
207  for name in self._weight_dict]
208 
209  common_weights_list = [[(name, weight)
210  for weight in self._common_weights[name]]
211  for name in self._common_weights]
212 
213  common_weights_dicts = []
214  for item in itertools.product(*common_weights_list):
215  d = {}
216  for name,weight in item:
217  d[name] = weight
218  common_weights_dicts.append(d)
219 
220  weight_configs = []
221  for weight_conf in itertools.product(*weights_list):
222  number_of_configs = len(weight_configs)
223  for common_weight in common_weights_dicts:
224  replaced_config \
225  = tuple([(dataset[0],
226  reduce(lambda x,y: mps_tools.replace_factors(x, y, common_weight[y]),
227  common_weight, dataset[1]))
228  for dataset in weight_conf])
229  if replaced_config not in weight_configs:
230  weight_configs.append(replaced_config)
231 
232  # default if config contains no common weights:
233  if len(weight_configs) == number_of_configs:
234  weight_configs.append(weight_conf)
235 
236  for weight_config in weight_configs:
237  resolved_weight_config \
238  = [(dataset[0], mps_tools.compute_product_string(dataset[1]))
239  for dataset in weight_config]
240  self._weight_configs.append(resolved_weight_config)
241 
242 

◆ _fetch_dataset_directory()

def mps_alisetup.SetupAlignment._fetch_dataset_directory (   self)
private
Fetch 'datasetDir' variable from general section and add it to the
'os.environ' dictionary.

Definition at line 700 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._config, mps_alisetup.SetupAlignment._general_options, and print().

Referenced by mps_alisetup.SetupAlignment._fill_general_options().

700  def _fetch_dataset_directory(self):
701  """
702  Fetch 'datasetDir' variable from general section and add it to the
703  'os.environ' dictionary.
704  """
705 
706  if self._config.has_option("general", "datasetdir"):
707  dataset_directory = self._config.get("general", "datasetdir")
708  # add it to environment for later variable expansion:
709  os.environ["datasetdir"] = dataset_directory
710  self._general_options["datasetdir"] = dataset_directory
711  else:
712  print("No datasetdir given in [general] section.", end=' ')
713  print("Be sure to give a full path in inputFileList.")
714  self._general_options["datasetdir"] = ""
715 
716 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

◆ _fetch_datasets()

def mps_alisetup.SetupAlignment._fetch_datasets (   self)
private
Fetch internal and external dataset configurations.

Definition at line 717 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._args, tkal_create_file_lists.FileListCreator._args, mps_alisetup.SetupAlignment._common_weights, mps_alisetup.SetupAlignment._config, mps_alisetup.SetupAlignment._datasets, tkal_create_file_lists.FileListCreator._datasets, mps_alisetup.SetupAlignment._external_datasets, mps_alisetup.SetupAlignment._general_options, mps_alisetup.SetupAlignment._weight_dict, any(), mps_monitormerge.items, join(), relativeConstraints.keys, print(), and submitPVValidationJobs.split().

717  def _fetch_datasets(self):
718  """Fetch internal and external dataset configurations."""
719 
720  all_configs = collections.OrderedDict()
721  all_configs["main"] = {"config": self._config,
722  "general": self._general_options,
723  "weight": None}
724  all_configs.update(self._external_datasets)
725 
726  for config in all_configs.values():
727  global_weight = "1" if config["weight"] is None else config["weight"]
728  if global_weight+self._config.config_path in self._common_weights:
729  global_weight = self._common_weights[global_weight+
730  self._config.config_path]
731  elif global_weight in self._common_weights:
732  global_weight = self._common_weights[global_weight]
733  else:
734  global_weight = (global_weight,)
735  common_weights = {}
736  weight_dict = {}
737  for section in config["config"].sections():
738  cache_datasetdir = os.environ["datasetdir"]
739  if "general" in section:
740  if config["config"].has_option("general", "datasetdir"):
741  os.environ["datasetdir"] = config["config"].get("general", "datasetdir")
742  elif section == "weights":
743  for option in config["config"].options(section):
744  common_weights[option] \
745  = [x.strip() for x in
746  config["config"].get(section, option).split(",")]
747  elif section.startswith("dataset:"):
748  print("-"*75)
749  # set name from section-name
750  name = section[8:]
751  if name in self._datasets:
752  print("WARNING: Duplicate definition of dataset '{}'".format(name))
753  print(" -> Using defintion in '{}':\n".format(config["config"].config_path))
754  print(" [{}]".format(section))
755  for k,v in config["config"].items(section):
756  print(" ", k, "=", v)
757  print()
758  self._datasets[name] = {}
759 
760  # extract weight for the dataset
761  if config["config"].has_option(section, "weight"):
762  self._weight_dict[name] \
763  = [x.strip() for x in
764  config["config"].get(section, "weight").split(",")]
765  else:
766  self._weight_dict[name] = ["1.0"]
767  self._weight_dict[name] = [global_w+"*"+w
768  for w in self._weight_dict[name]
769  for global_w in global_weight]
770  weight_dict[name] = self._weight_dict[name]
771 
772  # extract essential variables
773  for var in ("inputFileList", "collection"):
774  try:
775  self._datasets[name][var] = config["config"].get(section, var)
776  except ConfigParser.NoOptionError:
777  print("No", var, "found in", section+". Please check ini-file.")
778  sys.exit(1)
779 
780  # get globaltag and configTemplate. If none in section, try to get
781  # default from [general] section.
782  for var in ("configTemplate", "globaltag"):
783  try:
784  self._datasets[name][var] = config["config"].get(section, var)
785  except (ConfigParser.NoSectionError,ConfigParser.NoOptionError):
786  try:
787  self._datasets[name][var] = config["general"][var]
788  except KeyError:
789  try:
790  self._datasets[name][var] \
791  = all_configs["main"]["general"][var]
792  except KeyError:
793  print("No",var,"found in ["+section+"]", end=' ')
794  print("and no default in [general] section.")
795  sys.exit(1)
796 
797  # get recogeometry and configTemplate. If none in section, try to get
798  # default from [general] section.
799  for var in ("configTemplate", "recogeometry"):
800  try:
801  self._datasets[name][var] = config["config"].get(section, var)
802  except (ConfigParser.NoSectionError,ConfigParser.NoOptionError):
803  try:
804  self._datasets[name][var] = config["general"][var]
805  except KeyError:
806  try:
807  self._datasets[name][var] \
808  = all_configs["main"]["general"][var]
809  except KeyError:
810  print("No",var,"found in ["+section+"]", end=' ')
811  print("and no default in [general] section.")
812  sys.exit(1)
813 
814  # extract non-essential options
815  if "ALCARECOTkAlCosmics" in self._datasets[name]["collection"]:
816  try:
817  self._datasets[name]["cosmicsZeroTesla"] \
818  = config["config"].getboolean(section,"cosmicsZeroTesla")
819  except ConfigParser.NoOptionError:
820  print("No option cosmicsZeroTesla found in", section,"even though it is required for dataset type", self._datasets[name]["collection"], ". Please check ini-file.")
821  sys.exit(1)
822  try:
823  self._datasets[name]["cosmicsDecoMode"] \
824  = config["config"].getboolean(section,"cosmicsDecoMode")
825  except ConfigParser.NoOptionError:
826  print("No option cosmicsDecoMode found in", section,"even though it is required for dataset type", self._datasets[name]["collection"], ".Please check ini-file.")
827  sys.exit(1)
828 
829  self._datasets[name]["primaryWidth"] = -1.0
830  if config["config"].has_option(section,"primaryWidth"):
831  self._datasets[name]["primaryWidth"] \
832  = config["config"].getfloat(section,"primaryWidth")
833 
834  self._datasets[name]["numberOfEvents"] = -1
835  if config["config"].has_option(section, "numberOfEvents"):
836  self._datasets[name]["numberOfEvents"] \
837  = config["config"].getint(section, "numberOfEvents")
838 
839  self._datasets[name]["json"] = ""
840  try:
841  self._datasets[name]["json"] = config["config"].get(section,"json")
842  except ConfigParser.NoOptionError:
843  try:
844  self._datasets[name]["json"] = config["general"]["json"]
845  except KeyError:
846  try:
847  self._datasets[name]["json"] \
848  = all_configs["main"]["general"]["json"]
849  except KeyError:
850  print("No json given in either [general] or", end=' ')
851  print("["+section+"] sections.")
852  print(" -> Proceeding without json-file.")
853 
854 
855  #replace ${datasetdir} and other variables, e.g. $CMSSW_BASE
856  for var in ("inputFileList", "json", "configTemplate"):
857  self._datasets[name][var] \
858  = os.path.expandvars(self._datasets[name][var])
859 
860 
861  # Get number of jobs from lines in inputfilelist
862  self._datasets[name]["njobs"] = 0
863  try:
864  with open(self._datasets[name]["inputFileList"], "r") as filelist:
865  for line in filelist:
866  if "CastorPool" in line:
867  continue
868  # ignore empty lines
869  if not line.strip()=="":
870  self._datasets[name]["njobs"] += 1
871  except IOError:
872  print("Inputfilelist", self._datasets[name]["inputFileList"], end=' ')
873  print("does not exist.")
874  sys.exit(1)
875  if self._datasets[name]["njobs"] == 0:
876  print("Number of jobs is 0. There may be a problem with the inputfilelist:")
877  print(self._datasets[name]["inputFileList"])
878  sys.exit(1)
879 
880  # Check if njobs gets overwritten in .ini-file
881  if config["config"].has_option(section, "njobs"):
882  if config["config"].getint(section, "njobs") <= self._datasets[name]["njobs"]:
883  self._datasets[name]["njobs"] = config["config"].getint(section, "njobs")
884  else:
885  print("'njobs' is bigger than the number of files for this", end=' ')
886  print("dataset:", self._datasets[name]["njobs"])
887  print("Using default.")
888  else:
889  print("No number of jobs specified. Using number of files in", end=' ')
890  print("inputfilelist as the number of jobs.")
891 
892  # check if local weights override global weights and resolve name clashes
893  for weight_name, weight_values in common_weights.items():
894  for key, weight in weight_dict.items():
895  if any([weight_name in w for w in weight]):
896  self._common_weights[weight_name+config["config"].config_path] = weight_values
897  self._weight_dict[key] = [mps_tools.replace_factors(w,
898  weight_name,
899  weight_name+config["config"].config_path)
900  for w in weight]
901  else:
902  self._common_weights[weight_name] = weight_values
903  self._weight_dict[key] = weight
904 
905  os.environ["datasetdir"] = cache_datasetdir
906 
907  if len(self._datasets) == 0:
908  print("No dataset section defined in '{0}'".format(
909  ", ".join([self._args.aligmentConfig]+self._external_datasets.keys())))
910  print("At least one section '[dataset:<name>]' is required.")
911  sys.exit(1)
912 
913  self._global_tag = self._datasets[name]["globaltag"]
914  self._reco_geometry = self._datasets[name]["recogeometry"]
915 
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:37
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
static std::string join(char **cmd)
Definition: RemoteFile.cc:21

◆ _fetch_defaults()

def mps_alisetup.SetupAlignment._fetch_defaults (   self)
private
Fetch default general options from config file.

Definition at line 680 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._config, mps_alisetup.SetupAlignment._external_datasets, mps_alisetup.SetupAlignment._general_options, print(), and contentValuesCheck.values.

Referenced by mps_alisetup.SetupAlignment._fill_general_options().

680  def _fetch_defaults(self):
681  """Fetch default general options from config file."""
682 
683  for var in ("globaltag", "recogeometry", "configTemplate", "json", "massStorageDir",
684  "testMode"):
685  try:
686  self._general_options[var] = self._config.get("general", var)
687  except ConfigParser.NoOptionError:
688  if var == "testMode": continue
689  print("No '" + var + "' given in [general] section.")
690 
691  for dataset in self._external_datasets.values():
692  dataset["general"] = {}
693  for var in ("globaltag", "recogeometry", "configTemplate", "json"):
694  try:
695  dataset["general"][var] = dataset["config"].get("general", var)
696  except (ConfigParser.NoSectionError,ConfigParser.NoOptionError):
697  pass
698 
699 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

◆ _fetch_essentials()

def mps_alisetup.SetupAlignment._fetch_essentials (   self)
private
Fetch general options from config file.

Definition at line 667 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._config, mps_alisetup.SetupAlignment._first_run, mps_alisetup.SetupAlignment._general_options, and print().

Referenced by mps_alisetup.SetupAlignment._fill_general_options().

667  def _fetch_essentials(self):
668  """Fetch general options from config file."""
669 
670  for var in ("classInf","pedeMem","jobname", "FirstRunForStartGeometry"):
671  try:
672  self._general_options[var] = self._config.get('general',var)
673  except ConfigParser.NoOptionError:
674  print("No", var, "found in [general] section.", end=' ')
675  print("Please check ini-file.")
676  sys.exit(1)
677  self._first_run = self._general_options["FirstRunForStartGeometry"]
678 
679 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

◆ _fetch_external_datasets()

def mps_alisetup.SetupAlignment._fetch_external_datasets (   self)
private
Fetch information about external datasets.

Definition at line 156 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._config, mps_alisetup.SetupAlignment._external_datasets, genParticles_cff.map, submitPVValidationJobs.split(), and nano_mu_digi_cff.strip.

Referenced by mps_alisetup.SetupAlignment._fill_general_options().

156  def _fetch_external_datasets(self):
157  """Fetch information about external datasets."""
158 
159  if self._config.has_option("general", "externalDatasets"):
160  datasets = map(lambda x: x.strip(),
161  self._config.get("general",
162  "externalDatasets").split(","))
163  datasets = [x for x in datasets if len(x.strip()) > 0]
164  for item in datasets:
165  splitted = item.split("|")
166  dataset = splitted[0].strip()
167  dataset = os.path.expandvars(dataset)
168 
169  weight = splitted[1] if len(splitted) > 1 else None
170  config = ConfigParser.ConfigParser()
171  config.optionxform = str
172  config.read(dataset)
173  config.config_path = dataset
174  self._external_datasets[dataset] = {"config": config,
175  "weight": weight}
176 
177 
178 

◆ _fetch_pede_settings()

def mps_alisetup.SetupAlignment._fetch_pede_settings (   self)
private
Fetch 'pedesettings' from general section in `self._config`.

Definition at line 243 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._config, and submitPVValidationJobs.split().

243  def _fetch_pede_settings(self):
244  """Fetch 'pedesettings' from general section in `self._config`."""
245 
246  self._pede_settings \
247  = ([x.strip()
248  for x in self._config.get("general", "pedesettings").split(",")]
249  if self._config.has_option("general", "pedesettings") else [None])
250 
251 

◆ _fill_general_options()

def mps_alisetup.SetupAlignment._fill_general_options (   self)
private
Create and fill `general_options` dictionary.

Definition at line 146 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._fetch_dataset_directory(), mps_alisetup.SetupAlignment._fetch_defaults(), mps_alisetup.SetupAlignment._fetch_essentials(), mps_alisetup.SetupAlignment._fetch_external_datasets(), and print().

146  def _fill_general_options(self):
147  """Create and fill `general_options` dictionary."""
148 
149  print("="*75)
150  self._fetch_dataset_directory()
151  self._fetch_external_datasets()
152  self._fetch_essentials()
153  self._fetch_defaults()
154 
155 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

◆ _handle_process_call()

def mps_alisetup.SetupAlignment._handle_process_call (   self,
  command,
  verbose = False 
)
private
Wrapper around subprocess calls which treats output depending on verbosity
level.

Arguments:
- `command`: list of command items
- `verbose`: flag to turn on verbosity

Definition at line 490 of file mps_alisetup.py.

References join(), and print().

Referenced by mps_alisetup.SetupAlignment._create_pede_jobs().

490  def _handle_process_call(self, command, verbose = False):
491  """
492  Wrapper around subprocess calls which treats output depending on verbosity
493  level.
494 
495  Arguments:
496  - `command`: list of command items
497  - `verbose`: flag to turn on verbosity
498  """
499 
500  call_method = subprocess.check_call if verbose else subprocess.check_output
501  try:
502  call_method(command, stderr=subprocess.STDOUT)
503  except subprocess.CalledProcessError as e:
504  print("" if verbose else e.output)
505  print("Failed to execute command:", " ".join(command))
506  sys.exit(1)
507 
508 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
static std::string join(char **cmd)
Definition: RemoteFile.cc:21

◆ setup()

def mps_alisetup.SetupAlignment.setup (   self)
Setup the alignment campaign.

Definition at line 77 of file mps_alisetup.py.

References mps_alisetup.SetupAlignment._args, tkal_create_file_lists.FileListCreator._args, mps_alisetup.SetupAlignment._create_additional_pede_jobs(), mps_alisetup.SetupAlignment._create_mille_jobs(), mps_alisetup.SetupAlignment._create_pede_jobs(), mps_alisetup.SetupAlignment._first_run, mps_alisetup.SetupAlignment._global_tag, mps_alisetup.SetupAlignment._override_gt, print(), and nano_mu_digi_cff.strip.

Referenced by o2olib.O2OTool.execute().

77  def setup(self):
78  """Setup the alignment campaign."""
79 
80  if self._args.weight:
81  self._create_additional_pede_jobs()
82  else:
83  self._create_mille_jobs()
84  self._create_pede_jobs()
85 
86  if self._override_gt.strip() != "":
87  msg = ("Overriding global tag with single-IOV tags extracted from "
88  "'{}' for run number '{}'.".format(self._global_tag,
89  self._first_run))
90  print(msg)
91  print("-"*75)
92  print(self._override_gt)
93  print("="*75)
94 
95 
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

Member Data Documentation

◆ _args

◆ _argv

mps_alisetup.SetupAlignment._argv
private

Definition at line 50 of file mps_alisetup.py.

Referenced by mps_alisetup.SetupAlignment._create_config().

◆ _cms_process

mps_alisetup.SetupAlignment._cms_process
private

◆ _common_weights

mps_alisetup.SetupAlignment._common_weights
private

◆ _config

◆ _config_template

mps_alisetup.SetupAlignment._config_template
private

◆ _datasets

◆ _external_datasets

mps_alisetup.SetupAlignment._external_datasets
private

◆ _first_pede_config

mps_alisetup.SetupAlignment._first_pede_config
private

◆ _first_run

◆ _general_options

◆ _global_tag

◆ _mille_script

mps_alisetup.SetupAlignment._mille_script
private

Definition at line 60 of file mps_alisetup.py.

Referenced by mps_alisetup.SetupAlignment._construct_paths().

◆ _mps_dir_name

mps_alisetup.SetupAlignment._mps_dir_name
private

◆ _mss_dir

mps_alisetup.SetupAlignment._mss_dir
private

◆ _override_gt

mps_alisetup.SetupAlignment._override_gt
private

◆ _pede_script

mps_alisetup.SetupAlignment._pede_script
private

Definition at line 58 of file mps_alisetup.py.

Referenced by mps_alisetup.SetupAlignment._construct_paths().

◆ _reco_geometry

mps_alisetup.SetupAlignment._reco_geometry
private

◆ _tracker_tree_path

mps_alisetup.SetupAlignment._tracker_tree_path
private

Definition at line 664 of file mps_alisetup.py.

Referenced by mps_alisetup.SetupAlignment._create_pede_jobs().

◆ _weight_configs

mps_alisetup.SetupAlignment._weight_configs
private

◆ _weight_dict

mps_alisetup.SetupAlignment._weight_dict
private