diff --git a/chem_spectra/controller/helper/share.py b/chem_spectra/controller/helper/share.py index 684ac6f8..3ae0ff55 100644 --- a/chem_spectra/controller/helper/share.py +++ b/chem_spectra/controller/helper/share.py @@ -107,6 +107,7 @@ def extract_params(request): list_file_names = request.form.getlist('list_file_names[]') data_type_mapping = request.form.get('data_type_mapping', default='') detector = request.form.get('detector', default=None) + dsc_meta_data = request.form.get('dsc_meta_data', default=None) params = { 'peaks_str': request.form.get('peaks_str', default=None), @@ -131,6 +132,7 @@ def extract_params(request): 'axesUnits': axesUnits, 'data_type_mapping': data_type_mapping, 'detector': detector, + 'dsc_meta_data': dsc_meta_data, } has_params = ( params.get('peaks_str') or diff --git a/chem_spectra/lib/composer/ni.py b/chem_spectra/lib/composer/ni.py index 64a33be6..520018bd 100644 --- a/chem_spectra/lib/composer/ni.py +++ b/chem_spectra/lib/composer/ni.py @@ -130,6 +130,22 @@ def __gen_header_cyclic_voltammetry(self): '$$ === CHEMSPECTRA CYCLIC VOLTAMMETRY ===\n', ] + def __gen_header_user_input_meta_data(self): + if self.core.is_dsc: + dsc_meta_data = self.core.params.get('dsc_meta_data', None) + melting_point, tg_value = '', '' + if dsc_meta_data is not None: + melting_point = dsc_meta_data.get('meltingPoint', '') + tg_value = dsc_meta_data.get('tg', '') + else: + melting_point = self.core.dic.get('MELTINGPOINT', '') + tg_value = self.core.dic.get('TG', '') + return [ + f'##MELTINGPOINT={melting_point}\n', + f'##TG={tg_value}\n' + ] + return [] + def __get_xy_of_peak(self, peak): if peak is None: return '', '' @@ -201,6 +217,7 @@ def __compose(self): meta.extend(self.gen_headers_root()) meta.extend(self.__gen_headers_spectrum_orig()) + meta.extend(self.__gen_header_user_input_meta_data()) meta.extend(self.gen_spectrum_orig()) meta.extend(self.__gen_headers_im()) meta.extend(self.__gen_headers_integration()) @@ -230,35 +247,12 @@ def __compose(self): return meta def __plt_nbins(self): - typ = self.core.typ - if 'NMR' == typ: - return 20 - elif 'INFRARED' == typ: - return 20 - elif 'RAMAN' == typ: - return 20 - elif 'UVVIS' == typ: - return 20 - elif 'THERMOGRAVIMETRIC ANALYSIS' == typ: - return 20 - elif 'MS' == typ: - return 20 return 20 def __fakto(self): typ = self.core.typ - if 'NMR' == typ: - return 1 - elif 'MS' == typ: - return 1 - elif 'INFRARED' == typ: + if 'INFRARED' == typ: return -1 - elif 'RAMAN' == typ: - return 1 - elif 'UVVIS' == typ: - return 1 - elif 'THERMOGRAVIMETRIC ANALYSIS' == typ: - return 1 return 1 def tf_img(self): diff --git a/chem_spectra/lib/converter/jcamp/base.py b/chem_spectra/lib/converter/jcamp/base.py index 846c3610..78621ecd 100644 --- a/chem_spectra/lib/converter/jcamp/base.py +++ b/chem_spectra/lib/converter/jcamp/base.py @@ -34,6 +34,7 @@ def __init__(self, path, params=False): self.is_emissions = self.__is_emissions() self.is_dls_acf = self.__is_dls_acf() self.is_dls_intensity = self.__is_dls_intensity() + self.is_dsc = self.__is_dsc() self.non_nmr = self.__non_nmr() self.ncl = self.__ncl() self.simu_peaks = self.__read_simu_peaks() @@ -156,6 +157,9 @@ def __is_dls_acf(self): def __is_dls_intensity(self): return self.typ in ['DLS intensity'] + + def __is_dsc(self): + return self.typ in ['DIFFERENTIAL SCANNING CALORIMETRY'] def __ncl(self): try: diff --git a/chem_spectra/lib/converter/jcamp/data_type.json b/chem_spectra/lib/converter/jcamp/data_type.json index bd90604f..8cccc47f 100644 --- a/chem_spectra/lib/converter/jcamp/data_type.json +++ b/chem_spectra/lib/converter/jcamp/data_type.json @@ -14,6 +14,7 @@ "SORPTION-DESORPTION MEASUREMENT": ["SORPTION-DESORPTION MEASUREMENT"], "Emissions": ["Emissions", "EMISSIONS", "FLUORESCENCE SPECTRUM", "FL SPECTRUM"], "DLS ACF": ["DLS ACF"], - "DLS intensity": ["DLS INTENSITY", "DLS intensity"] + "DLS intensity": ["DLS INTENSITY", "DLS intensity"], + "DIFFERENTIAL SCANNING CALORIMETRY": ["DIFFERENTIAL SCANNING CALORIMETRY"] } } diff --git a/chem_spectra/lib/converter/jcamp/data_type.json.example b/chem_spectra/lib/converter/jcamp/data_type.json.example index 5c135ad6..26b5ff20 100644 --- a/chem_spectra/lib/converter/jcamp/data_type.json.example +++ b/chem_spectra/lib/converter/jcamp/data_type.json.example @@ -14,6 +14,7 @@ "SORPTION-DESORPTION MEASUREMENT": ["SORPTION-DESORPTION MEASUREMENT"], "Emissions": ["Emissions", "EMISSIONS", "FLUORESCENCE SPECTRUM", "FL SPECTRUM"], "DLS ACF": ["DLS ACF"], - "DLS intensity": ["DLS INTENSITY", "DLS intensity"] + "DLS intensity": ["DLS INTENSITY", "DLS intensity"], + "DIFFERENTIAL SCANNING CALORIMETRY": ["DIFFERENTIAL SCANNING CALORIMETRY"] } } diff --git a/chem_spectra/lib/converter/jcamp/ni.py b/chem_spectra/lib/converter/jcamp/ni.py index ce2bc6e8..7e016917 100644 --- a/chem_spectra/lib/converter/jcamp/ni.py +++ b/chem_spectra/lib/converter/jcamp/ni.py @@ -43,6 +43,7 @@ def __init__(self, base): self.is_emissions = base.is_emissions if hasattr(base, 'is_emissions') else False self.is_dls_acf = base.is_dls_acf if hasattr(base, 'is_dls_acf') else False self.is_dls_intensity = base.is_dls_intensity if hasattr(base, 'is_dls_intensity') else False + self.is_dsc = base.is_dsc if hasattr(base, 'is_dsc') else False self.non_nmr = base.non_nmr self.ncl = base.ncl self.is_dept = base.is_dept @@ -98,7 +99,8 @@ def __thres(self): "CYCLIC VOLTAMMETRY": THRESHOLD_XRD, "SORPTION-DESORPTION MEASUREMENT": THRESHOLD_XRD, "DLS intensity": THRESHOLD_XRD, - "Emissions": THRESHOLD_EMISSION + "Emissions": THRESHOLD_EMISSION, + "DIFFERENTIAL SCANNING CALORIMETRY": THRESHOLD_TGA, } if self.params.get('user_data_type_mapping'): diff --git a/chem_spectra/lib/converter/share.py b/chem_spectra/lib/converter/share.py index 7766d420..e98563d4 100644 --- a/chem_spectra/lib/converter/share.py +++ b/chem_spectra/lib/converter/share.py @@ -25,6 +25,7 @@ def parse_params(params): 'jcamp_idx': 0, 'axesUnits': None, 'detector': None, + 'dsc_meta_data': None, } select_x = params.get('select_x', None) @@ -68,6 +69,8 @@ def parse_params(params): user_data_type_mapping = params.get('data_type_mapping') detector = params.get('detector') detector = json.loads(detector) if detector else None + dsc_meta_data = params.get('dsc_meta_data') + dsc_meta_data = json.loads(dsc_meta_data) if dsc_meta_data else None if (cyclicvolta is not None): spectraList = cyclicvolta['spectraList'] if (len(spectraList) > 0): @@ -101,6 +104,7 @@ def parse_params(params): 'axesUnits': axesUnits, 'user_data_type_mapping': user_data_type_mapping, 'detector': detector, + 'dsc_meta_data': dsc_meta_data, } diff --git a/tests/fixtures/source/bagit/dsc/dsc.zip b/tests/fixtures/source/bagit/dsc/dsc.zip new file mode 100644 index 00000000..63079a39 Binary files /dev/null and b/tests/fixtures/source/bagit/dsc/dsc.zip differ diff --git a/tests/lib/converter/bagit/test_bagit_base_converter.py b/tests/lib/converter/bagit/test_bagit_base_converter.py index 9a0edbde..2e798168 100644 --- a/tests/lib/converter/bagit/test_bagit_base_converter.py +++ b/tests/lib/converter/bagit/test_bagit_base_converter.py @@ -10,6 +10,7 @@ emissions_layout_path = target_dir + 'emissions/emissions.zip' dls_acf_layout_path = target_dir + 'dls_acf/dls_acf.zip' dls_intensity_layout_path = target_dir + 'dls_intensity/dls_intensity.zip' +dsc_layout_path = target_dir + 'dsc/dsc.zip' def assertFileType(file, mimeStr): assert mimetypes.guess_type(file.name)[0] == mimeStr @@ -144,3 +145,12 @@ def test_bagit_has_one_file_no_combined_image(): converter = BagItConveter(td) assert converter.combined_image is None + +def test_bagit_convert_to_jcamp_dsc_layout(): + with tempfile.TemporaryDirectory() as td: + with zipfile.ZipFile(dsc_layout_path, 'r') as z: + z.extractall(td) + + converter = BagItConveter(td) + jcamp = converter.data[0] + assertJcampContent(jcamp, '##DATA TYPE=DIFFERENTIAL SCANNING CALORIMETRY')