Page History
...
The most pain-free way to access LCLS XTC data files from python is through LCLS's python framework, pyana. It is a non-interactive framework, but to some extent you can work interactively with the data it produces
All about pyana.
C++ framework: psana
The idea is the same as for pyana. Non-interactive. No interactive support as of yet.
All about psana - Original Documentation.
If you like GUIs:
The XTC Explorer - Old gives you an "interactive" way to configure your analysis.
...
Python/IPython can be used to analyze data after you've saved them, or they can be embedded into a pyana module to give you interactive access to the data at regular intervals throughout your analysis.
'IPython' (http://ipython.org/) is an enhanced python shell for interactive use. Many of the examples here would work equally well with a 'regular' python shell.
Plotting is done with 'matplotlib' (http://matplotlib.sourceforge.net/)
If you're looking for an IDE to work with, consider 'Spyder' (http://code.google.com/p/spyderlib/).
Interactively exploring the XTC file.
...
Code Block |
---|
usage: xtcscanner [options] xtc-files ... options: -h, --help show this help message and exit -n NDATAGRAMS, --ndatagrams=NDATAGRAMS -v, --verbose -l L1_OFFSET, --l1-offset=L1_OFFSET |
Example:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
Scanning.... Start parsing files: ['/reg/d/psdm/AMO/amo01509/xtc/e8-r0094-s00-c00.xtc', '/reg/d/psdm/AMO/amo01509/xtc/e8-r0094-s01-c00.xtc'] 201 datagrams read in 0.070000 s . . . . . . . ------------------------------------------------------------- XtcScanner information: - 1 calibration cycles. - Events per calib cycle: [197] Information from 0 control channels found: Information from 9 devices found BldInfo:EBeam: EBeamBld (197) BldInfo:FEEGasDetEnergy: FEEGasDetEnergy (197) DetInfo:AmoETof-0|Acqiris-0: (5 ch) AcqConfig_V1 (1) AcqWaveform_V1 (197) DetInfo:AmoGasdet-0|Acqiris-0: (2 ch) AcqConfig_V1 (1) AcqWaveform_V1 (197) DetInfo:AmoITof-0|Acqiris-0: (1 ch) AcqConfig_V1 (1) AcqWaveform_V1 (197) DetInfo:AmoMbes-0|Acqiris-0: (1 ch) AcqConfig_V1 (1) AcqWaveform_V1 (197) DetInfo:EpicsArch-0|NoDevice-0: Epics_V1 (688) DetInfo:NoDetector-0|Evr-0: EvrConfig_V2 (1) ProcInfo:: RunControlConfig_V1 (11) XtcScanner is done! ------------------------------------------------------------- |
...
With interactive python embedded, see: https://confluence.slac.stanford.edu/display/PCDS/XTC+Explorer#XTCExplorer-InteractiveplottingwithIPython
IPython used "like" MATLAB
...
Starting an interactive session
Code Block | |||||||||
---|---|---|---|---|---|---|---|---|---|
| |||||||||
[ofte@psana0XXX myrelease]$ ipython -pylab Python 2.4.3 (#1, Nov 3 2010, 12:52:40) Type "copyright", "credits" or "license" for more information. IPython 0.9.1 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object'. ?object also works, ?? prints more. |
Code Block | |||||||||
---|---|---|---|---|---|---|---|---|---|
| |||||||||
In [1]: from pymatlab import * |
Generally, it is recommended to load library modules with 'import pymatlab' and access all its methods and classes with pyamatlab.function. In an interactive session it may be easier to have access to the contents of pymatlab in your immediate workspace by doing 'from pymatlab import *'.
Code Block | |||||||||
---|---|---|---|---|---|---|---|---|---|
| |||||||||
In [2]: who H5getobjnames ScanInput ScanOutput filtvec findmovingmotor getSTDMEANfrac_from_startpoint get_filter get_limits get_limits_automatic get_limits_channelhist get_limits_correlation get_limits_corrfrac h5py np plt rdXPPdata runexpNO2fina scan scaninput In [3]: whos Variable Type Data/Info -------------------------------------------------------- H5getobjnames function <function H5getobjnames at 0x2b57de8> ScanInput type <class 'pymatlab.ScanInput'> ScanOutput type <class 'pymatlab.ScanOutput'> filtvec function <function filtvec at 0x2b57f50> findmovingmotor function <function findmovingmotor at 0x2b57d70> getSTDMEANfrac_from_startpoint function <function getSTDMEANfrac_<...>_startpoint at 0x2b581b8> get_filter function <function get_filter at 0x2b57ed8> get_limits function <function get_limits at 0x2b58050> get_limits_automatic function <function get_limits_automatic at 0x2b58230> get_limits_channelhist function <function get_limits_channelhist at 0x2b582a8> get_limits_correlation function <function get_limits_correlation at 0x2b580c8> get_limits_corrfrac function <function get_limits_corrfrac at 0x2b58140> h5py module <module 'h5py' from '/reg<...>ython/h5py/__init__.pyc'> np module <module 'numpy' from '/re<...>thon/numpy/__init__.pyc'> plt module <module 'matplotlib.pyplo<...>n/matplotlib/pyplot.pyc'> rdXPPdata function <function rdXPPdata at 0x2b57c80> runexpNO2fina function <function runexpNO2fina at 0x2b57e60> scan ScanOutput <pymatlab.ScanOutput object at 0x2b60536bee90> scaninput ScanInput <pymatlab.ScanInput object at 0x2b60536b4e90> |
...
Table of comparison (MATLAB vs MatPlotLib)
See also http://www.scipy.org/NumPy_for_Matlab_Users
MatLab | MatPlotLib | Comments | ||||
---|---|---|---|---|---|---|
Loglog plot of one array vs. another
| Loglog plot of one array vs. another
| channels is a 4xN array of floats, where N is the number of events. Each column corresponds to one out of four Ipimb channels. | ||||
test | test | Test | ||||
array of limits from graphical input | array of limits from graphical input |
| ||||
|
| In MatLab, | ||||
|
|
| ||||
filter | filter |
| ||||
|
| Comment | ||||
|
|
|
...
Simple array to a NumPy file:
Code Block | |||||||
---|---|---|---|---|---|---|---|
| |||||||
import numpy as np np.save("filename.npy", array) array = np.load("filename.npy") np.savetxt("filename.dat", array) array = loadtxt("filename.dat") |
...
Simple array to an HDF5 file
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
import h5py def beginjob(self,evt,env): self.ofile = h5py.File("outputfile.hdf5", 'w') # open for writing (overwrites existing file) self.shot_counter = 0 def event(self,evt,env) # example: store several arrays from one shot in a group labeled with shot (event) number self.shot_counter += 1 group = self.ofile.create_group("Shot%d" % self.shot_counter) image1_source = "CxiSc1-0|TM6740-1" image2_source = "CxiSc1-0|TM6740-2" frame = evt.getFrameValue(image1_source) image1 = frame.data() frame = evt.getFrameValue(image2_source) image2 = frame.data() dataset1 = group.create_dataset("%s"%image1_source,data=image1) dataset2 = group.create_dataset("%s"%image2_source,data=image2) def endjob(self,env) self.ofile.close() |
...