Event display / xtc file browser
Xtc files contain the raw data streamed from the DAQ online system, therefore they are not indexed and the events don't always line up in the "right" order. Therefore it's not straight-forward to browse (back and fourth) through an xtc file. This tool is also not a real browser, but allows a simple-to-run interface to the xtc files.
This tool is written in python, relying on PyQt4 for graphical user interface. The data processing is done via the pyana framework and visualization provided by matplotlib.
To run, you need to set up an offline release in your directory:
[user@psana0X ~] newrel ana-current myrelease [user@psana0X ~] cd myrelease
Add the xtc browser package to your analysis release and "compile":
[user@psana0X myrelease] addpkg XtcEventBrowser V00-00-06 [user@psana0X myrelease] scons
Xtc file reader: xtcsummary.py
Text output listing the contents of an xtc file. Similar to pyxtcreader, but instead of listing all datagrams, it loops through and prints only a summary.
Usage:
xtcsummary.py <filename(s)>
XtcExplorer
A rewrite of xtcsummary.py, to be usable as a library module for the event browser. Can be run just like the script above:
XtcExplorer.py <filename(s)>
LclsXtcEventBrowser.py
LclsXtcEventBrowser is a class in the XtcEventBrowser package. It opens a GUI:
- Input xtc file name(s) via:
- file browser
- text input line
- Options to scan the files for contents (making use of XtcExplorer)
- Quick scan reads only the first 1000 events (sufficient to see what detectors were in use)
- Full scan of all files (needed to know how many events and calibration cycles were in the given run(s).
- Output from scan can be used to configure pyana. Checkboxes for each detector found.
- Run simple pyana analysis via a button
- Can be run from interactive ipython session
- (Should be able to) Return prompt to ipython to continue working on plots / redraw.
- Write pyana script for the simple analysis done by the Gui, which the user can modify to have more control and options for further analysis.
Output of the Scan is currently text-only in the terminal or ipython window.
After the Scan, Checkboxes (will) allow you to select which sources you want to display data from. A button also allows you to run pyana. Here's an example output of beam energy by pyana.
Further analysis with pyana
Any serious data analysis will need more customized tools than we can provide in a GUI interface. This will require the user / analyst to program his/her own tools. Pyana is a complete framework for programming a user analysis in python. The Gui Event Browser can provide simple analysis code that can be expanded by the user. "Blank" analysis code can also be generated with Andy's codegen
script (try codegen -h
and codegen -p
for options).
More information about pyana can be found on confluence.
Data visualization with NumPy (arrays) and MatPlotLib (plots).
Saving (and loading) a numpy array (e.g. image) to (from) a file
import numpy as np # binary file .npy format np.save("filename.npy", array) array = np.load("filename.npy") # txt file np.savetxt("filename.dat", array) array = loadtxt("filename.dat")
A comparison with MatLab.
MatLab |
MatPlotLib |
Comments |
|
---|---|---|---|
Loglog plot of one array vs. another % % % a1 = subplot(121); loglog(channels(:,1),channels(:,2),'o') xlabel('CH0') ylabel('CH1') a2 = subplot(122); loglog(channels(:,3),channels(:,4),'o') xlabel('CH2') ylabel('CH3') |
Loglog plot of one array vs. another import matplotlib.pyplot as plt import numpy as np a1 = plt.subplot(221) plt.loglog(channels[:,0],channels[:,1], 'o' ) plt.xlabel('CH0') plt.ylabel('CH1') a2 = plt.subplot(222) plt.loglog(channels[:,2],channels[:,3], 'o' ) plt.xlabel('CH2') plt.ylabel('CH3') |
channels is a 4xN array of floats, where N is the number of events. Each column corresponds to one out of four Ipimb channels. |
]]></ac:plain-text-body></ac:structured-macro> |
test |
test |
Test |
|
array of limits from graphical input |
array of limits from graphical input |
|
|
axes(a1) hold on lims(1:2,:) = ginput(2); axes(a2) hold on lims(3:4,:) = ginput(2); |
plt.axes(a1) plt.hold(True) limslista = plt.ginput(2) plt.axes(a2) plt.hold(True) limslistb = plt.ginput(2) limsa = np.array(limslista) limsb = np.array(limslistb) lims = np.hstack( [limsa, limsb] ) |
In MatLab, |
|
|
|
|
|
filter |
filter |
|
|
fbool1 = (channels(:,1)>min(lims(1:2,1)))&(channels(:,1)<max(lims(1:2,1))) fbool2 = (channels(:,2)>min(lims(1:2,2)))&(channels(:,2)<max(lims(1:2,2))); fbool = fbool1&fbool2 loglog(channels(fbool,1),channels(fbool,2),'or') fbool3 = (channels(:,3)>min(lims(3:4,3)))&(channels(:,3)<max(lims(3:4,3))) fbool4 = (channels(:,4)>min(lims(3:4,4)))&(channels(:,4)<max(lims(3:4,4))); fbool = fbool3&fbool4 loglog(channels(fbool,3),channels(fbool,4),'or') |
fbools0 = (channels[:,0]>lims[:,0].min())&(channels[:,0]<lims[:,0].max()) fbools1 = (channels[:,1]>lims[:,1].min())&(channels[:,1]<lims[:,1].max()) fbools = fbools0 & fbools1 fbools2 = (channels[:,2]>lims[:,2].min())&(channels[:,2]<lims[:,2].max()) fbools3 = (channels[:,3]>lims[:,3].min())&(channels[:,3]<lims[:,3].max()) fbools = fbools2&fbools3 |
Comment |
|
|
|
|