Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents

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.

Note! This tool is under development... features are being added and new versions available often. This documentation might be slightly outdated, but the version mentioned here should work as advertised.

To run, you need to set up an offline release in your directory:

Code Block
Wiki Markup
{toc}

h1. 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{_}*.

*Note\!* This tool is under development... features are being added and new versions available often. This documentation might be slightly outdated, but the version mentioned here should work as advertised.

To run, you need to set up an offline release in your directory:
{code}
[user@psana0XXX ~] newrel ana-current myrelease
[user@psana0XXX ~] cd myrelease
{code}

Add

...

the

...

xtc

...

browser

...

package

...

to

...

your

...

analysis

...

release

...

and

...

"compile":

{
Code Block
}
[user@psana0XXX myrelease] addpkg XtcEventBrowser V00-00-07
[user@psana0XXX myrelease] scons
{code}

Run

...

the

...

program

...

with

...

the

...

command

...

'xtcbrowser'

...

and

...

optionally

...

give

...

the

...

input

...

xtc

...

files

...

that

...

you

...

want

...

to

...

read

...

as

...

arguments.

...

You

...

can

...

also

...

browse

...

to

...

find

...

files

...

after

...

launching

...

the

...

browser.

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

This

...

will

...

open

...

a

...

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

...

the

...

pyana

...

section

...

of

...

confluence).

Image Added Image Added Image Added Image Added

A few things to note about the different detectors:

  • CsPad: CsPad data is reconstructed in pyana_cspad.py.

...

  • To

...

  • run

...

  • this

...

  • module

...

  • by

...

  • itself

...

  • with

...

  • pyana:

...

  • Code Block

...

  • 
    pyana -m XtcEventBrowser/src/pyana_cspad.py <xtc files>
    

...

  • Options

...

  • must

...

  • be

...

  • specified

...

  • in

...

  • a

...

  • configuration

...

  • file,

...

  • or

...

  • the

...

  • default

...

  • values

...

  • will

...

  • be

...

  • used:

...


  • .bq
    image_source

...

  • =

...

  • CxiDs1-0

...

  • |Cspad-0

...

  • #

...

  • specify

...

  • image

...

  • source

...


  • draw_each_event

...

  • =

...

  • 0

...

  • #

...

  • if

...

  • this

...

  • is

...

  • 1

...

  • (True),

...

  • image

...

  • is

...

  • drawn

...

  • for

...

  • each

...

  • event

...


  • dark_img_file

...

  • =

...

  • my_darks.npy

...

  • #

...

  • Name

...

  • of

...

  • dark-image

...

  • file

...

  • (binary

...

  • numpy

...

  • array

...

  • file)

...

  • if

...

  • you

...

  • have

...

  • one,

...

  • or

...

  • want

...

  • to

...

  • make

...

  • one.

...


  • collect_darks

...

  • =

...

  • 0

...

  • #

...

  • This

...

  • must

...

  • be

...

  • set

...

  • to

...

  • 1

...

  • if

...

  • you

...

  • want

...

  • to

...

  • create

...

  • the

...

  • dark-image

...

  • file

...


  • .bq

XtcScanner

A rewrite of xtcsummary.py,

...

to

...

be

...

usable

...

as

...

a

...

library

...

module

...

for

...

the

...

event

...

browser.

...

Can

...

be

...

run

...

just

...

like

...

the

...

script

...

above:

{
Code Block
}XtcScanner.py <filename(s)>{code}

h2. 

XtcBrowserMain.py

...

XtcBrowserMain

...

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.

Image Added Main control widget. From here, select file(s) to browse, then select "Scan" or "Quick Scan" to provide a summary of the file.
Image Added Output of the Scan is currently text-only in the terminal or ipython window.
Image Added 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

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


!app1_main.png|thumbnail,border=1! Main control widget. From here, select file(s) to browse, then select "Scan" or "Quick Scan" to provide a summary of the file.
!app1_txt.png|thumbnail,border=1! Output of the Scan is currently text-only in the terminal or ipython window.
!app1_beamE.png|thumbnail,border=1! 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.


h1. 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.



h1. Data visualization with NumPy (arrays) and MatPlotLib (plots).


h2. Saving (and loading) a numpy array (e.g. image) to (from) a file

{code}
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")
{code}


h2. A comparison with MatLab.

|| MatLab || MatPlotLib || Comments ||
| {color:darkgreen}Loglog plot of one array vs. another{color}
{code}

A comparison with MatLab.

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="f55673c1-65f0-4ad4-9237-e4eb0b78e3ae"><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