#!/usr/bin/env python
# coding: utf-8
# # Convert µs-ALEX SM files to Photon-HDF5
#
#
This Jupyter notebook
# will guide you through the conversion of a µs-ALEX data file from SM (WeissLab)
# to Photon-HDF5 format. For more info on how to edit
# a jupyter notebook refer to this example.
#
# Please send feedback and report any problem to the
# [Photon-HDF5 google group](https://groups.google.com/forum/#!forum/photon-hdf5).
#
# # 1. How to run it?
#
# The notebook is composed by "text cells", such as this paragraph, and "code cells"
# containing the code to be executed (and identified by an `In [ ]` prompt).
# To execute a code cell, select it and press **SHIFT+ENTER**.
# To modify an cell, click on it to enter "edit mode" (indicated by a green frame),
# then type.
#
# You can run this notebook directly online (for demo purposes), or you can
# run it on your on desktop. For a local installation please refer to:
#
# - [Jupyter Notebook Quick-Start Guide](http://jupyter-notebook-beginner-guide.readthedocs.org)
#
#
#
# Please run each each code cell using SHIFT+ENTER.
#
#
# # 2. Prepare the data file
#
# ## 2.1 Upload the data file
#
#
#
# Note: if you are running the notebook locally skip to section 2.2.
#
#
# Before starting, you have to upload a data file to be converted to Photon-HDF5.
# You can use one of our example data files available
# [on figshare](http://dx.doi.org/10.6084/m9.figshare.1455963).
#
# To upload a file (up to 35 MB) switch to the "Home" tab in your browser,
# click the upload button and select the data file.
# Wait until the upload completes.
# For larger files (like some of our example files) please use the
# [Upload notebook](Upload data files.ipynb) instead.
#
# Once the file is uploaded, come back here and follow the instructions below.
#
# ## 2.2 Select the file
#
# Specify the input data file in the following cell:
# In[ ]:
filename = 'data/0023uLRpitc_NTP_20dT_0.5GndCl.sm'
# The next cell will check if the `filename` location is correct:
# In[ ]:
import os
try:
with open(filename): pass
print('Data file found, you can proceed.')
except IOError:
print('ATTENTION: Data file not found, please check the filename.\n'
' (current value "%s")' % filename)
# In case of file not found, please double check the file name
# and that the file has been uploaded.
# # 3. Load the data
#
# We start by loading the software:
# In[ ]:
get_ipython().run_line_magic('matplotlib', 'inline')
import numpy as np
import phconvert as phc
print('phconvert version: ' + phc.__version__)
# Then we load the input file:
# In[ ]:
d = phc.loader.usalex_sm(filename,
donor = 0,
acceptor = 1,
alex_period = 4000,
alex_offset = 700,
alex_period_donor = (2180, 3900),
alex_period_acceptor = (200, 1800),
excitation_wavelengths = (532e-9, 635e-9),
detection_wavelengths = (580e-9, 680e-9))
# And we plot the alternation histogram:
# In[ ]:
phc.plotter.alternation_hist(d)
# The previous plot is the alternation histogram for the donor and acceptor channel separately.
# The shaded areas marks the donor (*green*) and acceptor (*red*) excitation periods.
#
# If the histogram looks wrong in some aspects (no photons, wrong detectors
# assignment, wrong period selection) please go back to the previous cell
# which loads the file and change the parameters until the histogram looks correct.
#
# You may also find useful to see how many different detectors are present
# and their number of photons. This information is shown in the next cell:
# In[ ]:
detectors = d['photon_data']['detectors']
print("Detector Counts")
print("-------- --------")
for det, count in zip(*np.unique(detectors, return_counts=True)):
print("%8d %8d" % (det, count))
# # 4. Metadata
#
# In the next few cells, we specify some metadata that will be stored
# in the Photon-HDF5 file. Please modify these fields to reflect
# the content of the data file:
# In[ ]:
author = 'John Doe'
author_affiliation = 'Research Institution'
description = 'us-ALEX measurement of a doubly-labeled ssDNA sample.'
sample_name = '20dt ssDNA oligo doubly labeled with Cy3B and Atto647N'
dye_names = 'Cy3B, ATTO647N'
buffer_name = 'TE50 + 0.5M GndCl'
# # 5. Conversion
#
#
#
Once you finished editing the the previous sections you can proceed with
# the actual conversion. To do that, click on the menu Cells -> Run All Below.
#
#
After the execution go to Section 6 to download the Photon-HDF5 file.
#
#
# The cells below contain the code to convert the input file to Photon-HDF5.
# ## 5.1 Add metadata
# In[ ]:
d['description'] = description
d['sample'] = dict(
sample_name=sample_name,
dye_names=dye_names,
buffer_name=buffer_name,
num_dyes = len(dye_names.split(',')))
d['identity'] = dict(
author=author,
author_affiliation=author_affiliation)
# ## 5.2 Save to Photon-HDF5
#
# This command saves the new file to disk. If the input data does not follows the Photon-HDF5 specification it returns an error (`Invalid_PhotonHDF5`) printing what violates the specs.
# In[ ]:
phc.hdf5.save_photon_hdf5(d, overwrite=True)
# You can check it's content by using an HDF5 viewer such as [HDFView](https://www.hdfgroup.org/products/java/hdfview/).
#
# # 6. Load Photon-HDF5
#
# We can load the newly created Photon-HDF5 file to check its content:
# In[ ]:
from pprint import pprint
# In[ ]:
filename = d['_data_file'].filename
# In[ ]:
h5data = phc.hdf5.load_photon_hdf5(filename)
# In[ ]:
phc.hdf5.dict_from_group(h5data.identity)
# In[ ]:
phc.hdf5.dict_from_group(h5data.setup)
# In[ ]:
pprint(phc.hdf5.dict_from_group(h5data.photon_data))
# In[ ]:
h5data._v_file.close()