Compare commits
2 Commits
rev-distro
...
rev-distro
Author | SHA1 | Date | |
---|---|---|---|
02709fd4df | |||
724c73ef19 |
20
.gitattributes
vendored
Normal file
20
.gitattributes
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
.git* export-ignore
|
||||||
|
#*.ipf diff=igorpro
|
||||||
|
# git diff --check should output something useful
|
||||||
|
*.ipf whitespace=indent-with-non-tab,tabwidth=4
|
||||||
|
# mark files as binary
|
||||||
|
# you can also add -delta if you regularly
|
||||||
|
# commit large files of these types
|
||||||
|
*.ibw binary
|
||||||
|
*.xop binary
|
||||||
|
*.pxp binary
|
||||||
|
*.pxt binary
|
||||||
|
*.uxp binary
|
||||||
|
*.uxt binary
|
||||||
|
*.ihf binary
|
||||||
|
*.ifn binary
|
||||||
|
*.ift binary
|
||||||
|
|
||||||
|
# automatic end of line normalization
|
||||||
|
*.ipf eol=lf
|
||||||
|
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@
|
|||||||
*.ipfT*
|
*.ipfT*
|
||||||
doc/html/*
|
doc/html/*
|
||||||
doc/latex/*
|
doc/latex/*
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ PROJECT_NAME = "PEARL Procedures"
|
|||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
# control system is used.
|
# control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER =
|
PROJECT_NUMBER = $(REVISION)
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
@ -1647,7 +1647,7 @@ EXTRA_PACKAGES =
|
|||||||
# to HTML_HEADER.
|
# to HTML_HEADER.
|
||||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||||
|
|
||||||
LATEX_HEADER =
|
LATEX_HEADER = src/header.tex
|
||||||
|
|
||||||
# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
|
# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
|
||||||
# generated LaTeX document. The footer should contain everything after the last
|
# generated LaTeX document. The footer should contain everything after the last
|
@ -11,7 +11,7 @@ DOX=doxygen
|
|||||||
DOXOPTS=
|
DOXOPTS=
|
||||||
LATEX_DIR=latex
|
LATEX_DIR=latex
|
||||||
|
|
||||||
REVISION=$(shell git describe --always --tags --dirty --long)
|
REVISION=$(shell git describe --always --tags --dirty --long || echo "unknown, "`date +"%F %T %z"`)
|
||||||
export REVISION
|
export REVISION
|
||||||
|
|
||||||
all: docs
|
all: docs
|
||||||
@ -19,7 +19,7 @@ all: docs
|
|||||||
docs: doxygen pdf
|
docs: doxygen pdf
|
||||||
|
|
||||||
doxygen:
|
doxygen:
|
||||||
$(DOX) $(DOXOPTS) Doxyfile
|
$(DOX) $(DOXOPTS) config.dox
|
||||||
|
|
||||||
pdf: doxygen
|
pdf: doxygen
|
||||||
-$(MAKE) -C $(LATEX_DIR)
|
-$(MAKE) -C $(LATEX_DIR)
|
||||||
@ -27,3 +27,4 @@ pdf: doxygen
|
|||||||
clean:
|
clean:
|
||||||
-rm latex/*
|
-rm latex/*
|
||||||
-rm html/*
|
-rm html/*
|
||||||
|
|
||||||
|
149
doc/src/header.tex
Normal file
149
doc/src/header.tex
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
% Latex header for doxygen 1.8.9.1
|
||||||
|
%
|
||||||
|
% To generate this file, call:
|
||||||
|
% doxygen -w latex header.tex footer.tex doxygen.sty
|
||||||
|
% and substitute the placeholders:
|
||||||
|
% $title, $datetime, $date, $doxygenversion, $projectname, $projectnumber, $projectbrief, $projectlogo
|
||||||
|
% (or diff and merge with previous version)
|
||||||
|
%
|
||||||
|
\documentclass[twoside]{book}
|
||||||
|
|
||||||
|
% Packages required by doxygen
|
||||||
|
\usepackage{fixltx2e}
|
||||||
|
\usepackage{calc}
|
||||||
|
\usepackage{doxygen}
|
||||||
|
\usepackage[export]{adjustbox} % also loads graphicx
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage{makeidx}
|
||||||
|
\usepackage{multicol}
|
||||||
|
\usepackage{multirow}
|
||||||
|
\PassOptionsToPackage{warn}{textcomp}
|
||||||
|
\usepackage{textcomp}
|
||||||
|
\usepackage[nointegrals]{wasysym}
|
||||||
|
\usepackage[table]{xcolor}
|
||||||
|
|
||||||
|
% Font selection
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
\usepackage[scaled=.90]{helvet}
|
||||||
|
\usepackage{courier}
|
||||||
|
\usepackage{amssymb}
|
||||||
|
\usepackage{sectsty}
|
||||||
|
\renewcommand{\familydefault}{\sfdefault}
|
||||||
|
\allsectionsfont{%
|
||||||
|
\fontseries{bc}\selectfont%
|
||||||
|
\color{darkgray}%
|
||||||
|
}
|
||||||
|
\renewcommand{\DoxyLabelFont}{%
|
||||||
|
\fontseries{bc}\selectfont%
|
||||||
|
\color{darkgray}%
|
||||||
|
}
|
||||||
|
\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
|
||||||
|
|
||||||
|
% Page & text layout
|
||||||
|
\usepackage{geometry}
|
||||||
|
\geometry{%
|
||||||
|
a4paper,%
|
||||||
|
top=2.5cm,%
|
||||||
|
bottom=2.5cm,%
|
||||||
|
left=2.5cm,%
|
||||||
|
right=2.5cm%
|
||||||
|
}
|
||||||
|
\tolerance=750
|
||||||
|
\hfuzz=15pt
|
||||||
|
\hbadness=750
|
||||||
|
\setlength{\emergencystretch}{15pt}
|
||||||
|
\setlength{\parindent}{0cm}
|
||||||
|
\setlength{\parskip}{0.2cm}
|
||||||
|
\makeatletter
|
||||||
|
\renewcommand{\paragraph}{%
|
||||||
|
\@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%
|
||||||
|
\normalfont\normalsize\bfseries\SS@parafont%
|
||||||
|
}%
|
||||||
|
}
|
||||||
|
\renewcommand{\subparagraph}{%
|
||||||
|
\@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%
|
||||||
|
\normalfont\normalsize\bfseries\SS@subparafont%
|
||||||
|
}%
|
||||||
|
}
|
||||||
|
\makeatother
|
||||||
|
|
||||||
|
% Headers & footers
|
||||||
|
\usepackage{fancyhdr}
|
||||||
|
\pagestyle{fancyplain}
|
||||||
|
\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
|
||||||
|
\fancyhead[CE]{\fancyplain{}{}}
|
||||||
|
\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
|
||||||
|
\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
|
||||||
|
\fancyhead[CO]{\fancyplain{}{}}
|
||||||
|
\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
|
||||||
|
\fancyfoot[LE]{\fancyplain{}{}}
|
||||||
|
\fancyfoot[CE]{\fancyplain{}{}}
|
||||||
|
\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize $projectnumber}}
|
||||||
|
\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize $projectnumber}}
|
||||||
|
\fancyfoot[CO]{\fancyplain{}{}}
|
||||||
|
\fancyfoot[RO]{\fancyplain{}{}}
|
||||||
|
\renewcommand{\footrulewidth}{0.4pt}
|
||||||
|
\renewcommand{\chaptermark}[1]{%
|
||||||
|
\markboth{#1}{}%
|
||||||
|
}
|
||||||
|
\renewcommand{\sectionmark}[1]{%
|
||||||
|
\markright{\thesection\ #1}%
|
||||||
|
}
|
||||||
|
|
||||||
|
% Indices & bibliography
|
||||||
|
\usepackage{natbib}
|
||||||
|
\usepackage[titles]{tocloft}
|
||||||
|
\setcounter{tocdepth}{3}
|
||||||
|
\setcounter{secnumdepth}{5}
|
||||||
|
\makeindex
|
||||||
|
|
||||||
|
% Hyperlinks (required, but should be loaded last)
|
||||||
|
\usepackage{ifpdf}
|
||||||
|
\ifpdf
|
||||||
|
\usepackage[pdftex,pagebackref=true]{hyperref}
|
||||||
|
\else
|
||||||
|
\usepackage[ps2pdf,pagebackref=true]{hyperref}
|
||||||
|
\fi
|
||||||
|
\hypersetup{%
|
||||||
|
colorlinks=true,%
|
||||||
|
linkcolor=blue,%
|
||||||
|
citecolor=blue,%
|
||||||
|
unicode%
|
||||||
|
}
|
||||||
|
|
||||||
|
% Custom commands
|
||||||
|
\newcommand{\clearemptydoublepage}{%
|
||||||
|
\newpage{\pagestyle{empty}\cleardoublepage}%
|
||||||
|
}
|
||||||
|
|
||||||
|
%===== C O N T E N T S =====
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
% Titlepage & ToC
|
||||||
|
\hypersetup{pageanchor=false,
|
||||||
|
bookmarks=true,
|
||||||
|
bookmarksnumbered=true,
|
||||||
|
pdfencoding=unicode
|
||||||
|
}
|
||||||
|
\pagenumbering{roman}
|
||||||
|
\begin{titlepage}
|
||||||
|
\vspace*{7cm}
|
||||||
|
\begin{center}%
|
||||||
|
{\Large $projectname}\\
|
||||||
|
\vspace*{1cm}
|
||||||
|
{\large $projectbrief }\\
|
||||||
|
\vspace*{0.5cm}
|
||||||
|
{\small Version $projectnumber}\\
|
||||||
|
\vspace*{0.5cm}
|
||||||
|
{\small $datetime}\\
|
||||||
|
\end{center}
|
||||||
|
\end{titlepage}
|
||||||
|
\clearemptydoublepage
|
||||||
|
\tableofcontents
|
||||||
|
\clearemptydoublepage
|
||||||
|
\pagenumbering{arabic}
|
||||||
|
\hypersetup{pageanchor=true}
|
||||||
|
|
||||||
|
%--- Begin generated contents ---
|
@ -21,7 +21,7 @@ Users of PEARL Procedures are requested to coordinate and share the development
|
|||||||
Please read and respect the respective license agreements.
|
Please read and respect the respective license agreements.
|
||||||
|
|
||||||
\author Matthias Muntwiler, <mailto:matthias.muntwiler@psi.ch>
|
\author Matthias Muntwiler, <mailto:matthias.muntwiler@psi.ch>
|
||||||
\version This documentation is compiled from revision $(REVISION).
|
\version This documentation is compiled from version $(REVISION).
|
||||||
\copyright 2009-2016 by [Paul Scherrer Institut](http://www.psi.ch)
|
\copyright 2009-2016 by [Paul Scherrer Institut](http://www.psi.ch)
|
||||||
\copyright Licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
\copyright Licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
*/
|
*/
|
||||||
|
@ -1,80 +0,0 @@
|
|||||||
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
|
|
||||||
#pragma IgorVersion = 6.1
|
|
||||||
#pragma ModuleName = PearlAnglescanProcessTest
|
|
||||||
#pragma version = 1.0
|
|
||||||
|
|
||||||
#include "pearl-anglescan-process"
|
|
||||||
#include "unit-testing"
|
|
||||||
|
|
||||||
// test suite for pearl-anglescan-process.ipf
|
|
||||||
|
|
||||||
// unit testing framework: http://www.igorexchange.com/project/unitTesting
|
|
||||||
// run all test cases with RunTest("pearl-anglescan-process.ipf")
|
|
||||||
// if wave equalities fail, EnableDebugOutput() and read Igor help on equalWaves().
|
|
||||||
|
|
||||||
// created: matthias.muntwiler@psi.ch, 2013-11-18
|
|
||||||
// Copyright (c) 2013 Paul Scherrer Institut
|
|
||||||
// $Id$
|
|
||||||
|
|
||||||
static function test_convert_angles_ttpa()
|
|
||||||
// function parameters
|
|
||||||
variable ntests = 3
|
|
||||||
make /n=(ntests)/d/free i_theta, i_tilt, i_phi
|
|
||||||
make /n=3/d/free i_ana
|
|
||||||
make /n=1/d/free o_polar, o_azi
|
|
||||||
i_theta = {0, 90, 90}
|
|
||||||
i_tilt = {0, 0, 0}
|
|
||||||
i_phi = {0, 0, 10}
|
|
||||||
i_ana = {-30, 0, +30}
|
|
||||||
|
|
||||||
make /n=(3,ntests)/d/free e_polar, e_azi
|
|
||||||
e_polar[][0] = {30, 0, 30}
|
|
||||||
e_azi[][0] = {-90, 0, 90} // 180, 90, 0
|
|
||||||
|
|
||||||
e_polar[][1] = {90, 90, 90}
|
|
||||||
e_azi[][1] = {-30, 0, +30}
|
|
||||||
|
|
||||||
e_polar[][2] = {90, 90, 90}
|
|
||||||
e_azi[][2] = {-20, 10, +40}
|
|
||||||
|
|
||||||
variable phi0 = 0
|
|
||||||
e_azi += phi0
|
|
||||||
|
|
||||||
convert_angles_ttpa2polar(i_theta, i_tilt, i_phi, i_ana, o_polar, o_azi)
|
|
||||||
|
|
||||||
|
|
||||||
CHECK_EQUAL_WAVES(o_polar, e_polar, tol=0.001)
|
|
||||||
CHECK_EQUAL_WAVES(o_azi, e_azi, tol=0.001)
|
|
||||||
|
|
||||||
nvar /z errors = root:packages:unittesting:error_count
|
|
||||||
if ((nvar_exists(errors)) && (errors > 0))
|
|
||||||
print o_azi
|
|
||||||
print e_azi
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
static function test_hist_hemi_aziscan()
|
|
||||||
CHECK_EMPTY_FOLDER()
|
|
||||||
|
|
||||||
make /n=360/d/free value, azi
|
|
||||||
azi = p
|
|
||||||
value = 1
|
|
||||||
variable polar = 45 // dphi = 2
|
|
||||||
|
|
||||||
make_hemi_grid(91, "")
|
|
||||||
wave w_index = index
|
|
||||||
wave w_nphis = nphis
|
|
||||||
wave w_dphi = dphi
|
|
||||||
wave w_values = values
|
|
||||||
wave w_azim = azim
|
|
||||||
wave w_polar = polar
|
|
||||||
|
|
||||||
duplicate /free w_values, e_values
|
|
||||||
variable p1 = w_index[44]
|
|
||||||
variable p2 = w_index[45]
|
|
||||||
e_values = (p >= p1) && (p < p2) ? 1 : 0
|
|
||||||
|
|
||||||
hemi_add_aziscan("", value, polar, azi)
|
|
||||||
|
|
||||||
CHECK_EQUAL_WAVES(w_values, e_values, tol=0.001)
|
|
||||||
end
|
|
@ -1893,13 +1893,12 @@ end
|
|||||||
///
|
///
|
||||||
/// @param x, y projected Cartesian coordinate
|
/// @param x, y projected Cartesian coordinate
|
||||||
///
|
///
|
||||||
/// @param projection mapping function from polar to cartesian coordinates
|
/// @param projection mapping function from polar to cartesian coordinates.
|
||||||
|
/// projections 0-2 have no effect on the azimuthal coordinate.
|
||||||
/// @arg 0 linear
|
/// @arg 0 linear
|
||||||
/// @arg 1 stereographic (default)
|
/// @arg 1 stereographic (default)
|
||||||
/// @arg 2 azimuthal
|
/// @arg 2 azimuthal
|
||||||
///
|
///
|
||||||
/// projections 0-2 have no effect on the azimuthal coordinate
|
|
||||||
///
|
|
||||||
/// @param zeroAngle zeroAngleWhere parameter of polar graphs
|
/// @param zeroAngle zeroAngleWhere parameter of polar graphs
|
||||||
/// @arg 0 (default) zero is at the 3 o'clock position
|
/// @arg 0 (default) zero is at the 3 o'clock position
|
||||||
/// @arg 180 zero is at the 9 o'clock position
|
/// @arg 180 zero is at the 9 o'clock position
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,368 +0,0 @@
|
|||||||
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
|
|
||||||
#pragma IgorVersion = 6.1
|
|
||||||
#pragma ModuleName = PearlAreaLive
|
|
||||||
#pragma version = 1.03
|
|
||||||
#include "pearl-epics", version >= 1.02
|
|
||||||
|
|
||||||
// preview panel for EPICS area detectors
|
|
||||||
// such as CCD cameras, 2D electron analysers
|
|
||||||
// the image is read from the NDPluginStdArrays plugin of the area detector
|
|
||||||
// make sure that plugin is enabled
|
|
||||||
|
|
||||||
// created: matthias.muntwiler@psi.ch, 2013-05-29
|
|
||||||
// $Id$
|
|
||||||
|
|
||||||
static strconstant package_name = "pearl_epics"
|
|
||||||
static strconstant package_path = "root:pearl_epics:"
|
|
||||||
// semicolon-separated list of persistent variable, string, and wave names
|
|
||||||
static strconstant prefs_objects = ""
|
|
||||||
|
|
||||||
function ad_connect(epicsname, nickname)
|
|
||||||
// connects to the necessary EPICS channels of the detector
|
|
||||||
// to disconnect, call epics_disconnect()
|
|
||||||
// (caution: this will disconnect all EPICS channels of all PEARL EPICS procedures!)
|
|
||||||
string epicsname // base name of the detector, e.g. X03DA-SCIENTA:
|
|
||||||
// image1: and cam1: are appended by the function
|
|
||||||
string nickname // nick name under which this detector is referred to in Igor
|
|
||||||
// must be a valid data folder name
|
|
||||||
// the data folder is created under root:pearl_epics
|
|
||||||
|
|
||||||
dfref savedf = GetDataFolderDFR()
|
|
||||||
setdatafolder root:
|
|
||||||
|
|
||||||
// data folder for common EPICS metadata
|
|
||||||
newdatafolder /o/s $package_name
|
|
||||||
dfref epicsdf = GetDataFolderDFR()
|
|
||||||
string /g ad_chids
|
|
||||||
string /g ad_nicknames
|
|
||||||
|
|
||||||
// data folder this detector
|
|
||||||
string foldername = nickname
|
|
||||||
newdatafolder /s/o $foldername
|
|
||||||
dfref detectordf = GetDataFolderDFR()
|
|
||||||
|
|
||||||
// create variables and waves
|
|
||||||
make /n=(1)/o arraydata, xscale, yscale
|
|
||||||
make /n=(1,1)/o image
|
|
||||||
variable /g ndimensions
|
|
||||||
variable /g arraysize0, arraysize1
|
|
||||||
variable /g datatype
|
|
||||||
variable /g colormode
|
|
||||||
string /g controls, monitors
|
|
||||||
string /g xunits, yunits
|
|
||||||
|
|
||||||
print "connecting EPICS channels..."
|
|
||||||
|
|
||||||
// channel lists
|
|
||||||
controls = ""
|
|
||||||
monitors = ""
|
|
||||||
string imagename = epicsname + "image1:"
|
|
||||||
string camname = epicsname + "cam1:"
|
|
||||||
|
|
||||||
// we will set our own monitor on ArrayData, so add this to the controls list
|
|
||||||
controls = ReplaceStringByKey("ArrayData", controls, imagename + "ArrayData", "=")
|
|
||||||
// check whether it has been set already
|
|
||||||
variable chidArrayData = epics_chid(imagename + "ArrayData")
|
|
||||||
variable array_connected = chidArrayData > 0
|
|
||||||
|
|
||||||
monitors = ReplaceStringByKey("NDimensions", monitors, imagename + "NDimensions_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey("ArraySize0", monitors, imagename + "ArraySize0_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey("ArraySize1", monitors, imagename + "ArraySize1_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey("DataType", monitors, imagename + "DataType_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey("ColorMode", monitors, imagename + "ColorMode_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey("XScale", monitors, camname + "CHANNEL_SCALE_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey("YScale", monitors, camname + "SLICE_SCALE_RBV", "=")
|
|
||||||
|
|
||||||
variable nroi = 4
|
|
||||||
variable iroi
|
|
||||||
string roikey, roiname
|
|
||||||
for (iroi = 0; iroi < nroi; iroi += 1)
|
|
||||||
roikey = "ROI" + num2str(iroi + 1)
|
|
||||||
roiname = epicsname + "ROI" + num2str(iroi + 1) + ":"
|
|
||||||
|
|
||||||
controls = ReplaceStringByKey(roikey + "Enable", controls, roiname + "EnableCallbacks", "=")
|
|
||||||
controls = ReplaceStringByKey(roikey + "EnableX", controls, roiname + "EnableX", "=")
|
|
||||||
controls = ReplaceStringByKey(roikey + "MinX", controls, roiname + "MinX", "=")
|
|
||||||
controls = ReplaceStringByKey(roikey + "SizeX", controls, roiname + "SizeX", "=")
|
|
||||||
controls = ReplaceStringByKey(roikey + "EnableY", controls, roiname + "EnableY", "=")
|
|
||||||
controls = ReplaceStringByKey(roikey + "MinY", controls, roiname + "MinY", "=")
|
|
||||||
controls = ReplaceStringByKey(roikey + "SizeY", controls, roiname + "SizeY", "=")
|
|
||||||
|
|
||||||
monitors = ReplaceStringByKey(roikey + "Enable", monitors, roiname + "EnableCallbacks_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey(roikey + "EnableX", monitors, roiname + "EnableX_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey(roikey + "MinX", monitors, roiname + "MinX_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey(roikey + "SizeX", monitors, roiname + "SizeX_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey(roikey + "EnableY", monitors, roiname + "EnableY_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey(roikey + "MinY", monitors, roiname + "MinY_RBV", "=")
|
|
||||||
monitors = ReplaceStringByKey(roikey + "SizeY", monitors, roiname + "SizeY_RBV", "=")
|
|
||||||
endfor
|
|
||||||
|
|
||||||
// connect EPICS channels
|
|
||||||
epics_connect(controls, monitors)
|
|
||||||
|
|
||||||
// keep track of detector IDs
|
|
||||||
ad_nicknames = AddListItem(nickname, ad_nicknames)
|
|
||||||
variable iad = WhichListItem(nickname, ad_nicknames, ";", 0, 0)
|
|
||||||
ad_chids = AddListItem(num2istr(epics_chid(imagename + "ArrayData")), ad_chids, ";", iad)
|
|
||||||
|
|
||||||
// set callback function
|
|
||||||
if (!array_connected)
|
|
||||||
pvMonitor /F=ad_live_callback epics_chid(imagename + "ArrayData")
|
|
||||||
endif
|
|
||||||
|
|
||||||
print "...done"
|
|
||||||
setdatafolder savedf
|
|
||||||
end
|
|
||||||
|
|
||||||
function ad_live_callback(chan)
|
|
||||||
variable chan
|
|
||||||
|
|
||||||
dfref savedf = GetDataFolderDFR()
|
|
||||||
setdatafolder $package_path
|
|
||||||
|
|
||||||
// find the data folder of the detector
|
|
||||||
svar ad_chids
|
|
||||||
svar ad_nicknames
|
|
||||||
variable iad = WhichListItem(num2istr(chan), ad_chids, ";", 0, 0)
|
|
||||||
if (iad >= 0)
|
|
||||||
string nickname = StringFromList(iad, ad_nicknames)
|
|
||||||
else
|
|
||||||
return -1
|
|
||||||
endif
|
|
||||||
setdatafolder $nickname
|
|
||||||
|
|
||||||
// retrieve data
|
|
||||||
svar controls
|
|
||||||
svar monitors
|
|
||||||
variable chidArrayData = epics_chid(StringByKey("ArrayData", controls, "="))
|
|
||||||
variable chidNDimensions = epics_chid(StringByKey("NDimensions", monitors, "="))
|
|
||||||
variable chidArraySize0 = epics_chid(StringByKey("ArraySize0", monitors, "="))
|
|
||||||
variable chidArraySize1 = epics_chid(StringByKey("ArraySize1", monitors, "="))
|
|
||||||
variable chidDataType = epics_chid(StringByKey("DataType", monitors, "="))
|
|
||||||
variable chidColorMode = epics_chid(StringByKey("ColorMode", monitors, "="))
|
|
||||||
variable chidXScale = epics_chid(StringByKey("XScale", monitors, "="))
|
|
||||||
variable chidYScale = epics_chid(StringByKey("YScale", monitors, "="))
|
|
||||||
|
|
||||||
wave arraydata
|
|
||||||
wave image
|
|
||||||
nvar ndimensions
|
|
||||||
nvar arraysize0
|
|
||||||
nvar arraysize1
|
|
||||||
nvar datatype
|
|
||||||
nvar colormode
|
|
||||||
wave xscale
|
|
||||||
wave yscale
|
|
||||||
|
|
||||||
pvGet chidNDimensions, ndimensions
|
|
||||||
pvGet chidArraySize0, arraysize0
|
|
||||||
pvGet chidArraySize1, arraysize1
|
|
||||||
pvGet chidDataType, datatype
|
|
||||||
pvGet chidColorMode, colormode
|
|
||||||
|
|
||||||
// sanity checks
|
|
||||||
if (ndimensions != 2)
|
|
||||||
return -2
|
|
||||||
endif
|
|
||||||
if (colormode != 0)
|
|
||||||
return -3
|
|
||||||
endif
|
|
||||||
|
|
||||||
redimension /n=(arraysize0 * arraysize1) arraydata
|
|
||||||
redimension /n=(arraysize0, arraysize1) image
|
|
||||||
redimension /n=(arraysize0) xscale
|
|
||||||
redimension /n=(arraysize1) yscale
|
|
||||||
|
|
||||||
switch(datatype)
|
|
||||||
case 0: // int8
|
|
||||||
redimension /b arraydata, image
|
|
||||||
break
|
|
||||||
case 1: // uint8
|
|
||||||
redimension /b/u arraydata, image
|
|
||||||
break
|
|
||||||
case 2: // int16
|
|
||||||
redimension /w arraydata, image
|
|
||||||
break
|
|
||||||
case 3: // uint16
|
|
||||||
redimension /w/u arraydata, image
|
|
||||||
break
|
|
||||||
case 4: // int32
|
|
||||||
redimension /i arraydata, image
|
|
||||||
break
|
|
||||||
case 5: // uint32
|
|
||||||
redimension /i/u arraydata, image
|
|
||||||
break
|
|
||||||
case 6: // float32
|
|
||||||
redimension /s arraydata, image
|
|
||||||
break
|
|
||||||
case 7: // float64
|
|
||||||
redimension /d arraydata, image
|
|
||||||
break
|
|
||||||
endswitch
|
|
||||||
|
|
||||||
pvGetWave chidArrayData, arraydata
|
|
||||||
pvGetWave chidXScale, xscale
|
|
||||||
pvGetWave chidYScale, yscale
|
|
||||||
|
|
||||||
image = arraydata[p + q * arraysize0]
|
|
||||||
setscale /i x xscale[0], xscale[numpnts(xscale)-1], image
|
|
||||||
setscale /i y yscale[0], yscale[numpnts(yscale)-1], image
|
|
||||||
|
|
||||||
ad_update_profiles(image)
|
|
||||||
|
|
||||||
// update ROI rectangles
|
|
||||||
svar /z graphname = :view_image:prof_graphname
|
|
||||||
if (svar_exists(graphname))
|
|
||||||
variable nroi = 4
|
|
||||||
variable iroi
|
|
||||||
for (iroi = 0; iroi < nroi; iroi += 1)
|
|
||||||
ad_update_ROI(graphname, iroi)
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
|
|
||||||
setdatafolder savedf
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
|
|
||||||
static function ad_update_ROI(graphname, iroi)
|
|
||||||
string graphname
|
|
||||||
variable iroi
|
|
||||||
|
|
||||||
string roikey
|
|
||||||
variable enable
|
|
||||||
svar monitors
|
|
||||||
|
|
||||||
wave xscale
|
|
||||||
wave yscale
|
|
||||||
|
|
||||||
variable enableX = 0
|
|
||||||
variable minX = 0
|
|
||||||
variable sizeX = numpnts(xscale)
|
|
||||||
|
|
||||||
variable enableY = 0
|
|
||||||
variable minY = 0
|
|
||||||
variable sizeY = numpnts(yscale)
|
|
||||||
|
|
||||||
roikey = "ROI" + num2str(iroi + 1)
|
|
||||||
enable = epics_get_num(StringByKey(roikey + "Enable", monitors, "="))
|
|
||||||
if (enable)
|
|
||||||
enableX = epics_get_num(StringByKey(roikey + "EnableX", monitors, "="))
|
|
||||||
if (enableX)
|
|
||||||
minX = epics_get_num(StringByKey(roikey + "MinX", monitors, "="))
|
|
||||||
sizeX = epics_get_num(StringByKey(roikey + "SizeX", monitors, "="))
|
|
||||||
endif
|
|
||||||
|
|
||||||
enableY = epics_get_num(StringByKey(roikey + "EnableY", monitors, "="))
|
|
||||||
if (enableY)
|
|
||||||
minY = epics_get_num(StringByKey(roikey + "MinY", monitors, "="))
|
|
||||||
sizeY = epics_get_num(StringByKey(roikey + "SizeY", monitors, "="))
|
|
||||||
endif
|
|
||||||
|
|
||||||
variable x1 = xscale[minX]
|
|
||||||
variable x2 = xscale[minX + sizeX - 1]
|
|
||||||
variable y1 = yscale[minY]
|
|
||||||
variable y2 = yscale[minY + sizeY - 1]
|
|
||||||
endif
|
|
||||||
|
|
||||||
ad_update_ROI_rect(graphname, iroi, x1, y1, x2, y2, enable)
|
|
||||||
end
|
|
||||||
|
|
||||||
static function ad_update_ROI_rect(graphname, iroi, x1, y1, x2, y2, enable)
|
|
||||||
string graphname
|
|
||||||
variable iroi // 0...3
|
|
||||||
variable x1,y1,x2,y2
|
|
||||||
variable enable // enable = 1; disable = 0
|
|
||||||
string roiname = "roi" + num2str(iroi + 1)
|
|
||||||
variable color = 65536 * (1 - iroi/8) - 1
|
|
||||||
|
|
||||||
if (enable)
|
|
||||||
DrawAction /w=$graphname getgroup=$roiname, delete, begininsert
|
|
||||||
SetDrawEnv /w=$graphname gstart,gname=$roiname
|
|
||||||
SetDrawEnv /w=$graphname xcoord= bottom,ycoord= left
|
|
||||||
SetDrawEnv /w=$graphname linefgc= (65535,color,color)
|
|
||||||
SetDrawEnv /w=$graphname fillpat= 0
|
|
||||||
SetDrawEnv /w=$graphname linethick= 0.50
|
|
||||||
DrawRect /w=$graphname x1,y1,x2,y2
|
|
||||||
SetDrawEnv /w=$graphname gstop
|
|
||||||
DrawAction /w=$graphname endinsert
|
|
||||||
else
|
|
||||||
DrawAction /w=$graphname getgroup=$roiname, delete
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
function ad_set_ROI(nickname, iroi, p1, q1, p2, q2, enable)
|
|
||||||
// set a ROI rectangle to the given coordinates
|
|
||||||
string nickname
|
|
||||||
variable iroi // 0...3
|
|
||||||
variable p1,q1,p2,q2 // rectangular coordinates of the new ROI (point scaling)
|
|
||||||
variable enable // enable = 1; disable = 0
|
|
||||||
|
|
||||||
string roiname = "roi" + num2str(iroi + 1)
|
|
||||||
string roikey
|
|
||||||
|
|
||||||
dfref savedf = GetDataFolderDFR()
|
|
||||||
setdatafolder $package_path
|
|
||||||
setdatafolder $nickname
|
|
||||||
|
|
||||||
svar controls
|
|
||||||
wave xscale
|
|
||||||
wave yscale
|
|
||||||
|
|
||||||
variable minX = min(p1, p2)
|
|
||||||
variable sizeX = max(p1, p2) - min(p1, p2) + 1
|
|
||||||
variable enableX = sizeX > 0
|
|
||||||
variable minY = min(q1, q2)
|
|
||||||
variable sizeY = max(q1, q2) - min(q1, q2) + 1
|
|
||||||
variable enableY = sizeY > 0
|
|
||||||
|
|
||||||
roikey = "ROI" + num2str(iroi + 1)
|
|
||||||
epics_set_num(StringByKey(roikey + "Enable", controls, "="), enable)
|
|
||||||
if (enable)
|
|
||||||
epics_set_num(StringByKey(roikey + "EnableX", controls, "="), enableX)
|
|
||||||
if (enableX)
|
|
||||||
epics_set_num(StringByKey(roikey + "MinX", controls, "="), minX)
|
|
||||||
epics_set_num(StringByKey(roikey + "SizeX", controls, "="), sizeX)
|
|
||||||
endif
|
|
||||||
|
|
||||||
epics_set_num(StringByKey(roikey + "EnableY", controls, "="), enableY)
|
|
||||||
if (enableY)
|
|
||||||
epics_set_num(StringByKey(roikey + "MinY", controls, "="), minY)
|
|
||||||
epics_set_num(StringByKey(roikey + "SizeY", controls, "="), sizeY)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
svar graphname = :view_image:prof_graphname
|
|
||||||
ad_update_ROI(graphname, iroi)
|
|
||||||
|
|
||||||
setdatafolder savedf
|
|
||||||
end
|
|
||||||
|
|
||||||
function add_roi_controls()
|
|
||||||
PopupMenu pm_set_roi mode=0,value="ROI 1;ROI 2;ROI 3;ROI 4",title="Set ROI"
|
|
||||||
PopupMenu pm_set_roi pos={400,0},bodyWidth=60,proc=PearlAreaLive#pmp_set_roi
|
|
||||||
PopupMenu pm_set_roi help={"Set a detector ROI to the current cursor selection"}
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
static function pmp_set_roi(pa) : PopupMenuControl
|
|
||||||
STRUCT WMPopupAction &pa
|
|
||||||
|
|
||||||
switch( pa.eventCode )
|
|
||||||
case 2: // mouse up
|
|
||||||
variable popNum = pa.popNum
|
|
||||||
string imgname = StringFromList(0, ImageNameList(pa.win, ";"))
|
|
||||||
wave /z image = ImageNameToWaveRef(pa.win, imgname)
|
|
||||||
if (waveexists(image))
|
|
||||||
wave /z source = PearlAreaDisplay#get_source_image(image)
|
|
||||||
if (waveexists(source))
|
|
||||||
dfref sourcedf = GetWavesDataFolderDFR(source)
|
|
||||||
string nickname = GetDataFolder(0, sourcedf)
|
|
||||||
ad_set_ROI(nickname, popNum - 1, pcsr(A, pa.win), qcsr(A, pa.win), pcsr(B, pa.win), qcsr(B, pa.win), 1)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
break
|
|
||||||
case -1: // control being killed
|
|
||||||
break
|
|
||||||
endswitch
|
|
||||||
|
|
||||||
return 0
|
|
||||||
End
|
|
@ -1,454 +0,0 @@
|
|||||||
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
|
|
||||||
#pragma IgorVersion = 6.1
|
|
||||||
#pragma ModuleName = PearlAreaProfilesTest
|
|
||||||
#pragma version = 1.02
|
|
||||||
|
|
||||||
#include "pearl-area-profiles"
|
|
||||||
#include "unit-testing"
|
|
||||||
|
|
||||||
|
|
||||||
/// @file
|
|
||||||
/// @brief test suite for pearl-area-profiles.ipf
|
|
||||||
///
|
|
||||||
/// unit testing framework: http://www.igorexchange.com/project/unitTesting.
|
|
||||||
/// run all test cases with <code>RunTest("pearl-area-profiles-test.ipf")</code>.
|
|
||||||
/// if wave equalities fail, EnableDebugOutput() and read Igor help on equalWaves().
|
|
||||||
///
|
|
||||||
/// @author matthias muntwiler, matthias.muntwiler@psi.ch
|
|
||||||
///
|
|
||||||
/// @copyright 2013-15 Paul Scherrer Institut @n
|
|
||||||
/// Licensed under the Apache License, Version 2.0 (the "License"); @n
|
|
||||||
/// you may not use this file except in compliance with the License. @n
|
|
||||||
/// You may obtain a copy of the License at
|
|
||||||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
/// @namespace PearlAreaProfilesTest
|
|
||||||
/// @brief profile extraction for multi-dimensional datasets acquired from area detectors.
|
|
||||||
///
|
|
||||||
/// PearlAreaProfilesTest is declared in @ref pearl-area-profiles-test.ipf.
|
|
||||||
///
|
|
||||||
|
|
||||||
|
|
||||||
/// test the ad_profile_x() function
|
|
||||||
static function test_ad_profile_x_w()
|
|
||||||
make /n=(11,21) /d /free source
|
|
||||||
setscale /p x 10, 1, "X", source
|
|
||||||
setscale /p y 100, 100, "Y", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y
|
|
||||||
|
|
||||||
make /n=11 /d /free expected
|
|
||||||
setscale /p x 10, 1, "X", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
expected = 30 + 3 * p + 500 + 600 + 700
|
|
||||||
|
|
||||||
make /n=1 /d /free result1, result0
|
|
||||||
variable p1, p2
|
|
||||||
|
|
||||||
p1 = 4
|
|
||||||
p2 = 6
|
|
||||||
ad_profile_x_w(source, p1, p2, result1, noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result1, expected, tol=1e-6)
|
|
||||||
|
|
||||||
expected /= 3
|
|
||||||
ad_profile_x_w(source, p1, p2, result0, noavg=0)
|
|
||||||
CHECK_EQUAL_WAVES(result0, expected, tol=1e-6)
|
|
||||||
end
|
|
||||||
|
|
||||||
/// test the ad_profile_y() function
|
|
||||||
static function test_ad_profile_y_w()
|
|
||||||
make /n=(11,21) /d /free source
|
|
||||||
setscale /p x 10, 1, "X", source
|
|
||||||
setscale /p y 100, 100, "Y", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y
|
|
||||||
|
|
||||||
make /n=21 /d /free expected
|
|
||||||
setscale /p x 100, 100, "Y", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
expected = 3 * x + 14 + 15 + 16
|
|
||||||
|
|
||||||
make /n=1 /d /free result1, result0
|
|
||||||
variable p1, p2
|
|
||||||
|
|
||||||
p1 = 4
|
|
||||||
p2 = 6
|
|
||||||
ad_profile_y_w(source, p1, p2, result1, noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result1, expected)
|
|
||||||
|
|
||||||
expected /= 3
|
|
||||||
ad_profile_y_w(source, p1, p2, result0, noavg=0)
|
|
||||||
CHECK_EQUAL_WAVES(result0, expected)
|
|
||||||
end
|
|
||||||
|
|
||||||
/// test the ad_extract_slab_x() function
|
|
||||||
static function test_ad_extract_slab_x()
|
|
||||||
variable nx = 11
|
|
||||||
variable ny = 16
|
|
||||||
variable nz = 21
|
|
||||||
make /n=(nx,ny,nz) /d /free source
|
|
||||||
setscale /i x -1, 1, "X", source
|
|
||||||
setscale /i y -2, 2, "Y", source
|
|
||||||
setscale /i z -3, 3, "Z", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y + z
|
|
||||||
source[4][][] = 1
|
|
||||||
source[5][][] = 1
|
|
||||||
|
|
||||||
make /n=(ny,nz) /d /free expected
|
|
||||||
setscale /i x -2, 2, "Y", expected
|
|
||||||
setscale /i y -3, 3, "Z", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
expected = 2
|
|
||||||
|
|
||||||
variable p1, p2
|
|
||||||
p1 = 4
|
|
||||||
p2 = 5
|
|
||||||
|
|
||||||
wave result = ad_extract_slab_x(source, p1, p2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
expected = 1
|
|
||||||
wave result = ad_extract_slab_x(source, p1, p2, "", noavg=0)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
p1 = -inf
|
|
||||||
p2 = 5
|
|
||||||
source = y + z
|
|
||||||
expected = (x + y) * 6
|
|
||||||
wave result = ad_extract_slab_x(source, p1, p2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
p1 = 4
|
|
||||||
p2 = +inf
|
|
||||||
expected = (x + y) * (nx - 4)
|
|
||||||
wave result = ad_extract_slab_x(source, p1, p2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
end
|
|
||||||
|
|
||||||
/// test the ad_extract_slab_y() function
|
|
||||||
static function test_ad_extract_slab_y()
|
|
||||||
variable nx = 11
|
|
||||||
variable ny = 16
|
|
||||||
variable nz = 21
|
|
||||||
make /n=(nx,ny,nz) /d /free source
|
|
||||||
setscale /i x -1, 1, "X", source
|
|
||||||
setscale /i y -2, 2, "Y", source
|
|
||||||
setscale /i z -3, 3, "Z", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y + z
|
|
||||||
source[][4][] = 1
|
|
||||||
source[][5][] = 1
|
|
||||||
|
|
||||||
make /n=(nx,nz) /d /free expected
|
|
||||||
setscale /i x -1, 1, "X", expected
|
|
||||||
setscale /i y -3, 3, "Z", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
expected = 2
|
|
||||||
|
|
||||||
variable p1, p2
|
|
||||||
p1 = 4
|
|
||||||
p2 = 5
|
|
||||||
|
|
||||||
wave result = ad_extract_slab_y(source, p1, p2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
expected = 1
|
|
||||||
wave result = ad_extract_slab_y(source, p1, p2, "", noavg=0)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
p1 = -inf
|
|
||||||
p2 = 5
|
|
||||||
source = x + z
|
|
||||||
expected = (x + y) * 6
|
|
||||||
wave result = ad_extract_slab_y(source, p1, p2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
p1 = 4
|
|
||||||
p2 = +inf
|
|
||||||
expected = (x + y) * (ny - 4)
|
|
||||||
wave result = ad_extract_slab_y(source, p1, p2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
end
|
|
||||||
|
|
||||||
/// test the ad_extract_slab_z() function
|
|
||||||
static function test_ad_extract_slab_z()
|
|
||||||
variable nx = 11
|
|
||||||
variable ny = 16
|
|
||||||
variable nz = 21
|
|
||||||
make /n=(nx,ny,nz) /d /free source
|
|
||||||
setscale /i x -1, 1, "X", source
|
|
||||||
setscale /i y -2, 2, "Y", source
|
|
||||||
setscale /i z -3, 3, "Z", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y + z
|
|
||||||
source[][][4] = 1
|
|
||||||
source[][][5] = 1
|
|
||||||
|
|
||||||
make /n=(nx,ny) /d /free expected
|
|
||||||
setscale /i x -1, 1, "X", expected
|
|
||||||
setscale /i y -2, 2, "Y", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
expected = 2
|
|
||||||
|
|
||||||
variable p1, p2
|
|
||||||
p1 = 4
|
|
||||||
p2 = 5
|
|
||||||
|
|
||||||
wave result = ad_extract_slab_z(source, p1, p2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
expected = 1
|
|
||||||
wave result = ad_extract_slab_z(source, p1, p2, "", noavg=0)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
p1 = -inf
|
|
||||||
p2 = 5
|
|
||||||
source = x + y
|
|
||||||
expected = (x + y) * 6
|
|
||||||
wave result = ad_extract_slab_z(source, p1, p2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
p1 = 4
|
|
||||||
p2 = +inf
|
|
||||||
expected = (x + y) * (nz - 4)
|
|
||||||
wave result = ad_extract_slab_z(source, p1, p2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
end
|
|
||||||
|
|
||||||
/// test the ad_extract_slab() function
|
|
||||||
static function test_ad_extract_slab()
|
|
||||||
variable nx = 11
|
|
||||||
variable ny = 16
|
|
||||||
variable nz = 21
|
|
||||||
|
|
||||||
make /n=(nx,ny,nz) /d /free source
|
|
||||||
setscale /i x -1, 1, "X", source
|
|
||||||
setscale /i y -2, 2, "Y", source
|
|
||||||
setscale /i z -3, 3, "Z", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y + z
|
|
||||||
|
|
||||||
variable x1, x2
|
|
||||||
variable y1, y2
|
|
||||||
variable z1, z2
|
|
||||||
|
|
||||||
make /n=(ny,nz) /d /free expected
|
|
||||||
setscale /i x -2, 2, "Y", expected
|
|
||||||
setscale /i y -3, 3, "Z", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
|
|
||||||
x1 = 0
|
|
||||||
x2 = 0
|
|
||||||
y1 = nan
|
|
||||||
y2 = nan
|
|
||||||
z1 = nan
|
|
||||||
z2 = nan
|
|
||||||
expected = source[(nx-1)/2][p][q]
|
|
||||||
wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
x1 = -inf
|
|
||||||
x2 = inf
|
|
||||||
expected = (x + y) * nx
|
|
||||||
wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
make /n=(nx,nz) /d /free expected
|
|
||||||
setscale /i x -1, 1, "X", expected
|
|
||||||
setscale /i y -3, 3, "Z", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
|
|
||||||
x1 = nan
|
|
||||||
x2 = nan
|
|
||||||
y1 = 0
|
|
||||||
y2 = 0
|
|
||||||
z1 = nan
|
|
||||||
z2 = nan
|
|
||||||
expected = source[p][(ny-1)/2][q]
|
|
||||||
wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
y1 = -inf
|
|
||||||
y2 = +inf
|
|
||||||
expected = (x + y) * ny
|
|
||||||
wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
make /n=(nx,ny) /d /free expected
|
|
||||||
setscale /i x -1, 1, "X", expected
|
|
||||||
setscale /i y -2, 2, "Y", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
|
|
||||||
x1 = nan
|
|
||||||
x2 = nan
|
|
||||||
y1 = nan
|
|
||||||
y2 = nan
|
|
||||||
z1 = 0
|
|
||||||
z2 = 0
|
|
||||||
expected = source[p][q][(nz-1)/2]
|
|
||||||
wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
z1 = -inf
|
|
||||||
z2 = inf
|
|
||||||
expected = (x + y) * nz
|
|
||||||
wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
end
|
|
||||||
|
|
||||||
/// test the ad_extract_rod_x() function
|
|
||||||
static function test_ad_extract_rod_x()
|
|
||||||
variable nx = 11
|
|
||||||
variable ny = 16
|
|
||||||
variable nz = 21
|
|
||||||
make /n=(nx,ny,nz) /d /free source
|
|
||||||
setscale /i x -1, 1, "X", source
|
|
||||||
setscale /i y -2, 2, "Y", source
|
|
||||||
setscale /i z -3, 3, "Z", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y + z
|
|
||||||
source[][4][4] = 1
|
|
||||||
source[][4][5] = 1
|
|
||||||
source[][5][4] = 1
|
|
||||||
source[][5][5] = 1
|
|
||||||
|
|
||||||
make /n=(nx) /d /free expected
|
|
||||||
setscale /i x -1, 1, "X", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
expected = 4
|
|
||||||
|
|
||||||
variable q1, q2
|
|
||||||
variable r1, r2
|
|
||||||
q1 = 4
|
|
||||||
q2 = 5
|
|
||||||
r1 = 4
|
|
||||||
r2 = 5
|
|
||||||
|
|
||||||
wave result = ad_extract_rod_x(source, q1, q2, r1, r2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
expected = 1
|
|
||||||
wave result = ad_extract_rod_x(source, q1, q2, r1, r2, "", noavg=0)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
end
|
|
||||||
|
|
||||||
/// test the ad_extract_rod() function, X coordinate
|
|
||||||
static function test_ad_extract_rod__x()
|
|
||||||
variable nx = 11
|
|
||||||
variable ny = 16
|
|
||||||
variable nz = 21
|
|
||||||
|
|
||||||
make /n=(nx,ny,nz) /d /free source
|
|
||||||
setscale /i x -1, 1, "X", source
|
|
||||||
setscale /i y -2, 2, "Y", source
|
|
||||||
setscale /i z -3, 3, "Z", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y + z
|
|
||||||
|
|
||||||
variable x1, x2
|
|
||||||
variable y1, y2
|
|
||||||
variable z1, z2
|
|
||||||
|
|
||||||
make /n=(nx) /d /free expected
|
|
||||||
setscale /i x -1, 1, "X", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
|
|
||||||
x1 = nan
|
|
||||||
x2 = nan
|
|
||||||
y1 = 0
|
|
||||||
y2 = 0
|
|
||||||
z1 = 0
|
|
||||||
z2 = 0
|
|
||||||
expected = source[p][(ny-1)/2][(nz-1)/2]
|
|
||||||
wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
y1 = -inf
|
|
||||||
y2 = +inf
|
|
||||||
z1 = -inf
|
|
||||||
z2 = +inf
|
|
||||||
expected = x * ny * nz
|
|
||||||
wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
end
|
|
||||||
|
|
||||||
/// test the ad_extract_rod() function, Y coordinate
|
|
||||||
static function test_ad_extract_rod__y()
|
|
||||||
variable nx = 11
|
|
||||||
variable ny = 16
|
|
||||||
variable nz = 21
|
|
||||||
|
|
||||||
make /n=(nx,ny,nz) /d /free source
|
|
||||||
setscale /i x -1, 1, "X", source
|
|
||||||
setscale /i y -2, 2, "Y", source
|
|
||||||
setscale /i z -3, 3, "Z", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y + z
|
|
||||||
|
|
||||||
variable x1, x2
|
|
||||||
variable y1, y2
|
|
||||||
variable z1, z2
|
|
||||||
|
|
||||||
make /n=(ny) /d /free expected
|
|
||||||
setscale /i x -2, 2, "Y", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
|
|
||||||
x1 = 0
|
|
||||||
x2 = 0
|
|
||||||
y1 = nan
|
|
||||||
y2 = nan
|
|
||||||
z1 = 0
|
|
||||||
z2 = 0
|
|
||||||
expected = source[(nx-1)/2][p][(nz-1)/2]
|
|
||||||
wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
x1 = -inf
|
|
||||||
x2 = +inf
|
|
||||||
z1 = -inf
|
|
||||||
z2 = +inf
|
|
||||||
expected = x * nx * nz
|
|
||||||
wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
end
|
|
||||||
|
|
||||||
/// test the ad_extract_rod() function, Z coordinate
|
|
||||||
static function test_ad_extract_rod__z()
|
|
||||||
variable nx = 11
|
|
||||||
variable ny = 16
|
|
||||||
variable nz = 21
|
|
||||||
|
|
||||||
make /n=(nx,ny,nz) /d /free source
|
|
||||||
setscale /i x -1, 1, "X", source
|
|
||||||
setscale /i y -2, 2, "Y", source
|
|
||||||
setscale /i z -3, 3, "Z", source
|
|
||||||
setscale d 0, 0, "D", source
|
|
||||||
source = x + y + z
|
|
||||||
|
|
||||||
variable x1, x2
|
|
||||||
variable y1, y2
|
|
||||||
variable z1, z2
|
|
||||||
|
|
||||||
make /n=(nz) /d /free expected
|
|
||||||
setscale /i x -3, 3, "Z", expected
|
|
||||||
setscale d 0, 0, "D", expected
|
|
||||||
|
|
||||||
x1 = 0
|
|
||||||
x2 = 0
|
|
||||||
y1 = 0
|
|
||||||
y2 = 0
|
|
||||||
z1 = nan
|
|
||||||
z2 = nan
|
|
||||||
expected = source[(nx-1)/2][(ny-1)/2][p]
|
|
||||||
wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
|
|
||||||
x1 = -inf
|
|
||||||
x2 = +inf
|
|
||||||
y1 = -inf
|
|
||||||
y2 = +inf
|
|
||||||
expected = x * nx * ny
|
|
||||||
wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
|
|
||||||
CHECK_EQUAL_WAVES(result, expected, tol=0.001)
|
|
||||||
end
|
|
@ -1,152 +0,0 @@
|
|||||||
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
|
|
||||||
#pragma IgorVersion = 6.1
|
|
||||||
#pragma ModuleName = PearlArpesScans
|
|
||||||
#pragma version = 1.01
|
|
||||||
#include "mm-physconst"
|
|
||||||
#include "pearl-optics-theory"
|
|
||||||
#include "pearl-epics", version >= 1.01
|
|
||||||
|
|
||||||
// EPICS scans of Scienta
|
|
||||||
// matthias muntwiler, 2013-03-15
|
|
||||||
// $Id: pearl-optics-scans.ipf 129 2013-06-26 15:53:13Z muntwiler_m $
|
|
||||||
|
|
||||||
static strconstant basename = "X03DA-SCIENTA:"
|
|
||||||
static strconstant camname = "cam1:"
|
|
||||||
static strconstant hdfname = "HDF1:"
|
|
||||||
static strconstant imgname = "image1:"
|
|
||||||
static strconstant statsname = "Stats1:"
|
|
||||||
|
|
||||||
function scienta_connect()
|
|
||||||
|
|
||||||
dfref savedf = GetDataFolderDFR()
|
|
||||||
print "connecting EPICS channels..."
|
|
||||||
|
|
||||||
// channel lists
|
|
||||||
string controls = ""
|
|
||||||
controls += basename + camname + "PASS_ENERGY;"
|
|
||||||
controls += basename + camname + "LOW_ENERGY;"
|
|
||||||
controls += basename + camname + "CENTRE_ENERGY;"
|
|
||||||
controls += basename + camname + "HIGH_ENERGY;"
|
|
||||||
controls += basename + camname + "LENS_MODE;"
|
|
||||||
controls += basename + camname + "ACQ_MODE;"
|
|
||||||
controls += basename + camname + "ENERGY_MODE;"
|
|
||||||
controls += basename + camname + "DETECTOR_MODE;"
|
|
||||||
controls += basename + camname + "ELEMENT_SET;"
|
|
||||||
controls += basename + camname + "STEP_SIZE;"
|
|
||||||
controls += basename + camname + "SLICES;"
|
|
||||||
controls += basename + camname + "NumExposures;"
|
|
||||||
controls += basename + camname + "FRAMES;"
|
|
||||||
controls += basename + camname + "STEP_TIME;"
|
|
||||||
|
|
||||||
string monitors = ""
|
|
||||||
monitors += basename + camname + "PASS_ENERGY_RBV;"
|
|
||||||
monitors += basename + camname + "LOW_ENERGY_RBV;"
|
|
||||||
monitors += basename + camname + "CENTRE_ENERGY_RBV;"
|
|
||||||
monitors += basename + camname + "HIGH_ENERGY_RBV;"
|
|
||||||
monitors += basename + camname + "ENERGY_WIDTH_RBV;"
|
|
||||||
monitors += basename + camname + "LENS_MODE_RBV;"
|
|
||||||
monitors += basename + camname + "ACQ_MODE_RBV;"
|
|
||||||
monitors += basename + camname + "ENERGY_MODE_RBV;"
|
|
||||||
monitors += basename + camname + "DETECTOR_MODE_RBV;"
|
|
||||||
monitors += basename + camname + "ELEMENT_SET_RBV;"
|
|
||||||
monitors += basename + camname + "STEP_SIZE_RBV;"
|
|
||||||
monitors += basename + camname + "SLICES_RBV;"
|
|
||||||
monitors += basename + camname + "NumExposures_RBV;"
|
|
||||||
monitors += basename + camname + "CURRENT_CHANNEL_RBV;"
|
|
||||||
monitors += basename + camname + "TOTAL_POINTS_RBV;"
|
|
||||||
monitors += basename + camname + "PROGRESS_RBV;"
|
|
||||||
//monitors += basename + camname + "INT_SPECTRUM;"
|
|
||||||
monitors += basename + camname + "BinX_RBV;"
|
|
||||||
monitors += basename + camname + "BinY_RBV;"
|
|
||||||
monitors += basename + camname + "MinX_RBV;"
|
|
||||||
monitors += basename + camname + "MinY_RBV;"
|
|
||||||
monitors += basename + camname + "SizeX_RBV;"
|
|
||||||
monitors += basename + camname + "SizeY_RBV;"
|
|
||||||
monitors += basename + camname + "ReverseX_RBV;"
|
|
||||||
monitors += basename + camname + "ReverseY_RBV;"
|
|
||||||
|
|
||||||
// variable name list corresponding to channel lists
|
|
||||||
string variables = ""
|
|
||||||
variables = AddListItem("ArrayData", variables, ";", ItemsInList(variables))
|
|
||||||
|
|
||||||
// connect EPICS channels
|
|
||||||
epics_connect(controls, monitors)
|
|
||||||
|
|
||||||
|
|
||||||
print "...done"
|
|
||||||
setdatafolder savedf
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
function pearl_set_attr_ch(attr_wave_name, attr_channel_name)
|
|
||||||
string attr_wave_name
|
|
||||||
string attr_channel_name
|
|
||||||
|
|
||||||
variable result
|
|
||||||
variable chid
|
|
||||||
pvOpen chid, attr_channel_name
|
|
||||||
|
|
||||||
switch(wavetype($attr_wave_name, 1))
|
|
||||||
case 1: // numeric
|
|
||||||
wave w_attr = $attr_wave_name
|
|
||||||
pvPutNumber /Q chid, w_attr[0]
|
|
||||||
result = 0
|
|
||||||
break
|
|
||||||
case 2: // text
|
|
||||||
wave /t wt_attr = $attr_wave_name
|
|
||||||
pvPutString /Q chid, wt_attr[0]
|
|
||||||
result = 0
|
|
||||||
break
|
|
||||||
default: // error
|
|
||||||
result = -1
|
|
||||||
endswitch
|
|
||||||
|
|
||||||
pvClose chid
|
|
||||||
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
|
|
||||||
function pearl_set_sscan(scan_rec_num)
|
|
||||||
variable scan_rec_num
|
|
||||||
|
|
||||||
string chan_base = "X03DA-PC:scan" + num2str(scan_rec_num) + ":"
|
|
||||||
string wave_base = "Scan" + num2str(scan_rec_num)
|
|
||||||
|
|
||||||
variable nfields
|
|
||||||
variable ifield
|
|
||||||
string wave_name
|
|
||||||
string chan_name
|
|
||||||
wave /z w_active = $(wave_base + "Active")
|
|
||||||
if (WaveExists(w_active))
|
|
||||||
if (w_active[0] != 0)
|
|
||||||
nfields = 4
|
|
||||||
for (ifield = 1; ifield <= nfields; ifield += 1)
|
|
||||||
sscanf wave_name, "%sPositioner%u", ifield
|
|
||||||
sscanf chan_name, "%sP%uPV", chan_base, ifield
|
|
||||||
pearl_set_attr_ch(wave_name, chan_name)
|
|
||||||
sscanf wave_name, "%sReadback%u", ifield
|
|
||||||
sscanf chan_name, "%sR%uPV", chan_base, ifield
|
|
||||||
pearl_set_attr_ch(wave_name, chan_name)
|
|
||||||
sscanf wave_name, "%sTrigger%u", ifield
|
|
||||||
sscanf chan_name, "%sT%uPV", chan_base, ifield
|
|
||||||
pearl_set_attr_ch(wave_name, chan_name)
|
|
||||||
endfor
|
|
||||||
nfields = 20
|
|
||||||
for (ifield = 1; ifield <= nfields; ifield += 1)
|
|
||||||
sscanf wave_name, "%sDetector%u", ifield
|
|
||||||
sscanf chan_name, "%sD%uPV", chan_base, ifield
|
|
||||||
pearl_set_attr_ch(wave_name, chan_name)
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
function pearl_repeat_scan()
|
|
||||||
// set up a scan according to the attributes of the given dataset
|
|
||||||
dfref savedf = GetDataFolderDFR()
|
|
||||||
|
|
||||||
setdatafolder :attr
|
|
||||||
|
|
||||||
|
|
||||||
setdatafolder savedf
|
|
||||||
end
|
|
@ -1,28 +0,0 @@
|
|||||||
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
|
|
||||||
|
|
||||||
function export_otf()
|
|
||||||
// export OTF folders to text files
|
|
||||||
|
|
||||||
string objname
|
|
||||||
variable index= 0
|
|
||||||
|
|
||||||
setdatafolder root:
|
|
||||||
dfref parentfolder = getdatafolderdfr()
|
|
||||||
string filename
|
|
||||||
|
|
||||||
do
|
|
||||||
objname = GetindexedObjNameDFR(parentfolder, 4, index)
|
|
||||||
if (strlen(objname) > 0)
|
|
||||||
if (cmpstr(StringFromList(0, objname, "_"), "otf") == 0)
|
|
||||||
setdatafolder parentfolder
|
|
||||||
setdatafolder $objname
|
|
||||||
wave ringcurrent,photonenergy,current_ch1,current_ch2
|
|
||||||
filename = objname + ".txt"
|
|
||||||
Save/G/M="\r\n"/W/P=pearl_explorer_filepath photonenergy,current_ch1,current_ch2,ringcurrent as filename
|
|
||||||
endif
|
|
||||||
index += 1
|
|
||||||
else
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
while(1)
|
|
||||||
end
|
|
File diff suppressed because it is too large
Load Diff
@ -55,10 +55,8 @@ menu "PEARL"
|
|||||||
end
|
end
|
||||||
|
|
||||||
submenu "Services"
|
submenu "Services"
|
||||||
PearlMenuEnableFunc("pearl_elog") + "ELOG Experiments", /Q, pearl_elog("Experiments")
|
PearlMenuEnableFunc("pearl_elog") + "Open ELOG Panel", /Q, pearl_elog("")
|
||||||
help = {"Create entries in ELOG experiments logbook"}
|
help = {"Open an ELOG panel to send entries to an ELOG logbook"}
|
||||||
PearlMenuEnableFunc("pearl_elog") + "ELOG Calculations", /Q, pearl_elog("Calculations")
|
|
||||||
help = {"Create entries in ELOG calculations logbook"}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
submenu "Sample Preparation"
|
submenu "Sample Preparation"
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
|
|
||||||
#pragma IgorVersion = 6.1
|
|
||||||
#pragma ModuleName = PearlPreparation
|
|
||||||
#pragma version = 1.04
|
|
||||||
#include "pearl-area-display" // 2D and 3D data visualization
|
|
||||||
#include "pearl-area-profiles" // data processing for multi-dimensional datasets
|
|
||||||
#include "pearl-elog"
|
|
||||||
#if exists("pvOpen")
|
|
||||||
#include "pearl-epics" // EPICS access under Igor
|
|
||||||
#include "pearl-anneal" // automated sample annealing
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// author: matthias.muntwiler@psi.ch
|
|
||||||
// Copyright (c) 2015 Paul Scherrer Institut
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
/// @file
|
|
||||||
/// @brief PEARL sample preparation package
|
|
||||||
///
|
|
||||||
/// this procedure defines the PEARL sample preparation package
|
|
||||||
/// the main purpose of this file is to load the necessary dependent procedures
|
|
||||||
/// (see the include statements at the top)
|
|
||||||
///
|
|
||||||
/// @pre
|
|
||||||
/// * on-line process control functionality requires the EPICS XOP to be loaded
|
|
||||||
///
|
|
||||||
/// @author matthias muntwiler, matthias.muntwiler@psi.ch
|
|
||||||
///
|
|
||||||
/// @copyright 2015 Paul Scherrer Institut @n
|
|
||||||
/// Licensed under the Apache License, Version 2.0 (the "License"); @n
|
|
||||||
/// you may not use this file except in compliance with the License. @n
|
|
||||||
/// You may obtain a copy of the License at
|
|
||||||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
/// @namespace PearlPreparation
|
|
||||||
/// @brief PEARL sample preparation package
|
|
||||||
///
|
|
||||||
/// PearlPreparation is declared in @ref pearl-preparation.ipf.
|
|
||||||
///
|
|
||||||
|
|
||||||
/// @defgroup PreparationPackage Sample preparation package
|
|
||||||
/// @brief PEARL sample preparation package
|
|
||||||
///
|
|
||||||
/// The purpose of a package is to load a bunch of dependent procedure files.
|
|
||||||
/// The sample preparation package loads the following files.
|
|
||||||
///
|
|
||||||
/// * pearl-area-import.ipf
|
|
||||||
/// * pearl-area-display.ipf
|
|
||||||
/// * pearl-area-profiles.ipf
|
|
||||||
/// * pearl-elog.ipf
|
|
||||||
/// * pearl-anneal.ipf
|
|
||||||
///
|
|
||||||
/// The following files are loaded if the EPICS.XOP is present:
|
|
||||||
///
|
|
||||||
/// * pearl-epics.ipf
|
|
||||||
///
|
|
||||||
|
|
||||||
/// initializes package data once when the procedure is first loaded
|
|
||||||
static function AfterCompiledHook()
|
|
||||||
|
|
||||||
dfref savefolder = GetDataFolderDFR()
|
|
||||||
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
|
|
||||||
function UnloadPearlPreparationPackage()
|
|
||||||
execute /p/q/z "DELETEINCLUDE \"pearl-preparation\""
|
|
||||||
execute /p/q/z "COMPILEPROCEDURES "
|
|
||||||
end
|
|
@ -637,6 +637,7 @@ function /s psh5_load_scan_preview(fileID, scanpath, [set_scale])
|
|||||||
|
|
||||||
string datasets = psh5_list_scan_datasets(fileID, scanpath)
|
string datasets = psh5_list_scan_datasets(fileID, scanpath)
|
||||||
string datasetname = ""
|
string datasetname = ""
|
||||||
|
variable index
|
||||||
// todo: this should be generalized
|
// todo: this should be generalized
|
||||||
if (strsearch(datasets, "ScientaImage", 0) >= 0)
|
if (strsearch(datasets, "ScientaImage", 0) >= 0)
|
||||||
datasetname = "ScientaImage"
|
datasetname = "ScientaImage"
|
||||||
@ -644,17 +645,24 @@ function /s psh5_load_scan_preview(fileID, scanpath, [set_scale])
|
|||||||
datasetname = "ScientaSpectrum"
|
datasetname = "ScientaSpectrum"
|
||||||
elseif (strsearch(datasets, "ScientaEnergyDistribution", 0) >= 0)
|
elseif (strsearch(datasets, "ScientaEnergyDistribution", 0) >= 0)
|
||||||
datasetname = "ScientaEnergyDistribution"
|
datasetname = "ScientaEnergyDistribution"
|
||||||
|
elseif (strsearch(datasets, "ImageEnergyDistribution", 0) >= 0)
|
||||||
|
datasetname = "ImageEnergyDistribution"
|
||||||
elseif (strsearch(datasets, "Counts", 0) >= 0)
|
elseif (strsearch(datasets, "Counts", 0) >= 0)
|
||||||
datasetname = "Counts"
|
datasetname = "Counts"
|
||||||
elseif (strsearch(datasets, "SampleCurrent", 0) >= 0)
|
elseif (strsearch(datasets, "SampleCurrent", 0) >= 0)
|
||||||
datasetname = "SampleCurrent"
|
datasetname = "SampleCurrent"
|
||||||
else
|
else
|
||||||
datasetname = StringFromList(0, datasets)
|
datasetname = StringFromList(0, datasets)
|
||||||
|
index = ItemsInList(datasetname, "/") - 1
|
||||||
|
datasetname = StringFromList(index, datasetname, "/")
|
||||||
endif
|
endif
|
||||||
|
if (strlen(datasetname) == 0)
|
||||||
|
return ""
|
||||||
|
endif
|
||||||
|
|
||||||
string datasetpath
|
string datasetpath
|
||||||
datasetpath = scanpath + "/" + datasetname
|
datasetpath = scanpath + "/" + datasetname
|
||||||
datasetpath = ReplaceString("//", datasetpath, "/")
|
datasetpath = ReplaceString("//", datasetpath, "/")
|
||||||
|
|
||||||
STRUCT HDF5DataInfo di // Defined in HDF5 Browser.ipf.
|
STRUCT HDF5DataInfo di // Defined in HDF5 Browser.ipf.
|
||||||
InitHDF5DataInfo(di)
|
InitHDF5DataInfo(di)
|
||||||
variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
|
variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
|
||||||
@ -667,6 +675,10 @@ function /s psh5_load_scan_preview(fileID, scanpath, [set_scale])
|
|||||||
if (di.ndims < 3)
|
if (di.ndims < 3)
|
||||||
HDF5LoadData /O /Q /Z fileID, datasetpath
|
HDF5LoadData /O /Q /Z fileID, datasetpath
|
||||||
dataname = StringFromList(0, S_waveNames)
|
dataname = StringFromList(0, S_waveNames)
|
||||||
|
wave /z data = $dataname
|
||||||
|
if (waveexists(data))
|
||||||
|
ps_set_dimlabels(data)
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
variable dim2start = 0
|
variable dim2start = 0
|
||||||
variable dim2count = 1
|
variable dim2count = 1
|
||||||
@ -1000,10 +1012,12 @@ function ps_set_dimlabels(data)
|
|||||||
setdimlabel 0, -1, $kEnergyDimLabel, data
|
setdimlabel 0, -1, $kEnergyDimLabel, data
|
||||||
break
|
break
|
||||||
case "ImageAngleDistribution":
|
case "ImageAngleDistribution":
|
||||||
|
case "ScientaAngleDistribution":
|
||||||
setdimlabel 0, -1, $kScanDimLabel, data
|
setdimlabel 0, -1, $kScanDimLabel, data
|
||||||
setdimlabel 1, -1, $kAngleDimLabel, data
|
setdimlabel 1, -1, $kAngleDimLabel, data
|
||||||
break
|
break
|
||||||
case "ImageEnergyDistribution":
|
case "ImageEnergyDistribution":
|
||||||
|
case "ScientaEnergyDistribution":
|
||||||
setdimlabel 0, -1, $kScanDimLabel, data
|
setdimlabel 0, -1, $kScanDimLabel, data
|
||||||
setdimlabel 1, -1, $kEnergyDimLabel, data
|
setdimlabel 1, -1, $kEnergyDimLabel, data
|
||||||
break
|
break
|
||||||
|
Binary file not shown.
Reference in New Issue
Block a user