webmo 1.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
webmo/__init__.py ADDED
@@ -0,0 +1,2 @@
1
+ from .webmo_rest import WebMOREST
2
+ __version__ = "1.6.0"
webmo/gui.py ADDED
@@ -0,0 +1,193 @@
1
+ #handle abstract base class
2
+ from abc import ABC, abstractmethod
3
+
4
+ class _WebMOGUIBase(ABC):
5
+ """The _WebMOGUIBase class is an abstract base class for all Python-based GUIs for WebMO.
6
+ """
7
+
8
+ def __init__(self, template, query_vars, additional_vars):
9
+ self._query_vars = query_vars
10
+ self._additional_vars = additional_vars
11
+
12
+ @abstractmethod
13
+ def display(self):
14
+ """Presents the menu-driven JupyterGUI
15
+
16
+ Displays the JupyterGUI using a system of IPython widgets.
17
+
18
+ Args:
19
+ None
20
+
21
+ Returns:
22
+ None
23
+ """
24
+ pass
25
+
26
+ @abstractmethod
27
+ def get_variables(self):
28
+ """Returns a populated variables dictionary.
29
+
30
+ Returns a populated variables dictionary, generated using the user-selected
31
+ menu options, along with an additional user-specified key/value pairs (additional_vars)
32
+
33
+ Args:
34
+ None
35
+
36
+ Returns:
37
+ A populated dictionary of of variables and values.
38
+ """
39
+ pass
40
+
41
+ class JupyterGUI(_WebMOGUIBase):
42
+ """The JupyterGUI class is a menu-driven Jupyter GUI interface for setting up WebMO jobs.
43
+
44
+ The class utilizes IPython widgets to present a menu-driven interface, using a subset
45
+ of user-specified list of template variables.
46
+ """
47
+ try:
48
+ import ipywidgets
49
+ except:
50
+ #fail silently, since this should never happen in Jupyter
51
+ pass #print('ipywidgets not found; disabling support for JupyterGUI')
52
+
53
+ import time
54
+
55
+ def __init__(self, template, query_vars, additional_vars=None):
56
+ """Constructor for JupyterGUI
57
+
58
+ This constructor generates a JupyterGUI object.
59
+
60
+ Args:
61
+ template(dict): A specific template, selected from WebMOREST.get_templates()
62
+ query_vars(list): A subset of variables to use when generating the GUI
63
+ additional_vars(dict, optional): A dictionary of additional variables/values to utilize during input file generation
64
+
65
+ Returns:
66
+ object: The newly constructed JupyterGUI object
67
+ """
68
+
69
+ _WebMOGUIBase.__init__(self, template, query_vars, additional_vars)
70
+ self._widgets = []
71
+ self._display_time = -1
72
+
73
+ for var in query_vars:
74
+ if template['variables'][var]['type'] == 'checkbox':
75
+ #handle checkbox options
76
+ self._widgets.append(
77
+ self.ipywidgets.widgets.Checkbox(
78
+ value=True if template['variables'][var]['default'] == 'on' else False,
79
+ description=var,
80
+ disabled=False));
81
+ elif template['variables'][var]['type'] == 'dropdown':
82
+ #handle select/dropdown options
83
+ self._widgets.append(
84
+ self.ipywidgets.widgets.Dropdown(
85
+ options=template['variables'][var]['options'],
86
+ value=template['variables'][var]['default'],
87
+ description=var,
88
+ disabled=False));
89
+ else:
90
+ #handle text input
91
+ self._widgets.append(
92
+ self.ipywidgets.widgets.Text(
93
+ description=var,
94
+ value=template['variables'][var]['default'],
95
+ disabled=False));
96
+
97
+ def display(self):
98
+
99
+ self._display_time = self.time.time()
100
+
101
+ for widget in self._widgets:
102
+ display(widget)
103
+
104
+ def get_variables(self):
105
+
106
+ MIN_INPUT_TIME = 1.0
107
+ # sanity check to make sure user has had time to input something
108
+ # fail this call during re-execution of entire notebook at once
109
+ elapsed_time = self.time.time() - self._display_time
110
+ if self._display_time == -1 or elapsed_time < MIN_INPUT_TIME:
111
+ raise RuntimeError('Must provide JupyterGUI input before calling get_variables')
112
+
113
+ # add in additional user-specified variables
114
+ if (self._additional_vars != None):
115
+ variables = {**self._additional_vars}
116
+ else:
117
+ variables = {}
118
+
119
+ for (var, widget) in zip(self._query_vars, self._widgets):
120
+ if isinstance(widget, self.ipywidgets.Checkbox):
121
+ variables[var] = "on" if widget.value == True else ""
122
+ else:
123
+ variables[var] = widget.value
124
+
125
+ return variables
126
+
127
+ class ConsoleGUI(_WebMOGUIBase):
128
+ """The ConsoleGUI class is a text-based interface for setting up WebMO jobs.
129
+
130
+ The class utilizes the questionary library to present a neat interface using a subset
131
+ of user-specified list of template variables.
132
+ """
133
+
134
+ def __init__(self, template, query_vars, additional_vars=None):
135
+ """Constructor for ConsoleGUI
136
+
137
+ This constructor generates a ConsoleGUI object.
138
+
139
+ Args:
140
+ template(dict): A specific template, selected from WebMOREST.get_templates()
141
+ query_vars(list): A subset of variables to use when generating the GUI
142
+ additional_vars(dict, optional): A dictionary of additional variables/values to utilize during input file generation
143
+
144
+ Returns:
145
+ object: The newly constructed ConsoleGUI object
146
+ """
147
+
148
+ import questionary as q
149
+
150
+ _WebMOGUIBase.__init__(self, template, query_vars, additional_vars)
151
+ self._questions = []
152
+ for var in query_vars:
153
+ # checkbox options
154
+ if template['variables'][var]['type'] == 'checkbox':
155
+ self._questions.append(q.confirm(var));
156
+ # select/dropdown options
157
+ elif template['variables'][var]['type'] == 'dropdown':
158
+ choices = []
159
+ for key, value in template['variables'][var]['options'].items():
160
+ choices.append(q.Choice(title=key, value=value))
161
+
162
+ self._questions.append(
163
+ q.select(
164
+ var,
165
+ choices=choices,
166
+ use_shortcuts=True));
167
+ # text input
168
+ else:
169
+ self._questions.append(
170
+ q.text(var));
171
+
172
+
173
+ def display(self):
174
+
175
+ self._answers = []
176
+ for question in self._questions:
177
+ self._answers.append(question.ask())
178
+
179
+ def get_variables(self):
180
+
181
+ # add in additional user-specified variables
182
+ if (self._additional_vars != None):
183
+ variables = {**self._additional_vars}
184
+ else:
185
+ variables = {}
186
+
187
+ for (var, value) in zip(self._query_vars, self._answers):
188
+ if isinstance(value, bool):
189
+ variables[var] = "on" if value else ""
190
+ else:
191
+ variables[var] = value
192
+
193
+ return variables
webmo/spectrum.py ADDED
@@ -0,0 +1,451 @@
1
+ import numpy as np
2
+
3
+ #
4
+ # lineshape functions
5
+ #
6
+
7
+ def _faddeeva(z):
8
+ """
9
+ Calculates the scaled complex complementary function in the complex plane.
10
+ We use this to calculate voigt lineshapes.
11
+ """
12
+ if _faddeeva.run_yet == False:
13
+ _faddeeva.run_yet = True
14
+ _faddeeva.N = 1000
15
+ _faddeeva.L = np.sqrt(_faddeeva.N / np.sqrt(2))
16
+ # our basis set. 1000 elements hits a good blend of speed and accuracy.
17
+ l = [
18
+ 5.11748989e-16,-1.44365777e-16,1.71205586e-16,1.43270169e-16,
19
+ 2.40509424e-16,9.34400028e-17,3.33586468e-16,2.07038704e-16,
20
+ 3.95030052e-16,-2.26565767e-17,2.99460336e-16,5.72632548e-16,
21
+ 1.29042294e-16,-7.07527120e-17,-5.62526370e-18,2.36711749e-16,
22
+ 1.02183724e-16,-4.34250382e-16,-8.07532865e-17,-4.96929924e-16,
23
+ 1.26045192e-16,-2.53796359e-16,-1.03766119e-16,-2.15858058e-16,
24
+ -1.83552885e-16,-8.67481915e-17,-3.07549909e-16,-2.74584240e-16,
25
+ -2.69389284e-17,-4.24362029e-16,-5.95060089e-16,-3.70830265e-16,
26
+ 2.29567357e-16,7.09903912e-17,-9.60967179e-16,2.56731866e-16,
27
+ -4.28826105e-16,-4.30205991e-16,-5.08718759e-16,-2.72358486e-16,
28
+ -2.89119580e-16,-3.97432513e-16,-4.35239789e-16,-8.06482626e-17,
29
+ -8.25507147e-16,-3.76087656e-16,-8.24193610e-16,-5.49494587e-16,
30
+ -6.65608655e-16,-7.53824209e-16,-7.22452074e-16,-3.57335854e-16,
31
+ -2.98311037e-16,-4.14104958e-16,-2.58059335e-16,-7.98829398e-16,
32
+ -3.86795717e-16,-2.37823897e-16,-1.83073068e-16,-8.98227362e-17,
33
+ -5.28120565e-17,-4.52881008e-16,-1.81103394e-16,-8.56200133e-17,
34
+ -1.22186640e-16,-5.41322089e-17,-7.24757378e-16,-3.50403658e-16,
35
+ -1.42903007e-16,-1.86846592e-16,-3.94211076e-16,-5.10446457e-16,
36
+ -2.41826709e-16,-1.21038373e-16,-3.79652685e-16,-3.19221360e-16,
37
+ -3.57241318e-16,-3.08579376e-16,-1.28131320e-16,-3.12949918e-16,
38
+ -2.46392992e-16,-2.91414183e-16,-2.85635470e-16,-8.72117464e-17,
39
+ -5.38404011e-17,-7.88752966e-17,8.44277161e-17,2.10083596e-17,
40
+ 1.82773768e-17,-4.62896364e-16,-2.15480876e-16,-3.50123461e-16,
41
+ -2.44328019e-16,-5.22369602e-16,-3.02177957e-16,-4.95661311e-16,
42
+ -2.05232527e-16,-6.89780504e-16,-5.76999940e-16,-3.57086548e-16,
43
+ -1.73695260e-16,-5.10360238e-16,-3.18226893e-16,-6.53936479e-16,
44
+ -4.07209831e-16,-5.23531607e-16,-6.25241467e-16,-5.59616421e-16,
45
+ -5.05190494e-16,-4.95920116e-16,5.91918728e-17,-4.24242069e-16,
46
+ -4.26716888e-16,-1.94214030e-16,-3.91975316e-16,1.89855222e-17,
47
+ -8.41436616e-17,-1.91135361e-16,1.17185773e-16,1.70875441e-17,
48
+ -7.82465278e-17,-4.50946865e-16,-3.49996280e-16,-3.61639701e-16,
49
+ -1.44123098e-16,-4.53945169e-16,-1.19604860e-16,-1.05312368e-16,
50
+ -1.05598414e-16,-1.98885939e-16,-1.60492266e-16,-5.06892532e-17,
51
+ -2.08435369e-16,-1.15672143e-16,-2.28953471e-16,-2.10576416e-16,
52
+ -1.43268468e-16,-3.93351320e-16,-3.19012003e-16,-2.86881044e-16,
53
+ -3.09187106e-16,4.85144017e-17,-1.43142304e-17,-2.05880804e-16,
54
+ -2.88573343e-16,-2.34476402e-16,-4.24449546e-16,-3.15047863e-16,
55
+ 7.15863776e-18,-9.40085268e-17,-3.41068217e-16,-5.81558958e-16,
56
+ -1.23060165e-16,-2.29925794e-16,-1.00051620e-16,2.60549021e-16,
57
+ -1.95855091e-16,-6.47544512e-16,-2.11951657e-16,1.68350302e-16,
58
+ -3.31451746e-16,-9.37946003e-17,-5.38246225e-17,2.45588357e-16,
59
+ -1.55116503e-16,1.47231294e-16,3.32452583e-17,-1.15883349e-16,
60
+ -6.26556401e-17,-4.11199133e-16,3.40065530e-16,2.76793021e-16,
61
+ 4.41447793e-16,5.24289805e-16,2.00946326e-16,3.90427144e-16,
62
+ 1.15328785e-16,1.07955299e-17,-2.17963342e-17,4.93958279e-16,
63
+ 2.49313066e-17,-1.32566816e-16,4.10357049e-16,-4.52822565e-16,
64
+ 4.07881112e-16,-7.92449589e-17,1.19915180e-16,1.39818533e-15,
65
+ 1.00809312e-17,-4.43575229e-16,-5.06216625e-17,4.14292705e-17,
66
+ 3.96859128e-17,-8.34232666e-16,9.11190986e-16,9.32038663e-16,
67
+ 8.84033937e-18,6.99303277e-18,9.01104015e-16,9.15275917e-16,
68
+ 0.00000000e00,9.09494702e-16,0.00000000e00,-9.09494702e-16,
69
+ 0.00000000e00,-9.09494702e-16,-9.09494702e-16,0.00000000e00,
70
+ -9.09494702e-16,0.00000000e00,0.00000000e00,-4.54747351e-16,
71
+ -4.54747351e-16,0.00000000e00,0.00000000e00,4.54747351e-16,
72
+ 4.54747351e-16,0.00000000e00,4.54747351e-16,0.00000000e00,
73
+ 0.00000000e00,0.00000000e00,0.00000000e00,4.54747351e-16,
74
+ 0.00000000e00,4.54747351e-16,4.54747351e-16,-4.54747351e-16,
75
+ 0.00000000e00,0.00000000e00,-4.54747351e-16,-4.54747351e-16,
76
+ 0.00000000e00,2.27373675e-16,-2.27373675e-16,-2.27373675e-16,
77
+ 0.00000000e00,-2.27373675e-16,-3.41060513e-16,-2.27373675e-16,
78
+ -1.13686838e-16,-2.27373675e-16,0.00000000e00,5.68434189e-17,
79
+ 5.68434189e-17,3.97903932e-16,1.70530257e-16,-2.27373675e-16,
80
+ 1.70530257e-16,0.00000000e00,3.12638804e-16,1.42108547e-17,
81
+ -1.13686838e-16,1.98951966e-16,9.94759830e-17,9.94759830e-17,
82
+ 1.20792265e-16,3.41060513e-16,2.62900812e-16,1.06581410e-16,
83
+ 2.73558953e-16,2.13162821e-17,2.87769808e-16,1.81188398e-16,
84
+ 4.19220214e-16,3.90798505e-17,2.38031816e-16,1.49213975e-16,
85
+ 4.86721774e-16,6.03961325e-17,3.49054119e-16,1.88737914e-16,
86
+ 3.00204306e-16,4.88498131e-17,9.72555370e-17,5.17141885e-16,
87
+ 1.27453603e-16,4.18998169e-16,4.35429470e-16,2.03947970e-16,
88
+ 3.28403971e-16,7.09432513e-17,2.75390821e-16,1.28230759e-16,
89
+ 1.38278278e-16,1.62314606e-16,1.17683641e-16,-7.49122986e-17,
90
+ -4.42562653e-17,2.25021390e-16,5.67809688e-17,-9.29117894e-17,
91
+ 4.77465290e-17,-4.95159469e-17,-7.98319744e-17,-1.82109536e-16,
92
+ 1.66366920e-16,-1.86119349e-16,1.35362208e-16,-3.26893894e-16,
93
+ 1.89110880e-16,8.02986150e-17,2.42919400e-16,-1.88988365e-16,
94
+ 1.09200626e-16,-1.55745100e-16,-1.23230690e-16,-7.49633103e-17,
95
+ -1.58868199e-16,-5.36516361e-17,2.77595573e-16,2.81580071e-16,
96
+ -2.95155908e-16,-2.48784798e-16,2.91340472e-16,1.36892539e-16,
97
+ 1.70318153e-16,1.73748269e-16,4.65475589e-17,-2.31324207e-16,
98
+ 1.83833839e-17,-6.04137894e-17,4.80069234e-17,-2.85632380e-16,
99
+ 3.67524426e-17,-4.74434771e-17,-3.17576294e-16,-1.71678676e-16,
100
+ -1.08599054e-16,-2.18406185e-16,1.85501493e-16,-1.46516971e-17,
101
+ -9.07895605e-17,-7.19678890e-17,1.53856704e-16,-1.40846832e-16,
102
+ 7.20265739e-17,-2.54008979e-16,-1.23325143e-16,2.75474757e-16,
103
+ 2.32616486e-16,-1.75463698e-16,9.79362317e-17,2.20669333e-16,
104
+ -2.29810374e-16,-7.95069634e-17,2.87994117e-16,3.12697006e-16,
105
+ 3.14586804e-16,1.79021616e-16,2.06952162e-17,-2.67293573e-16,
106
+ 3.45231230e-16,8.68326886e-17,2.65629639e-16,3.06821693e-18,
107
+ 1.34860677e-16,2.74418053e-16,-3.04162528e-16,1.09786189e-16,
108
+ -1.54948449e-17,-3.43520294e-16,-8.60630571e-17,-3.28755503e-16,
109
+ -2.06357180e-16,-7.70834219e-16,-4.48670877e-16,-4.21195874e-16,
110
+ -3.33542439e-16,-1.12012549e-16,1.31482158e-16,-9.05916732e-17,
111
+ -1.88320054e-16,-2.71973298e-16,-1.85779885e-16,-2.41487719e-16,
112
+ -3.34298416e-16,-1.26864283e-16,-1.07737460e-16,-3.00912980e-16,
113
+ -5.14639839e-16,-3.53320333e-16,-5.69661721e-16,-1.64073995e-16,
114
+ -1.61323191e-16,-6.91875273e-16,2.10402594e-17,-4.97408214e-16,
115
+ -9.58387029e-17,-4.71724194e-16,-2.64915700e-16,-3.20381256e-16,
116
+ -1.81528269e-16,-3.63661361e-16,-3.33501787e-16,-4.82454667e-16,
117
+ 1.92955199e-17,-2.70836693e-16,3.39983475e-17,6.18997114e-17,
118
+ -1.02320106e-16,1.27057441e-16,8.31854263e-17,-1.18884147e-16,
119
+ 9.89208773e-17,2.55999309e-16,-1.28411687e-17,1.37041750e-16,
120
+ 1.06258503e-16,4.81342042e-16,4.98521006e-16,2.55381445e-16,
121
+ 2.54674725e-16,2.62261848e-16,3.83584674e-16,1.89662976e-16,
122
+ 1.26359468e-16,3.08514032e-16,2.58755647e-16,2.87385786e-16,
123
+ 8.62079097e-17,2.85730122e-16,1.60530531e-16,2.12208599e-16,
124
+ -7.50533882e-17,1.03721015e-16,-9.44620129e-17,-1.25196451e-17,
125
+ 1.83989433e-16,1.02092358e-16,1.23199547e-16,3.12924987e-16,
126
+ 7.94899735e-18,3.13515155e-17,-1.91924262e-16,-1.57024233e-16,
127
+ -1.16563275e-16,1.01280507e-16,-3.14811048e-16,-1.99895021e-16,
128
+ 3.17185157e-17,3.72378215e-16,-2.48438099e-17,-1.96408130e-16,
129
+ 2.19875515e-16,-1.48259617e-16,-1.88755403e-16,6.10412835e-17,
130
+ -7.97417495e-17,1.04554694e-16,-1.34343584e-16,1.57394697e-16,
131
+ -2.97867426e-16,9.44191922e-17,-3.12413672e-16,1.09925848e-16,
132
+ -1.70858155e-16,1.22319748e-16,-2.39270244e-16,2.99282075e-16,
133
+ 2.71551291e-16,1.51896598e-16,-1.91045098e-16,3.37244715e-16,
134
+ -1.68447924e-16,2.78788148e-16,-1.02388408e-16,2.28266264e-16,
135
+ -1.06314013e-16,7.49857205e-17,6.80150911e-17,2.62399291e-16,
136
+ 2.93062592e-16,6.72930693e-16,1.23409884e-16,7.80241772e-17,
137
+ 1.23935426e-16,7.42401592e-17,-4.97733202e-17,2.24872387e-17,
138
+ 3.13006754e-17,4.36894318e-16,-2.73584271e-17,5.34106732e-16,
139
+ 3.04015329e-17,3.55236272e-16,2.00061692e-16,2.35008822e-17,
140
+ 2.00115055e-16,7.50216609e-16,1.71467707e-16,5.48936595e-16,
141
+ 6.59987339e-16,9.11465756e-16,3.27550321e-16,3.16454926e-16,
142
+ 3.25061464e-16,3.92881805e-16,4.45080470e-16,4.34813674e-16,
143
+ 2.86276929e-16,2.80084273e-16,4.02814643e-16,2.86153600e-16,
144
+ 1.46638302e-16,2.34169964e-16,-3.36764594e-17,1.72043602e-16,
145
+ 3.94568392e-16,1.84240100e-16,1.58638568e-16,-6.67371223e-17,
146
+ 2.14683219e-16,-4.10907209e-17,-5.60176818e-18,-4.23445380e-16,
147
+ 1.13835939e-18,-1.09095088e-16,8.20242358e-17,8.94645890e-17,
148
+ 1.93399044e-16,3.99021608e-17,-1.82013746e-16,6.18526657e-16,
149
+ -1.11938105e-16,6.66551783e-16,5.13967366e-16,5.58363111e-16,
150
+ -4.19435265e-18,-3.54000381e-16,1.01030703e-16,4.22960946e-16,
151
+ 2.42257871e-16,1.01132651e-16,1.82876993e-16,-9.86957381e-17,
152
+ 3.56039675e-16,1.05496299e-16,3.44095847e-16,5.75735467e-16,
153
+ 2.24941492e-16,2.69783032e-16,1.92864050e-16,-9.74377652e-18,
154
+ 2.79461094e-16,-3.94524145e-16,6.85116549e-17,-3.18711202e-16,
155
+ -7.88669123e-17,7.99601369e-17,-2.31458426e-17,-2.50800230e-16,
156
+ -7.86084747e-17,-4.74833060e-16,-4.36565773e-17,-1.55929470e-16,
157
+ -4.05522987e-16,-3.59094184e-16,-2.55120726e-16,-4.05726600e-16,
158
+ -2.13699502e-16,-5.41348764e-16,-4.78030787e-17,-2.58327801e-16,
159
+ -3.46581471e-16,-3.46533290e-16,-8.53057559e-17,-5.38831280e-16,
160
+ -3.46786352e-16,-4.32363655e-16,-1.68813053e-16,-7.17961227e-17,
161
+ -3.91976466e-16,-2.55961277e-16,-6.32428739e-17,-2.99788312e-16,
162
+ 5.13471358e-17,-4.10951740e-16,-1.03668319e-17,-2.33628706e-16,
163
+ -3.38590834e-16,-5.28009955e-18,-6.29904955e-17,-2.06798096e-16,
164
+ -2.06115411e-16,-5.30012252e-16,-8.60235170e-17,-3.79126886e-16,
165
+ -3.93774310e-16,-1.23453191e-16,-1.98039359e-16,-2.99884806e-16,
166
+ -1.70348792e-16,-5.75530462e-16,-1.90399233e-17,-1.33260936e-16,
167
+ -2.41764387e-16,-2.41057218e-16,2.74137576e-17,-1.43504070e-16,
168
+ -1.79498040e-16,-1.49035292e-16,-5.13045291e-17,7.64957220e-17,
169
+ -9.01996753e-18,7.79047747e-17,8.01635709e-17,1.01525911e-16,
170
+ 3.24917016e-16,1.64160518e-16,1.22226009e-16,5.58281902e-16,
171
+ 7.64857413e-17,2.02497667e-16,8.65193004e-17,3.72152535e-16,
172
+ -9.26868752e-18,-2.09224351e-16,-8.47794702e-17,-1.25922233e-16,
173
+ 1.29086358e-16,2.89461144e-16,-8.20626177e-17,-5.16486509e-17,
174
+ 1.83191796e-16,-3.06674860e-16,-1.13915329e-16,3.80596575e-16,
175
+ -3.28275082e-16,1.10666724e-16,-5.99813539e-17,1.05195582e-16,
176
+ -1.75628122e-16,-3.65824066e-16,-4.36305437e-16,-1.34170680e-16,
177
+ -2.35694163e-18,-8.44147857e-17,-2.29387585e-16,-2.49491085e-16,
178
+ -3.82957891e-16,-2.01082319e-16,-3.69520171e-16,3.08359859e-16,
179
+ -1.99895640e-17,-3.32817349e-16,-1.20815203e-16,-3.95566702e-18,
180
+ -4.24507796e-16,-3.33867325e-16,-6.50492639e-16,-4.67244932e-16,
181
+ -6.40278657e-17,-1.99413595e-16,-6.38794849e-17,-4.86309451e-16,
182
+ -3.90516920e-16,-5.53476004e-16,-4.25387534e-16,-5.07859220e-16,
183
+ 1.50184194e-16,-1.56593179e-16,-5.77023883e-17,-1.20813224e-16,
184
+ -2.42609780e-16,-6.96228162e-16,-2.31425493e-16,-5.63834410e-16,
185
+ -3.28654446e-16,-3.29201011e-16,1.15017889e-16,-5.36343420e-16,
186
+ -2.25728055e-17,-4.08400873e-16,-7.62532358e-18,-5.63480342e-16,
187
+ 2.29275694e-17,-3.86463027e-16,-1.19440287e-16,-1.12034603e-17,
188
+ -4.48245375e-16,-8.71150653e-17,-3.59698822e-16,7.63701580e-16,
189
+ -2.09249540e-16,-7.29027711e-17,4.34806301e-16,2.79370416e-16,
190
+ 4.35781459e-16,9.68543292e-17,1.82341529e-16,4.66259454e-16,
191
+ 4.58752443e-16,-5.47309304e-16,4.82142613e-16,6.60132335e-16,
192
+ 4.61280949e-16,-3.13067390e-16,1.92698504e-16,1.04964129e-16,
193
+ -8.98832392e-17,-3.42289455e-16,3.43710315e-16,3.40297977e-17,
194
+ 2.34400799e-16,3.56171595e-17,-1.35737919e-16,4.13360932e-16,
195
+ 9.28909624e-17,-5.26283763e-17,5.39552046e-16,2.63123975e-16,
196
+ 1.77400491e-16,1.60163316e-16,1.73522799e-16,2.60524046e-16,
197
+ 3.91736558e-16,1.22245854e-16,5.72475581e-16,-2.79943119e-17,
198
+ 5.39626522e-16,4.69224371e-16,1.79053135e-16,4.94826390e-16,
199
+ 3.39932067e-16,8.38290822e-17,2.83931853e-16,5.55942954e-16,
200
+ 4.19747676e-16,2.79124937e-16,2.03558902e-16,4.24519122e-16,
201
+ 1.02658980e-16,1.89197331e-17,3.63112861e-16,1.41263763e-16,
202
+ -6.39833244e-17,2.94156130e-16,1.19279922e-16,2.62537867e-16,
203
+ 9.23250107e-17,9.54340873e-17,2.02657914e-16,8.56837549e-17,
204
+ 1.09912242e-16,3.25830034e-16,-6.06707638e-17,1.19561917e-16,
205
+ 1.82940837e-18,-4.63814691e-17,-1.76004402e-16,-1.14268787e-16,
206
+ -1.99388849e-16,-2.34993921e-16,-2.91227483e-16,7.53550548e-18,
207
+ 4.82690083e-18,-2.38575495e-16,-2.44652589e-16,-8.24120125e-17,
208
+ -1.33320590e-16,-2.00054414e-16,-1.43372915e-16,1.89338899e-16,
209
+ -3.10018714e-16,-1.46340691e-16,-1.07599704e-16,-1.64066751e-16,
210
+ -2.17562644e-16,-1.17636359e-16,-1.86483075e-16,5.34358570e-17,
211
+ -4.22094388e-17,1.49639967e-16,-9.19369910e-17,6.43735552e-17,
212
+ -4.95497319e-17,3.33550953e-16,-5.58797396e-18,1.08044533e-17,
213
+ -5.68782134e-17,-1.09699521e-16,2.02816822e-17,6.57529483e-18,
214
+ -5.62985774e-17,1.37422525e-16,3.68137873e-16,2.93855626e-16,
215
+ 4.60911681e-16,2.79558527e-16,1.93645149e-16,4.29339673e-16,
216
+ 3.94346119e-16,-9.11980916e-17,2.08587798e-16,4.60632308e-16,
217
+ 2.46253693e-16,2.94939706e-16,2.89601071e-16,2.36630408e-16,
218
+ 3.40090024e-16,2.08679525e-16,1.92263017e-16,9.71798469e-17,
219
+ 2.75039790e-16,4.35625730e-16,3.44388483e-16,3.13739000e-16,
220
+ 2.67825858e-16,5.23555689e-16,7.02254341e-17,1.24864649e-16,
221
+ 3.20139668e-16,2.33491483e-16,2.19996198e-16,3.10765864e-16,
222
+ 1.92283246e-16,4.58564011e-16,5.97928541e-16,1.65336064e-16,
223
+ 1.97369721e-16,4.79474407e-16,4.74556351e-16,-2.72567462e-17,
224
+ 4.84030144e-16,2.35944695e-16,-1.64178854e-16,2.08598406e-16,
225
+ 4.78048738e-16,-1.07186669e-16,2.72374315e-16,1.30982162e-16,
226
+ 6.19721697e-16,1.84166717e-16,2.19916975e-16,-8.38157837e-17,
227
+ 3.10783706e-16,1.43651243e-16,8.32086938e-16,-8.60950101e-17,
228
+ 1.12719684e-15,1.25055521e-15,1.59161573e-15,2.61479727e-15,
229
+ 5.34328137e-15,8.24229573e-15,1.30739863e-14,2.09752216e-14,
230
+ 3.33102435e-14,5.24096322e-14,8.29913915e-14,1.30512490e-13,
231
+ 2.04465778e-13,3.19687388e-13,4.96527264e-13,7.69091457e-13,
232
+ 1.18768639e-12,1.82723170e-12,2.80164159e-12,4.28093472e-12,
233
+ 6.51965593e-12,9.89587079e-12,1.49690322e-11,2.25677468e-11,
234
+ 3.39091173e-11,5.07809830e-11,7.57933947e-11,1.12751053e-10,
235
+ 1.67175699e-10,2.47052924e-10,3.63894571e-10,5.34237415e-10,
236
+ 7.81753258e-10,1.14021130e-09,1.65761999e-09,2.40199471e-09,
237
+ 3.46936706e-09,4.99485579e-09,7.16792849e-09,1.02533485e-08,
238
+ 1.46198336e-08,2.07791178e-08,2.94389945e-08,4.15750919e-08,
239
+ 5.85276356e-08,8.21314254e-08,1.14889782e-07,1.60206498e-07,
240
+ 2.22693985e-07,3.08581163e-07,4.26251360e-07,5.86949080e-07,
241
+ 8.05705175e-07,1.10254346e-06,1.50404848e-06,2.04539498e-06,
242
+ 2.77296513e-06,3.74771110e-06,5.04945887e-06,6.78239587e-06,
243
+ 9.08204151e-06,1.21240672e-05,1.61354139e-05,2.14082509e-05,
244
+ 2.83174350e-05,3.73422599e-05,4.90934463e-05,6.43464991e-05,
245
+ 8.40827711e-05,1.09539808e-04,1.42272822e-04,1.84229443e-04,
246
+ 2.37840239e-04,3.06127873e-04,3.92838172e-04,5.02596823e-04,
247
+ 6.41095903e-04,8.15314926e-04,1.03378162e-03,1.30687819e-03,
248
+ 1.64719925e-03,2.06996828e-03,2.59351969e-03,3.23985416e-03,
249
+ 4.03527510e-03,5.01111418e-03,6.20455414e-03,7.65955651e-03,
250
+ 9.42790170e-03,1.15703481e-02,1.41579155e-02,1.72732972e-02,
251
+ 2.10124030e-02,2.54860316e-02,3.08216711e-02,3.71654197e-02,
252
+ 4.46840156e-02,5.35669618e-02,6.40287248e-02,7.63109798e-02,
253
+ 9.06848724e-02,1.07453255e-01,1.26952855e-01,1.49556315e-01,
254
+ 1.75674058e-01,2.05755892e-01,2.40292299e-01,2.79815316e-01,
255
+ 3.24898926e-01,3.76158879e-01,4.34251842e-01,4.99873794e-01,
256
+ 5.73757579e-01,6.56669521e-01,7.49405043e-01,8.52783210e-01,
257
+ 9.67640138e-01,1.09482124e00,1.23517231e00,1.38952936e00,
258
+ 1.55870741e00,1.74348805e00,1.94460614e00,2.16273548e00,
259
+ 2.39847384e00,2.65232736e00,2.92469468e00,3.21585089e00,
260
+ 3.52593174e00,3.85491824e00,4.20262214e00,4.56867248e00,
261
+ 4.95250359e00,5.35334499e00,5.77021329e00,6.20190671e00,
262
+ 6.64700218e00,7.10385565e00,7.57060543e00,8.04517909e00,
263
+ 8.52530380e00,9.00852024e00,9.49220006e00,9.97356678e00,
264
+ 1.04497200e01,1.09176625e01,1.13743304e01,1.18166252e01,
265
+ 1.22414481e01,1.26457352e01,1.30264942e01,1.33808408e01,
266
+ 1.37060347e01,1.39995149e01,1.42589331e01,1.44821848e01,
267
+ 1.46674378e01,1.48131571e01,1.49181262e01,1.49814637e01,
268
+ ]
269
+ a = np.array(l)
270
+ a = np.flip(a)
271
+ _faddeeva.vals = a
272
+ _faddeeva.poly = np.polynomial.polynomial.Polynomial(a)
273
+
274
+ Z = (_faddeeva.L + 1j * z) / (_faddeeva.L - 1j * z)
275
+ p = _faddeeva.poly(Z)
276
+ w = 2 * p / (_faddeeva.L - 1j * z)**2 + (1 / np.sqrt(np.pi)) / (_faddeeva.L - 1j * z)
277
+
278
+ return(w)
279
+
280
+ _faddeeva.run_yet = False
281
+ _faddeeva.vals = None
282
+ _faddeeva.L = None
283
+ _faddeeva.N = None
284
+ _faddeeva.poly = None
285
+
286
+ def _arb_voigt(center, intensity, ratio, peak_width):
287
+ """
288
+ Use the Faddeeva function to calculate a voigt line shape. See
289
+ https://en.wikipedia.org/wiki/Voigt_profile#The_uncentered_Voigt_profile
290
+ """
291
+
292
+ def _voigt_decoder(q, k):
293
+ """
294
+ Takes the FWHM (k) and a ratio (q) and determines the values of gamma and sigma.
295
+
296
+ Accurate to within around 1.2%.
297
+ """
298
+ f_l = (-k*(q**2) + (-1 + q)**2 * np.sqrt(((k**2)*(q**2) * (4 - 8 * q + 5 * (q**2)))/(-1 + q)**4))/(2 * (-1 + q)**2)
299
+ f_g = (k * (q**2) - (-1 + q)**2 * np.sqrt(((k**2) * (q**2) * (4 - 8 * q + 5 * (q**2)))/(-1 + q)**4))/(2 * (-1 + q) * q)
300
+
301
+
302
+ gamma = f_l/2 # because gamma = FWHM/2
303
+ sigma = f_g / (2 * np.sqrt(2*np.log(2)))
304
+
305
+ return(gamma,sigma)
306
+
307
+ from math import sqrt, pi
308
+
309
+ gamma, sigma = _voigt_decoder(ratio, peak_width)
310
+ denom = sigma * sqrt(2 * pi) # denomonator
311
+ z = lambda x: _faddeeva((x - center + gamma*1j)/(sqrt(2) * sigma)) # Define z(x) as numerator, more or less
312
+ l = lambda x: intensity * ((z(x).real)/denom) # define the actual voigt function
313
+
314
+ return l
315
+
316
+ def voigt_line(center, intensity, width=10, q=0.5, start=0, stop=4000, step=1):
317
+ """Calculate a voigt lineshape
318
+
319
+ This function returns a pair of numpy arrays that define a voigt line.
320
+
321
+ Arguments:
322
+ center(float): the center point of the line
323
+ intensity(float): the area under the line (NOT the height!)
324
+ width(float,optional): the full width half max of the desired line
325
+ q(float,optional): the ratio of gaussian to lorentzian, from 0 < q < 1.
326
+ start(float,optional): the starting point of the returned array
327
+ stop(float,optional): the ending point of the returned array
328
+ step(float,optional): the space between points of the returned array
329
+
330
+ Returns:
331
+ (x,y): a tuple of the x and y numpy arrays of the specified line
332
+ """
333
+ if (q <= 0):
334
+ return(gauss_line(center, intensity, width, start, stop, step))
335
+ elif (q >= 1):
336
+ return(lorentz_line(center,intensity,width,start,stop,step))
337
+
338
+ x = np.arange(start=start, stop=stop, step=step)
339
+ vfunc = np.vectorize(_arb_voigt(center, intensity, q, width))
340
+ return((x,vfunc(x)))
341
+
342
+ def _arb_gaussian(center, intensity, width=10):
343
+ """
344
+ Return a gaussian with an arbitrary height and intensity, with sigma being determined by calculating
345
+ it from our FWHM peak width.
346
+ """
347
+ from math import sqrt, pi, exp, log
348
+
349
+ sigma = (width / (2 * sqrt(2 * log(2))))
350
+ l = lambda x: intensity * (1/(sigma*sqrt(2*pi))) * exp(-((x-center)**2/(2*sigma**2)))
351
+
352
+ return l
353
+
354
+ def gauss_line(center, intensity, width=10, start=0, stop=4000, step=1):
355
+ """Calculate a gaussian lineshape
356
+
357
+ This function returns a pair of numpy arrays that define a gaussian with
358
+ given parameters.
359
+
360
+ Arguments:
361
+ center(float): the center point of the line
362
+ intensity(float): the area under the line (NOT the height!)
363
+ width(float,optional): the full width half max of the desired line
364
+ start(float,optional): the starting point of the returned array
365
+ stop(float,optional): the ending point of the returned array
366
+ step(float,optional): the space between points of the returned array
367
+
368
+ Returns:
369
+ (x,y): a tuple of the x and y numpy arrays of the specified line
370
+ """
371
+ x = np.arange(start=start, stop=stop, step=step)
372
+ vfunc = np.vectorize(_arb_gaussian(center, intensity, width))
373
+ return((x,vfunc(x)))
374
+
375
+ def _arb_lorentz(center, intensity, width=10):
376
+ """
377
+ Return a lorentzian with an arbitrary height and intensity, with gamma being calculated from our
378
+ FWHM peak width.
379
+ """
380
+ from math import pi
381
+
382
+ gamma = (width / 2)
383
+ l = lambda x: (intensity/pi) * (gamma/((x-(center))**2 + gamma**2))
384
+
385
+ return l
386
+
387
+ def lorentz_line(center, intensity, width=10, start=0, stop=4000, step=1):
388
+ """Calculate a lorentzian lineshape
389
+
390
+ This function returns a pair of numpy arrays that define a lorentzian line
391
+ given a set of parameters.
392
+
393
+ Arguments:
394
+ center(float): the center point of the line
395
+ intensity(float): the area under the line (NOT the height!)
396
+ width(float,optional): the full width half max of the desired line
397
+ start(float,optional): the starting point of the returned array
398
+ stop(float,optional): the ending point of the returned array
399
+ step(float,optional): the space between points of the returned array
400
+
401
+ Returns:
402
+ (x,y): a tuple of the x and y numpy arrays of the specified line
403
+ """
404
+ x = np.arange(start=start, stop=stop, step=step)
405
+ vfunc = np.vectorize(_arb_lorentz(center, intensity, width))
406
+ return((x,vfunc(x)))
407
+
408
+ def construct_spectrum(points, intensities, lineshape="gauss", frac_loren=0.5, width=10, start=0, stop=4000, step=1):
409
+ """Construct an entire spectrum plot of data
410
+
411
+ This function returns a pair of numpy arrays that make a spectrum; an x axis
412
+ and a y axis of the spectrum at each point on the x axis. This can then be
413
+ plotted or analyzed.
414
+
415
+ Arguments:
416
+ points([float]): a list of peak positions
417
+ intensities([float]): a list of corresponding peak intensities - the order must
418
+ match `points`
419
+ lineshape(string,optional): the desired lineshape. The options are "gauss", "lorentz", and "voigt"
420
+ frac_loren(float,optional): the fraction lorentzian of the voigt lineshape, if specified
421
+ width(float,optional): the full width half max of each peak
422
+ start(float,optional): the starting point of the returned array
423
+ stop(float,optional): the ending point of the returned array
424
+ step(float,optional): the space between points of the returned array
425
+
426
+ Returns:
427
+ (x,y): a tuple of the x and y numpy arrays for the constructed spectrum
428
+ """
429
+ l = []
430
+
431
+ linefuncs = {
432
+ "gauss": gauss_line,
433
+ "lorentz": lorentz_line,
434
+ "voigt": lambda x, y, **kwargs: voigt_line(x,y,q=frac_loren, **kwargs)
435
+ }
436
+ if (lineshape not in linefuncs.keys()):
437
+ raise AssertionError("invalid lineshape specified")
438
+ else:
439
+ linefunc = linefuncs[lineshape]
440
+
441
+ if (len(points) == 0 or len(intensities) == 0):
442
+ raise AssertionError("points or intensities are empty")
443
+
444
+ if (len(points) != len(intensities)):
445
+ raise AssertionError("peaks and intensities do not match size")
446
+
447
+ for (x,y) in zip(points, intensities):
448
+ axis, tmp = linefunc(x,y,width=width,start=start,stop=stop,step=step)
449
+ l.append(tmp)
450
+
451
+ return((axis,np.array(l).sum(axis=0)))