Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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 (XtcEventBrowser) is also not a real browser, but allows a simple-to-run interface to the xtc files. The package name is XtcEventBrowser, the executables (xtcbrowser and xtcscanner) are found in the app subdirectory of this package, and all other code is in the src subdirectory.

xtcbrowser


This page is currently under revision. See an earlier version of this page ("Tools"->"Page History") to get self-consistent documentation.

The xtcbrowser ia a tool 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.

Note! This tool is under development... features are being added and new versions available often. This documentation might be slightly outdated, but if you use the tagged version (VXX-XX-XX) mentioned here it should work as advertised.

How to run / get started

To run, you need to set up an offline release in your directory (See the Account Setup section to set up the analysis environment):

...

Code Block
[user@psana0XXX myrelease] xtcbrowser /reg/d/psdm/cxi/cxi80410/xtc/e55-r0581*

The GUIs

The procedure above This will open a GUI, the main browser. It allows you to browse for files, and to run a scan to see what's in the file. Maybe "scan" is not a good choice of word... it parses the xtc file and investigate what kind of data is there.

  • File section: Shows a list of currently selected file(s). As you may have guessed, "File Browser" opens a file browser and "Clear File List" clears the current list of files. This section also allows you to add a file name by hand (or paste).
  • Scan section: The two buttons to the left allows you to scan the xtc file to get a summary of what datagrams are stored in it. Note, for most purposes, a "Quick Scan" is sufficient. If you need to scan the whole file, e.g. if you want to know the total number of events, number of calibration cycles, etc, you can enable the "Scan File(s)" button. If the files are big, this will take a lot of time...

After scanning, a new GUI will pop up showing you a list of detectors/devices found in the file. A little more information is written to the terminal window too.

  • "Available Detectors/Devices": In front of each detector/device name is a checkbox, where you can select which datagrams you are interested in analysing / plotting.
  • "Current pyana configuration": Initially this field is blank. But as you select devices from the list, a tentative configuration file for running pyana is written and shown in this field. At the same time, another two buttons shows ut:
  • "Write configuration to file" and "Edit configuration file". You need to write the configuration to file to be able to run pyana (which picks up this file).
  • "Run pyana" button will appear once you've written to file. You can still edit the file (which lauches an emacs window... my apologies to non-emacs-users... Will have a more generic solution soon'ish). "Run pyana" lauches an input GUI that shows you the runstring. You can use the same runstring from the command line. Or hit "OK" and it'll run.
  • After launching pyana, another button "Quit pyana" appears... If you see you need to change parameters, you can stop pyana, edit the configuration file, and start over again.

More information on how to Gui. After opening file(s), click the "Quick Scan" button to scan the first 1000 events in the file. After scanning, a new window will pop up, allowing to select detectors/devices to make plots from. The plots are made via pyana. Configuration file for pyana will be generated automatically. To customize your analysis, you can edit the pyana config file and pyana files in XtcEventBrowser package to fit your need, then run pyana by itself (see 'pyana -h' for more help, or the pyana section of confluence).

...

MatLab

MatPlotLib

Comments

Loglog plot of one array vs. another

Code Block
%
%
%
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

Code Block
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.

Note that the arrays are indexed with 1,2,3,4 in MatLab and 0,1,2,3 in MatPlotLib/NumPy/Python.

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="724f224fd46f321a-4219e2ee-41d44cca-a95e8ae3-d8be21920390104b5ba6cfea"><ac:plain-text-body><![CDATA[Note also the use of paranthesis, array() in MatLab, array[] in MatPlotLib.

]]></ac:plain-text-body></ac:structured-macro>

test

test

Test

array of limits from graphical input

array of limits from graphical input

 

Code Block
axes(a1)
hold on
lims(1:2,:) = ginput(2);

axes(a2)
hold on
lims(3:4,:) = ginput(2);
Code Block
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, lims is an expandable array that holds limits as set by input from mouse click on the plot (ginput).
NumPy arrays cannot be expanded, so I've chosen to append to a python list first, then fill a NumPy array for the usage to look the same.

The exact usage of the lims array depends on where you place each limit. I think perhaps I've done it differently from the MatLab version.

 

 

 

filter

filter

 

Code Block
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') 
Code Block
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