Versions Compared

Key

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

...

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 get started

To This tool is not in a release yet, so 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*

Description of the GUIs

Image Removed

LCLS Xtc Event Browser

The procedure above xtcbrowser will open launch 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 (Perhaps "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...

...

  • "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 run pyana

...

by itself (see 'pyana -h' for more help, or the pyana section of confluence).

Producing plots via pyana

This is probably where most changes will happen soon. Currently each type of detector is processed in different pyana modules, which makes correlation plots cumbersome. But this is on the list of features to be included. At the moment, only certain plots are displayed, via matplotlib, and the only way to really get the plots that you want is to edit the pyana source code!!! You can find it in XtcEventBrowser/src/ directory, all the pyana modules are called pyana_whatever.py. Feel free to treat these files as examples and edit them to fit your needs. The implementation will soon be more generic and customizable.

Here are some example plots madeMore information on how to run pyana by itself (see 'pyana -h' for more help, or the pyana section of confluence).
Example plots: one event from CsPad with background subtraction and filter. Some beamline data plots: Beam energy and position, Gas detector energy measurements.

...

The pyana modules

A few things to note about the different detectors / pyana modules:

...

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="6332bb5030ac37d2-2b422141-4f4749a8-8618a871-9c99d8ac11b2dc420c2857db"><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