11__author__ = 'github.com/arm61'
22
3+ import os
34from typing import TextIO
45from typing import Union
56
@@ -25,11 +26,16 @@ def load(fname: Union[TextIO, str]) -> sc.DataGroup:
2526def load_as_dataset (fname : Union [TextIO , str ]) -> DataSet1D :
2627 """Load data from an ORSO .ort file as a DataSet1D."""
2728 data_group = load (fname )
29+ basename = os .path .splitext (os .path .basename (fname ))[0 ]
30+ data_name = 'R_' + basename
31+ coords_name = 'Qz_' + basename
32+ coords_name = list (data_group ['coords' ].keys ())[0 ] if coords_name not in data_group ['coords' ] else coords_name
33+ data_name = list (data_group ['data' ].keys ())[0 ] if data_name not in data_group ['data' ] else data_name
2834 return DataSet1D (
29- x = data_group ['coords' ]['Qz_0' ].values ,
30- y = data_group ['data' ]['R_0' ].values ,
31- ye = data_group ['data' ]['R_0' ].variances ,
32- xe = data_group ['coords' ]['Qz_0' ].variances ,
35+ x = data_group ['coords' ][coords_name ].values ,
36+ y = data_group ['data' ][data_name ].values ,
37+ ye = data_group ['data' ][data_name ].variances ,
38+ xe = data_group ['coords' ][coords_name ].variances ,
3339 )
3440
3541
@@ -86,6 +92,8 @@ def _load_txt(fname: Union[TextIO, str]) -> sc.DataGroup:
8692 if ',' in first_line :
8793 delimiter = ','
8894
95+ basename = os .path .splitext (os .path .basename (fname ))[0 ]
96+
8997 try :
9098 # First load only the data to check column count
9199 data = np .loadtxt (fname , delimiter = delimiter , comments = '#' )
@@ -110,13 +118,44 @@ def _load_txt(fname: Union[TextIO, str]) -> sc.DataGroup:
110118 # Re-raise with more descriptive message
111119 raise ValueError (f"Failed to load data from { fname } : { str (error )} " ) from error
112120
113- data = {'R_0' : sc .array (dims = ['Qz_0' ], values = y , variances = np .square (e ))}
121+ data_name = 'R_' + basename
122+ coords_name = 'Qz_' + basename
123+ data = {data_name : sc .array (dims = [coords_name ], values = y , variances = np .square (e ))}
114124 coords = {
115- data ['R_0' ].dims [0 ]: sc .array (
116- dims = ['Qz_0' ],
125+ data [data_name ].dims [0 ]: sc .array (
126+ dims = [coords_name ],
117127 values = x ,
118128 variances = np .square (xe ),
119129 unit = sc .Unit ('1/angstrom' ),
120130 )
121131 }
122132 return sc .DataGroup (data = data , coords = coords )
133+
134+ def merge_datagroups (* data_groups : sc .DataGroup ) -> sc .DataGroup :
135+ """Merge multiple DataGroups into a single DataGroup."""
136+ merged_data = {}
137+ merged_coords = {}
138+ merged_attrs = {}
139+
140+ for group in data_groups :
141+ for key , value in group ['data' ].items ():
142+ if key not in merged_data :
143+ merged_data [key ] = value
144+ else :
145+ merged_data [key ] = sc .concatenate ([merged_data [key ], value ])
146+
147+ for key , value in group ['coords' ].items ():
148+ if key not in merged_coords :
149+ merged_coords [key ] = value
150+ else :
151+ merged_coords [key ] = sc .concatenate ([merged_coords [key ], value ])
152+
153+ if 'attrs' not in group :
154+ continue
155+ for key , value in group ['attrs' ].items ():
156+ if key not in merged_attrs :
157+ merged_attrs [key ] = value
158+ else :
159+ merged_attrs [key ] = {** merged_attrs [key ], ** value }
160+
161+ return sc .DataGroup (data = merged_data , coords = merged_coords , attrs = merged_attrs )
0 commit comments