diff --git a/examples/compare_measurement_setups.py b/examples/compare_measurement_setups.py index 4889185..689149a 100644 --- a/examples/compare_measurement_setups.py +++ b/examples/compare_measurement_setups.py @@ -29,7 +29,7 @@ # Operating points of interest FREQS = np.linspace(1e5, 1e6, 5) # Frequency in Hz -TEMPS = [50, 60, 70] # Temperature in °C +TEMPS = [60] # Temperature in °C FLUX_DENSITIES = np.linspace(0.025, 0.15, 5) # Flux density in T # Materials to compare @@ -45,16 +45,29 @@ color=colors().gtruth, marker="x" ), - "N49_LEA": ComplexPermeabilityPlotConfig( + "N49_LEA_probe_1": ComplexPermeabilityPlotConfig( mat_cfg=ComplexPermeabilityConfig( material=mdb.Material.N49, setup=mdb.DataSource.LEA_MTB, - pv_fit_function=mdb.FitFunction.enhancedSteinmetz + pv_fit_function=mdb.FitFunction.enhancedSteinmetz, + probe_codes=["65Y"] ), enabled=True, - label="N49 (LEA-MTB)", + label="N49 (LEA-MTB) (65Y)", color=colors().compare1, marker="*" + ), + "N49_LEA_probe_2": ComplexPermeabilityPlotConfig( + mat_cfg=ComplexPermeabilityConfig( + material=mdb.Material.N49, + setup=mdb.DataSource.LEA_MTB, + pv_fit_function=mdb.FitFunction.enhancedSteinmetz, + probe_codes=["R16x9.6x6.3"] + ), + enabled=True, + label="N49 (LEA-MTB) (R16x9.6x6.3)", + color=colors().compare2, + marker="x" ) } @@ -83,7 +96,8 @@ logging.info(f"Fitting permeability |μ| for: {cfg.label} ({cfg.mat_cfg.setup.name})") material = mdb_data.get_complex_permeability(material=cfg.mat_cfg.material, data_source=cfg.mat_cfg.setup, - pv_fit_function=cfg.mat_cfg.pv_fit_function) + pv_fit_function=cfg.mat_cfg.pv_fit_function, + probe_codes=cfg.mat_cfg.probe_codes) material.fit_permeability_magnitude() col_name = f"mu_abs_{key}" @@ -114,7 +128,8 @@ logging.info(f"Fitting power loss for: {cfg.label} ({cfg.mat_cfg.setup.name})") material = mdb_data.get_complex_permeability(material=cfg.mat_cfg.material, data_source=cfg.mat_cfg.setup, - pv_fit_function=cfg.mat_cfg.pv_fit_function) + pv_fit_function=cfg.mat_cfg.pv_fit_function, + probe_codes=cfg.mat_cfg.probe_codes) material.fit_losses() col_name = f"pv_{key}" diff --git a/materialdatabase/meta/data_classes.py b/materialdatabase/meta/data_classes.py index 849742b..a5ac1ae 100644 --- a/materialdatabase/meta/data_classes.py +++ b/materialdatabase/meta/data_classes.py @@ -11,6 +11,7 @@ class ComplexPermeabilityConfig: material: Material setup: DataSource pv_fit_function: FitFunction + probe_codes: None | list[str] = None @dataclass diff --git a/materialdatabase/processing/complex_permeability.py b/materialdatabase/processing/complex_permeability.py index 7d6355f..e15e564 100644 --- a/materialdatabase/processing/complex_permeability.py +++ b/materialdatabase/processing/complex_permeability.py @@ -190,7 +190,7 @@ def fit_losses(self, mu_abs = np.sqrt(fit_data["mu_real"] ** 2 + fit_data["mu_imag"] ** 2) pv = pv_mag(fit_data["f"].to_numpy(), - -fit_data["mu_imag"].to_numpy() * mu_0, + -fit_data["mu_imag"].to_numpy() * mu_0, # type: ignore fit_data["b"].to_numpy() / mu_abs / mu_0) popt_pv, pcov_pv = curve_fit(log_pv_fit_function, (fit_data["f"], diff --git a/materialdatabase/processing/data_structure.py b/materialdatabase/processing/data_structure.py index cc3cd26..3314792 100644 --- a/materialdatabase/processing/data_structure.py +++ b/materialdatabase/processing/data_structure.py @@ -202,14 +202,19 @@ def plot_available_data(self, exclude_dc_bias: bool = True) -> None: logger.info(available_data) self.plot_boolean_dataframe(available_data) - def get_complex_data_set(self, material: Material, data_source: DataSource, data_type: ComplexDataType) -> pd.DataFrame: + def get_complex_data_set(self, + material: Material, + data_source: DataSource, + data_type: ComplexDataType, + probe_codes: list[str] | None = None) -> pd.DataFrame: """ Get a complex data set of a certain material, data type and measurement. :param material: e.g. mdb.Material.N95 :param data_source: e.g. mdb.MeasurementSetup.TDK_MDT :param data_type: e.g. mdb.ComplexDataType.complex_permeability - :return: + :param probe_codes: None -> all probe codes available or select probes via ['Y3F', '7U8'], e.g. + :return: pd.DataFrame with complex data set """ if data_type not in {item.value for item in ComplexDataType}: raise ValueError(f"{data_type} is no valid complex data type.\n" @@ -219,40 +224,54 @@ def get_complex_data_set(self, material: Material, data_source: DataSource, data if path2file not in self.all_paths: raise ValueError(f"The specified data file with path {path2file} does not exist.") else: - logger.info(f"Complex data read from {path2file}.") - return pd.read_csv(path2file, sep=",") + df_available = pd.read_csv(path2file, sep=",") + if probe_codes is None: + logger.info(f"Complex data read from {path2file}.") + return df_available + else: + logger.info(f"Complex data read from {path2file}" + f"for the probe codes {probe_codes}.") + return df_available.loc[df_available["probe"].isin(probe_codes)] def get_complex_permeability(self, material: Material, data_source: DataSource, - pv_fit_function: FitFunction) -> ComplexPermeability: + pv_fit_function: FitFunction, + probe_codes: list[str] | None = None) -> ComplexPermeability: """ Get a complex permeability data set of a certain material and measurement type. :param material: e.g. mdb.Material.N95 :param data_source: e.g. mdb.MeasurementSetup.TDK_MDT :param pv_fit_function: + :param probe_codes: None -> all probe codes available or select probes via ['Y3F', '7U8'], e.g. :return: """ dataset = self.get_complex_data_set( material=material, data_source=data_source, - data_type=ComplexDataType.complex_permeability + data_type=ComplexDataType.complex_permeability, + probe_codes=probe_codes ) return ComplexPermeability(dataset, material, data_source, pv_fit_function) - def get_complex_permittivity(self, material: Material, data_source: DataSource) -> ComplexPermittivity: + def get_complex_permittivity(self, + material: Material, + data_source: DataSource, + probe_codes: list[str] | None = None) -> ComplexPermittivity: """ Get a complex permittivity data set of a certain material and measurement type. :param material: e.g. mdb.Material.N95 :param data_source: e.g. mdb.MeasurementSetup.LEA_MTB + :param probe_codes: None -> all probe codes available or select probes via ['Y3F', '7U8'], e.g. :return: """ dataset = self.get_complex_data_set( material=material, data_source=data_source, - data_type=ComplexDataType.complex_permittivity + data_type=ComplexDataType.complex_permittivity, + probe_codes=probe_codes ) return ComplexPermittivity(dataset, material, data_source)