From b98f06ee2208457f4546767802ea6b7257a8ba09 Mon Sep 17 00:00:00 2001 From: JoschD <26184899+JoschD@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:37:02 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20=20@=206953d?= =?UTF-8?q?625c93b669ef6f34c7e5f5428ee37e6a94f=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .buildinfo | 2 +- _modules/index.html | 4 +- .../omc3/amplitude_detuning_analysis.html | 4 +- _modules/omc3/check_corrections.html | 4 +- _modules/omc3/correction/filters.html | 4 +- _modules/omc3/correction/handler.html | 4 +- _modules/omc3/correction/model_appenders.html | 4 +- _modules/omc3/correction/model_diff.html | 4 +- _modules/omc3/correction/response_io.html | 4 +- _modules/omc3/correction/response_madx.html | 18 ++- _modules/omc3/correction/response_twiss.html | 4 +- .../omc3/correction/sequence_evaluation.html | 4 +- _modules/omc3/definitions/formats.html | 4 +- _modules/omc3/global_correction.html | 4 +- _modules/omc3/harpy/clean.html | 4 +- _modules/omc3/harpy/frequency.html | 4 +- _modules/omc3/harpy/handler.html | 4 +- _modules/omc3/harpy/kicker.html | 4 +- _modules/omc3/hole_in_one.html | 4 +- _modules/omc3/kmod/analysis.html | 4 +- _modules/omc3/knob_extractor.html | 12 +- _modules/omc3/madx_wrapper.html | 4 +- .../omc3/model/accelerators/accelerator.html | 4 +- _modules/omc3/model/accelerators/esrf.html | 4 +- _modules/omc3/model/accelerators/iota.html | 4 +- _modules/omc3/model/accelerators/lhc.html | 112 +++++++++--------- _modules/omc3/model/accelerators/petra.html | 4 +- _modules/omc3/model/accelerators/ps.html | 4 +- .../omc3/model/accelerators/psbooster.html | 4 +- _modules/omc3/model/accelerators/skekb.html | 4 +- _modules/omc3/model/manager.html | 4 +- .../model_creators/lhc_model_creator.html | 84 ++++++------- .../model_creators/ps_model_creator.html | 4 +- .../psbooster_model_creator.html | 4 +- _modules/omc3/model_creator.html | 37 +++--- .../beta_from_amplitude.html | 4 +- .../optics_measurements/beta_from_phase.html | 4 +- .../omc3/optics_measurements/data_models.html | 4 +- .../omc3/optics_measurements/dispersion.html | 4 +- _modules/omc3/optics_measurements/dpp.html | 4 +- .../interaction_point.html | 4 +- _modules/omc3/optics_measurements/kick.html | 4 +- .../optics_measurements/measure_optics.html | 4 +- _modules/omc3/optics_measurements/phase.html | 4 +- _modules/omc3/optics_measurements/rdt.html | 4 +- .../omc3/optics_measurements/toolbox.html | 4 +- _modules/omc3/optics_measurements/tune.html | 4 +- .../plotting/optics_measurements/utils.html | 4 +- .../plotting/plot_amplitude_detuning.html | 4 +- _modules/omc3/plotting/plot_bbq.html | 4 +- .../plotting/plot_checked_corrections.html | 4 +- .../plotting/plot_optics_measurements.html | 4 +- _modules/omc3/plotting/plot_spectrum.html | 4 +- _modules/omc3/plotting/plot_tfs.html | 4 +- _modules/omc3/plotting/spectrum/stem.html | 4 +- _modules/omc3/plotting/spectrum/utils.html | 4 +- .../omc3/plotting/spectrum/waterfall.html | 4 +- _modules/omc3/plotting/utils/annotations.html | 4 +- _modules/omc3/plotting/utils/colors.html | 4 +- _modules/omc3/plotting/utils/lines.html | 4 +- _modules/omc3/plotting/utils/style.html | 4 +- _modules/omc3/plotting/utils/windows.html | 4 +- _modules/omc3/response_creator.html | 10 +- _modules/omc3/run_kmod.html | 4 +- .../scripts/betabeatsrc_output_converter.html | 4 +- .../scripts/fake_measurement_from_model.html | 4 +- _modules/omc3/scripts/linfile_clean.html | 4 +- _modules/omc3/scripts/merge_kmod_results.html | 4 +- _modules/omc3/tbt_converter.html | 4 +- _modules/omc3/tune_analysis/bbq_tools.html | 4 +- _modules/omc3/tune_analysis/constants.html | 4 +- .../omc3/tune_analysis/fitting_tools.html | 4 +- .../tune_analysis/kick_file_modifiers.html | 4 +- .../omc3/tune_analysis/timber_extract.html | 4 +- _modules/omc3/utils/contexts.html | 4 +- _modules/omc3/utils/iotools.html | 44 ++++++- _modules/omc3/utils/logging_tools.html | 4 +- _modules/omc3/utils/mock.html | 4 +- _modules/omc3/utils/outliers.html | 4 +- _modules/omc3/utils/stats.html | 4 +- _modules/omc3/utils/time_tools.html | 4 +- _static/documentation_options.js | 2 +- entrypoints/analysis.html | 4 +- entrypoints/correction.html | 4 +- entrypoints/other.doctree | Bin 101661 -> 101364 bytes entrypoints/other.html | 5 +- entrypoints/plotting.html | 4 +- entrypoints/scripts.html | 4 +- environment.pickle | Bin 4123706 -> 4147182 bytes genindex.html | 4 +- index.html | 4 +- modules/correction.html | 4 +- modules/definitions.html | 4 +- modules/harpy.html | 4 +- modules/kmod.html | 4 +- modules/model.doctree | Bin 274539 -> 274821 bytes modules/model.html | 46 +++---- modules/optics_measurements.html | 4 +- modules/plotting.html | 4 +- modules/tune_analysis.html | 4 +- modules/utils.doctree | Bin 291798 -> 307222 bytes modules/utils.html | 39 +++++- search.html | 4 +- searchindex.js | 2 +- 104 files changed, 420 insertions(+), 341 deletions(-) diff --git a/.buildinfo b/.buildinfo index dd18456e..f8ad0232 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 74faf1ece4c7094eae20373cbc46ce0d +config: f69d78534b8d73ccbf329ad4588350ae tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_modules/index.html b/_modules/index.html index c414fd26..060d8388 100644 --- a/_modules/index.html +++ b/_modules/index.html @@ -3,7 +3,7 @@
-
Specify user-defined output path. This should probably be
`model_dir/knobs.madx`
- default: ``knobs.madx``
-
- **state**:
@@ -689,16 +687,16 @@ Source code for omc3.knob_extractor
def _get_knobs_def_file(user_defined: Optional[Union[Path, str]] = None) -> Path:
""" Check which knobs-definition file is appropriate to take. """
if user_defined is not None:
- LOGGER.info(f"Using user defined knobs.txt: '{user_defined}")
+ LOGGER.info(f"Using user knobs-definition file: '{user_defined}")
return Path(user_defined)
if KNOBS_FILE_ACC_MODELS.is_file():
- LOGGER.info(f"Using model folder's knobs.txt: '{KNOBS_FILE_ACC_MODELS}")
+ LOGGER.info(f"Using given acc-models folder's knobs.txt as knobsdefinition file: '{KNOBS_FILE_ACC_MODELS}")
return KNOBS_FILE_ACC_MODELS
if KNOBS_FILE_AFS.is_file():
# if all fails, fall back to lhc acc-models
- LOGGER.info(f"Using fallback knobs.txt: '{KNOBS_FILE_AFS}'")
+ LOGGER.info(f"Using afs-fallback acc-models folder's knobs.txt as knobs-definition file: '{KNOBS_FILE_AFS}'")
return KNOBS_FILE_AFS
raise FileNotFoundError("None of the knobs-definition files are available.")
diff --git a/_modules/omc3/madx_wrapper.html b/_modules/omc3/madx_wrapper.html
index 3fffdba7..bd2df47f 100644
--- a/_modules/omc3/madx_wrapper.html
+++ b/_modules/omc3/madx_wrapper.html
@@ -3,7 +3,7 @@
- omc3.madx_wrapper — omc3 0.14.1 documentation
+ omc3.madx_wrapper — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/accelerators/accelerator.html b/_modules/omc3/model/accelerators/accelerator.html
index 556559fb..025a2e49 100644
--- a/_modules/omc3/model/accelerators/accelerator.html
+++ b/_modules/omc3/model/accelerators/accelerator.html
@@ -3,7 +3,7 @@
- omc3.model.accelerators.accelerator — omc3 0.14.1 documentation
+ omc3.model.accelerators.accelerator — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/accelerators/esrf.html b/_modules/omc3/model/accelerators/esrf.html
index 4c67ae24..c7dde8f9 100644
--- a/_modules/omc3/model/accelerators/esrf.html
+++ b/_modules/omc3/model/accelerators/esrf.html
@@ -3,7 +3,7 @@
- omc3.model.accelerators.esrf — omc3 0.14.1 documentation
+ omc3.model.accelerators.esrf — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/accelerators/iota.html b/_modules/omc3/model/accelerators/iota.html
index e4ca936d..71458d18 100644
--- a/_modules/omc3/model/accelerators/iota.html
+++ b/_modules/omc3/model/accelerators/iota.html
@@ -3,7 +3,7 @@
- omc3.model.accelerators.iota — omc3 0.14.1 documentation
+ omc3.model.accelerators.iota — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/accelerators/lhc.html b/_modules/omc3/model/accelerators/lhc.html
index 8e7f0498..b2241820 100644
--- a/_modules/omc3/model/accelerators/lhc.html
+++ b/_modules/omc3/model/accelerators/lhc.html
@@ -3,7 +3,7 @@
- omc3.model.accelerators.lhc — omc3 0.14.1 documentation
+ omc3.model.accelerators.lhc — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
@@ -535,29 +535,6 @@ Source code for omc3.model.accelerators.lhc
LOGGER.info(f"> Driven Tune X [{self.drv_tunes[0]:10.3f}]")
LOGGER.info(f"> Driven Tune Y [{self.drv_tunes[1]:10.3f}]")
- def load_main_seq_madx(self) -> str:
- if self.acc_model_path is not None:
- main_call = f'call, file = \'{self.acc_model_path / "lhc.seq"}\';'
- if self.year.startswith('hl'):
- main_call += f'\ncall, file = \'{self.acc_model_path / "hllhc_sequence.madx"}\';'
- return main_call
- try:
- return _get_call_main_for_year(self.year)
- except AttributeError:
- raise AcceleratorDefinitionError(
- "The accelerator definition is incomplete, mode "
- "has to be specified (--lhcmode option missing?)."
- )
-
- # Private Methods ##########################################################
-
- def _get_triplet_correctors_file(self) -> Path:
- correctors_dir = LHC_DIR / self.correctors_dir / "correctors"
- return correctors_dir / "triplet_correctors.json"
-
- def _get_corrector_elems(self) -> Path:
- correctors_dir = LHC_DIR / self.correctors_dir / "correctors"
- return correctors_dir / f"corrector_elems_b{self.beam}.tfs"
[docs]
@@ -611,32 +588,13 @@ Source code for omc3.model.accelerators.lhc
elif self.beam == 2:
return [i in index for i in self.model.loc["BPMSW.33R8.B2":].index]
- def _get_madx_script_info_comments(self) -> str:
- info_comments = (
- f'title, "LHC Model created by omc3";\n'
- f"! Model directory: {Path(self.model_dir).absolute()}\n"
- f"! Natural Tune X [{self.nat_tunes[0]:10.3f}]\n"
- f"! Natural Tune Y [{self.nat_tunes[1]:10.3f}]\n"
- f"! Best Knowledge: [{'NO' if self.model_best_knowledge is None else 'OK':>10s}]\n"
- )
- if self.excitation == AccExcitationMode.FREE:
- info_comments += f"! Excitation [{'NO':>10s}]\n\n"
- return info_comments
- else:
- info_comments += (
- f"! Excitation [{'ACD' if self.excitation == AccExcitationMode.ACD else 'ADT':>10s}]\n"
- f"! > Driven Tune X [{self.drv_tunes[0]:10.3f}]\n"
- f"! > Driven Tune Y [{self.drv_tunes[1]:10.3f}]\n\n"
- )
- return info_comments
+ # MAD-X Methods ############################################################
[docs]
- def get_base_madx_script(self, best_knowledge: bool = False) -> str:
- ats_md = False
- high_beta = False
+ def get_base_madx_script(self, best_knowledge: bool = False, ats_md: bool = False, high_beta: bool = False) -> str:
madx_script = (
- f"{self._get_madx_script_info_comments()}"
+ f"{self._get_madx_script_info_comments()}\n\n"
f"call, file = '{self.model_dir / MACROS_DIR / GENERAL_MACROS}';\n"
f"call, file = '{self.model_dir / MACROS_DIR / LHC_MACROS}';\n"
)
@@ -650,10 +608,12 @@ Source code for omc3.model.accelerators.lhc
f"call, file = '{self.model_dir / MACROS_DIR / LHC_MACROS_RUN3}';\n"
)
- madx_script += "! ----- Calling Sequence and Optics -----\n"
+ madx_script += "\n! ----- Calling Sequence -----\n"
madx_script += "option, -echo; ! suppress output from base sequence loading to keep the log small\n"
- madx_script += self.load_main_seq_madx()
- madx_script += "\n\n"
+ madx_script += self._get_madx_main_sequence_loading()
+ madx_script += "\noption, echo; ! re-enable output to see the optics settings\n"
+
+ madx_script += "\n! ---- Call optics and other modifiers ----\n"
if self.modifiers is not None:
madx_script += "".join(
@@ -663,6 +623,7 @@ Source code for omc3.model.accelerators.lhc
if self.year in ['2012', '2015', '2016', '2017', '2018', '2021', 'hllhc1.3']:
# backwards compatibility with pre acc-models optics
+ # WARNING: This might override values extracted via the knob-extractor.
madx_script += (
f"\n! ----- Defining Configuration Specifics -----\n"
f"xing_angles = {'1' if self.xing else '0'};\n"
@@ -672,14 +633,13 @@ Source code for omc3.model.accelerators.lhc
f" exec, set_default_crossing_scheme();\n"
f"}}\n"
)
- else:
- madx_script += 'call, file="knobs.madx";\n\n'
madx_script += (
+ "\n! ----- Finalize Sequence -----\n"
"exec, cycle_sequences();\n"
f"use, sequence = LHCB{self.beam};\n"
- f"option, echo;\n"
)
+
if best_knowledge:
# madx_script += f"exec, load_average_error_table({self.energy}, {self.beam});\n"
madx_script += (
@@ -688,6 +648,7 @@ Source code for omc3.model.accelerators.lhc
f"seterr, table=errtab;\n"
f"call, file = '{self.model_dir / B2_SETTINGS_MADX}';\n"
)
+
if high_beta:
madx_script += "exec, high_beta_matcher();\n"
@@ -710,6 +671,39 @@ Source code for omc3.model.accelerators.lhc
return madx_script
+
+ def _get_madx_script_info_comments(self) -> str:
+ info_comments = (
+ f'title, "LHC Model created by omc3";\n'
+ f"! Model directory: {Path(self.model_dir).absolute()}\n"
+ f"! Natural Tune X [{self.nat_tunes[0]:10.3f}]\n"
+ f"! Natural Tune Y [{self.nat_tunes[1]:10.3f}]\n"
+ f"! Best Knowledge: [{'NO' if self.model_best_knowledge is None else 'YES':>10s}]\n"
+ )
+ if self.excitation == AccExcitationMode.FREE:
+ info_comments += f"! Excitation [{'NO':>10s}]\n"
+ else:
+ info_comments += (
+ f"! Excitation [{'ACD' if self.excitation == AccExcitationMode.ACD else 'ADT':>10s}]\n"
+ f"! > Driven Tune X [{self.drv_tunes[0]:10.3f}]\n"
+ f"! > Driven Tune Y [{self.drv_tunes[1]:10.3f}]\n"
+
+ )
+ return info_comments
+
+ def _get_madx_main_sequence_loading(self) -> str:
+ if self.acc_model_path is not None:
+ main_call = f'call, file = \'{self.acc_model_path / "lhc.seq"}\';'
+ if self.year.startswith('hl'):
+ main_call += f'\ncall, file = \'{self.acc_model_path / "hllhc_sequence.madx"}\';'
+ return main_call
+ try:
+ return _get_call_main_for_year(self.year)
+ except AttributeError:
+ raise AcceleratorDefinitionError(
+ "The accelerator definition is incomplete, mode "
+ "has to be specified (--lhcmode option missing?)."
+ )
[docs]
@@ -721,6 +715,8 @@ Source code for omc3.model.accelerators.lhc
return madx_script
+ # Private Methods ##########################################################
+
def _uses_ats_knobs(self) -> bool:
"""
Returns wether the ATS knobs and macros should be used, based on the instance's year.
@@ -738,7 +734,15 @@ Source code for omc3.model.accelerators.lhc
try:
return int(self.year) >= 2022 # self.year is always a string
except ValueError: # if a "hllhc1.x" year is given
- return False
+ return False
+
+ def _get_triplet_correctors_file(self) -> Path:
+ correctors_dir = LHC_DIR / self.correctors_dir / "correctors"
+ return correctors_dir / "triplet_correctors.json"
+
+ def _get_corrector_elems(self) -> Path:
+ correctors_dir = LHC_DIR / self.correctors_dir / "correctors"
+ return correctors_dir / f"corrector_elems_b{self.beam}.tfs"
diff --git a/_modules/omc3/model/accelerators/petra.html b/_modules/omc3/model/accelerators/petra.html
index 846169b6..4eb45c89 100644
--- a/_modules/omc3/model/accelerators/petra.html
+++ b/_modules/omc3/model/accelerators/petra.html
@@ -3,7 +3,7 @@
- omc3.model.accelerators.petra — omc3 0.14.1 documentation
+ omc3.model.accelerators.petra — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/accelerators/ps.html b/_modules/omc3/model/accelerators/ps.html
index b652c5b6..b098d6fb 100644
--- a/_modules/omc3/model/accelerators/ps.html
+++ b/_modules/omc3/model/accelerators/ps.html
@@ -3,7 +3,7 @@
- omc3.model.accelerators.ps — omc3 0.14.1 documentation
+ omc3.model.accelerators.ps — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/accelerators/psbooster.html b/_modules/omc3/model/accelerators/psbooster.html
index d339da0e..7268198d 100644
--- a/_modules/omc3/model/accelerators/psbooster.html
+++ b/_modules/omc3/model/accelerators/psbooster.html
@@ -3,7 +3,7 @@
- omc3.model.accelerators.psbooster — omc3 0.14.1 documentation
+ omc3.model.accelerators.psbooster — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/accelerators/skekb.html b/_modules/omc3/model/accelerators/skekb.html
index f8b3a986..21140cdc 100644
--- a/_modules/omc3/model/accelerators/skekb.html
+++ b/_modules/omc3/model/accelerators/skekb.html
@@ -3,7 +3,7 @@
- omc3.model.accelerators.skekb — omc3 0.14.1 documentation
+ omc3.model.accelerators.skekb — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/manager.html b/_modules/omc3/model/manager.html
index 9088318e..abdbbfb2 100644
--- a/_modules/omc3/model/manager.html
+++ b/_modules/omc3/model/manager.html
@@ -3,7 +3,7 @@
- omc3.model.manager — omc3 0.14.1 documentation
+ omc3.model.manager — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/model_creators/lhc_model_creator.html b/_modules/omc3/model/model_creators/lhc_model_creator.html
index 59a128bb..7cf36ce9 100644
--- a/_modules/omc3/model/model_creators/lhc_model_creator.html
+++ b/_modules/omc3/model/model_creators/lhc_model_creator.html
@@ -3,7 +3,7 @@
- omc3.model.model_creators.lhc_model_creator — omc3 0.14.1 documentation
+ omc3.model.model_creators.lhc_model_creator — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
@@ -215,7 +215,6 @@ Source code for omc3.model.model_creators.lhc_model_creator
This module provides convenience functions for model creation of the ``LHC``.
"""
import logging
-import pathlib
import shutil
from pathlib import Path
from typing import List
@@ -241,11 +240,11 @@ Source code for omc3.model.model_creators.lhc_model_creator
TWISS_ELEMENTS_DAT,
PATHFETCHER, AFSFETCHER, # GITFETCHER, LSAFETCHER,
AFS_ACCELERATOR_MODEL_REPOSITORY,
- MODIFIER_SUBDIR,
+ OPTICS_SUBDIR,
AFS_B2_ERRORS_ROOT,
)
from omc3.model.model_creators.abstract_model_creator import ModelCreator, check_folder_choices
-from omc3.utils import iotools
+from omc3.utils.iotools import get_check_suffix_func, create_dirs
LOGGER = logging.getLogger(__name__)
@@ -263,32 +262,45 @@ Source code for omc3.model.model_creators.lhc_model_creator
class LhcModelCreator(ModelCreator):
acc_model_name = "lhc"
-
-[docs]
+
+[docs]
@classmethod
- def get_options(cls, accel_inst, opt) -> bool:
+ def check_options(cls, accel: Lhc, opt) -> bool:
+ """ Use the fetcher to list choices if requested. """
+
+ # Set the fetcher paths ---
if opt.fetch == PATHFETCHER:
- accel_inst.acc_model_path = Path(opt.path)
+ accel.acc_model_path = Path(opt.path)
+
elif opt.fetch == AFSFETCHER:
- accel_inst.acc_model_path = check_folder_choices(AFS_ACCELERATOR_MODEL_REPOSITORY / cls.acc_model_name,
- "No optics tag (flag --year) given",
- accel_inst.year,
- opt.list_choices,
- lambda path: path.is_dir())
+ # list 'year' choices ---
+ accel.acc_model_path = check_folder_choices(
+ AFS_ACCELERATOR_MODEL_REPOSITORY / cls.acc_model_name,
+ msg="No optics tag (flag --year) given",
+ selection=accel.year,
+ list_choices=opt.list_choices,
+ predicate=Path.is_dir
+ )
else:
- raise AttributeError(f"{accel_inst.NAME} model creation requires one of the following fetchers: "
- f"[{PATHFETCHER}, {AFSFETCHER}]. "
- "Please provide one with the flag `--fetch afs` "
- "or `--fetch path --path PATH`.")
- if accel_inst.acc_model_path is None:
+ raise AttributeError(
+ f"{accel.NAME} model creation requires one of the following fetchers: "
+ f"[{PATHFETCHER}, {AFSFETCHER}]. "
+ "Please provide one with the flag `--fetch afs` "
+ "or `--fetch path --path PATH`."
+ )
+
+ if accel.acc_model_path is None:
return False
+ # list optics choices ---
if opt.list_choices:
- check_folder_choices(accel_inst.acc_model_path / MODIFIER_SUBDIR,
- "No modifier given",
- None,
- True,
- lambda path: path.suffix == ".madx")
+ check_folder_choices(
+ accel.acc_model_path / OPTICS_SUBDIR,
+ msg="No modifier given",
+ selection=None, # TODO: could check if user made valid choice
+ list_choices=opt.list_choices,
+ predicate=get_check_suffix_func(".madx")
+ )
return False
return True
@@ -343,17 +355,13 @@ Source code for omc3.model.model_creators.lhc_model_creator
@classmethod
def prepare_run(cls, accel: Lhc) -> None:
LOGGER.info("preparing run ...")
- if accel.acc_model_path is not None:
- link = Path(accel.model_dir)/accel.REPOSITORY
- target = accel.acc_model_path
- if not link.exists():
- link.absolute().symlink_to(target)
-
+ cls.prepare_symlink(accel)
cls.check_accelerator_instance(accel)
+
LOGGER.debug("Preparing model creation structure")
macros_path = accel.model_dir / MACROS_DIR
LOGGER.info("creating macros dirs")
- iotools.create_dirs(macros_path)
+ create_dirs(macros_path)
LOGGER.debug("Copying macros to model directory")
lib_path = Path(__file__).parent.parent / "madx_macros"
@@ -422,16 +430,16 @@ Source code for omc3.model.model_creators.lhc_model_creator
[docs]
class LhcBestKnowledgeCreator(LhcModelCreator):
EXTRACTED_MQTS_FILENAME: str = "extracted_mqts.str"
- CORRECTIONS_FILENAME: str = "corrections.madx"
-
-[docs]
+
+[docs]
@classmethod
- def get_options(cls, accel_inst, opt) -> bool:
+ def check_options(cls, accel_inst, opt) -> bool:
if accel_inst.list_b2_errors:
errors_dir = AFS_B2_ERRORS_ROOT / f"Beam{accel_inst.beam}"
@@ -440,7 +448,7 @@ Source code for omc3.model.model_creators.lhc_model_creator
print(d.stem)
return False
- return super().get_options(accel_inst, opt)
+ return super().check_options(accel_inst, opt)
@@ -451,11 +459,7 @@ Source code for omc3.model.model_creators.lhc_model_creator
raise AcceleratorDefinitionError(
"Don't set ACD or ADT for best knowledge model.")
- corrections_file = accel.model_dir / \
- cls.CORRECTIONS_FILENAME # existence is tested in madx
-
madx_script = accel.get_base_madx_script(best_knowledge=True)
- madx_script += f"call, file = '{corrections_file}';\n"
mqts_file = accel.model_dir / cls.EXTRACTED_MQTS_FILENAME
if mqts_file.exists():
diff --git a/_modules/omc3/model/model_creators/ps_model_creator.html b/_modules/omc3/model/model_creators/ps_model_creator.html
index 8dd1f8a5..c86c8570 100644
--- a/_modules/omc3/model/model_creators/ps_model_creator.html
+++ b/_modules/omc3/model/model_creators/ps_model_creator.html
@@ -3,7 +3,7 @@
- omc3.model.model_creators.ps_model_creator — omc3 0.14.1 documentation
+ omc3.model.model_creators.ps_model_creator — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model/model_creators/psbooster_model_creator.html b/_modules/omc3/model/model_creators/psbooster_model_creator.html
index 721635a3..6e03fcc5 100644
--- a/_modules/omc3/model/model_creators/psbooster_model_creator.html
+++ b/_modules/omc3/model/model_creators/psbooster_model_creator.html
@@ -3,7 +3,7 @@
- omc3.model.model_creators.psbooster_model_creator — omc3 0.14.1 documentation
+ omc3.model.model_creators.psbooster_model_creator — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/model_creator.html b/_modules/omc3/model_creator.html
index 70cd6b8f..ffd6f36e 100644
--- a/_modules/omc3/model_creator.html
+++ b/_modules/omc3/model_creator.html
@@ -3,7 +3,7 @@
- omc3.model_creator — omc3 0.14.1 documentation
+ omc3.model_creator — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
@@ -215,13 +215,14 @@ Source code for omc3.model_creator
Entrypoint to run the model creator for LHC, PSBooster and PS models.
"""
from pathlib import Path
+from typing import Union
from generic_parser import EntryPointParameters, entrypoint
from omc3.madx_wrapper import run_string
from omc3.model import manager
from omc3.model.accelerators.accelerator import Accelerator
-from omc3.model.constants import JOB_MODEL_MADX_MASK, PATHFETCHER, AFSFETCHER, GITFETCHER, LSAFETCHER, MODIFIER_SUBDIR
+from omc3.model.constants import JOB_MODEL_MADX_MASK, PATHFETCHER, AFSFETCHER, GITFETCHER, LSAFETCHER, OPTICS_SUBDIR
from omc3.model.model_creators.lhc_model_creator import ( # noqa
LhcBestKnowledgeCreator,
LhcCouplingCreator,
@@ -230,7 +231,7 @@ Source code for omc3.model_creator
from omc3.model.model_creators.ps_model_creator import PsModelCreator
from omc3.model.model_creators.psbooster_model_creator import BoosterModelCreator
from omc3.model.model_creators.segment_creator import SegmentCreator
-from omc3.utils.iotools import create_dirs, PathOrStr
+from omc3.utils.iotools import create_dirs, PathOrStr, save_config
from omc3.utils import logging_tools
from omc3.utils.parsertools import print_help, require_param
from generic_parser.tools import silence
@@ -363,6 +364,7 @@ Source code for omc3.model_creator
print_help(_get_params())
return None
+
# proceed to the creator
accel_inst = manager.get_accelerator(accel_opt)
require_param("type", _get_params(), opt)
@@ -373,7 +375,7 @@ Source code for omc3.model_creator
# now that the creator is initialised, we can ask for modifiers that are actually present
# using the fetcher we chose
- if not creator.get_options(accel_inst, opt):
+ if not creator.check_options(accel_inst, opt):
return None
accel_inst.verify_object()
@@ -382,44 +384,47 @@ Source code for omc3.model_creator
# Prepare model-dir output directory
accel_inst.model_dir = Path(opt.outputdir).absolute()
- # adjust modifier paths,
+ # adjust modifier paths, to allow giving only filenames in default directories (e.g. optics)
if accel_inst.modifiers is not None:
accel_inst.modifiers = [_find_modifier(m, accel_inst) for m in accel_inst.modifiers]
# Prepare paths
create_dirs(opt.outputdir)
- (Path(opt.outputdir) / "knobs.madx").touch() # create empty knobs.madx for madx job
creator.prepare_run(accel_inst)
-
+
madx_script = creator.get_madx_script(accel_inst)
# Run madx to create model
run_string(madx_script,
output_file=opt.outputdir / JOB_MODEL_MADX_MASK.format(opt.type),
log_file=opt.logfile,
cwd=opt.outputdir)
+
+ # Save config at the end, to not being written out for each time the choices are listed
+ save_config(Path(opt.outputdir), opt=opt, unknown_opt=accel_opt, script=__file__)
+
# Return accelerator instance
accel_inst.model_dir = opt.outputdir
return accel_inst
-def _find_modifier(modifier, accel_inst: Accelerator):
+def _find_modifier(modifier: Path, accel_inst: Accelerator):
# first case: if modifier exists as is, take it
if modifier.exists():
return modifier
# second case: try if it is already in the output dir
- modifier_path = accel_inst.model_dir / modifier
- if modifier_path.exists():
- return modifier_path.absolute()
+ model_dir_path: Path = accel_inst.model_dir / modifier
+ if model_dir_path.exists():
+ return model_dir_path.absolute()
# and last case, try to find it in the acc-models rep
if accel_inst.acc_model_path is not None:
- modifier_path = accel_inst.acc_model_path / MODIFIER_SUBDIR / modifier
- if modifier_path.exists():
- return modifier_path.absolute()
+ optics_path: Path = accel_inst.acc_model_path / OPTICS_SUBDIR / modifier
+ if optics_path.exists():
+ return optics_path.absolute()
- raise FileNotFoundError(f"couldn't find modifier {modifier}. Tried in {accel_inst.model_dir} and {accel_inst.acc_model_path}/{MODIFIER_SUBDIR}")
+ raise FileNotFoundError(f"couldn't find modifier {modifier}. Tried in {accel_inst.model_dir} and {accel_inst.acc_model_path}/{OPTICS_SUBDIR}")
if __name__ == "__main__":
diff --git a/_modules/omc3/optics_measurements/beta_from_amplitude.html b/_modules/omc3/optics_measurements/beta_from_amplitude.html
index b5737320..177d9fcb 100644
--- a/_modules/omc3/optics_measurements/beta_from_amplitude.html
+++ b/_modules/omc3/optics_measurements/beta_from_amplitude.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.beta_from_amplitude — omc3 0.14.1 documentation
+ omc3.optics_measurements.beta_from_amplitude — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/beta_from_phase.html b/_modules/omc3/optics_measurements/beta_from_phase.html
index ba8193b0..cf59f6e9 100644
--- a/_modules/omc3/optics_measurements/beta_from_phase.html
+++ b/_modules/omc3/optics_measurements/beta_from_phase.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.beta_from_phase — omc3 0.14.1 documentation
+ omc3.optics_measurements.beta_from_phase — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/data_models.html b/_modules/omc3/optics_measurements/data_models.html
index 60e9add0..05828ccc 100644
--- a/_modules/omc3/optics_measurements/data_models.html
+++ b/_modules/omc3/optics_measurements/data_models.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.data_models — omc3 0.14.1 documentation
+ omc3.optics_measurements.data_models — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/dispersion.html b/_modules/omc3/optics_measurements/dispersion.html
index f953a8fe..30a87b1a 100644
--- a/_modules/omc3/optics_measurements/dispersion.html
+++ b/_modules/omc3/optics_measurements/dispersion.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.dispersion — omc3 0.14.1 documentation
+ omc3.optics_measurements.dispersion — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/dpp.html b/_modules/omc3/optics_measurements/dpp.html
index e0ee2168..89c07c0b 100644
--- a/_modules/omc3/optics_measurements/dpp.html
+++ b/_modules/omc3/optics_measurements/dpp.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.dpp — omc3 0.14.1 documentation
+ omc3.optics_measurements.dpp — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/interaction_point.html b/_modules/omc3/optics_measurements/interaction_point.html
index dc8c9bd6..71d03017 100644
--- a/_modules/omc3/optics_measurements/interaction_point.html
+++ b/_modules/omc3/optics_measurements/interaction_point.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.interaction_point — omc3 0.14.1 documentation
+ omc3.optics_measurements.interaction_point — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/kick.html b/_modules/omc3/optics_measurements/kick.html
index 20162b3a..55b3a2d3 100644
--- a/_modules/omc3/optics_measurements/kick.html
+++ b/_modules/omc3/optics_measurements/kick.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.kick — omc3 0.14.1 documentation
+ omc3.optics_measurements.kick — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/measure_optics.html b/_modules/omc3/optics_measurements/measure_optics.html
index 14870608..0f3b6cb1 100644
--- a/_modules/omc3/optics_measurements/measure_optics.html
+++ b/_modules/omc3/optics_measurements/measure_optics.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.measure_optics — omc3 0.14.1 documentation
+ omc3.optics_measurements.measure_optics — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/phase.html b/_modules/omc3/optics_measurements/phase.html
index 829dcdf3..3ad5ab10 100644
--- a/_modules/omc3/optics_measurements/phase.html
+++ b/_modules/omc3/optics_measurements/phase.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.phase — omc3 0.14.1 documentation
+ omc3.optics_measurements.phase — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/rdt.html b/_modules/omc3/optics_measurements/rdt.html
index fd2f44c3..b196e783 100644
--- a/_modules/omc3/optics_measurements/rdt.html
+++ b/_modules/omc3/optics_measurements/rdt.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.rdt — omc3 0.14.1 documentation
+ omc3.optics_measurements.rdt — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/toolbox.html b/_modules/omc3/optics_measurements/toolbox.html
index 5dafd557..a462d2e4 100644
--- a/_modules/omc3/optics_measurements/toolbox.html
+++ b/_modules/omc3/optics_measurements/toolbox.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.toolbox — omc3 0.14.1 documentation
+ omc3.optics_measurements.toolbox — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/optics_measurements/tune.html b/_modules/omc3/optics_measurements/tune.html
index b278691a..412fbcad 100644
--- a/_modules/omc3/optics_measurements/tune.html
+++ b/_modules/omc3/optics_measurements/tune.html
@@ -3,7 +3,7 @@
- omc3.optics_measurements.tune — omc3 0.14.1 documentation
+ omc3.optics_measurements.tune — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/optics_measurements/utils.html b/_modules/omc3/plotting/optics_measurements/utils.html
index 04962653..379f49b1 100644
--- a/_modules/omc3/plotting/optics_measurements/utils.html
+++ b/_modules/omc3/plotting/optics_measurements/utils.html
@@ -3,7 +3,7 @@
- omc3.plotting.optics_measurements.utils — omc3 0.14.1 documentation
+ omc3.plotting.optics_measurements.utils — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/plot_amplitude_detuning.html b/_modules/omc3/plotting/plot_amplitude_detuning.html
index 1140af1f..31b763c5 100644
--- a/_modules/omc3/plotting/plot_amplitude_detuning.html
+++ b/_modules/omc3/plotting/plot_amplitude_detuning.html
@@ -3,7 +3,7 @@
- omc3.plotting.plot_amplitude_detuning — omc3 0.14.1 documentation
+ omc3.plotting.plot_amplitude_detuning — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/plot_bbq.html b/_modules/omc3/plotting/plot_bbq.html
index f94b7255..9197ec8c 100644
--- a/_modules/omc3/plotting/plot_bbq.html
+++ b/_modules/omc3/plotting/plot_bbq.html
@@ -3,7 +3,7 @@
- omc3.plotting.plot_bbq — omc3 0.14.1 documentation
+ omc3.plotting.plot_bbq — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/plot_checked_corrections.html b/_modules/omc3/plotting/plot_checked_corrections.html
index 9ea60de3..24df115c 100644
--- a/_modules/omc3/plotting/plot_checked_corrections.html
+++ b/_modules/omc3/plotting/plot_checked_corrections.html
@@ -3,7 +3,7 @@
- omc3.plotting.plot_checked_corrections — omc3 0.14.1 documentation
+ omc3.plotting.plot_checked_corrections — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/plot_optics_measurements.html b/_modules/omc3/plotting/plot_optics_measurements.html
index 7f80455d..7153019d 100644
--- a/_modules/omc3/plotting/plot_optics_measurements.html
+++ b/_modules/omc3/plotting/plot_optics_measurements.html
@@ -3,7 +3,7 @@
- omc3.plotting.plot_optics_measurements — omc3 0.14.1 documentation
+ omc3.plotting.plot_optics_measurements — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/plot_spectrum.html b/_modules/omc3/plotting/plot_spectrum.html
index da0f508e..84768bb4 100644
--- a/_modules/omc3/plotting/plot_spectrum.html
+++ b/_modules/omc3/plotting/plot_spectrum.html
@@ -3,7 +3,7 @@
- omc3.plotting.plot_spectrum — omc3 0.14.1 documentation
+ omc3.plotting.plot_spectrum — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/plot_tfs.html b/_modules/omc3/plotting/plot_tfs.html
index a6b0f1b2..e115b3aa 100644
--- a/_modules/omc3/plotting/plot_tfs.html
+++ b/_modules/omc3/plotting/plot_tfs.html
@@ -3,7 +3,7 @@
- omc3.plotting.plot_tfs — omc3 0.14.1 documentation
+ omc3.plotting.plot_tfs — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/spectrum/stem.html b/_modules/omc3/plotting/spectrum/stem.html
index 95e7aaf5..4ae6e198 100644
--- a/_modules/omc3/plotting/spectrum/stem.html
+++ b/_modules/omc3/plotting/spectrum/stem.html
@@ -3,7 +3,7 @@
- omc3.plotting.spectrum.stem — omc3 0.14.1 documentation
+ omc3.plotting.spectrum.stem — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/spectrum/utils.html b/_modules/omc3/plotting/spectrum/utils.html
index a2a673f4..9b971ebb 100644
--- a/_modules/omc3/plotting/spectrum/utils.html
+++ b/_modules/omc3/plotting/spectrum/utils.html
@@ -3,7 +3,7 @@
- omc3.plotting.spectrum.utils — omc3 0.14.1 documentation
+ omc3.plotting.spectrum.utils — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/spectrum/waterfall.html b/_modules/omc3/plotting/spectrum/waterfall.html
index f6f28cf7..574f377d 100644
--- a/_modules/omc3/plotting/spectrum/waterfall.html
+++ b/_modules/omc3/plotting/spectrum/waterfall.html
@@ -3,7 +3,7 @@
- omc3.plotting.spectrum.waterfall — omc3 0.14.1 documentation
+ omc3.plotting.spectrum.waterfall — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/utils/annotations.html b/_modules/omc3/plotting/utils/annotations.html
index 4ac7ee17..0f1f2c88 100644
--- a/_modules/omc3/plotting/utils/annotations.html
+++ b/_modules/omc3/plotting/utils/annotations.html
@@ -3,7 +3,7 @@
- omc3.plotting.utils.annotations — omc3 0.14.1 documentation
+ omc3.plotting.utils.annotations — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/utils/colors.html b/_modules/omc3/plotting/utils/colors.html
index f4416cbe..3d69551f 100644
--- a/_modules/omc3/plotting/utils/colors.html
+++ b/_modules/omc3/plotting/utils/colors.html
@@ -3,7 +3,7 @@
- omc3.plotting.utils.colors — omc3 0.14.1 documentation
+ omc3.plotting.utils.colors — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/utils/lines.html b/_modules/omc3/plotting/utils/lines.html
index 186bb0ce..57d53aa0 100644
--- a/_modules/omc3/plotting/utils/lines.html
+++ b/_modules/omc3/plotting/utils/lines.html
@@ -3,7 +3,7 @@
- omc3.plotting.utils.lines — omc3 0.14.1 documentation
+ omc3.plotting.utils.lines — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/utils/style.html b/_modules/omc3/plotting/utils/style.html
index 6bdd9910..d32c9ea2 100644
--- a/_modules/omc3/plotting/utils/style.html
+++ b/_modules/omc3/plotting/utils/style.html
@@ -3,7 +3,7 @@
- omc3.plotting.utils.style — omc3 0.14.1 documentation
+ omc3.plotting.utils.style — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/plotting/utils/windows.html b/_modules/omc3/plotting/utils/windows.html
index bf4105df..05330437 100644
--- a/_modules/omc3/plotting/utils/windows.html
+++ b/_modules/omc3/plotting/utils/windows.html
@@ -3,7 +3,7 @@
- omc3.plotting.utils.windows — omc3 0.14.1 documentation
+ omc3.plotting.utils.windows — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/response_creator.html b/_modules/omc3/response_creator.html
index 9ca41458..fdabc656 100644
--- a/_modules/omc3/response_creator.html
+++ b/_modules/omc3/response_creator.html
@@ -3,7 +3,7 @@
- omc3.response_creator — omc3 0.14.1 documentation
+ omc3.response_creator — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
@@ -267,6 +267,7 @@ Source code for omc3.response_creator
"""
+from pathlib import Path
from typing import Dict
import pandas as pd
@@ -278,7 +279,7 @@ Source code for omc3.response_creator
from omc3.global_correction import CORRECTION_DEFAULTS, OPTICS_PARAMS_CHOICES
from omc3.model import manager
from omc3.utils import logging_tools
-from omc3.utils.iotools import PathOrStr
+from omc3.utils.iotools import PathOrStr, save_config
LOG = logging_tools.get_logger(__name__)
@@ -326,6 +327,9 @@ Source code for omc3.response_creator
The response matrices can be either created by response_madx or TwissResponse.
"""
LOG.info("Creating response.")
+ if opt.outfile_path is not None:
+ save_config(Path(opt.outfile_path).parent, opt=opt, unknown_opt=other_opt, script=__file__)
+
accel_inst = manager.get_accelerator(other_opt)
if opt.creator == "madx":
diff --git a/_modules/omc3/run_kmod.html b/_modules/omc3/run_kmod.html
index c5263ab6..1a5da816 100644
--- a/_modules/omc3/run_kmod.html
+++ b/_modules/omc3/run_kmod.html
@@ -3,7 +3,7 @@
- omc3.run_kmod — omc3 0.14.1 documentation
+ omc3.run_kmod — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/scripts/betabeatsrc_output_converter.html b/_modules/omc3/scripts/betabeatsrc_output_converter.html
index 5a86f92e..100c6a51 100644
--- a/_modules/omc3/scripts/betabeatsrc_output_converter.html
+++ b/_modules/omc3/scripts/betabeatsrc_output_converter.html
@@ -3,7 +3,7 @@
- omc3.scripts.betabeatsrc_output_converter — omc3 0.14.1 documentation
+ omc3.scripts.betabeatsrc_output_converter — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/scripts/fake_measurement_from_model.html b/_modules/omc3/scripts/fake_measurement_from_model.html
index e6e45713..d6957876 100644
--- a/_modules/omc3/scripts/fake_measurement_from_model.html
+++ b/_modules/omc3/scripts/fake_measurement_from_model.html
@@ -3,7 +3,7 @@
- omc3.scripts.fake_measurement_from_model — omc3 0.14.1 documentation
+ omc3.scripts.fake_measurement_from_model — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/scripts/linfile_clean.html b/_modules/omc3/scripts/linfile_clean.html
index 30273a80..7bbe9363 100644
--- a/_modules/omc3/scripts/linfile_clean.html
+++ b/_modules/omc3/scripts/linfile_clean.html
@@ -3,7 +3,7 @@
- omc3.scripts.linfile_clean — omc3 0.14.1 documentation
+ omc3.scripts.linfile_clean — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/scripts/merge_kmod_results.html b/_modules/omc3/scripts/merge_kmod_results.html
index 0415a43a..effcbbcf 100644
--- a/_modules/omc3/scripts/merge_kmod_results.html
+++ b/_modules/omc3/scripts/merge_kmod_results.html
@@ -3,7 +3,7 @@
- omc3.scripts.merge_kmod_results — omc3 0.14.1 documentation
+ omc3.scripts.merge_kmod_results — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/tbt_converter.html b/_modules/omc3/tbt_converter.html
index 948bb9dd..1cab533a 100644
--- a/_modules/omc3/tbt_converter.html
+++ b/_modules/omc3/tbt_converter.html
@@ -3,7 +3,7 @@
- omc3.tbt_converter — omc3 0.14.1 documentation
+ omc3.tbt_converter — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/tune_analysis/bbq_tools.html b/_modules/omc3/tune_analysis/bbq_tools.html
index a5bf917f..cfbb00d4 100644
--- a/_modules/omc3/tune_analysis/bbq_tools.html
+++ b/_modules/omc3/tune_analysis/bbq_tools.html
@@ -3,7 +3,7 @@
- omc3.tune_analysis.bbq_tools — omc3 0.14.1 documentation
+ omc3.tune_analysis.bbq_tools — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/tune_analysis/constants.html b/_modules/omc3/tune_analysis/constants.html
index 59cd1cee..7c999b40 100644
--- a/_modules/omc3/tune_analysis/constants.html
+++ b/_modules/omc3/tune_analysis/constants.html
@@ -3,7 +3,7 @@
- omc3.tune_analysis.constants — omc3 0.14.1 documentation
+ omc3.tune_analysis.constants — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/tune_analysis/fitting_tools.html b/_modules/omc3/tune_analysis/fitting_tools.html
index 008745c4..795823c8 100644
--- a/_modules/omc3/tune_analysis/fitting_tools.html
+++ b/_modules/omc3/tune_analysis/fitting_tools.html
@@ -3,7 +3,7 @@
- omc3.tune_analysis.fitting_tools — omc3 0.14.1 documentation
+ omc3.tune_analysis.fitting_tools — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/tune_analysis/kick_file_modifiers.html b/_modules/omc3/tune_analysis/kick_file_modifiers.html
index 4a5577ca..35f86fd2 100644
--- a/_modules/omc3/tune_analysis/kick_file_modifiers.html
+++ b/_modules/omc3/tune_analysis/kick_file_modifiers.html
@@ -3,7 +3,7 @@
- omc3.tune_analysis.kick_file_modifiers — omc3 0.14.1 documentation
+ omc3.tune_analysis.kick_file_modifiers — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/tune_analysis/timber_extract.html b/_modules/omc3/tune_analysis/timber_extract.html
index 85efc8fe..87950be9 100644
--- a/_modules/omc3/tune_analysis/timber_extract.html
+++ b/_modules/omc3/tune_analysis/timber_extract.html
@@ -3,7 +3,7 @@
- omc3.tune_analysis.timber_extract — omc3 0.14.1 documentation
+ omc3.tune_analysis.timber_extract — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/utils/contexts.html b/_modules/omc3/utils/contexts.html
index 33a63050..90afca87 100644
--- a/_modules/omc3/utils/contexts.html
+++ b/_modules/omc3/utils/contexts.html
@@ -3,7 +3,7 @@
- omc3.utils.contexts — omc3 0.14.1 documentation
+ omc3.utils.contexts — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/utils/iotools.html b/_modules/omc3/utils/iotools.html
index d479cd4d..f99b565f 100644
--- a/_modules/omc3/utils/iotools.html
+++ b/_modules/omc3/utils/iotools.html
@@ -3,7 +3,7 @@
- omc3.utils.iotools — omc3 0.14.1 documentation
+ omc3.utils.iotools — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
@@ -219,7 +219,7 @@ Source code for omc3.utils.iotools
import shutil
import sys
from pathlib import Path
-from typing import Any, Union
+from typing import Any, Callable, Union
from generic_parser.entry_datatypes import get_instance_faker_meta, get_multi_class
from generic_parser.entrypoint_parser import save_options_to_config
@@ -410,6 +410,24 @@ Source code for omc3.utils.iotools
+
+[docs]
+def replace_in_path(path: Path, old: Union[Path, str], new: Union[Path, str]) -> Path:
+ """ Replace a part of a path with a new path.
+ Useful for example to replace the original path with a path to a symlink or vice versa.
+
+ Args:
+ path (Path): Path object to replace the subpath in
+ old (Union[Path, str]): Subpath to be replaced
+ new (Union[Path, str]): Subpath to replace with
+
+ Returns:
+ Path: New Path object with the replacement in.
+ """
+ return Path(str(path).replace(str(old), str(new)))
+
+
+
[docs]
def remove_none_dict_entries(dict_: dict) -> dict:
@@ -468,6 +486,26 @@ Source code for omc3.utils.iotools
unknown=unknown_opt
)
+
+
+
+[docs]
+def always_true(*args, **kwargs) -> bool:
+ """ A function that is always True. """
+ return True
+
+
+
+
+[docs]
+def get_check_suffix_func(suffix: str) -> Callable[[Path],bool]:
+ """ Returns a function that checks the suffix of a given path agains
+ the suffix. """
+ def check_suffix(path: Path) -> bool:
+ return path.suffix == suffix
+ return check_suffix
+
+
diff --git a/_modules/omc3/utils/logging_tools.html b/_modules/omc3/utils/logging_tools.html
index 0e8a3b9a..3938f73a 100644
--- a/_modules/omc3/utils/logging_tools.html
+++ b/_modules/omc3/utils/logging_tools.html
@@ -3,7 +3,7 @@
- omc3.utils.logging_tools — omc3 0.14.1 documentation
+ omc3.utils.logging_tools — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/utils/mock.html b/_modules/omc3/utils/mock.html
index 2b09b0d2..29ce3f89 100644
--- a/_modules/omc3/utils/mock.html
+++ b/_modules/omc3/utils/mock.html
@@ -3,7 +3,7 @@
- omc3.utils.mock — omc3 0.14.1 documentation
+ omc3.utils.mock — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/utils/outliers.html b/_modules/omc3/utils/outliers.html
index ce97d6d3..60262b56 100644
--- a/_modules/omc3/utils/outliers.html
+++ b/_modules/omc3/utils/outliers.html
@@ -3,7 +3,7 @@
- omc3.utils.outliers — omc3 0.14.1 documentation
+ omc3.utils.outliers — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/utils/stats.html b/_modules/omc3/utils/stats.html
index 27b15590..76774aae 100644
--- a/_modules/omc3/utils/stats.html
+++ b/_modules/omc3/utils/stats.html
@@ -3,7 +3,7 @@
- omc3.utils.stats — omc3 0.14.1 documentation
+ omc3.utils.stats — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_modules/omc3/utils/time_tools.html b/_modules/omc3/utils/time_tools.html
index 8fadbdc8..d9fb0042 100644
--- a/_modules/omc3/utils/time_tools.html
+++ b/_modules/omc3/utils/time_tools.html
@@ -3,7 +3,7 @@
- omc3.utils.time_tools — omc3 0.14.1 documentation
+ omc3.utils.time_tools — omc3 0.15.0 documentation
@@ -15,7 +15,7 @@
-
+
diff --git a/_static/documentation_options.js b/_static/documentation_options.js
index 5c726b82..618d3626 100644
--- a/_static/documentation_options.js
+++ b/_static/documentation_options.js
@@ -1,5 +1,5 @@
const DOCUMENTATION_OPTIONS = {
- VERSION: '0.14.1',
+ VERSION: '0.15.0',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
BUILDER: 'html',
diff --git a/entrypoints/analysis.html b/entrypoints/analysis.html
index 10b35dad..9b5bd607 100644
--- a/entrypoints/analysis.html
+++ b/entrypoints/analysis.html
@@ -4,7 +4,7 @@
- Analysis — omc3 0.14.1 documentation
+ Analysis — omc3 0.15.0 documentation
@@ -16,7 +16,7 @@
-
+
diff --git a/entrypoints/correction.html b/entrypoints/correction.html
index 50cc3cf1..a7aa81d2 100644
--- a/entrypoints/correction.html
+++ b/entrypoints/correction.html
@@ -4,7 +4,7 @@
- Correction — omc3 0.14.1 documentation
+ Correction — omc3 0.15.0 documentation
@@ -16,7 +16,7 @@
-
+
diff --git a/entrypoints/other.doctree b/entrypoints/other.doctree
index 241407c6bb9b471735fa6d0d8f29ce9de15e3c3d..f4e2b9254d80d8ae3ad0e99231e0bd1dc2a2d9e8 100644
GIT binary patch
delta 13135
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
CmU-3y
delta 13478
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
hj|8M%SAAW5p;9`RG)tui!
- Other — omc3 0.14.1 documentation
+ Other — omc3 0.15.0 documentation
@@ -16,7 +16,7 @@
-
+
@@ -359,7 +359,6 @@ Knob Extractorknobs.madx
state:
diff --git a/entrypoints/plotting.html b/entrypoints/plotting.html
index 1a3d0fb1..fecabd2b 100644
--- a/entrypoints/plotting.html
+++ b/entrypoints/plotting.html
@@ -4,7 +4,7 @@
- Plotting — omc3 0.14.1 documentation
+ Plotting — omc3 0.15.0 documentation
@@ -16,7 +16,7 @@
-
+
diff --git a/entrypoints/scripts.html b/entrypoints/scripts.html
index 737cdf91..1b62b810 100644
--- a/entrypoints/scripts.html
+++ b/entrypoints/scripts.html
@@ -4,7 +4,7 @@
- Scripts — omc3 0.14.1 documentation
+ Scripts — omc3 0.15.0 documentation
@@ -16,7 +16,7 @@
-
+
diff --git a/environment.pickle b/environment.pickle
index 76e9b9762325e1071af960bf4810b77489bb219a..c0eab5110b022b1cfd742efe53a0e28c7d879852 100644
GIT binary patch
delta 543535
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