initial commit

This commit is contained in:
Benoît Sierro
2022-04-06 13:41:07 +02:00
commit 4dd36f8dc2
5 changed files with 1139 additions and 0 deletions

163
.gitignore vendored Normal file
View File

@@ -0,0 +1,163 @@
.vscode
.DS_Store
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

530
data/Argon_750nm.CSV Executable file
View File

@@ -0,0 +1,530 @@
70CSV
// AQ6370 OPTICAL SPECTRUM ANALYZER //
25
"CTRWL", 750.180000
"SPAN", 2.000000
"START WL", 749.180000
"STOP WL", 751.180000
"WLFREQ", 0
"REFL", -69.900
"LSCL",-3.0
"BASEL",0.00000000000
"RESLN",0.020
"AVG", 10
"SMPLAUTO", 1
"SMPL", 501
"SMPLINTVL",0.0040
"HIGH3"
"MEAS"
"LSUNT",0
"NMSKH","OFF"
"RESCOR",0
"RESPARM",14283
"FREQPARM",14283
"[TRACE DATA]"
749.1800,1.886E-009
749.1840,-1.814E-010
749.1880,4.393E-009
749.1920,5.302E-009
749.1960,1.564E-009
749.2000,2.578E-009
749.2040,3.173E-009
749.2080,2.543E-009
749.2120,4.090E-009
749.2160,2.254E-009
749.2200,1.613E-009
749.2240,2.656E-009
749.2280,4.871E-009
749.2320,2.881E-009
749.2360,2.523E-009
749.2400,1.763E-009
749.2440,5.209E-009
749.2480,3.911E-009
749.2520,3.312E-009
749.2560,2.970E-009
749.2600,3.186E-009
749.2640,3.533E-009
749.2680,6.071E-009
749.2720,6.027E-009
749.2760,2.802E-009
749.2800,4.396E-009
749.2840,4.363E-009
749.2880,4.154E-009
749.2920,5.001E-009
749.2960,6.928E-009
749.3000,3.123E-009
749.3040,4.637E-009
749.3080,3.466E-009
749.3120,4.200E-009
749.3160,3.010E-009
749.3200,4.786E-009
749.3240,5.492E-009
749.3280,3.710E-009
749.3320,5.558E-009
749.3360,3.259E-009
749.3400,4.192E-009
749.3440,1.736E-009
749.3480,2.128E-009
749.3520,5.626E-009
749.3560,1.442E-009
749.3600,2.901E-009
749.3640,4.523E-009
749.3680,4.928E-009
749.3720,5.645E-009
749.3760,4.817E-009
749.3800,4.527E-009
749.3840,4.506E-009
749.3880,3.123E-009
749.3920,3.111E-009
749.3960,2.992E-009
749.4000,5.482E-009
749.4040,4.208E-009
749.4080,6.201E-009
749.4120,5.391E-009
749.4160,4.743E-009
749.4200,5.388E-009
749.4240,5.527E-009
749.4280,7.186E-009
749.4320,4.669E-009
749.4360,5.038E-009
749.4400,4.892E-009
749.4440,2.480E-009
749.4480,2.981E-009
749.4520,2.782E-009
749.4560,5.581E-009
749.4600,6.543E-009
749.4640,6.392E-009
749.4680,7.106E-009
749.4720,3.108E-009
749.4760,5.250E-009
749.4800,3.147E-009
749.4840,6.431E-009
749.4880,4.606E-009
749.4920,4.045E-009
749.4960,6.164E-009
749.5000,3.298E-009
749.5040,4.967E-009
749.5080,5.383E-009
749.5120,4.850E-009
749.5160,5.807E-009
749.5200,5.329E-009
749.5240,7.289E-009
749.5280,5.368E-009
749.5320,6.169E-009
749.5360,1.040E-008
749.5400,4.093E-009
749.5440,5.866E-009
749.5480,3.356E-009
749.5520,7.623E-009
749.5560,4.415E-009
749.5600,3.819E-009
749.5640,3.544E-009
749.5680,7.250E-009
749.5720,4.572E-009
749.5760,3.755E-009
749.5800,5.222E-009
749.5840,5.988E-009
749.5880,5.257E-009
749.5920,6.610E-009
749.5960,3.157E-009
749.6000,3.219E-009
749.6040,4.556E-009
749.6080,6.296E-009
749.6120,5.584E-009
749.6160,4.192E-009
749.6200,7.069E-009
749.6240,5.588E-009
749.6280,4.157E-009
749.6320,3.856E-009
749.6360,5.057E-009
749.6400,5.239E-009
749.6440,5.843E-009
749.6480,2.581E-009
749.6520,6.027E-009
749.6560,6.581E-009
749.6600,5.121E-009
749.6640,6.653E-009
749.6680,4.271E-009
749.6720,5.540E-009
749.6760,6.515E-009
749.6800,7.306E-009
749.6840,4.190E-009
749.6880,3.709E-009
749.6920,6.302E-009
749.6960,6.388E-009
749.7000,5.680E-009
749.7040,5.440E-009
749.7080,5.455E-009
749.7120,7.778E-009
749.7160,4.530E-009
749.7200,6.271E-009
749.7240,8.175E-009
749.7280,6.554E-009
749.7320,5.844E-009
749.7360,6.875E-009
749.7400,7.670E-009
749.7440,6.135E-009
749.7480,6.296E-009
749.7520,6.238E-009
749.7560,8.811E-009
749.7600,1.027E-008
749.7640,3.792E-009
749.7680,6.693E-009
749.7720,5.717E-009
749.7760,5.449E-009
749.7800,8.478E-009
749.7840,7.188E-009
749.7880,9.100E-009
749.7920,7.598E-009
749.7960,6.140E-009
749.8000,7.155E-009
749.8040,7.712E-009
749.8080,7.128E-009
749.8120,4.515E-009
749.8160,6.684E-009
749.8200,7.515E-009
749.8240,5.411E-009
749.8280,6.048E-009
749.8320,9.447E-009
749.8360,9.474E-009
749.8400,6.826E-009
749.8440,6.150E-009
749.8480,9.486E-009
749.8520,8.923E-009
749.8560,8.326E-009
749.8600,9.442E-009
749.8640,4.681E-009
749.8680,7.626E-009
749.8720,7.288E-009
749.8760,5.657E-009
749.8800,9.260E-009
749.8840,7.951E-009
749.8880,8.935E-009
749.8920,6.514E-009
749.8960,8.464E-009
749.9000,9.091E-009
749.9040,1.053E-008
749.9080,1.103E-008
749.9120,9.890E-009
749.9160,6.340E-009
749.9200,8.855E-009
749.9240,1.044E-008
749.9280,9.490E-009
749.9320,1.076E-008
749.9360,9.019E-009
749.9400,1.063E-008
749.9440,9.949E-009
749.9480,9.264E-009
749.9520,1.116E-008
749.9560,1.238E-008
749.9600,1.025E-008
749.9640,1.183E-008
749.9680,1.042E-008
749.9720,9.502E-009
749.9760,7.598E-009
749.9800,1.096E-008
749.9840,1.079E-008
749.9880,1.368E-008
749.9920,1.069E-008
749.9960,1.192E-008
750.0000,1.211E-008
750.0040,1.476E-008
750.0080,1.534E-008
750.0120,1.506E-008
750.0160,1.322E-008
750.0200,1.406E-008
750.0240,1.508E-008
750.0280,1.574E-008
750.0320,1.629E-008
750.0360,1.545E-008
750.0400,1.585E-008
750.0440,1.731E-008
750.0480,1.625E-008
750.0520,1.876E-008
750.0560,1.791E-008
750.0600,1.896E-008
750.0640,1.980E-008
750.0680,2.010E-008
750.0720,2.023E-008
750.0760,2.128E-008
750.0800,2.544E-008
750.0840,2.544E-008
750.0880,2.731E-008
750.0920,2.901E-008
750.0960,2.839E-008
750.1000,3.096E-008
750.1040,3.367E-008
750.1080,3.454E-008
750.1120,4.052E-008
750.1160,4.003E-008
750.1200,4.248E-008
750.1240,4.626E-008
750.1280,5.003E-008
750.1320,5.483E-008
750.1360,5.708E-008
750.1400,6.262E-008
750.1440,6.452E-008
750.1480,6.785E-008
750.1520,6.922E-008
750.1560,7.622E-008
750.1600,7.845E-008
750.1640,8.219E-008
750.1680,8.486E-008
750.1720,8.939E-008
750.1760,9.025E-008
750.1800,9.551E-008
750.1840,9.807E-008
750.1880,1.009E-007
750.1920,1.024E-007
750.1960,1.022E-007
750.2000,1.002E-007
750.2040,1.001E-007
750.2080,1.027E-007
750.2120,1.021E-007
750.2160,1.022E-007
750.2200,9.834E-008
750.2240,9.332E-008
750.2280,9.466E-008
750.2320,8.955E-008
750.2360,8.618E-008
750.2400,8.028E-008
750.2440,7.696E-008
750.2480,7.295E-008
750.2520,6.936E-008
750.2560,6.697E-008
750.2600,6.196E-008
750.2640,5.951E-008
750.2680,5.537E-008
750.2720,5.195E-008
750.2760,4.552E-008
750.2800,4.439E-008
750.2840,4.067E-008
750.2880,3.739E-008
750.2920,3.261E-008
750.2960,3.446E-008
750.3000,3.258E-008
750.3040,2.899E-008
750.3080,2.870E-008
750.3120,2.625E-008
750.3160,2.627E-008
750.3200,2.699E-008
750.3240,2.223E-008
750.3280,2.266E-008
750.3320,2.202E-008
750.3360,2.112E-008
750.3400,1.899E-008
750.3440,1.847E-008
750.3480,1.961E-008
750.3520,1.872E-008
750.3560,1.725E-008
750.3600,1.668E-008
750.3640,1.558E-008
750.3680,1.712E-008
750.3720,1.662E-008
750.3760,1.451E-008
750.3800,1.382E-008
750.3840,1.517E-008
750.3880,1.397E-008
750.3920,1.554E-008
750.3960,1.302E-008
750.4000,1.672E-008
750.4040,1.285E-008
750.4080,1.271E-008
750.4120,1.242E-008
750.4160,1.341E-008
750.4200,1.195E-008
750.4240,1.081E-008
750.4280,1.136E-008
750.4320,8.758E-009
750.4360,1.142E-008
750.4400,1.043E-008
750.4440,8.205E-009
750.4480,1.255E-008
750.4520,8.982E-009
750.4560,9.364E-009
750.4600,8.464E-009
750.4640,1.071E-008
750.4680,1.159E-008
750.4720,6.774E-009
750.4760,1.051E-008
750.4800,9.242E-009
750.4840,9.927E-009
750.4880,6.740E-009
750.4920,9.382E-009
750.4960,8.447E-009
750.5000,1.111E-008
750.5040,9.997E-009
750.5080,8.018E-009
750.5120,1.122E-008
750.5160,9.959E-009
750.5200,8.895E-009
750.5240,1.157E-008
750.5280,8.677E-009
750.5320,9.303E-009
750.5360,7.186E-009
750.5400,9.815E-009
750.5440,7.531E-009
750.5480,1.158E-008
750.5520,8.225E-009
750.5560,7.345E-009
750.5600,6.519E-009
750.5640,7.842E-009
750.5680,8.510E-009
750.5720,9.191E-009
750.5760,1.218E-008
750.5800,6.444E-009
750.5840,9.170E-009
750.5880,9.678E-009
750.5920,7.806E-009
750.5960,7.396E-009
750.6000,6.904E-009
750.6040,9.053E-009
750.6080,1.029E-008
750.6120,5.697E-009
750.6160,1.016E-008
750.6200,1.036E-008
750.6240,8.116E-009
750.6280,6.741E-009
750.6320,8.353E-009
750.6360,7.724E-009
750.6400,9.610E-009
750.6440,8.374E-009
750.6480,1.078E-008
750.6520,9.833E-009
750.6560,7.249E-009
750.6600,6.146E-009
750.6640,6.232E-009
750.6680,6.907E-009
750.6720,6.143E-009
750.6760,6.774E-009
750.6800,6.977E-009
750.6840,6.737E-009
750.6880,8.807E-009
750.6920,8.040E-009
750.6960,7.598E-009
750.7000,7.425E-009
750.7040,5.808E-009
750.7080,8.750E-009
750.7120,9.276E-009
750.7160,8.646E-009
750.7200,1.036E-008
750.7240,8.932E-009
750.7280,8.940E-009
750.7320,1.151E-008
750.7360,8.142E-009
750.7400,8.845E-009
750.7440,7.983E-009
750.7480,1.041E-008
750.7520,6.024E-009
750.7560,9.695E-009
750.7600,8.548E-009
750.7640,8.050E-009
750.7680,9.533E-009
750.7720,7.497E-009
750.7760,7.554E-009
750.7800,1.029E-008
750.7840,7.741E-009
750.7880,7.026E-009
750.7920,9.383E-009
750.7960,6.949E-009
750.8000,7.401E-009
750.8040,8.791E-009
750.8080,8.840E-009
750.8120,5.809E-009
750.8160,7.133E-009
750.8200,6.826E-009
750.8240,5.498E-009
750.8280,6.650E-009
750.8320,6.834E-009
750.8360,6.541E-009
750.8400,9.232E-009
750.8440,5.792E-009
750.8480,9.510E-009
750.8520,7.648E-009
750.8560,1.193E-008
750.8600,1.032E-008
750.8640,7.720E-009
750.8680,6.292E-009
750.8720,1.025E-008
750.8760,7.721E-009
750.8800,5.053E-009
750.8840,7.349E-009
750.8880,7.235E-009
750.8920,7.434E-009
750.8960,6.194E-009
750.9000,5.896E-009
750.9040,6.173E-009
750.9080,8.190E-009
750.9120,7.514E-009
750.9160,5.786E-009
750.9200,6.912E-009
750.9240,7.847E-009
750.9280,8.771E-009
750.9320,8.483E-009
750.9360,7.402E-009
750.9400,9.425E-009
750.9440,7.235E-009
750.9480,7.314E-009
750.9520,9.199E-009
750.9560,7.407E-009
750.9600,9.833E-009
750.9640,8.369E-009
750.9680,8.188E-009
750.9720,5.897E-009
750.9760,1.121E-008
750.9800,7.247E-009
750.9840,1.030E-008
750.9880,9.059E-009
750.9920,6.305E-009
750.9960,7.803E-009
751.0000,6.260E-009
751.0040,6.632E-009
751.0080,8.439E-009
751.0120,6.287E-009
751.0160,9.148E-009
751.0200,8.275E-009
751.0240,8.422E-009
751.0280,7.888E-009
751.0320,8.916E-009
751.0360,7.581E-009
751.0400,9.430E-009
751.0440,9.312E-009
751.0480,9.281E-009
751.0520,9.729E-009
751.0560,1.015E-008
751.0600,9.065E-009
751.0640,1.002E-008
751.0680,7.607E-009
751.0720,8.622E-009
751.0760,1.189E-008
751.0800,9.802E-009
751.0840,8.685E-009
751.0880,6.030E-009
751.0920,9.090E-009
751.0960,1.158E-008
751.1000,5.451E-009
751.1040,9.767E-009
751.1080,6.368E-009
751.1120,7.536E-009
751.1160,1.124E-008
751.1200,1.017E-008
751.1240,9.669E-009
751.1280,9.600E-009
751.1320,8.671E-009
751.1360,1.134E-008
751.1400,9.225E-009
751.1440,1.207E-008
751.1480,8.720E-009
751.1520,5.573E-009
751.1560,9.581E-009
751.1600,9.566E-009
751.1640,1.122E-008
751.1680,1.144E-008
751.1720,1.069E-008
751.1760,1.181E-008
751.1800,1.227E-008
1 70CSV
2 // AQ6370 OPTICAL SPECTRUM ANALYZER //
3 25
4 CTRWL 750.180000
5 SPAN 2.000000
6 START WL 749.180000
7 STOP WL 751.180000
8 WLFREQ 0
9 REFL -69.900
10 LSCL -3.0
11 BASEL 0.00000000000
12 RESLN 0.020
13 AVG 10
14 SMPLAUTO 1
15 SMPL 501
16 SMPLINTVL 0.0040
17 HIGH3
18 MEAS
19 LSUNT 0
20 NMSKH OFF
21 RESCOR 0
22 RESPARM 14283
23 FREQPARM 14283
24 [TRACE DATA]
25 749.1800 1.886E-009
26 749.1840 -1.814E-010
27 749.1880 4.393E-009
28 749.1920 5.302E-009
29 749.1960 1.564E-009
30 749.2000 2.578E-009
31 749.2040 3.173E-009
32 749.2080 2.543E-009
33 749.2120 4.090E-009
34 749.2160 2.254E-009
35 749.2200 1.613E-009
36 749.2240 2.656E-009
37 749.2280 4.871E-009
38 749.2320 2.881E-009
39 749.2360 2.523E-009
40 749.2400 1.763E-009
41 749.2440 5.209E-009
42 749.2480 3.911E-009
43 749.2520 3.312E-009
44 749.2560 2.970E-009
45 749.2600 3.186E-009
46 749.2640 3.533E-009
47 749.2680 6.071E-009
48 749.2720 6.027E-009
49 749.2760 2.802E-009
50 749.2800 4.396E-009
51 749.2840 4.363E-009
52 749.2880 4.154E-009
53 749.2920 5.001E-009
54 749.2960 6.928E-009
55 749.3000 3.123E-009
56 749.3040 4.637E-009
57 749.3080 3.466E-009
58 749.3120 4.200E-009
59 749.3160 3.010E-009
60 749.3200 4.786E-009
61 749.3240 5.492E-009
62 749.3280 3.710E-009
63 749.3320 5.558E-009
64 749.3360 3.259E-009
65 749.3400 4.192E-009
66 749.3440 1.736E-009
67 749.3480 2.128E-009
68 749.3520 5.626E-009
69 749.3560 1.442E-009
70 749.3600 2.901E-009
71 749.3640 4.523E-009
72 749.3680 4.928E-009
73 749.3720 5.645E-009
74 749.3760 4.817E-009
75 749.3800 4.527E-009
76 749.3840 4.506E-009
77 749.3880 3.123E-009
78 749.3920 3.111E-009
79 749.3960 2.992E-009
80 749.4000 5.482E-009
81 749.4040 4.208E-009
82 749.4080 6.201E-009
83 749.4120 5.391E-009
84 749.4160 4.743E-009
85 749.4200 5.388E-009
86 749.4240 5.527E-009
87 749.4280 7.186E-009
88 749.4320 4.669E-009
89 749.4360 5.038E-009
90 749.4400 4.892E-009
91 749.4440 2.480E-009
92 749.4480 2.981E-009
93 749.4520 2.782E-009
94 749.4560 5.581E-009
95 749.4600 6.543E-009
96 749.4640 6.392E-009
97 749.4680 7.106E-009
98 749.4720 3.108E-009
99 749.4760 5.250E-009
100 749.4800 3.147E-009
101 749.4840 6.431E-009
102 749.4880 4.606E-009
103 749.4920 4.045E-009
104 749.4960 6.164E-009
105 749.5000 3.298E-009
106 749.5040 4.967E-009
107 749.5080 5.383E-009
108 749.5120 4.850E-009
109 749.5160 5.807E-009
110 749.5200 5.329E-009
111 749.5240 7.289E-009
112 749.5280 5.368E-009
113 749.5320 6.169E-009
114 749.5360 1.040E-008
115 749.5400 4.093E-009
116 749.5440 5.866E-009
117 749.5480 3.356E-009
118 749.5520 7.623E-009
119 749.5560 4.415E-009
120 749.5600 3.819E-009
121 749.5640 3.544E-009
122 749.5680 7.250E-009
123 749.5720 4.572E-009
124 749.5760 3.755E-009
125 749.5800 5.222E-009
126 749.5840 5.988E-009
127 749.5880 5.257E-009
128 749.5920 6.610E-009
129 749.5960 3.157E-009
130 749.6000 3.219E-009
131 749.6040 4.556E-009
132 749.6080 6.296E-009
133 749.6120 5.584E-009
134 749.6160 4.192E-009
135 749.6200 7.069E-009
136 749.6240 5.588E-009
137 749.6280 4.157E-009
138 749.6320 3.856E-009
139 749.6360 5.057E-009
140 749.6400 5.239E-009
141 749.6440 5.843E-009
142 749.6480 2.581E-009
143 749.6520 6.027E-009
144 749.6560 6.581E-009
145 749.6600 5.121E-009
146 749.6640 6.653E-009
147 749.6680 4.271E-009
148 749.6720 5.540E-009
149 749.6760 6.515E-009
150 749.6800 7.306E-009
151 749.6840 4.190E-009
152 749.6880 3.709E-009
153 749.6920 6.302E-009
154 749.6960 6.388E-009
155 749.7000 5.680E-009
156 749.7040 5.440E-009
157 749.7080 5.455E-009
158 749.7120 7.778E-009
159 749.7160 4.530E-009
160 749.7200 6.271E-009
161 749.7240 8.175E-009
162 749.7280 6.554E-009
163 749.7320 5.844E-009
164 749.7360 6.875E-009
165 749.7400 7.670E-009
166 749.7440 6.135E-009
167 749.7480 6.296E-009
168 749.7520 6.238E-009
169 749.7560 8.811E-009
170 749.7600 1.027E-008
171 749.7640 3.792E-009
172 749.7680 6.693E-009
173 749.7720 5.717E-009
174 749.7760 5.449E-009
175 749.7800 8.478E-009
176 749.7840 7.188E-009
177 749.7880 9.100E-009
178 749.7920 7.598E-009
179 749.7960 6.140E-009
180 749.8000 7.155E-009
181 749.8040 7.712E-009
182 749.8080 7.128E-009
183 749.8120 4.515E-009
184 749.8160 6.684E-009
185 749.8200 7.515E-009
186 749.8240 5.411E-009
187 749.8280 6.048E-009
188 749.8320 9.447E-009
189 749.8360 9.474E-009
190 749.8400 6.826E-009
191 749.8440 6.150E-009
192 749.8480 9.486E-009
193 749.8520 8.923E-009
194 749.8560 8.326E-009
195 749.8600 9.442E-009
196 749.8640 4.681E-009
197 749.8680 7.626E-009
198 749.8720 7.288E-009
199 749.8760 5.657E-009
200 749.8800 9.260E-009
201 749.8840 7.951E-009
202 749.8880 8.935E-009
203 749.8920 6.514E-009
204 749.8960 8.464E-009
205 749.9000 9.091E-009
206 749.9040 1.053E-008
207 749.9080 1.103E-008
208 749.9120 9.890E-009
209 749.9160 6.340E-009
210 749.9200 8.855E-009
211 749.9240 1.044E-008
212 749.9280 9.490E-009
213 749.9320 1.076E-008
214 749.9360 9.019E-009
215 749.9400 1.063E-008
216 749.9440 9.949E-009
217 749.9480 9.264E-009
218 749.9520 1.116E-008
219 749.9560 1.238E-008
220 749.9600 1.025E-008
221 749.9640 1.183E-008
222 749.9680 1.042E-008
223 749.9720 9.502E-009
224 749.9760 7.598E-009
225 749.9800 1.096E-008
226 749.9840 1.079E-008
227 749.9880 1.368E-008
228 749.9920 1.069E-008
229 749.9960 1.192E-008
230 750.0000 1.211E-008
231 750.0040 1.476E-008
232 750.0080 1.534E-008
233 750.0120 1.506E-008
234 750.0160 1.322E-008
235 750.0200 1.406E-008
236 750.0240 1.508E-008
237 750.0280 1.574E-008
238 750.0320 1.629E-008
239 750.0360 1.545E-008
240 750.0400 1.585E-008
241 750.0440 1.731E-008
242 750.0480 1.625E-008
243 750.0520 1.876E-008
244 750.0560 1.791E-008
245 750.0600 1.896E-008
246 750.0640 1.980E-008
247 750.0680 2.010E-008
248 750.0720 2.023E-008
249 750.0760 2.128E-008
250 750.0800 2.544E-008
251 750.0840 2.544E-008
252 750.0880 2.731E-008
253 750.0920 2.901E-008
254 750.0960 2.839E-008
255 750.1000 3.096E-008
256 750.1040 3.367E-008
257 750.1080 3.454E-008
258 750.1120 4.052E-008
259 750.1160 4.003E-008
260 750.1200 4.248E-008
261 750.1240 4.626E-008
262 750.1280 5.003E-008
263 750.1320 5.483E-008
264 750.1360 5.708E-008
265 750.1400 6.262E-008
266 750.1440 6.452E-008
267 750.1480 6.785E-008
268 750.1520 6.922E-008
269 750.1560 7.622E-008
270 750.1600 7.845E-008
271 750.1640 8.219E-008
272 750.1680 8.486E-008
273 750.1720 8.939E-008
274 750.1760 9.025E-008
275 750.1800 9.551E-008
276 750.1840 9.807E-008
277 750.1880 1.009E-007
278 750.1920 1.024E-007
279 750.1960 1.022E-007
280 750.2000 1.002E-007
281 750.2040 1.001E-007
282 750.2080 1.027E-007
283 750.2120 1.021E-007
284 750.2160 1.022E-007
285 750.2200 9.834E-008
286 750.2240 9.332E-008
287 750.2280 9.466E-008
288 750.2320 8.955E-008
289 750.2360 8.618E-008
290 750.2400 8.028E-008
291 750.2440 7.696E-008
292 750.2480 7.295E-008
293 750.2520 6.936E-008
294 750.2560 6.697E-008
295 750.2600 6.196E-008
296 750.2640 5.951E-008
297 750.2680 5.537E-008
298 750.2720 5.195E-008
299 750.2760 4.552E-008
300 750.2800 4.439E-008
301 750.2840 4.067E-008
302 750.2880 3.739E-008
303 750.2920 3.261E-008
304 750.2960 3.446E-008
305 750.3000 3.258E-008
306 750.3040 2.899E-008
307 750.3080 2.870E-008
308 750.3120 2.625E-008
309 750.3160 2.627E-008
310 750.3200 2.699E-008
311 750.3240 2.223E-008
312 750.3280 2.266E-008
313 750.3320 2.202E-008
314 750.3360 2.112E-008
315 750.3400 1.899E-008
316 750.3440 1.847E-008
317 750.3480 1.961E-008
318 750.3520 1.872E-008
319 750.3560 1.725E-008
320 750.3600 1.668E-008
321 750.3640 1.558E-008
322 750.3680 1.712E-008
323 750.3720 1.662E-008
324 750.3760 1.451E-008
325 750.3800 1.382E-008
326 750.3840 1.517E-008
327 750.3880 1.397E-008
328 750.3920 1.554E-008
329 750.3960 1.302E-008
330 750.4000 1.672E-008
331 750.4040 1.285E-008
332 750.4080 1.271E-008
333 750.4120 1.242E-008
334 750.4160 1.341E-008
335 750.4200 1.195E-008
336 750.4240 1.081E-008
337 750.4280 1.136E-008
338 750.4320 8.758E-009
339 750.4360 1.142E-008
340 750.4400 1.043E-008
341 750.4440 8.205E-009
342 750.4480 1.255E-008
343 750.4520 8.982E-009
344 750.4560 9.364E-009
345 750.4600 8.464E-009
346 750.4640 1.071E-008
347 750.4680 1.159E-008
348 750.4720 6.774E-009
349 750.4760 1.051E-008
350 750.4800 9.242E-009
351 750.4840 9.927E-009
352 750.4880 6.740E-009
353 750.4920 9.382E-009
354 750.4960 8.447E-009
355 750.5000 1.111E-008
356 750.5040 9.997E-009
357 750.5080 8.018E-009
358 750.5120 1.122E-008
359 750.5160 9.959E-009
360 750.5200 8.895E-009
361 750.5240 1.157E-008
362 750.5280 8.677E-009
363 750.5320 9.303E-009
364 750.5360 7.186E-009
365 750.5400 9.815E-009
366 750.5440 7.531E-009
367 750.5480 1.158E-008
368 750.5520 8.225E-009
369 750.5560 7.345E-009
370 750.5600 6.519E-009
371 750.5640 7.842E-009
372 750.5680 8.510E-009
373 750.5720 9.191E-009
374 750.5760 1.218E-008
375 750.5800 6.444E-009
376 750.5840 9.170E-009
377 750.5880 9.678E-009
378 750.5920 7.806E-009
379 750.5960 7.396E-009
380 750.6000 6.904E-009
381 750.6040 9.053E-009
382 750.6080 1.029E-008
383 750.6120 5.697E-009
384 750.6160 1.016E-008
385 750.6200 1.036E-008
386 750.6240 8.116E-009
387 750.6280 6.741E-009
388 750.6320 8.353E-009
389 750.6360 7.724E-009
390 750.6400 9.610E-009
391 750.6440 8.374E-009
392 750.6480 1.078E-008
393 750.6520 9.833E-009
394 750.6560 7.249E-009
395 750.6600 6.146E-009
396 750.6640 6.232E-009
397 750.6680 6.907E-009
398 750.6720 6.143E-009
399 750.6760 6.774E-009
400 750.6800 6.977E-009
401 750.6840 6.737E-009
402 750.6880 8.807E-009
403 750.6920 8.040E-009
404 750.6960 7.598E-009
405 750.7000 7.425E-009
406 750.7040 5.808E-009
407 750.7080 8.750E-009
408 750.7120 9.276E-009
409 750.7160 8.646E-009
410 750.7200 1.036E-008
411 750.7240 8.932E-009
412 750.7280 8.940E-009
413 750.7320 1.151E-008
414 750.7360 8.142E-009
415 750.7400 8.845E-009
416 750.7440 7.983E-009
417 750.7480 1.041E-008
418 750.7520 6.024E-009
419 750.7560 9.695E-009
420 750.7600 8.548E-009
421 750.7640 8.050E-009
422 750.7680 9.533E-009
423 750.7720 7.497E-009
424 750.7760 7.554E-009
425 750.7800 1.029E-008
426 750.7840 7.741E-009
427 750.7880 7.026E-009
428 750.7920 9.383E-009
429 750.7960 6.949E-009
430 750.8000 7.401E-009
431 750.8040 8.791E-009
432 750.8080 8.840E-009
433 750.8120 5.809E-009
434 750.8160 7.133E-009
435 750.8200 6.826E-009
436 750.8240 5.498E-009
437 750.8280 6.650E-009
438 750.8320 6.834E-009
439 750.8360 6.541E-009
440 750.8400 9.232E-009
441 750.8440 5.792E-009
442 750.8480 9.510E-009
443 750.8520 7.648E-009
444 750.8560 1.193E-008
445 750.8600 1.032E-008
446 750.8640 7.720E-009
447 750.8680 6.292E-009
448 750.8720 1.025E-008
449 750.8760 7.721E-009
450 750.8800 5.053E-009
451 750.8840 7.349E-009
452 750.8880 7.235E-009
453 750.8920 7.434E-009
454 750.8960 6.194E-009
455 750.9000 5.896E-009
456 750.9040 6.173E-009
457 750.9080 8.190E-009
458 750.9120 7.514E-009
459 750.9160 5.786E-009
460 750.9200 6.912E-009
461 750.9240 7.847E-009
462 750.9280 8.771E-009
463 750.9320 8.483E-009
464 750.9360 7.402E-009
465 750.9400 9.425E-009
466 750.9440 7.235E-009
467 750.9480 7.314E-009
468 750.9520 9.199E-009
469 750.9560 7.407E-009
470 750.9600 9.833E-009
471 750.9640 8.369E-009
472 750.9680 8.188E-009
473 750.9720 5.897E-009
474 750.9760 1.121E-008
475 750.9800 7.247E-009
476 750.9840 1.030E-008
477 750.9880 9.059E-009
478 750.9920 6.305E-009
479 750.9960 7.803E-009
480 751.0000 6.260E-009
481 751.0040 6.632E-009
482 751.0080 8.439E-009
483 751.0120 6.287E-009
484 751.0160 9.148E-009
485 751.0200 8.275E-009
486 751.0240 8.422E-009
487 751.0280 7.888E-009
488 751.0320 8.916E-009
489 751.0360 7.581E-009
490 751.0400 9.430E-009
491 751.0440 9.312E-009
492 751.0480 9.281E-009
493 751.0520 9.729E-009
494 751.0560 1.015E-008
495 751.0600 9.065E-009
496 751.0640 1.002E-008
497 751.0680 7.607E-009
498 751.0720 8.622E-009
499 751.0760 1.189E-008
500 751.0800 9.802E-009
501 751.0840 8.685E-009
502 751.0880 6.030E-009
503 751.0920 9.090E-009
504 751.0960 1.158E-008
505 751.1000 5.451E-009
506 751.1040 9.767E-009
507 751.1080 6.368E-009
508 751.1120 7.536E-009
509 751.1160 1.124E-008
510 751.1200 1.017E-008
511 751.1240 9.669E-009
512 751.1280 9.600E-009
513 751.1320 8.671E-009
514 751.1360 1.134E-008
515 751.1400 9.225E-009
516 751.1440 1.207E-008
517 751.1480 8.720E-009
518 751.1520 5.573E-009
519 751.1560 9.581E-009
520 751.1600 9.566E-009
521 751.1640 1.122E-008
522 751.1680 1.144E-008
523 751.1720 1.069E-008
524 751.1760 1.181E-008
525 751.1800 1.227E-008

BIN
data/data.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

400
deconvolution.py Normal file
View File

@@ -0,0 +1,400 @@
from dataclasses import dataclass, field
from pathlib import Path
from typing import Callable
import click
import labmodule as lab
import numpy as np
from customfunc.app import PlotApp
from numpy.fft import fft, fftshift, ifft
from scipy.optimize import curve_fit
LN2 = np.log(2)
@click.group()
def main():
pass
@dataclass
class FitResult:
curve: np.ndarray = field(repr=False)
covariance: np.ndarray
amp: float
width: float
x0: float = 0
params: tuple[float, ...] = field(default_factory=tuple)
@dataclass
class VoigtFitResult:
name: str
curve: np.ndarray = field(repr=False)
covariance: np.ndarray
gaussian_width: float
lorentzian_width: float
@property
def descr(self) -> str:
return (
f"{self.name} - Gaussian width : {self.gaussian_width:.2f}, "
f"Lorentzian width : {self.lorentzian_width:.2f}"
)
def setup_axes(n: int, lims=(-10, 10)) -> tuple[np.ndarray, float, np.ndarray, float]:
"""Creates a time-like and a frequency-like array and returns their respective spacing"""
x, dx = np.linspace(*lims, n, retstep=True)
f = np.fft.fftfreq(n, dx)
return x, dx, f, f[1] - f[0]
def freq_axis(x: np.ndarray) -> tuple[np.ndarray, np.ndarray, float]:
"""
given an array with equally spaced values, returns a corresponding frequency array,
an array of indices to automatically sort ffts and the x spacing
"""
dx = np.diff(x).mean()
f = np.fft.fftfreq(len(x), dx)
ind = np.argsort(f)
return f[ind], ind, dx
def lorentzian(x: np.ndarray, amp: float, width: float, x0: float) -> np.ndarray:
"""Lorentzian function of max `amp`, FWHM `width` and position `x0`"""
gamma = (width * 0.5) ** 2
return amp * gamma / ((x - x0) ** 2 + gamma)
def unit_lorentzian(x: np.ndarray, width: float, x0: float) -> np.ndarray:
"""Normalized Lorentzian function of FWHM `width` and position `x0`"""
return lorentzian(x, 1 / (np.pi * width * 0.5), width, x0)
def peak_func(x: np.ndarray, amp: float, width: float, x0: float) -> np.ndarray:
"""2-sided decaying exp of max `amp`, FWHM `width` and position `x0`"""
a = 2 * LN2 / width
return amp * np.exp(-np.abs(x - x0) * a)
def fft_lorentzian(f: np.ndarray, dx: float, amp: float, width: float) -> np.ndarray:
"""
Same as `peak_func` but parametrized as the fourier transform
of a Lorentzian function of max `amp` and FWHM `width`
"""
gamma_sqrt = width / 2
return amp * np.pi * gamma_sqrt * np.exp(-2 * np.pi * gamma_sqrt * np.abs(f)) / dx
def gaussian(x: np.ndarray, amp: float, width: float, x0: float) -> np.ndarray:
"""Gaussian function of max `amp`, FWHM `width` and position `x0`"""
sig2 = width ** 2 / (8 * LN2)
return amp * np.exp(-((x - x0) ** 2) / (2 * sig2))
def elevated_gaussian(x: np.ndarray, amp: float, width: float, x0: float, y0: float) -> np.ndarray:
"""Gaussian function of max `amp`, FWHM `width`, position `x0` and baseline `y0`"""
sig2 = width ** 2 / (8 * LN2)
return amp * np.exp(-((x - x0) ** 2) / (2 * sig2)) + y0
def unit_gaussian(x: np.ndarray, width: float, x0: float) -> np.ndarray:
"""Normalized Gaussian function of FWHM `width` and position `x0`"""
return gaussian(x, np.sqrt(4 * LN2 / np.pi) / width, width, x0)
def fft_gaussian(f: np.ndarray, dx: float, amp: float, width: float) -> np.ndarray:
"""
Same as `gaussian` but parametrized as the fourier transform
of another Gaussian function of max `amp` and FWHM `width`
""" # exp_param =
freq_amp = amp * width / 2 * np.sqrt(np.pi / LN2) / dx
freq_width = 4 * LN2 / (width * np.pi)
return gaussian(f, freq_amp, freq_width, 0)
def voigt(x: np.ndarray, gaussian_width: float, lorentzian_width: float) -> np.ndarray:
"""Voigt profile of max 1 with specified Gaussian and Lorentzian FWHM"""
conv = convolve(unit_gaussian(x, gaussian_width, 0), unit_lorentzian(x, lorentzian_width, 0))
if conv.max() > 0:
return conv / conv.max()
return conv
def log_voigt(x: np.ndarray, gaussian_width: float, lorentzian_width: float) -> np.ndarray:
"""log of `voigt`"""
return np.log(voigt(x, gaussian_width, lorentzian_width))
def fft_voigt(
f: np.ndarray, dx: float, gaussian_width: float, lorentzian_width: float
) -> np.ndarray:
"""
returns the product of a `peak_func` and a `gaussian`
parameterized as the Fourier transform of a Voigt profile
given by `gaussian_width` and `lorentzian_width`
"""
profile = fft_gaussian(f, dx, 1, gaussian_width) * fft_lorentzian(f, dx, 1, lorentzian_width)
return profile / profile.max()
def single_func_fit(
x: np.ndarray,
y: np.ndarray,
fct: Callable[[np.ndarray, float, float, float], np.ndarray],
force_center=False,
use_weights=False,
extra_params: int = 0,
) -> FitResult:
"""fits a single bell-like function (Gaussian or Lorentian, not Voigt)
Parameters
----------
x : np.ndarray
x input
y : np.ndarray
corresponding y data
fct : Callable[[np.ndarray, float, float, float], np.ndarray]
function to fit
force_center : bool, optional
assume the bell is centered at x=0, by default False
use_weights : bool, optional
give more importance to higher y values, by default False
Returns
-------
FitResult
resuts of the fit
"""
if force_center:
def _fct(_x: np.ndarray, amp: float, width: float):
return fct(_x, amp, width, 0)
fct = _fct
am = y.argmax()
params, cov = curve_fit(
fct, x, y, sigma=1 / y if use_weights else None, p0=[y[am], 1, x[am]] + [0] * extra_params
)
curve = fct(x, *params)
return FitResult(curve, cov, params[0], params[1], params[2], tuple(params))
def linear_direct_voigt_fit(x: np.ndarray, y: np.ndarray, use_weights=False) -> VoigtFitResult:
params, cov = curve_fit(voigt, x, y, sigma=1 / y if use_weights else None)
curve = voigt(x, *params)
return VoigtFitResult("Linear direct fit", curve, cov, *params)
def log_direct_voigt_fit(x: np.ndarray, y: np.ndarray) -> VoigtFitResult:
ind = y > 0
y_fit = np.log(y[ind])
x_fit = x[ind]
params, cov = curve_fit(log_voigt, x_fit, y_fit, bounds=[1e-12, np.inf])
curve = np.exp(log_voigt(x, *params))
return VoigtFitResult("Log direct fit", curve, cov, *params)
def linear_fft_voigt_fit(f: np.ndarray, A: np.ndarray, x: np.ndarray, dx: float) -> VoigtFitResult:
params, cov = curve_fit(
lambda _f, _g, _l: fft_voigt(_f, dx, _g, _l), f, A, bounds=[1e-12, np.inf]
)
curve = voigt(x, *params)
return VoigtFitResult("Linear FFT fit", curve, cov, *params)
def convolve(gau: np.ndarray, lor: np.ndarray) -> np.ndarray:
return np.convolve(gau, lor, mode="same")
def add_noise(arr: np.ndarray, abs_fac: float, rel_fac: float):
return (
arr + abs_fac * np.random.rand(len(arr)) + rel_fac * arr * (np.random.rand(len(arr)) - 0.5)
)
@main.command(help="fit a lorentzian with a gaussian")
def demo1():
x = np.linspace(-10, 10, 501)
with PlotApp(
FWHM=np.geomspace(0.1, 10),
relative_noise=np.linspace(0, 2),
absolute_noise=[0, *np.geomspace(0.001, 1)],
) as app:
app.set_antialiasing(True)
app.params["FWHM"].value = 3.7
@app.update
def draw(FWHM, relative_noise, absolute_noise):
lo = lorentzian(x, 1, FWHM, 0)
lo = add_noise(lo, absolute_noise, relative_noise * 0.04)
fit = single_func_fit(x, lo, gaussian)
app[0].set_line_data("Lorentzian", x, lo, width=2)
app[0].set_line_data(
"gaus fit", x, fit.curve, width=2, label=f"Gaussian fit : FWHM = {fit.width}"
)
@main.command(name="default", help="illustrate the influence of noises and fit a voigt profile")
def demo2():
with PlotApp(
n=np.arange(256, 2046),
lorentz_fwhm=np.geomspace(0.1, 1),
gauss_fwhm=np.linspace(1, 10),
relative_noise=np.linspace(0, 2),
absolute_noise=[0, *np.geomspace(1e-6, 1, 201)],
) as app:
app.set_antialiasing(True)
ax = app["Main Plot"]
app.params["gauss_fwhm"].value = 5
app.params["n"].value = 1024
app.params_layout.setSpacing(0)
@app.update
def draw(n, lorentz_fwhm, gauss_fwhm, absolute_noise, relative_noise):
x, dx, f, df = setup_axes(n, (-20, 20))
gaus = gaussian(x, 1, gauss_fwhm, 0)
lore = lorentzian(x, 1, lorentz_fwhm, 0)
ax.set_line_data("Gaussian", x, gaus / gaus.max(), width=2)
ax.set_line_data("Lorentz", x, lore / lore.max(), width=2)
conv = convolve(gaus, lore)
conv /= conv.max()
conv_noise = add_noise(conv, absolute_noise, relative_noise * 0.1)
gaus_noise = add_noise(gaus, absolute_noise, relative_noise * 0.1)
ax.set_line_data("Voigt", x, conv, width=2)
ax.set_line_data("Noisy Voigt", x, conv_noise, width=2)
ax.set_line_data("Noisy Gaussian", x, gaus_noise, width=2)
lin_fit = linear_direct_voigt_fit(x, conv_noise)
log_fit = log_direct_voigt_fit(x, conv_noise)
transfo = np.fft.fft(np.fft.fftshift(conv_noise)).real
fft_fit = linear_fft_voigt_fit(f, transfo / transfo.max(), x, dx)
for fit in lin_fit, log_fit, fft_fit:
display_fit(x, fit)
def display_fit(x: np.ndarray, fit: VoigtFitResult):
ax.set_line_data(fit.name, x, fit.curve)
ax.set_line_data(
fit.name + "gauss",
x,
gaussian(x, 1, fit.gaussian_width, 0),
label=f"{fit.name} - Gaussian {fit.gaussian_width:.2f}",
width=1.5,
)
ax.set_line_data(
fit.name + "loren",
x,
lorentzian(x, 1, fit.lorentzian_width, 0),
label=f"{fit.name} - Lorentzian {fit.lorentzian_width:.2f}",
width=1.5,
)
@main.command(help="Explore fft fitting")
def demo3():
x, dx, f, df = setup_axes(1001, (-20, 20))
with PlotApp(
lorentz_fwhm=np.geomspace(0.1, 1),
gauss_fwhm=np.linspace(1, 10),
relative_noise=np.linspace(0, 2),
absolute_noise=[0, *np.geomspace(1e-6, 1, 201)],
) as app:
app.set_antialiasing(True)
ax = app[0]
ind = np.argsort(f)
@app.update
def draw(lorentz_fwhm, gauss_fwhm, absolute_noise, relative_noise):
gaus_clean = gaussian(x, 1, gauss_fwhm, 0)
lore_clean = lorentzian(x, 1, lorentz_fwhm, 0)
voig_clean = convolve(gaus_clean, lore_clean)
gaus = add_noise(gaus_clean, absolute_noise, relative_noise * 0.1)
lore = add_noise(lore_clean, absolute_noise, relative_noise * 0.1)
voig = add_noise(voig_clean, absolute_noise, relative_noise * 0.1)
gaus_f = np.fft.fft(np.fft.fftshift(gaus)).real
lore_f = np.fft.fft(np.fft.fftshift(lore)).real
voig_f = np.fft.fft(np.fft.fftshift(voig)).real
ax.set_line_data("Transformed Gaussian", f[ind], gaus_f[ind])
ax.set_line_data("Transformed Lorentz", f[ind], lore_f[ind])
ax.set_line_data("Transformed Voigt", f[ind], voig_f[ind])
gaus_ff = fft_gaussian(f, dx, 1, gauss_fwhm)
lore_ff = fft_lorentzian(f, dx, 1, lorentz_fwhm)
voig_ff = fft_voigt(f, dx, gauss_fwhm, lorentz_fwhm) * voig_clean.sum()
ax.set_line_data("Expected Gaussian", f[ind], gaus_ff[ind], width=1)
ax.set_line_data("Expected Lorentz", f[ind], lore_ff[ind], width=1)
ax.set_line_data("Expected Voigt", f[ind], voig_ff[ind], width=1)
@click.argument("file", type=click.Path(True, dir_okay=False))
@main.command(name="fit")
def fit_measurement(file):
wl, intens = lab.osa.load_osa_spectrum(file)
wl *= 1e9
gauss_fit = single_func_fit(wl, intens, elevated_gaussian, extra_params=1)
wl0 = gauss_fit.x0
baseline = gauss_fit.params[-1]
intens -= baseline
gauss_fit.curve -= baseline
intens[intens < 0] = 0
wl -= wl0
with PlotApp(n=np.arange(len(wl) // 2)[1:]) as app:
app.set_antialiasing(True)
ax1 = app["Measurement"]
ax2 = app["Fourier domain"]
ax1.set_line_data("Measured spectrum", wl, intens, width=2, color="red")
ax1.set_line_data("Initial Guassian fit", wl, gauss_fit.curve, width=2, color="blue")
ax1.plot_widget.plotItem.setLogMode(y=True)
@app.update
def draw(n):
s = slice(n, -n) if n else slice(None)
wl_fit = wl[s]
intens_fit = intens[s] - intens[s].min()
f, ind, dwl = freq_axis(wl_fit)
ax1.set_line_data("Fitted spectrum", wl_fit, intens_fit)
trans = np.abs(np.fft.fft(intens_fit))[ind]
m = trans.max()
ax2.set_line_data("Transformed", f, trans)
fft_fit = linear_fft_voigt_fit(f, trans / m, wl_fit, dwl)
lin_fit = linear_direct_voigt_fit(wl_fit, intens_fit)
log_fit = log_direct_voigt_fit(wl_fit, intens_fit)
for fit in fft_fit, lin_fit, log_fit:
display_fit(wl_fit, dwl, f, fit, m)
def display_fit(x: np.ndarray, dx: float, f: np.ndarray, fit: VoigtFitResult, amp: float):
ax2.set_line_data(
fit.name, f, amp * fft_voigt(f, dx, fit.gaussian_width, fit.lorentzian_width)
)
ax1.set_line_data(fit.name, x, fit.curve)
ax1.set_line_data(
fit.name + "gauss",
x,
gaussian(x, 1, fit.gaussian_width, 0),
label=f"{fit.name} - Gaussian {fit.gaussian_width:.2f}",
width=1.5,
)
ax1.set_line_data(
fit.name + "lorentz",
x,
lorentzian(x, 1, fit.lorentzian_width, 0),
label=f"{fit.name} - Lorentzian {fit.lorentzian_width:.2f}",
width=1.5,
)
if __name__ == "__main__":
main()

46
test_scaling.py Normal file
View File

@@ -0,0 +1,46 @@
"""test what the scaling factore of numpy's fft is"""
import numpy as np
from customfunc.app import PlotApp
def setup_axes(n: int, lims=(-10, 10)) -> tuple[np.ndarray, float, np.ndarray, float]:
x, dx = np.linspace(*lims, n, retstep=True)
f = np.fft.fftfreq(n, dx)
return x, dx, f, f[1] - f[0]
def abs2(z):
return z.real ** 2 + z.imag ** 2
def g(x, w):
return np.exp(-w * x ** 2)
def main():
with PlotApp(exp_param=np.linspace(1, 50), n=np.arange(32, 1024)) as app:
app.set_antialiasing(True)
fax = app["Frequency"]
@app.update
def draw(exp_param, n):
x, dx, f, df = setup_axes(n)
ind = np.argsort(f)
time_amp = 1
freq_amp = np.sqrt(np.pi / exp_param) * time_amp / dx
freq_w = np.pi ** 2 / exp_param
signal = g(x, exp_param) * time_amp
transformed = np.fft.fft(np.fft.fftshift(signal))
fax.set_line_data("transformed", f[ind], transformed[ind].real)
modeled = g(f, freq_w) * freq_amp
fax.set_line_data("expected", f[ind], modeled[ind])
if __name__ == "__main__":
main()