11"""Readers from file formats."""
22
33from dataclasses import dataclass
4+ from typing import Union
45
56import orsopy
67from orsopy .fileio import load_orso
910from RATapi .models import AbsorptionLayer , Background , Contrast , Data , Layer , Parameter , Resolution
1011
1112
12- def read_ort (filepath : str ) -> Project :
13+ def load_ort_data (filepath : str ) -> Union [Data , list [Data ]]:
14+ """Read data from an .ort file.
15+
16+ Parameters
17+ ----------
18+ filepath : str
19+ The path to the .ort file.
20+
21+ Returns
22+ -------
23+ Data | list[Data]
24+ If the .ort file contains one dataset, just the data model.
25+ If it contains multiple datasets, returns a list of data models.
26+
27+ """
28+ ort_data = load_orso (filepath )
29+ datasets = [Data (name = dataset .info .data_source .sample .name , data = dataset .data ) for dataset in ort_data ]
30+ if len (datasets ) == 1 :
31+ return datasets [0 ]
32+ return datasets
33+
34+
35+ def ort_to_project (filepath : str ) -> Project :
1336 """Create a project from an .ort file.
1437
1538 Parameters
@@ -27,58 +50,47 @@ def read_ort(filepath: str) -> Project:
2750 ort_data = load_orso (filepath )
2851
2952 for dataset in ort_data :
30- metadata = dataset .info
31- sample = metadata .data_source .sample
32- model_info = orso_model_to_rat (sample .model )
33-
34- # Add all parameters that aren't already defined
35- project .parameters .union (model_info .parameters )
36- project .layers .extend (model_info .layers )
37- project .bulk_in .append (model_info .bulk_in )
38- project .bulk_out .append (model_info .bulk_out )
53+ sample = dataset .info .data_source .sample
3954
4055 project .data .append (Data (name = sample .name , data = dataset .data ))
4156
42- if dataset .data .shape [1 ] == 4 :
43- project .resolutions .append (
44- Resolution (
45- name = f"{ sample .name } Resolution" ,
46- type = "data" ,
57+ if sample .model is not None :
58+ model_info = orso_model_to_rat (sample .model )
59+
60+ # Add all parameters that aren't already defined
61+ project .parameters .union (model_info .parameters )
62+ project .layers .extend (model_info .layers )
63+ project .bulk_in .append (model_info .bulk_in )
64+ project .bulk_out .append (model_info .bulk_out )
65+
66+ if dataset .data .shape [1 ] == 4 :
67+ project .resolutions .append (
68+ Resolution (
69+ name = f"{ sample .name } Resolution" ,
70+ type = "data" ,
71+ )
4772 )
48- )
49- else :
50- project .resolution_parameters .append (Parameter (name = f"{ sample .name } Resolution Parameter" ))
51- project .resolutions .append (
52- Resolution (
53- name = f"{ sample .name } Resolution" ,
54- type = "constant" ,
55- source = f"{ sample .name } Resolution Parameter" ,
73+ else :
74+ project .resolutions .append (
75+ Resolution (
76+ name = f"{ sample .name } Resolution" ,
77+ type = "constant" ,
78+ source = "Resolution Param 1" ,
79+ )
5680 )
57- )
5881
59- project .background_parameters .append (Parameter (name = f"{ sample .name } Background Parameter" ))
60- project .backgrounds .append (
61- Background (
62- name = f"{ sample .name } Background" ,
63- type = "constant" ,
64- source = f"{ sample .name } Background Parameter" ,
65- )
66- )
67-
68- project .scalefactors .append (Parameter (name = f"{ sample .name } Scalefactor" ))
69-
70- project .contrasts .append (
71- Contrast (
72- name = metadata .data_source .experiment .title ,
73- data = sample .name ,
74- background = f"{ sample .name } Background" ,
75- bulk_in = model_info .bulk_in .name ,
76- bulk_out = model_info .bulk_out .name ,
77- scalefactor = f"{ sample .name } Scalefactor" ,
78- resolution = f"{ sample .name } Resolution" ,
79- model = [layer .name for layer in model_info .layers ],
82+ project .contrasts .append (
83+ Contrast (
84+ name = dataset .info .data_source .experiment .title ,
85+ data = sample .name ,
86+ background = "Background 1" ,
87+ bulk_in = model_info .bulk_in .name ,
88+ bulk_out = model_info .bulk_out .name ,
89+ scalefactor = "Scalefactor 1" ,
90+ resolution = f"{ sample .name } Resolution" ,
91+ model = model_info .model ,
92+ )
8093 )
81- )
8294
8395 return project
8496
@@ -90,17 +102,20 @@ class ORSOSample:
90102 bulk_in : Parameter
91103 bulk_out : Parameter
92104 parameters : ClassList [Parameter ]
93- layers : ClassList [Layer ]
105+ layers : ClassList [Layer ] | ClassList [AbsorptionLayer ]
106+ model : list [str ]
94107
95108
96- def orso_model_to_rat (model : orsopy .fileio .model_language .SampleModel | str ) -> ORSOSample :
109+ def orso_model_to_rat (model : orsopy .fileio .model_language .SampleModel | str , absorption : bool = False ) -> ORSOSample :
97110 """Get information from an ORSO SampleModel object.
98111
99112 Parameters
100113 ----------
101114 model : orsopy.fileio.model_language.SampleModel or str
102115 The sample model to turn into a RAT data. If given as a string,
103116 the string is interpreted as a layer stack in ORSO model language.
117+ absorption : bool, default False
118+ Whether to account for absorption in the model.
104119
105120 Returns
106121 -------
@@ -148,11 +163,16 @@ def orso_model_to_rat(model: orsopy.fileio.model_language.SampleModel | str) ->
148163 layers = ClassList ()
149164
150165 for orso_layer in stack [1 :- 1 ]:
151- layer_params , layer = orso_layer_to_rat_layer (orso_layer )
166+ layer_params , layer = orso_layer_to_rat_layer (orso_layer , absorption )
152167 parameters .union (layer_params )
153- layers .append (layer )
168+ layers .union (layer )
169+
154170
155- return ORSOSample (bulk_in = bulk_in , bulk_out = bulk_out , parameters = parameters , layers = layers )
171+ return ORSOSample (bulk_in = bulk_in ,
172+ bulk_out = bulk_out ,
173+ parameters = parameters ,
174+ layers = layers ,
175+ model = [layer .material .formula for layer in stack [1 :- 1 ]])
156176
157177
158178def orso_layer_to_rat_layer (
@@ -195,7 +215,7 @@ def orso_layer_to_rat_layer(
195215 thickness = f"{ name } Thickness" ,
196216 roughness = f"{ name } Roughness" ,
197217 SLD_real = f"{ name } SLD" ,
198- SLD_imag = f"{ name } SLD imaginary" ,
218+ SLD_imaginary = f"{ name } SLD imaginary" ,
199219 )
200220 else :
201221 layer = Layer (
0 commit comments