Compare commits
75 Commits
Author | SHA1 | Date | |
---|---|---|---|
66f3b48e2a | |||
33fe4ee5fb | |||
0e2d880249 | |||
be8689853b | |||
a81515cb95 | |||
a09d6878f2 | |||
5ec1228ea6 | |||
8ecac5fd57 | |||
35760525bb | |||
c42bbd16f3 | |||
4661dee936 | |||
7b6180a688 | |||
602a5a4e6c | |||
f03b918840 | |||
07a3de1ed4 | |||
58461bf013 | |||
c930298972 | |||
9af6b1fb8e | |||
815ca7162f | |||
5ee3b17953 | |||
f2a598f512 | |||
48d531f90f | |||
cf0ab74ba7 | |||
eac9a8adc9 | |||
a200c184cb | |||
48a2ff632e | |||
29428ec1bf | |||
68ce56c7db | |||
5779a24b3e | |||
651e24721f | |||
df88345c55 | |||
1a2853e548 | |||
f19a94651b | |||
867246874b | |||
a91002f807 | |||
884e0270a1 | |||
40fcc228fa | |||
6d0666f285 | |||
5755331273 | |||
d81a10e450 | |||
f4ac06cb20 | |||
74cfa3ecbf | |||
29064c44be | |||
10271dab9a | |||
41b4b61f1b | |||
cce7a6bcd0 | |||
a4eb96a4a9 | |||
572e0f96a5 | |||
4ebb5bb377 | |||
32ed8d4df2 | |||
83c4bff123 | |||
90db9144fe | |||
e705ba5d9a | |||
38ffcb3104 | |||
54fee067df | |||
2035ae5ede | |||
520ff84941 | |||
de04b3f036 | |||
785b32e945 | |||
5232349ad1 | |||
c3e3af0311 | |||
e9247ed3d5 | |||
fe7a1b7920 | |||
1fb1753d82 | |||
ed0bfd516b | |||
513144997e | |||
55b681acc1 | |||
c71fc92cf0 | |||
af5a6e37d1 | |||
ca5bbbe1e0 | |||
921b8bbab4 | |||
503336e685 | |||
2650c7d12b | |||
b3d9345def | |||
b29d85dd4c |
@ -1,7 +1,11 @@
|
||||
# - musrfit
|
||||
cmake_minimum_required(VERSION 3.9)
|
||||
|
||||
project(musrfit VERSION 1.5.1 LANGUAGES C CXX)
|
||||
if (CMAKE_VERSION GREATER_EQUAL 3.12)
|
||||
cmake_policy(SET CMP0075 NEW)
|
||||
endif (CMAKE_VERSION GREATER_EQUAL 3.12)
|
||||
|
||||
project(musrfit VERSION 1.6.4 LANGUAGES C CXX)
|
||||
|
||||
#--- musrfit specific options -------------------------------------------------
|
||||
option(nexus "build optional NeXus support. Needed for ISIS" OFF)
|
||||
@ -178,8 +182,7 @@ endif (qt_based_tools)
|
||||
#--- if NeXus check also for HDF4, HDF5, and MXML -----------------------------
|
||||
if (nexus)
|
||||
find_package(HDF5 COMPONENTS CXX REQUIRED )
|
||||
#//as35 - STILL SUPPORTED BY NEXUS ?? -> find_package(HDF4 REQUIRED)
|
||||
#//as35 - STILL SUPPORTED BY NEXUS ?? -> find_package(MXML REQUIRED)
|
||||
find_package(HDF4 REQUIRED)
|
||||
find_package(NeXus REQUIRED)
|
||||
add_definitions(-DPNEXUS_ENABLED)
|
||||
endif (nexus)
|
||||
@ -226,7 +229,7 @@ endif (OpenMP_FOUND)
|
||||
|
||||
if (nexus)
|
||||
message("")
|
||||
#//as35 message(" HDF4 found in ${HDF4_INCLUDE_DIRS}")
|
||||
message(" HDF4 found in ${HDF4_INCLUDE_DIRS}")
|
||||
message(" HDF5 found in ${HDF5_INCLUDE_DIRS}")
|
||||
message(" NeXus found in ${NEXUS_INCLUDE_DIR}")
|
||||
endif (nexus)
|
||||
|
37
ChangeLog
@ -12,6 +12,43 @@ or
|
||||
|
||||
https://bitbucket.org/muonspin/musrfit/commits/all
|
||||
|
||||
Release of V1.6.4, 2020/08/29
|
||||
=============================
|
||||
|
||||
Allow to view time spectra and Fourier theory only calculated at the data points
|
||||
via the option '-1' or '--one_to_one'.
|
||||
|
||||
Release of V1.6.3, 2020/07/27
|
||||
=============================
|
||||
|
||||
A single asymmetry plot allows to toggle the color of the theory function line
|
||||
by the key 't'.
|
||||
|
||||
Release of V1.6.2, 2020/06/17
|
||||
=============================
|
||||
|
||||
Functions not only can use parameters and maps but now also meta data from the
|
||||
data files like, field (B or b), energy (En or en), or temperature (T<x> pr t<x>
|
||||
where <x> is a number starting from 0, e.g. t0).
|
||||
|
||||
Release of V1.6.1, 2020/05/25
|
||||
=============================
|
||||
|
||||
For asymmetry fits: allow alpha, beta in the RUN block to be functions.
|
||||
|
||||
Release of V1.6.0, 2020/05/16
|
||||
=============================
|
||||
|
||||
Allow to transform parameter vectors of run collections for mupp.
|
||||
This allows for instance to calculate the superfluid density directly from the
|
||||
depolarization rate and plot it.
|
||||
|
||||
Release of V1.5.2, 2020/02/03
|
||||
=============================
|
||||
|
||||
Implemented a SECTOR command. It allows to get chisq/maxLH information from
|
||||
different time sector slots.
|
||||
|
||||
Release of V1.5.0, 2019/05/15
|
||||
=============================
|
||||
|
||||
|
97
cmake/FindHDF4.cmake
Normal file
@ -0,0 +1,97 @@
|
||||
## Process this file with cmake
|
||||
#=============================================================================
|
||||
# NeXus - Neutron & X-ray Common Data Format
|
||||
#
|
||||
# CMakeLists for building the NeXus library and applications.
|
||||
#
|
||||
# Copyright (C) 2011 Stephen Rankin
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as published by the
|
||||
# Free Software Foundation; either version 2 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
# for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this library; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# For further information, see <http://www.nexusformat.org>
|
||||
#
|
||||
#
|
||||
#=============================================================================
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# find the runtime binaries of the HDF4 library
|
||||
#------------------------------------------------------------------------------
|
||||
find_library(HDF4_DF_LIBRARY NAMES df hdf
|
||||
HINTS ENV HDF4_ROOT
|
||||
PATH_SUFFIXES hdf)
|
||||
|
||||
|
||||
if(HDF4_DF_LIBRARY MATCHES HDF4_DF_LIBRARY-NOTFOUND)
|
||||
message(FATAL_ERROR "Could not find HDF4 DF library!")
|
||||
else()
|
||||
get_filename_component(HDF4_LIBRARY_DIRS ${HDF4_DF_LIBRARY} PATH)
|
||||
message(STATUS "Found HDF4 DF library: ${HDF4_DF_LIBRARY}")
|
||||
message(STATUS "HDF4 libary path: ${HDF4_LIBRARY_DIRS}")
|
||||
endif()
|
||||
|
||||
find_library(HDF4_MFHDF_LIBRARY NAMES mfhdf
|
||||
HINTS ENV HDF4_ROOT
|
||||
PATH_SUFFIXES hdf)
|
||||
|
||||
if(HDF4_MFHDF_LIBRARY MATCHES HDF4_MFHDF_LIBRARY-NOTFOUND)
|
||||
message(FATAL_ERROR "Could not find HDF5 MFHDF library!")
|
||||
else()
|
||||
message(STATUS "Found HDF4 MFHDF library: ${HDF4_MFHDF_LIBRARY}")
|
||||
endif()
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# find the HDF4 header file
|
||||
#------------------------------------------------------------------------------
|
||||
find_path(HDF4_INCLUDE_DIRS mfhdf.h
|
||||
HINTS ENV HDF4_ROOT
|
||||
PATH_SUFFIXES hdf)
|
||||
|
||||
if(HDF4_INCLUDE_DIRS MATCHES HDF4_INCLUDE_DIRS-NOTFOUND)
|
||||
message(FATAL_ERROR "Could not find HDF4 header files")
|
||||
else()
|
||||
message(STATUS "Found HDF4 header files in: ${HDF4_INCLUDE_DIRS}")
|
||||
endif()
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# search for additional packages required to link against HDF4
|
||||
#------------------------------------------------------------------------------
|
||||
find_package(JPEG REQUIRED)
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# add libraries to the link list for NAPI
|
||||
#------------------------------------------------------------------------------
|
||||
get_filename_component(LIB_EXT ${HDF4_DF_LIBRARY} EXT)
|
||||
if(LIB_EXT MATCHES .a)
|
||||
message(STATUS "HDF4 DF library is static")
|
||||
list(APPEND NAPI_LINK_LIBS "-Wl,-whole-archive" ${HDF4_DF_LIBRARY} "-Wl,-no-whole-archive")
|
||||
else()
|
||||
list(APPEND NAPI_LINK_LIBS ${HDF4_DF_LIBRARY})
|
||||
endif()
|
||||
|
||||
|
||||
get_filename_component(LIB_EXT ${HDF4_MFHDF_LIBRARY} EXT)
|
||||
if(LIB_EXT MATCHES .a)
|
||||
message(STATUS "HDF4 MFHDF library is static")
|
||||
list(APPEND NAPI_LINK_LIBS "-Wl,-whole-archive" ${HDF4_MFHDF_LIBRARY} "-Wl,-no-whole-archive")
|
||||
else()
|
||||
list(APPEND NAPI_LINK_LIBS ${HDF4_MFHDF_LIBRARY})
|
||||
endif()
|
||||
|
||||
list(APPEND NAPI_LINK_LIBS jpeg)
|
||||
|
||||
include_directories ( SYSTEM ${HDF4_INCLUDE_DIRS} )
|
||||
link_directories(${HDF4_LIBRARY_DIRS})
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2016 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2016 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Sphinx build info version 1
|
||||
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
|
||||
config: b0f54e143f8f1d163af95476812112f7
|
||||
config: 0b93e4185566cd2a81b86f199313e66e
|
||||
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
||||
|
@ -1,60 +0,0 @@
|
||||
#---------------------------------------------------
|
||||
# get compilation flags from root-config
|
||||
|
||||
ROOTCFLAGS = $(shell $(ROOTSYS)/bin/root-config --cflags)
|
||||
|
||||
#---------------------------------------------------
|
||||
|
||||
OS = LINUX
|
||||
CXX = g++
|
||||
CXXFLAGS = -O3 -Wall -Wno-trigraphs -fPIC
|
||||
LOCALINCLUDE = .
|
||||
ROOTINCLUDE = $(ROOTSYS)/include
|
||||
INCLUDES = -I$(LOCALINCLUDE) -I$(ROOTINCLUDE)
|
||||
LD = g++
|
||||
LDFLAGS =
|
||||
SOFLAGS = -O -shared
|
||||
|
||||
# the output from the root-config script:
|
||||
CXXFLAGS += $(ROOTCFLAGS)
|
||||
LDFLAGS +=
|
||||
|
||||
# some definitions: headers (used to generate *Dict* stuff), sources, objects,...
|
||||
OBJS =
|
||||
OBJS += TMyFunction.o TMyLibraryDict.o
|
||||
|
||||
SHLIB = libTMyLibrary.so
|
||||
|
||||
# make the shared lib:
|
||||
#
|
||||
all: $(SHLIB)
|
||||
|
||||
$(SHLIB): $(OBJS)
|
||||
@echo "---> Building shared library $(SHLIB) ..."
|
||||
/bin/rm -f $(SHLIB)
|
||||
$(LD) $(OBJS) $(SOFLAGS) -o $(SHLIB)
|
||||
@echo "done"
|
||||
|
||||
# clean up: remove all object file (and core files)
|
||||
# semicolon needed to tell make there is no source
|
||||
# for this target!
|
||||
#
|
||||
clean:; @rm -f $(OBJS) *Dict* core*
|
||||
@echo "---> removing $(OBJS)"
|
||||
|
||||
#
|
||||
$(OBJS): %.o: %.cpp
|
||||
$(CXX) $(INCLUDES) $(CXXFLAGS) -c $<
|
||||
|
||||
# Generate the ROOT CINT dictionary
|
||||
|
||||
TMyLibraryDict.cpp: TMyFunction.h TMyLibraryLinkDef.h
|
||||
@echo "Generating dictionary $@..."
|
||||
rootcint -f $@ -c -p -I$(ROOTINCLUDE) $^
|
||||
|
||||
install: all
|
||||
@echo "Installing shared lib: libTApproximation.so"
|
||||
ifeq ($(OS),LINUX)
|
||||
cp -pv $(SHLIB) $(ROOTSYS)/lib
|
||||
cp -pv $(LOCALINCLUDE)/*.h $(ROOTSYS)/include
|
||||
endif
|
950
doc/html/_images/mupp-add-var.svg
Normal file
@ -0,0 +1,950 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="mupp-add-var.svg"
|
||||
viewBox="0 0 734 524"
|
||||
height="524"
|
||||
width="734"
|
||||
id="svg1566"
|
||||
version="1.1">
|
||||
<metadata
|
||||
id="metadata1572">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1570" />
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="g1574"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-y="35"
|
||||
inkscape:window-x="349"
|
||||
inkscape:cy="262"
|
||||
inkscape:cx="367"
|
||||
inkscape:zoom="1"
|
||||
showgrid="false"
|
||||
id="namedview1568"
|
||||
inkscape:window-height="961"
|
||||
inkscape:window-width="1831"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<g
|
||||
id="g1574"
|
||||
inkscape:label="Image"
|
||||
inkscape:groupmode="layer">
|
||||
<image
|
||||
id="image1576"
|
||||
xlink:href="data:image/png;base64,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
|
||||
wbtlixb8uNzWq5DEx8eHwIO/kzdvHrJnz860KZPZtmUzu3du57uF8yldqpS9bbWqVVm/dg1du3Rm
|
||||
2Q9LmT93TrI12WTOnJl8+fKyYuVPhISEYDKZuHL1qsOB1XmoSelSpfh+yWL27NrBwvnz6PBRe375
|
||||
6Ud7/dIli+jUsQOzZ83g9317WLHsB/z8/GjY4E3WrV3N7p3bGTJ4EKr66KUYNnQIG9evZc+unaz6
|
||||
eSVNmzS21xUtWgSLxcLyFT8SFRVFbGwsJ0+d4tdNm+1tBg8cyKbNm/j6m4lcvnKFuLg4rl27xoyZ
|
||||
s/h10yZ7u9SYTCaWLV/B0aPH7L1Jyfnmzk3lSpWY+u233H/wgCtXr/LdosW0eOst56bPRZ/evZg4
|
||||
4Wu+HPs5ixYu4MflP9Dq7ZYObeq88QYrlv3Anl07WL7se2rXrmWvW/b9Eho2bACA0Whg/97djP18
|
||||
tL1+8qRv+Kh9OwBq1qhO4B+BaJpmr3+n1dv8tHIFe3bt5NcN6+jbpzcGg8FeD7ZwMW/ubPbs2sGy
|
||||
H5ZSrmxZe135//2P75csZuf2bezYvo2F8+fZX+vUtrd0ySL69e3DzOnfsmTRQpYs/s5hfTqdji6d
|
||||
O7Fu7Wp2bt/G7FkzKFyoEACZvLwIPPg7Pj4+ALz2WjkOBx7krebNAFBVlZ3bt9l/L1Lb/rChQwi5
|
||||
G8LI0aOZv2AhH/fqzdlz5+z1Jf392bJ1KxcvXsJkMnPnzh3Wrd/A7eBgIOVQE4PBwKf9+7Fty2Y2
|
||||
/7qBjh0+YuWKZdSrZwtNSb+X7737Dls2bWTPrh30+qQn3t7eTJzwNfv27OKnlSsoWdLfvs70vCbJ
|
||||
fT72SwID/yAsLIygs2f5+edfKFumjHMzu9q1aqJTVWbNnkNMTAx79+1jx86dtEz2Ho+KiuLcufNU
|
||||
r1Y12ZKOqlWtyoZ1a+jZozsL5s1l5YplDBo4AKPRaG9TpHBh5syayc7t21i3ZhWdO3VEp9MB0K9v
|
||||
H0YMG2pvO2fWTDZtfPShpvWHHzD926mA7cP2/fv3uXXrlr0+PY/D2br1G9i7bx+RkanfZvnAwYNs
|
||||
3bqN27dvO1elauvWbSxf8SOXr1zh/v37LPxuEdHR0ZT0L+HcFEj/8eVQYCA1a1Z3KDt4KJAa1auh
|
||||
KLYPgU/yLM8PgNViwWQy2Ser1epQ/7T7IYT4b3lpgveWrVvJmzcvJYoXt5c1btSQ4ydOcPPmLVRV
|
||||
Zc3atTRt/hZ16r3Jnj17+WbCeFxdXe3tc+f2wWw288GHbWjfoaO9PElERAQX/vyTT/v3pV7dOuTL
|
||||
l9e5iYNMmTIxdcokVq9ZS83adfjiq3G0bJHyoN20aROmTv2WWm/UJejsWSZ98zUBARVo3bqtrWe9
|
||||
Vk1q1nj0R+TMmTO0btuOmrXfYPyEbxg0cID9cZ85E4TVqjF61AiqVKlMtmzZ7MuBbahMvnx50+yx
|
||||
Sh6ynkXhIoWxWCxcuPCoNzzo7FmyZPEmR47syVo+Urt2LbZu/jXNaerkSc6LOKhWrSorVq6kfYeO
|
||||
fNyrNx07fESVKpUBKFe2LGNGj2La9OnUeqMuM2bM4ovPx1C6tC1cHgr8g0oBAQCULVOWkJBQAgIC
|
||||
UBQFnU7H/157jUOBfwBQrFgxLl++YtvoQ2H379Ov/6fUqFWb7j0/oVrV13n3nVYObVq2bMHkyVOp
|
||||
WbsOP//8C1OnTCZrliwAjB41gp9+/oVab9Slbr03mfrtt/bXILXtAdSqWZNhI0bStn0Hpk2bztQp
|
||||
k+zr+6h9Oxo2aECv3n2o36AhR48eY8aMb/H09CQyKopz58/be+wqBgRw/cYNKla0Pf4SJYqjqipn
|
||||
goKA1LefM2dOLl6+jGa17WN4eDhnztjaA/xx+AjvvfsOb7dsQZEiRdL85ihJxw4f8dpr5fiwdRua
|
||||
NHsLLy8vXnnlFYc2OXPmwMfHh7davk2nLt149513+HbaFJatWEHtOvXYs2cvw4YMsbdPz2vyOGXL
|
||||
luX8+bSHARQuXJjzFy44DJ0KOnuOwkUKJ2sFFy9dpFixog5lznx8fIiJiaFj5y582KYd+fPlo1vX
|
||||
zoDtg9LMGd/yx+HD1G/QkN59+tGkcSPatmkNQGDgH/bX0sXFhWLFimKxJFLw1VcBCAgIIDDpvVu0
|
||||
KJevOL6W6X0cGalAgVfw9vbmfBrDMNJ7fLl48SLFihazz9vKLpE5c2ZyP/zg+STP+vzUrFWTXzeu
|
||||
Z9n3S+jerStubm4O9U+7H0KI/5aXJnhHR0ezc9cumjzs/VUUhcaNGrFuna0HKCQkhB07dxEXF4fZ
|
||||
bOa7RYvR6/X4+T36StNkMrF4yVL7fGq6devBwYOHaP3hB/y4fBm/blyf5teGNapX415YGL+sWoXV
|
||||
auXSpUv8smq1czPWrFnL2XPnSEhIYMPGjeTJk4fJU6YRGRXFzZu3OHjwECVKPOoBWr1mLQ8ehGO1
|
||||
Wjl0KJD9vx+gfPnyANy9e5c27doTHx9P/7592PTwD0BABdsf6CxZbCdWhYSE2tf3PHl4eBATE+MQ
|
||||
4KOibGNlPTw87GXJ7du3n/c/bJPmNHzkKOdFHBw/foKTJ08BEBp6j42/brJ/C9CkSWN+++03fv/9
|
||||
ABaLhX3797Nz5y6aN20K2MJLhYfPTUBABTZt3kxUZCSFCxWiZEl/Ei0Wzj3s0fXK5EVMTAzJbd++
|
||||
gxs3bqJpGteuXePHlT/Zn+sk69dvIOjsWaxWK6tWr+HmrZu88UZtAEwmMwUKvEKuXLmwWCycOHHS
|
||||
/tyltj2A9Rs2cP/+fQAOHznC5ctX7Otr2qQxCxct4urVa5hMZuYvWEhiYiLVq1cDbI+3YrLHO3v2
|
||||
HCqUL4+qqgRUqMCRI0ftQSO17S/87jv69enNgAH9qVgxgNfKlXOonzxlKvMXLKR2rVrMmTWD7du2
|
||||
MGjggBThI0mjhg357rtFhISGYjabmTlrFiaTyaFNYmIi306fQWxsHBcuXOD06TOcOnmKI0eOYjKZ
|
||||
WL1mDX5+Be09xel5TdLS4q3mBFQoz+Sptp7i1Hh6eBAd7fi8REdF4en0/o6JiSFTpswOZc7MZrP9
|
||||
GzPbz8to0rgJANWqVSMuLp4FC7/DZDJz5epVFi1ZSvNmtvfu0WNHyZ49O/nz5+e1cuU4d+48v/9+
|
||||
gIoVA9Dr9ZQrW8Y+TChTpkwpXsv0Po6MkilTJsZ/9SXLlq9I84NPeo8v0TExZM6cyT4PttcDIJNT
|
||||
eVqe5fnZsWMnAwcNpmu37sycNYc3atdm9KiRDm2edj+EEP8tj++uesGsW7+BcV99yeQpUyhZsiRZ
|
||||
s2Zh+44dwKOTvgICAnB3d8NiseLh4UEWb1tPIcD9+/efeAJgZFQUc+fNZ+68+RiNBurXq8fwYUO5
|
||||
ffs2e/buc2ibI0cOgoPvOJTdueM4DxAa+igEx8fFYzKZiYiISFYWh7u7u33+g/ffo2GDBmTNmgWL
|
||||
xUrmzJkdvkK+du0aX437GrD1mnXt2oVJEyfQtHkL+4mTOXPmSPfXwU8jJiYGDw8PFEV5FCC9bCeb
|
||||
Ov/hT2IymQgLC3MuTrd79+6lmC9Xzjb8widXLo6fOOFQf/PWLfwffpA5euwYmTNnpuCrrxIQUIGJ
|
||||
kybj7e1NxYoBuLm5cfjwEftXxVGRUSk+PFSpUpm2bVqTxzcPigKurq72YRVJbjk9z8G3g8mZMycA
|
||||
/QcMpFPHDiz7fgmRkVGsXbeORYuXAKlvD+Ce03N1L+yefX05c+bk5s2b9jqr1Urw7WB8cuUCbMF7
|
||||
7Oej8fT05NUCBdi5azedOnagWNGiVAwIYMfOnfZlU9v+r5s2s//3AzRp3IgaNaozZvRIgoLOMuiz
|
||||
IWiahsViYdXqNaxavQZFUShbpgxffjEWk8nE5Ckpw2yOHNkJTvY7YTKZCQuzfahIcv/+A4ffy7j4
|
||||
OEKS/c7ExcWjKAru7u6YTKZ0vSapeafV23T4qD3devTk5s1Hv0/OomNi8Mnt2Fvp6eVFtNP728PD
|
||||
g8hI2+/xkMGDaPHw267Lly/zznsfABAZGYnZ/GjI1r17YWTJ4o3RaCBXrpzcvn3bIWTevHnT/lrH
|
||||
xsZx+vQZKgZUwNfXl0OBgVy7fp0mjRtx/sIFEhIS7D3DkZGR9uWSpPdxZISsWbMyY/o0jhw9lur7
|
||||
JEl6jy+eHh5ERDgOh0l6L0c6laflWZ6fw0eO2H++ceMmsXGxzJk10/6BAZ5+P4QQ/y0vTY83wOHD
|
||||
R4iNiaFG9eo0adyYbb/9RlxcHABdOnemwKsF6Ny1Kw0bN6VJs+ZERUU5jLN72lEWJpOZ9Rs2cvPW
|
||||
LYoWTfmVcmhoKLmdDtxJ42ufVbWqVWnXtg0jRo6yP46DBw+mOV4wMiqKRYsX4+rqSoFXXuH69evc
|
||||
uHGTRg0bOjcFbN8U/BV/XvgTnU5nH1cMUKxoMR48CCc01DEgJ6lb5w127fgtzWnm9MefqJXXachP
|
||||
vrx5CQkJAeDO3bv4+uZ2qM/j68vdu3cBSEhI4NSpU9Sp8wb58ubl9OkzHAoMpGLFAAIqVCAw2YmF
|
||||
586fp2BB29f4YOuhm/TNBJYtX0Gzt1rQuGlz5s5fkOI59M3tuP3cvrnt+3f58mWGDB1GnXpvMnLU
|
||||
aNq3a8vrr9tOcHXeXpJ8edN+vCEhIeRJdkKfqqrk9s3NnYeP9/iJ43h4ePDeu+9w8uQpzGYzBw8F
|
||||
Ur16NUqVKmUfmgBpbz8iIoITJ06yefNW2rRrT61aNcmTJ+VJhJqmcez4cfbt30/RokWcqwHbNxTJ
|
||||
v3I3Gg1ky5Y1WYunk97XxFmHj9rTvl1bunbvycWLl5yrHfz5558UKVzY4byLYkWL8mey4Q8AfgX9
|
||||
7D23X44bT/mASpQPqGQP3QBZsmRx+HCTN19eHjwIx2Qyc/duCLl9czvse948eeyvNUDgH7bhJhUD
|
||||
KnAoMJA/Av+gXNmyvF6lCn8cPmIPp+cvXLAPQUmS3sfxd8ud24cF8+Zy8OAhvp7wzWOHu6X3+OLn
|
||||
58f5C+ft8wCF/PyIjIy0/y48yfN4fhLNibZha8nW8bT7IYT4b3mpgrfVamXDxl9p1ept3qhdm7Xr
|
||||
1tvrMnl5cSf4jr3Ht1nTpk99PdtMmTLRr28fShQvjru7O56enrzVvBl58+ThxMmTzs3ZvWcvObJn
|
||||
p2WLFqiqip+fX6pjvJ+GVyYvoqKiuX7jBmA7+apy5UeX7HrttXK0bdOa/PnzYzQayZEjOx07dCAm
|
||||
JoaLl2yBYtzXX9OoYUP69e3DqwUK4OrqSv78+enZozsNG9hONHwco9GA0WhEURT0ej1Go9F+wtft
|
||||
4GAOHDzIxx/3tJ+M2q5dG1avWeO0lkf27tvPO+99kOY0dPjjr3tbtEgRmjZpjKqqlC5disaNG7Fh
|
||||
g+0Evg0bNlK3Th0qVgxAVVWqVKlMrVq1WLv+0XvjUGAgH37wPseOn8BisXD48BFKlypFyZL+DkF0
|
||||
1+7dVKhQwR6E3N3d0el0XLjwJ1arlUyZMtlPVEyuaZPGFCtWFFVVad6sKfny5mX7jp3odDoaNWxI
|
||||
Ji8vNE0j7OE3LpZEW++u8/aSNG7UiBIlSqCqKm+3bIGvry/bd9h6qtdv2Ej7dm3Jny8fBoOBjh0+
|
||||
wqA3sPfhtzEmk5kTJ07SpvWH9mEIgYF/8P577xIREcGVq1eTNpPq9t9q3gwvLy/7vH8Jf8zmRMLD
|
||||
bT27H/fsQaWKFcmSxRsXFxfK/+9/1KhejRMnUv5+APy6aRMftW9Hzhw5MBgM9Oje3eHkwqeVntek
|
||||
TesPWb/20fvxk4978nbLFvT8uBfBwcEYjUaMxkcnY7q7u9Ondy/y5s0DwI6du7BqGp07dcTV1ZVK
|
||||
FSvyRu1a/LL60TAyT09PihcvluJbsNT07dMbo9FIzhw56NSxAxs2bgRg7969eLi707ZNawwGA6+8
|
||||
8grt2rZxOK4dCgykYkAAPj4+nD17jsioKK5dv87bLVs4fGg8dCiQbNmyOnwITM/jaNumDZUqVrTP
|
||||
J/2+q6qKoioYjUaHE1dVVcVoNNrH9tuey0evZ4nixTkceNC+H/nz52f+3Dns3LWTWbPn2NsnD7vJ
|
||||
9yG9x5eKAQHs2rXHsaxiALv37LV/g+W8L86e5fl5q3kzfH198fT0xN+/BAMG9OfQoUAio6LsbZz3
|
||||
QwghknuphpqALXh07PAR169ft4/7BZi/YCGjRo1g2fdLiImN5cCBgw7DM9LDZDLh4mJkzOhR+PjY
|
||||
xuReu36dUaPHOAS0JJGRkfTp15+Bn/and6+PuXjpEmvXradWrZrOTdNt27bfqBhQgR+X2663ff36
|
||||
dfb//ru9/sH9BxQvXpx332lF1qxZiYmJ4ey5c3z8SW/7lQgOHQqkU+cudOzwEQvmz8XV1Y3g4Nvs
|
||||
3rOX3w88WldafvnpJ3tPvr9/CTp81J5Vq1bz5bjxAAwfMYohgwexYd0azGYzG3/dxJy585KvwkF8
|
||||
fDzx8fHOxem2ffsO/ve/1+jbpzcxMTHMnDXbfh3go8eOMfrzsfTv2wcfHx+Cg4MZOWqUQxA8FBhI
|
||||
j+7d7EEl6UNKrpw57R9wAP744zBxsbFUqFCewMA/uHPnDlOmTmPmjG8JfxBOVFQUe/bstZ/YmeSX
|
||||
Vavp368vRYsU4dbt2/Tp15/79++j0+moX78effv0Qq/XExkVxQ/LltsvR+m8vSQ///ILffv0SrE+
|
||||
wH7uwozp3+Lp6cGFC3/S85NeRCX7w3/wUCABARXs6zx67CguLi7s2r3b3gZS336+fPlYsug73N3d
|
||||
cHV15W5ICEOHDbdf8zoiIoIe3buSP39+DAYDd0NCWL1mLfPmL0i+arsFCxfi5eXFsh+WkpiYyE8/
|
||||
/8KtW7cwm1JeMSc90vOa5Pbx4dixY4AtGLZr2waAn1ausLexWq0EVLJ98+Dm5kbrDz9g77593Lx5
|
||||
i5iYGHr37svgQQNp17YtYWFhfD1hosNr1ODN+hw8eOiJx5i7d0O4du0aa1evwmg0sH37DmbPmQvY
|
||||
vq3q+Ukv+vXpQ/t2bYmOjmHDxo0sWfq9ffnTp8+gaRpHjh61B7lDhwIpUby4/aRgsJ0Ds37DRpo3
|
||||
b8bMWbMB2/v8SY+jWdPGbNm6zf6eHDb0M4eb0/y+bw/Xrl2jZat3AWjUsIHDDWJ+32cLv/UbNCIs
|
||||
LAyf3D7cunXLPlSoWdMm5MqVi7Zt2tC2je11AJg1ew4LFn73sI3jPjzp+FLw1VfJnduHrdu22cv0
|
||||
ej0N3qxP3/6f2suc98XZszw/tWrWpEf37nh6enDvXhh79+5ldrJ9S20/hBAiOeXh5GDkyJFKUFCQ
|
||||
EhoaqkRFRSkFCxZUQkNDVaPRqIuJiVGtVqvB3d3dYDabjYCrqqoemqZ5aZqWJSrestZ5fU/Lc/Aq
|
||||
bg+u6Vz8UujcqSPFixennxx4n4s+vXvh7Z3ZfgOjv1tAQAW6de1Ch462K0/83Zy3t3TJIlau/CnN
|
||||
q9I8b87bT1K2bBn8Cvrxy6pVDuV/ldFoZMdvW+nUpSvnzjkOFXheflz+A337D/hbznEA22NYuWI5
|
||||
vfr05fr1687VdtWqVmXggE9p0qy5c9XfIksWb5YuXkTrtu0dbqKTkYZ8Nphjx46xafMW56rnZvxX
|
||||
X7Jv/36H35F3Wr1NiRLFHY4TGbEvzlLbDyHEP8N33C6ixz26D8Wz8nLVNVMU5YGiKFFWqzUGiDcY
|
||||
DKbY2FizqqpmDw8Pq8lksuTIkcN6+fJlzcvLS8uRI4dWokQJbfTo0SnG1r10Pd4vmooVAzh//gLh
|
||||
4eGUKF6cVq3eZuKkyc7NxEsiMPCPVL/d+Ltk9PacpbV9q+X5fE2eJYs3fgX9OHrsGAaDgd69PiH4
|
||||
zh2Hy8U9b+++/6Fz0XNlMplo3sLxWvIvggcPwmncNGNCflq+/Gqcc9FzN+izIc5FrPzpZ+eiDNkX
|
||||
Z6nthxBCJCfB+y/yL1GCz8eMxmgw8OBBOIsXL2Hr1kdfgb5osmXLxqKFqQ8L2LlrF5MmT3EuFv9B
|
||||
J0+d4uSpR0O5npVer6dfvz7k9vHBYrEQFHSW/v0HyPhXIYQQ/0kSvP+ihd8tYuF3i5yLX1hhYWEZ
|
||||
9tX38zBl6jTnon+1Nm3bOxe91EJD7/HBh4/G9v6X7N23j737nnzypRBCiP+Ol+qqJkIIIYQQQrys
|
||||
JHgLIYQQQgiRASR4CyGEEEIIkQEkeD+lHt278eUXY52LhUihR/dufNyzh3Nxhpk/dw6VKz26+VKS
|
||||
9u3aUqDAK87FT/QyvPdLlSxJyxZPf/konU7H4cCDz/S8/BcVLlSIn1aucLi5zovM29ubDevWPPVN
|
||||
1cQ/6+vx4xyuK/9Pedr9GDXy8TeFS8uCeXOf6fglXi5ycqWT/Pnz0+uTnpQpXQYPD3dCQkI5fuK4
|
||||
/bqse/buxdPD02mpjFW5UiU6d+5IIT8/AG7dvs36DRtZtmy5vU2J4sXp2OEjypQpjbu7O8HBweze
|
||||
s4el39tuzJMWFxcXxowaSdGiRcmTx5d58xcwd958hzbe3t58NmggVapUxmQysfHXTUyd9i0Wi+2O
|
||||
jFMmT6Tq6687LAPQq3cffj9w0Ln4Xylnjhy83bIFzd76Zy47V7t2LVSdyoGD6X++X4b3PsCQwYNY
|
||||
tHgJt4ODnase6/333qVlixb4+uYmLi6OK1euMn/BQg4eOoTVauXrbyYSFma7UdE/4e/8venZozvV
|
||||
qlYlX768REZGsXfvXqZNn2G/MVJqGrxZn65dupAzZ04uXb7E119/w6nTpwH48+JFLl+6zNstW7B8
|
||||
xY9OS754unTqyKbNWxyub16sWFEGDxxIkSJFuHcvlAULF7F23bpkSznq0b0bVau+TsFXX+XkyVN0
|
||||
6dbdob5evbq826oVhQsXxt3djfIBKT/0Anw7bQqf9OrjUPakY2pqHvf6wOMfX9asWfm4R3fKVyhP
|
||||
9mzZuHP3LqtXr2Hp9z/Ylx844FPeafW2fR5g6rRvHdokV7KkPx3at6dkSX/c3Ny4cuUKc+ctsN/s
|
||||
LDVPetxz5s5j5vRpbN22FdNT3HTrSc+Ns5UrllGwYEGHsrbtPiLo7Fng8fvxy08/MmbsF2nevTe5
|
||||
J/3t/mHZMq5eS/veABnhccfJJHXrvMF7775L4cKFAY1r16+zfv0GVq1eQ2Ji4qOVOSlSuDAff9yT
|
||||
YsWKkjVLFrp278GRI0cd2jzufftv8Z8N3nq9PtU3yNTJkzh16hQftmlLeHg4eXx9He6Kd/r0mWSt
|
||||
M16ePHmYNHEC076dTu8+/bBYLBTy87Pf7hps1xafPHEia9asoUvX7gTfuUPOnDlp3KghVSpXYeOv
|
||||
ttutp0bTNE6cPMmPP/3Ep/36OlcD8PmYUehUHc2atyBz5sxMnTKJuLg4Zs2eY2/zy6pVTJzkeGnC
|
||||
1J5vSP21SK3sZdKyZQv27tvncEfJjPTBe++xZo3jvaz+97/X6NKpEwUKvEKzpk0JCwtj+syZHD9+
|
||||
Anix3/uqqjJm9Ej7dZJdXFzo3KkjN27cZPOWLfjmzk2vXh9TtEhRXF1deat5M9asXcvPv9huANSw
|
||||
wZt06dyJIUOHc/TYMTzc3fH397e/xzRNY+XKn+zb+6f8Xb83WbNmYdKUKVy6dJlcOXMyatQIBg8a
|
||||
wLDhI52bAlC6dClGDB/GsBEjOXDgIB+8/x7Tpk7mrZat7OF17fr1DBrwKSt+XImmpbhHBB0+ak9U
|
||||
VBQ//fyLc1WG8vDwoHHjxrz/YWuHsmlTp7Bu3Xp6ftKL18qVY/y4Lwm+E5zqde0Bbt68yaxZc6he
|
||||
vRqv5M/vXE1UZBQ//vQTmby8GDxooEOdr68v3bp0ZubDY2TOHDno1q0ri5cs5dq1a+k6pib3pNfn
|
||||
SY/P29ub8IgIBn82lODg25QuXZqxY0YTHR3N6mTHjTVr1/H1hG/s86m9t5L4+vryx+HDTJ8xk/CI
|
||||
CJo3a8o3E8bzQeu2XL582bk58OS/JZcuXeLOnbvUrVP3sX+3knvSc5OWEaNG89tv2+3zZvOjgJ3W
|
||||
frxaoABemTJx6pQt1Lds0YLmzZuSx9eXlT8u5+7duwwbPpKIiIh0/e3esXOX/ed/wpOOkwBdOnei
|
||||
9YcfMGPmLIaPHMWDBw8o5OdH6w8/4PcDB7h5M+27+ZrNZnbs2MH8BQtYOP/RHV+TPOl9+2/x0gTv
|
||||
li1a8E6rlg43x/Dx8WHdmlW0eLsV8fEJjBg2lOLFi2M0Grh85QqTJ0+1X4s46S5yGzZupEaN6pgS
|
||||
TLTv0NG+LoDMmTOTL19ehg4fQUhICABXrl7lytWr9jY9uncjb968DBk6DIDSpUoxcMCn5M+fj4sX
|
||||
L7Fv/34aNWxgv8Xy0iWL2L17D+XL/4/SpUpx/foNhg4fQdEihenWrSuZM2Viy5atjPt6gv3axsOG
|
||||
DqFypYp4eWXi3r1QFi1ewrr1GwAoWrQIFovFoZfJ+ZrLgwcOZNPmTXz9zUR72bVr15gxcxaKkuJG
|
||||
pQ5MJhPLltture38yR7AN3duKleqxIdt2nL/wQPuP3jAd4sW06N7d4c/EhaLFZPJlGzJR/r07kWe
|
||||
PL6YEkwUKuTH4SNHMZvNKcomJNv/v8rd3Y09u3by7fQZVK9WDVdXV8Lu32fsF1/aX+ssWbzp17cv
|
||||
FQMqAHDw4CEmTp5CREQENWpUp1+f3vYe7C6dO9GlcydatGzF9Rs3KF6s/tyItgAAIABJREFUGHNm
|
||||
z6J2nbokJiZSs0Z1Fi9Z+o9s39PTkzJlSjNk2KOvO41GI5MnfsOIkaMpUOAVdu3e7XCTnBf9vW+1
|
||||
Wvnyq/F88P571KxZg7x58zJ/4UKOHrXdGn7Y0CFcvHiRZctXULhQYbbv2EGePL62HQdK+vtz8uQp
|
||||
+zcACQkJDpf60+l0HDqwn7ffeZerV6/Zb/ZTv149LBbbre7r16vL/IXfsXXrNvvx5Idly/iofTvc
|
||||
3Nz4+ZdfWLL0B4YPHULFigEE37nD6DGf2z+w/O9/r/FJz5688kp+rFYrR48dY8KEiQ63NH/a35uD
|
||||
Bw898bgG8PnYL+0/h4WF8fPPv9C2zaMg6qzFW805cOAg27fvAGDBwu9o8VZz6tWtY//wc+TIUXLl
|
||||
ykUhPz/+vHgx+eIAZM+eHb0+9T8x1apWZdDAT9m0eQuvlSuHl5cnR44eY/KUqfbHX6RwYfr360uR
|
||||
IoWJiopi/YaNLPxuERaLhX59++Dp4cGYsV8AMGfWTPLnz0+DRo0BaP3hB1SqVJGPP+lNxYoB3L9/
|
||||
n1u3HgWC2rVqolNVZs2eg8Vi4f/s3XecDOcDx/HP7hXXOVfcqUEQIkESJEiUJKL3Gr1EjU4IEl2k
|
||||
6BFEjSSCREmECIJE9JboXZx+dxzXXdn9/bFu3K7DSdmQ3/f9et2LfeaZ2ZnZ2dnvPPPMzOZff2XD
|
||||
xo00rF//rj/wafvgkiVLOAyxSdu2yr1wZ0v3xYsXmTHzUzp17MCTxYrRrVsXZs+Zy/nzFzK9T03v
|
||||
fp/P/Zbv9OnTTJn6sTG9n3/+ha1bt1GyZAm74G1JTb3r9ujI8fkVc+fN5/XmzSj+ZLEMg3dml3vH
|
||||
zp1UqvRSpoP3/dbN3aSkpNxzWTOaj0qVKvLzz79gsVgoUeJpunfrQqs27XijY3tGjhpD8eJPGgE+
|
||||
M7/dc2Z9yuof1hhPDK5fry7t2rbBz8+PLVu2kpScTHJSEmPHvW/8powYOYo2rVuTM2coO3ft4p13
|
||||
h9OubRvq1a1DSkoK02fMND7TwMDAe+ak++0nc4aG0rFDe4aPGMnqH9YY5QcOHmTg24Pvmy/SflPc
|
||||
3d0dBwF/7nv5KHpk+nj/uHYtuXPnpljRokZZrZo1+O333zl//gJms5kV335LnXr1eaVqNX75ZTMf
|
||||
ffg+Hh4eRv3Q0BCSk5N5vUWrDH+cbty4wfETJ+jfrw9VX32FPHlyO1ax4+fnx+RJE1i+4lsqVXmF
|
||||
Me+No2GD+o7VqFOnNpMnT6Xyy69y+MgRJnz0AWXKlKZly9a0aNWaSpUrUaniS0b9Q4cO0bJ1GypV
|
||||
eZn3P/yIgW8NMJb70KHDWCxWRgx/l3LlXiAgIMAYD2zdBfLkyX3XR45n1DL1IAoVLkRqaqrdkwcP
|
||||
HzmCv382goIC09W8t4ovvcTSZctp2ryFEbAzKnM0b+5s1q5Zfde/55591nEUOyVLlqBz1260aNWa
|
||||
gwcP8uH7t59uN2b0KLy9vWnUuCmNmjQjW7ZsjBk9EoDdu/cQEhJCrly21okypUsTdu4cZcuWsb0u
|
||||
U5p9+/aRkpKCm5sbBQoU4PSZM8a00zjj/YsUKUxCQoIRoAF8fHzw8vKyC0hh584Rdu4c8Ghs+8Wf
|
||||
fJLChQsTERFJdEw0FcqXI2vWrAAEBwdz8vRprBbb9n39+nUOHTpsTHfX7j2UKVOaTm90pGTJEnh5
|
||||
eRnDMtKhfTueeaYULVq2onbd+vj6+pIvn33/7+DgIEJCQqjfsBEdO3WhaZMmTJ0yiYWLFlHllar8
|
||||
8stmhg6+/ZTF1NRUxk+YyKuvVad+A9sp/LffHmgMz4yMviP3269lpGTJkhw7dtyx2FC4UCEOHb69
|
||||
/qxWK0ePHrt1atnm5s2bnD9/gSeeKGKUPYiQkBDi4uLo8EYnWrRqQ948eejS+Q0A/Hx9+WTaVHbt
|
||||
3s1r1WvQq3dfateqaRws7Ny5izK3DlCzZMnCE08UITU1hQL58wNQpkwZ44f6iSJF7vguFipUiGPH
|
||||
j9t15Th85CiFCt9evr+Ti4sLZcuWwcfHh6ioKDw8PHi+bFlcXV3/1D71fp/Pgy6fu7sbTz5Z7I5t
|
||||
olLlSqxetZKFXyyga5fOeHp62g2/l8cey0e2bNk4djzj7Syzy33y5EmeKPKE8fp+7rdu7qZH9+6s
|
||||
XrWSubNnUae27QAuvYzmo3Klimz6+WcAcgQHExMTw+XLlwGwWCzs33+A+Ph44P6/3Y6ee/ZZevfq
|
||||
ydB3hlHllar8tGED1au95liNqlVfpWv37tSqXZccOXLw2fy5XL5yheo1azNq9FjeGtCfwEDb+rxf
|
||||
TrrffvL558uSmprKmh/X2pWn+cv54gG320fVIxO8Y2Nj2bhpE7VvfSFMJhO1atbku+9srRDh4eFs
|
||||
2LiJhIQEkpOTmTf/M1xdXSlY8Ha/raSkJLtWyIx06dKN7dt30LLF6yz+aiGrV62kWdMmjtUAqPjS
|
||||
i0RevcrSZcuwWCycOnWKpcuWO1ZjxYpvOXL0KDdv3uT7VavIlSsXEydNITomhvPnL7B9+w6KFStm
|
||||
1F++4luioq5jsVjYsWMnW7Zu47nnngPgypUrtGrTlsTERPr16c0Pt3aKZUrbfoT8/W0XD4WH325F
|
||||
+zt5e3sTFxdn9wWLibH1E/X29jbK6tWtw0/rfrT7y+7vbwzfvWcPe/fZWivvVeaoT9/+NG/R6q5/
|
||||
v++/dz+7L75caJw2W/D5FxQrVpQC+fMTEhJCmdKlGT9hItExMURHRzN+4iSeL1uWHDlyEBcXx+Ej
|
||||
RyhbpjReXp4UKvQ48+bNN4Jv2TJl2LHL9kPv6+ODyWQiLi7OeN80znh/P19fYh3e+9q1ayxZ8jUL
|
||||
5s+lVs2a1Khe/Y4LCR/mbd9sNpM//2O8O2w4hw4dYsqUj1m/foMR+ubOm0ff3r0YMKAfZcuW4ZlS
|
||||
pYxpgu2prH369qdAgfyMHTOaDevXMmnieONAxlHNGjWYN28+4RERJCcn88n06Xe0hqWkpDD142nE
|
||||
xydw/PhxDh48xIH9B9izZy9JSUksX7GCggULGK07v/32OwcOHiQlJYXomBhmfjqL0re+12n+zPcm
|
||||
M/u19BrUr0eZ0s8xcfJkx0EGb2/vO/p/x8TG2H3HAeLi4vDz8wNsrWnp57te3Tq0ad3Krszd/fbF
|
||||
mMnJyXx5q2+r7f8LqV2rNgAvvvgiCQmJzJk7j6SkZM788QfzF3xOvbp1ANi7by+BgYHkzZuXZ0qV
|
||||
4ujRY2zduo2yZcvg6upKqZIl2LFzJ2A7SHT8Lvp4exMba18WGxODj8Py/V0CAgK4efMmA98ezMVL
|
||||
lxj09hCiY2IIDg7O9D41vft9Pg+yfGazmaFDhhARGck3S293C9qwYSNvDRxE5y5d+WT6TF6uUoUR
|
||||
wzPumuTIz8+P998by8KvFt0R5tNkdrlj4+LImtW2jWXG/dZNRmbNnkP/t96iS9fufPvdSvr360fT
|
||||
Jo3t6jjOR1BQIPny5WPXrf3ur1u2cPXqNZZ9s4SSJUpSp05t4/cY7v/b7ahWrRr8sOZH9h84gMVi
|
||||
YcPGTcYZvvRmzZ5DREQk16Ki2LhxE8lJSSxZ8rXRWh0VFUWhxx8H7p+T7refzJYtG1evXv3Hnjz8
|
||||
INvtoyzj84APqe9Wfs+498YycdIkihcvTvbs/vy0wXY6ycvLkze7daNMmTJ4eXmSmmrB29sb/2y3
|
||||
f7SuXbtmdySVkeiYGD6dNZtPZ83G3d2N16pW5Z2hQ7h48SK/bLZ/Cl1QUBCXLtmObtOkHe2mF5Hu
|
||||
VHJiQiJJScncuHEjXVmC3ZHl682bUaN6dbJn9yc11ULWrFntTpOePXuW98Z9ANhCVufOnZgw/kPq
|
||||
1GtgXDgZHBzExYsXjXH+LnFxcXh7e2MymYwdpq+v7YK79D9uP65dd8dp0uvpljn9OrlXmaN79dHL
|
||||
jMjIq8b/ExMTiY2NJTg4mITEBKxWq906O3/+PAA5cgRz5coVo5UtPDyCQ4cO8+uWLfTt0xtPT09K
|
||||
lHiaCZNsfXNjYmOxWq0Z7uid8f7Rd9lRffDReL78ahFdOneiYIECfDZvLjM/nWV0LXqYt32LxcLi
|
||||
W32wT5w8SWJionHhE8DqH9awZes2ateqScWKLzFyxDAOHz7CwLcHG9vp9h07jAuEcufOxbtDh/L+
|
||||
e2Np2bqNMZ00QUGBXEq3PElJyXdceHntWpTd/iQhMcGu20hCQiImkwkvLy+SkpLIly8f3bp0pkiR
|
||||
IkYA9fDwwNPTk4SEBODPfW8ys19L06RxI9q3a0uXbt3v2RczLi4OHx/7C2l9fXy5es1+HXh7exMd
|
||||
HQ3Y5qN5uqeUdu3SmZjoaL5Id9F3+u5r0dHRdv1oIyOv4u+fDXd3N3LkCObixYt2oez8+fMEBwcD
|
||||
EB+fwMGDhyhbpjQ5c+Zkx86dnA0Lo3atmhw7fpybN28aLanR0dHGeGli4+IICQ2xK/PJ4ID17xIe
|
||||
Hm6cmk/repTWNaNQoccztU9N736fT2aXz8XFhRHD3yVnzpz07NXH7vPZvWeP8f9z584TnxDPzOmf
|
||||
GIH5brJnz860j6cYXYfuJrO/JT7e3ty4YdvGMuN+6yYj69L17Q4LCyNHjmBq16pl7HPgzvmoVLEi
|
||||
W7dtN9ZZfHwC7Tu+QdEnnmDAgH5UesnWPbBXn77GhZf3+u2+5jB/wUHBxsFjmkuX77ygPDIi0vh/
|
||||
QoL9PiitzMvbto/NTE66137y+vXrBAQEYDab/5Hwndnt9lH3yLR4g+10e3xcHBVfeonatWqxbv16
|
||||
4wer0xtv8Fj+x3ijc2dq1KpD7br1iImJsetz9KBnQZKSkln5/SrOX7hAkSJ3nk6NiIgg1GEjCQmx
|
||||
f/2gXqxQgTatW/HusOHGcmzfvv2ufaeiY2KY/9lneHh48Fi+fISFhXHu3Hlq1qjhWBWwnSn4K04c
|
||||
P4GLi4txBA3wRJEniIq6ToTjDiA83O4v/Rc1o1NSGZU5+vLzBWzasP6uf3drPUiTJ/ftLhTZsmXD
|
||||
19eX8PBwrlwJx2QyEZru80s7yr9yxdZlY8fOnZR+7jnKli3D9h07iYq6zqVLl3i9eTPi4uI4efIU
|
||||
YGu9O3PmjHHaOz1nvP/x48fx9PS8I2wAXLhwgVOnTjF12jRGjBpNyxavO1YBHu5t/+tvlnItKsqu
|
||||
DGzdZX7/fT9r1qylVZu2VK5cya6fd3rnz19g2fIVFC5cCLP5zt1gRESk3Wfh7u5GQED2dDUe3OhR
|
||||
Izh3/jzNXm9BjVp16NGrDwDpF+/PfW8cSzLWvl1b2rZpTeeu3Y1t5W6OnzhB0aK3T6ubTCYKFy7E
|
||||
iRO3uwVkyZKF3LlzGS2aFovFbr4TEhKIjYuzK0vP39/f7uA0d57cREVdJykpmStXwgnNGWr32efO
|
||||
lctuGjt32Q5Ey5YpzY6dO9m1cxelSpakfLly7Nq9x1hXx44fv+O7eOLECQoXsv/snyhShBPpuj38
|
||||
U2Z+OsvudWb3qend7/PJzPK5u7vz4QfvExQYxJs9et73QvCU5BRMJhMuGXxf0oSGhjBn1qds376D
|
||||
Dz78KMPtNU1ml7tgwYIcO37MeH0/91s3mZGcnIzZxX45HeejcqVKRjeT9I4cPUpYWBh9+w9g9eof
|
||||
7np7QMffbkfhEeGEhobalYWG2L9+UJnJSek57ie3b9+Bi4sLVV991bEq8Dfki0xst/8Fd/8GPYQs
|
||||
Fgvfr1pN48aNeLlKFb79bqUxzM/Xl8uXLhstvnXr1Hnge7b6+fnRt09vihUtipeXFz4+PtSvV5fc
|
||||
uXJl2IXh5182ExQYSMMGDTCbzRQsWDDDfq4PwtfPl5iYWKPvbeFChXgh3cU6zzxTitatWpI3b17c
|
||||
3d0JCgqkQ/v2tuB1yvZjOu6DD6hZowZ9+/Qm/2OP4eHhQd68eenerSs1qlc3pnU37u5uuLu7YzKZ
|
||||
cHV1xd3dHRcXFwAuXrrEtu3befPN7sYFeW3atGL5ihV203BxMePu7m73l1HAeVA9e/ehSbPX7/r3
|
||||
2++/OY5ip0OHdgQEBODh4UHf3r04fPgwZ/74g8uXL7Nr92769OmFr68vfr6+9Ondkx07dnLlyhUA
|
||||
Dhw4iLu7O3Vq12LnLltLxI6du2jdqiU7b51uTLPp51+MPqjpOeP9o6Kus3//AeMiTbCd6q766ivG
|
||||
xW5mk5knixUjrUvSo7Dt30v9enXx9fU1Xj9Z7EmSk1O4ft3WWtygQX1qVK9Gjhw5cHd3o0D+/DRq
|
||||
2ID9+22ncR2t/uEH2rVtQ3BQEG5ubnTr2pW7XRCUWX6+vpw+c4bExERcXFwyPOj5u743kyaOt7uX
|
||||
cI83u9OoYQO6v9mTS5cu3Zr27W4fhQsXpnevnsbrZctXUO6Fcrz00otkyZKF1q1a4u3tzdp16406
|
||||
zz5TivDw8AwvrMysPr174e7uTnBQEB07tOf7VasA2Lx5M95eXrRu1RI3Nzfy5ctHm9at7Pb5O3bu
|
||||
pGyZMoSEhHDkyFGiY2I4GxZGo4YN2JmupXDHjp0EBGQnZ7oQs2HjJixWK2907GD0t365SmWWLr/d
|
||||
Xap1q1Y8X7as8TptX2g2mzGZTbi7u9vdx9xstn12ad+xtM/vfjKzT61SpTKNGt4OcPf7fO63fJ6e
|
||||
nkyeNAFPTw8GvDWQlJRUu3kH23cqZ86c+Pj48OSTxRgwoB87duwk+lZAL1a0KLt3bjfWa968eZn9
|
||||
6Uw2btrI9BkzM9x+06/TzCw32LrRbdr0i/G6VcsWrPzWvk5691s3Xl5e9O7V07ibSM7QUCpVrEhg
|
||||
YCB+fn5UrPgSrVq2sLvDCdjPh6+vL089VZwtW7Yaw58qXpynn37KeO3l5UX+AvmNs1SZ+e1Ob9Wq
|
||||
H6he7TWefuopzGYzVSpX4pln7LvQPaj75aT77ScvXrrE7DlzeXvQWzRu1JDQ0BA8PT15qnhxxr03
|
||||
5q4NHWlMJtv3Ju174eZqyxpp28j9ttv/ikeqqwnAyu9X0aF9O8LCwti///bVwLPnzGX48HdZ+MUC
|
||||
4uLj2bZtu133jMxISkoiSxZ3Ro4YTkhIDlJTUzkbFsbwESMzvKI2Ojqa3n378Vb/fvTq+SYnT53i
|
||||
2+9WUrlyJceqmbZu3XrKlinN4q9s99sOCwtjy9bbX+6oa1EULVqUpk0akz17duLi4jhy9Chv9uhl
|
||||
nPLdsWMnHd/oRIf27Zgz+1M8PDy5dOkiP/+yma3bbk/rbpZ+/bXRmvnkk8Vo364ty5YtZ+y49wF4
|
||||
593hDB40kO+/W0FycjKrVv9wRytOwwYN7jjSHz1mLCu+/Wv347x69XZXjT9j5crvmTVzOtmzZ+fg
|
||||
oUO8Neh2V4QhQ96hX98+LP16MZhM7NixkwkTRxvjJicns2/fb3YXIe3YsZNWLVvcsX18s3QZixZ+
|
||||
ga+vr11LkrPef+GiRbzerJlxkW1KSgpVqlSmV88eeHp50bLF65w+c8a4K8SjsO3fS548eVgwfx5e
|
||||
Xp54eHhwJTycIUPfMfp6RoRH0KxpE3r37oXvrQvcdu7axbRPpjtMyWbO3Ln4+vqy8MvPSUmx3dXk
|
||||
woULJKc7Ff+gxo57n359etO4UUOSk5P58cd11K5V067O3/W9CQ0JMW5N5u7uTpvWti4gXy+xdSsC
|
||||
W0NGmefLAbYL4Vq2eJ1Jk6cAsH//AUaNHk2/Pr0JCgrm9OnT9Ord166rV506te96K8HMuHIlnLNn
|
||||
z/Lt8mW4u7vx008bmDHzU8DWGti9R0/69u5N2zatiY2N4/tVq1jw+RfG+AcPHsJqtbJn717j4GnH
|
||||
jp0UK1qUHem22djYWFZ+v4p69eryyfQZgK07Qq9efRg08C3atG7N1atX+eDD8Xbbet06tfhx7Trj
|
||||
tPvQIW/bPURl66+/cPbsWeMuPjVrVGfYu7cPdrb+agtpr1Wved/91v32qc+XKcNjjz1m3B7zfp/P
|
||||
/ZavVMkSxvUFG35aZ3sTbGcRunXvAdhadLt17YqPjzeRkVfZvHkzM9LNU0hoCBcuXDC6NtStU5sc
|
||||
OXLQulUrWre63eVo+oyZzJk771Yd+3V6v+UukD8/oaEhrF13ex5DQ0LYd49rge63bjw9PWnZ4nU2
|
||||
//or589fwNXNjbZtWpM//2O4urpy8dIl5s6bb3TBgzvn48UK5fnt99/t+pJbrBbe7NKNfHnz4uPj
|
||||
ywvPP8/u3XuYO28+kLnf7vR27d7NlKnTGD16JH6+vmzZspV1638iKfnP74Pul5Mys5/8dNZs/vjj
|
||||
D5o1bUrPHm9itd66j/f3q7h82dZIdDehISF89+3tEP3xVFtXpMFD32Ht2nX33W7/K0y3/uwMGzbM
|
||||
dPjwYVNERIQpJibGVKBAAVNERITZ3d3dJS4uzmyxWNy8vLzckpOT3QEPs9nsbbVafa1Wq39MYuq3
|
||||
jtN7UD6DlnFxUCXH4kfCGx07ULRoUfr26+84SP5FabdeqlO3/gM/eOXP6ta1C2azmY+nffKvvP/s
|
||||
T20/eI4P0enQvh0/bdjAH3+ctSv/qx6Gbb9kyRIULFDQuB3X38Xd3Z0N69fSsVNnjh7N/Gnvf0Ng
|
||||
YCAzPplGk2bNM2zN/zs8/nhBxo0dS/MWLe36aWdW2u0Ya9et5zjoH+Hvn43PP5tPy9Zt//J1ImIz
|
||||
+O1B7Nu3jx/W/Og46G/z/ntj+XXLFru7dC3+6kv69Bvwj1zDdDeO8/HBuPfYsXPXXfczo0aO4J13
|
||||
hzkW/2Uzpk9j8+ZfjYuS5d5yjttE7LiMu/o8CF8Pl7omkynKZDLFWCyWOCDRzc0tKT4+PtlsNid7
|
||||
e3tbkpKSUoOCgiynT5+2+vr6WoOCgqzFihWzjhgx4o6WiUeuxfthU7ZsGY4dO87169cpVrQojRs3
|
||||
YvyEiY7V5P9QWuvav6Vjp86ORYCtpfPv8DBu++nvTf5X+Ptno2CBguzdt8+4p/ely5ftbn32sIqM
|
||||
jKRRE1sr7D/l5MlT//h7/J2ioq5Tq45zQv7/i7HvjXMs+tsNfHuwY5HdszycxXE+Dhw8yMaNG+3K
|
||||
0rNYMnex8/1UqVyJX7dsISUllWqvVeXpp55m5MjbZ0Hl0aTg/Rc9WawYo0aOwN3Njaio63z22YI7
|
||||
HiTwMAkICGD+3DmOxYDtVkITJtrujCH/XfPmf+ZY9Kc8jNu+4wMp/ixXV1f69u1NaEgIqampHD58
|
||||
hH79BvxtBy0i8uj6/IsvHYvsDBs+0rHoT6lZowZDhw4BbBfG9+s/wGlnTP+MShUr0u8uT7ye+vHH
|
||||
dteI/D9TVxMRERER+U95WLuaPPjl8iIiIiIi8sAUvEVEREREnEDBW0RERETECRS8RUREREScQMFb
|
||||
RERERMQJFLxFRERERJxAwVtERERExAkUvEVEREREnEDBW0RERETECRS8RUREREScQMFbRERERMQJ
|
||||
FLxFRERERJxAwVtERERExAkUvEVEREREnEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxFRERE
|
||||
RJxAwVtERERExAkUvEVEREREnEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxFRERERJxAwVtE
|
||||
RERExAkUvEVEREREnEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxFRERERJxAwVtERERExAkU
|
||||
vEVEREREnEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxFRERERJxAwVtERERExAkUvEVERERE
|
||||
nEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxFRERERJxAwVtERERExAkUvEVEREREnEDBW0RE
|
||||
RETECRS8RUREREScQMFbRERERMQJFLxFRERERJxAwVtERERExAkUvEVEREREnEDBW0RERETECRS8
|
||||
RUREREScQMFbRERERMQJFLxFRERERJxAwVtERERExAkUvEVEREREnEDBW0RERETECRS8RURERESc
|
||||
QMFbRERERMQJFLxFRERERJxAwVtERERExAkUvEVEREREnEDBW0RERETECRS8RUREREScQMFbRERE
|
||||
RMQJFLxFRERERJxAwVtERERExAkUvEVEREREnEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxF
|
||||
RERERJxAwVtERERExAkUvEVEREREnEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxFRERERJxA
|
||||
wVtERERExAkUvEVEREREnEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxFRERERJxAwVtERERE
|
||||
xAkUvEVEREREnEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxFRERERJxAwVtERERExAkUvEVE
|
||||
REREnEDBW0RERETECRS8RUREREScQMFbRERERMQJFLxFRERERJxAwVtERERExAkUvEVEREREnOCh
|
||||
DN7W5CS8nn3NsVhERERE5J48S1eHpETH4oeCq2PBwyBuWieydp9JtsZvOw4SEREREbm7pJvEfvKG
|
||||
Y+lD4aEM3iRGEze+uWOpiIiIiMgj66HsaiIiIiIi8l+j4C0iIiIi4gQK3iIiIiIiTqDgLSIiIiLi
|
||||
BAreIiIiIiJOoOAtIiIiIuIECt4iIiIiIk6g4C0iIiIi4gQK3iIiIiIiTqDgLSIiIiLiBAreIiIi
|
||||
IiJOoOAtIiIiIuIECt4iIiIiIk6g4C0iIiIi4gQK3iIiIiIiTqDgLSIiIiLiBP/Z4D1l4kfUrlUD
|
||||
gGefKcXSxQsdavx92rdtzTtDBjkWi4iIiPwrXFxcMJv/szHvkeXqWPCwKFK4EC1fb07xJ4vh6enB
|
||||
lfBwtmzdzpKvl3L9xg3H6k7zRod2BAUFMnbch0bZtu078Pb2TldLRERE5N9htVr56vN5JCcn071n
|
||||
X6KuX8dkMjlWk3/BQ3ko9OwzpZgy8SMiIiLo3f8t6jVqxtB3R2KxWChT5jnH6v+6I0ePsXvPXsdi
|
||||
EREREaeyWq1YrVYeL1iAgwf2M2PaZPx8fbFarY5V5V/wULZ49+7ZnXU/bWDKtOlG2bnz55k9d75x
|
||||
xJYta1a6de3Es6VKAbB7z16mzfiU6OhoY5y78fDwoEPb1lQoXw4VZidoAAAgAElEQVQvL08OHznK
|
||||
5KmfcPnKFQC8PD1p26YlFcqXI6ufH1fCwxk/cQqBgYHUrlkDFxczX8yfA0CHzt1o0bwpuXLlZNSY
|
||||
ccD9523GtCns2buPQo8XJDAwAIDJUz/h9/0HAChZ4mm6du5IaEgoVqyEhZ2jZ5/+WK1WSpZ4mqef
|
||||
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
|
||||
o4AtPM/4ZBrh4eE0aNSEl199jclTp5KamgLAoUOHaNm6DZWqvMz7H37EwLcGUKxo0fSTp2TJknTs
|
||||
1JmGjZty/vz/2rvv8KiqxI3j771Tkkky9Al1F0RFCOIu4NrL2unYBZFiQREBey/Iuj9XXdeOBbvY
|
||||
EAs2OtioKp3EAgur1CSEljLJlHt/f4QZkoHABJIZwO/nee6T5Jwzd2Yyc07eOTn33nUaPmxopfqK
|
||||
/u+f/1Bpaam69eilq68ZrB7du1eqD4fD+s8TT+qc87rqggsvliTdfXf5f8imz5ihjz+ZoG++/Vbn
|
||||
X3iRzr/wIkI3AKDWHTTBW5JeGvOyJKksENBrMbNbknTfPXdr6uSJ+nrmdD3+70f1xJNPac2atZKk
|
||||
+vXrK38vy0Tq16+vvLy82GJJUm5enurVqxdbXMmdd9yu8R9+pN/XrImtUnp6uiSpqKioUnlhYWG0
|
||||
TpK+/+F7ZWeXB621a9dp9er/qV3bttH6UCikZ58brZISv3799VctX56tZUuXacGChQoEAvpkwgQd
|
||||
fnhrud3u6G125/zevTRj2pTodtqpp0iK7/dUlVatWlXa54xpU3TG3/8erd+8ebP69uuvQVderZdf
|
||||
eVXz58+vtKY6GAzqnXffq/D9u+rZo2e0fvr0GTr5pBP13TdfacqkL2Uapl59bec6a6n89/z0U0+o
|
||||
fv16unbI9dq8ZYskqc9ll+rlV17Vr7/+Ksuy9N2sWVqwcKHOPKN8Df7SZcu0atVq9exRHnwbNGig
|
||||
0049RR9//El037vzwbj3NHXyRH33zVfq3auXRj74j13Wie/Jy6+8qtvuuENDrr9Bn372uW679VZd
|
||||
duklkuJ/zyxatFjTps9QIBDQZ59/odTUFE347DOtWbNWxcXFmjhpsrKyKgfcfRUMBJSenq42bdrI
|
||||
5XJp8+bNWrV6tSTptFNPk8Pp0BNPPqWioiKFw2EtXbpMJSV+SdInEz7Vli1bZVmW5s//XrPnzNWx
|
||||
xx5bcfcaO/ZthULlQf3bb79V+6z2leojmjZtomM7d9ZTTz0tv9+vLVu2aswrldfPL168RMuWL1co
|
||||
FNL2wkK9NOZl/S3m/gAASKSDYqlJRCgU0qrVqxUIlO023Dz9zLP6btZsOZ1OHX54az048gFt375d
|
||||
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
|
||||
fXXu1FGybXXq+FctWLgoel+ffzFRZ591hlLcbsm21bN7Vy1eslRr165Tfn6+vvtulkr9foWCQb37
|
||||
3jg5nQ4d1qpl9HEGAgG9P2585ecpSXb5czi6fTsdu+O+K76v49l3KBTWy6+8Jn9JiVau/K9++vln
|
||||
5eTkaPHiJQqUlenLiZN0WKuWcrtckm3rwvN7aezYd7Vy5X9lW5bmzpuvJUuW6rRTTq78+NgOnS1e
|
||||
sbdjY6upTVK3LudqwofvV9ratT0q+t47+cTjJUmvvPq6ykpLVbh9u1597U2dfdaZlfZT8ftQKKTx
|
||||
4z+SbFuhYFDjP/xYXc47Z9f7Z2OrqS3JkrzUxE76WhvUnh8WLNQPCxZKkpo1a6o7br1ZD95/r64d
|
||||
Ojz6uuflb4p+X+IvVZrHI1uSz9dItm1rw8bcaP269RskSY0yfcrNz9eChYvUqVNH5W8q0E8//6K5
|
||||
87/X0OuvU0pqqo5u317PvzgmetvZc+eptLRMZ/z9dM38+mudfdZZ+s9Tz8hW+RlWBl89SJ07dZQn
|
||||
1SPLspSWlqa6devKlmRL2rp1q0Lh8I697WRL2rJtm955b5yGXDdYQ4ffFC3f132XlpYqf1NB9LH7
|
||||
S0tlGIZSPakqCwTUtGkTDRp4hfr2uTR6G4/Ho1WrV9OfDlnxvLKMp6hdM7/+Rq+98Valsn+MvF9S
|
||||
+Tu0SZMmql+vnt587eVovWEaCoWCSktPjy43iYx9tqTt2wsVrHDsz6aCzapXt66cLpeCwWC0HKg5
|
||||
yR0pkxu8k/vckUDr12/Q519O0j133ibDMGKrd5GXv0mGYahxZqY25uZKUnRZSX5e+RrwBQsXqXfP
|
||||
7iooKNCPCxdp67Zt2pibq0suukAlJcVatfp/kd0pHA5r0pQp6t6tiyzbUigc0qzZcyRJgwb0U8s/
|
||||
/1k33ny7tm7bJkma8OG4So9zbx+SP/x4gnr37K5uXc6rVB7PvqtrY26uXn9zrGZ+9U1sFQ5Ve3n/
|
||||
SYqvDbAfSktLlZ+/qVJZxQPmN+bmKS8vXwOuGlyhxU4OhyO2SPXq1VVaWppKSkokSc2bN9PWbdsI
|
||||
3ag9SR4rk7/UBIeknj266ZyzzlSmzyeXy6WWLf+s3j27KzvnJ9l7S7GS8vLytGjxEg29/lplZKTL
|
||||
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
|
||||
"
|
||||
preserveAspectRatio="none"
|
||||
height="524"
|
||||
width="734" />
|
||||
<ellipse
|
||||
style="fill:none;fill-opacity:0;stroke:#ff9900;stroke-width:1.74924;stroke-opacity:1"
|
||||
id="path1087"
|
||||
cx="124"
|
||||
cy="176"
|
||||
rx="18.125381"
|
||||
ry="18.125383" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:27.4347px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9900;fill-opacity:1;stroke:none;stroke-width:0.685868"
|
||||
x="115.03148"
|
||||
y="186"
|
||||
id="text1091"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1089"
|
||||
x="115.03148"
|
||||
y="186"
|
||||
style="fill:#ff9900;fill-opacity:1;stroke-width:0.685868">1</tspan></text>
|
||||
<ellipse
|
||||
ry="18.125383"
|
||||
rx="18.125381"
|
||||
cy="348"
|
||||
cx="129"
|
||||
id="path1087-6"
|
||||
style="fill:none;fill-opacity:0;stroke:#ff9900;stroke-width:1.74924;stroke-opacity:1" />
|
||||
<text
|
||||
id="text1091-5"
|
||||
y="358"
|
||||
x="120.03148"
|
||||
style="font-style:normal;font-weight:normal;font-size:27.4347px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9900;fill-opacity:1;stroke:none;stroke-width:0.685868"
|
||||
xml:space="preserve"><tspan
|
||||
style="fill:#ff9900;fill-opacity:1;stroke-width:0.685868"
|
||||
y="358"
|
||||
x="120.03148"
|
||||
id="tspan1089-6"
|
||||
sodipodi:role="line">2</tspan></text>
|
||||
<ellipse
|
||||
ry="18.125383"
|
||||
rx="18.125381"
|
||||
cy="431"
|
||||
cx="283"
|
||||
id="path1087-9"
|
||||
style="fill:none;fill-opacity:0;stroke:#ff9900;stroke-width:1.74924;stroke-opacity:1" />
|
||||
<text
|
||||
id="text1091-3"
|
||||
y="441"
|
||||
x="274.03149"
|
||||
style="font-style:normal;font-weight:normal;font-size:27.4347px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9900;fill-opacity:1;stroke:none;stroke-width:0.685868"
|
||||
xml:space="preserve"><tspan
|
||||
style="fill:#ff9900;fill-opacity:1;stroke-width:0.685868"
|
||||
y="441"
|
||||
x="274.03149"
|
||||
id="tspan1089-7"
|
||||
sodipodi:role="line">3</tspan></text>
|
||||
<ellipse
|
||||
style="fill:none;fill-opacity:0;stroke:#ff9900;stroke-width:1.74924;stroke-opacity:1"
|
||||
id="path1087-9-4"
|
||||
cx="428"
|
||||
cy="470"
|
||||
rx="18.125381"
|
||||
ry="18.125383" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:27.4347px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9900;fill-opacity:1;stroke:none;stroke-width:0.685868"
|
||||
x="419.03149"
|
||||
y="480"
|
||||
id="text1091-3-5"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1089-7-2"
|
||||
x="419.03149"
|
||||
y="480"
|
||||
style="fill:#ff9900;fill-opacity:1;stroke-width:0.685868">4</tspan></text>
|
||||
<ellipse
|
||||
ry="18.125383"
|
||||
rx="18.125381"
|
||||
cy="470"
|
||||
cx="650"
|
||||
id="path1087-9-4-5"
|
||||
style="fill:none;fill-opacity:0;stroke:#ff9900;stroke-width:1.74924;stroke-opacity:1" />
|
||||
<text
|
||||
id="text1091-3-5-4"
|
||||
y="480"
|
||||
x="641.03149"
|
||||
style="font-style:normal;font-weight:normal;font-size:27.4347px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9900;fill-opacity:1;stroke:none;stroke-width:0.685868"
|
||||
xml:space="preserve"><tspan
|
||||
style="fill:#ff9900;fill-opacity:1;stroke-width:0.685868"
|
||||
y="480"
|
||||
x="641.03149"
|
||||
id="tspan1089-7-2-7"
|
||||
sodipodi:role="line">5</tspan></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 31 KiB |
@ -1,22 +0,0 @@
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: acknowledgment
|
||||
|
||||
.. _acknowledgment:
|
||||
|
||||
Acknowledgements
|
||||
================
|
||||
|
||||
|
||||
**Bastian M. Wojek**
|
||||
I am very much indebted to BMW for his rigorous testing of ``musrfit``, his many useful suggestions, contributions, and for the
|
||||
largest part of the user manual of ``musrfit`` which makes it accessible to a broader audience! Many thanks Bastian!
|
||||
|
||||
**Uldis Locans**
|
||||
I am very much indebted to Uldis work on :ref:`DKS <setup-dks>` enabling the GPU support for ``musrfit``. His kind, calm, and
|
||||
extremely competent way to deal with his projects as well as to deal with the chaos of physicists way to think is admirable. Many thanks Uldis!
|
||||
|
||||
**Zaher Salman**
|
||||
Thanks for his beta-NMR and web-interface contributions to ``musrfit``!
|
||||
|
||||
**Robert Scheuermann**
|
||||
Thanks for his constant contructive input on ``musrfit``!
|
@ -1,8 +0,0 @@
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: any2many
|
||||
|
||||
any2many - a Universal |mgr|\SR-file-format converter
|
||||
=====================================================
|
||||
|
||||
``any2many`` allows to convert most |mgr|\SR-file-formats from one to the other.
|
||||
For a detailed description see :ref:`here <any2many>`.
|
@ -1,9 +0,0 @@
|
||||
.. index:: bugtracking
|
||||
.. _bugtracking:
|
||||
|
||||
Bugtracking
|
||||
===========
|
||||
|
||||
For reporting bugs or requesting new features and improvements please use
|
||||
the `bitbucket-repo <https://bitbucket.org/muonspin/musrfit/issues>`_ (preferred)
|
||||
or send an e-mail to A. Suter at PSI.
|
@ -1,18 +0,0 @@
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: cite
|
||||
.. _cite:
|
||||
|
||||
How to Cite ``musrfit``?
|
||||
========================
|
||||
|
||||
Since quite some effort is going into the development and maintenance of the ``musrfit`` package, you should at least acknowledge it in your publication if you have used it to analyze your data. Even better of course is to cite it properly by the reference given beneath
|
||||
|
||||
* A.\ Suter, B.M. Wojek, "Musrfit: A Free Platform-Independent Framework for |mgr|\SR Data Analysis", Physics Procedia **30**, 69 (2012). `<http://dx.doi.org/10.1016/j.phpro.2012.04.042>`_
|
||||
|
||||
The GPU high speed ``musrfit`` version is utilizing ``DKS``. In case you are using this version, please also add the following citations
|
||||
|
||||
* A.\ Adelmann, U. Locans, A. Suter, "The Dynamic Kernel Scheduler—Part 1", Computer Physics Communications **207**, 83 (2016). `<https://doi.org/10.1016/j.cpc.2016.05.013>`_
|
||||
* U.\ Locans, *et al.*, "Real-time computation of parameter fitting and image reconstruction using graphical processing units", Computer Physics Communications **215**, 71 (2017). `<https://doi.org/10.1016/j.cpc.2017.02.007>`_
|
||||
* U.\ Locans and A.\ Suter, "Musrfit – Real Time Parameter Fitting Using GPUs", JPS Conf. Proc. *21*, 011051 (2018). `<http://dx.doi.org/10.7566/JPSCP.21.011051>`_
|
||||
|
||||
|
@ -1,31 +0,0 @@
|
||||
.. musrfit docu documentation master file, created by
|
||||
sphinx-quickstart on Sun Jun 17 11:00:32 2018.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
Welcome to the musrfit documentation!
|
||||
=====================================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
cite
|
||||
tutorial
|
||||
user-manual
|
||||
user-libs
|
||||
setup-standard
|
||||
setup-dks
|
||||
musredit
|
||||
mupp
|
||||
msr2data
|
||||
any2many
|
||||
musr-root
|
||||
acknowledgement
|
||||
bugtracking
|
||||
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`search`
|
@ -1,374 +0,0 @@
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: msr2data
|
||||
|
||||
.. _msr2data:
|
||||
|
||||
msr2data - A Program for Automatically Processing Multiple ``musrfit`` msr Files
|
||||
================================================================================
|
||||
|
||||
``msr2data`` (originally written by B. M. Wojek) is a program implemented in ``C++``. Its purpose is
|
||||
to process multiple msr files (input files for ``musrfit``) with the same parameters and summarize the fitting
|
||||
results either in a *TRIUMF DB* [#f1]_ or a *column ASCII* file. This allows essentially to
|
||||
|
||||
#. Collect the fit parameters.
|
||||
#. Generate *new* input msr files based on old ones.
|
||||
|
||||
.. [#f1] For an abridged description of this format see `here <http://musr.org/xyfit/dbformat.html>`_. The DB files
|
||||
produced by ``msr2data`` can be viewed for instance with :ref:`mupp <mupp>` or |mgr|\View `see here <http://musr.org/muview/>`_, however,
|
||||
they are not completely backward-compatible to the original ``db language`` since the parameter names can be longer than five or
|
||||
six characters! In order to establish this backward compatibility (if needed) the user has to ensure the correct length of the
|
||||
parameter names in the msr files!
|
||||
|
||||
.. _msr2data-basic-usage:
|
||||
|
||||
Basic Types of Usage
|
||||
--------------------
|
||||
|
||||
Apart from numerous :ref:`optional parameters <msr2data-opt-param>` that might be set, in principle there are four different ways of calling ``msr2data``.
|
||||
These differ in how the list of runs which should be processed is supplied:
|
||||
|
||||
**msr2data <run> <extension> [optional parameters]**
|
||||
A single run number.
|
||||
**msr2data <firstRunNo> <lastRunNo> <extension> [optional parameters]**
|
||||
An interval of run numbers is specified through the first and the last run number. The condition ``<firstRunNo>`` < ``<lastRunNo>`` is not necessary.
|
||||
**msr2data \[ <runList> \] <extension> [optional parameters]**
|
||||
Where ``<runList>`` is one or a combination of the following:
|
||||
|
||||
#. ``<run0>, <run1>, <run2>, ... <runN>`` : run numbers, *e.g.* 123 124,
|
||||
#. ``<run0>-<runN>`` : a range, *e.g.* 123-125 -> 123 124 125,
|
||||
#. ``<run0>:<runN>:<step>`` : a sequence, *e.g.* 123:127:2 -> 123 125 127. ``<step>`` has to be a positive integer.
|
||||
#. A ``<runList>`` can also combine (1)-(3), *e.g.* 123 128-130 133, etc.
|
||||
|
||||
**msr2data <runListFileName> <extension> [optional parameters]**
|
||||
An ASCII file containing a list of run numbers and optional external parameters is passed to ``msr2data``. For the structure of the ASCII file
|
||||
see :ref:`below <run-list-file_structure>`.
|
||||
|
||||
All four basic types of calling ``msr2data`` contain the *mandatory* file-name ``<extension>`` passed right after the list of runs. The meaning of
|
||||
this ``<extension>`` should become clear after giving examples for all four cases:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8472 _tf_h13
|
||||
|
||||
generates the DB file ``out.db`` (can be changed by using the -o option) from ``8472_tf_h13.msr``.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8472 8474 _tf_h13
|
||||
|
||||
generates the DB file ``out.db`` (can be changed by using the -o option) from ``8472_tf_h13.msr``, ``8473_tf_h13.msr``, and ``8474_tf_h13.msr``.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data [8472 8470] _tf_h13
|
||||
|
||||
generates the DB file ``out.db`` (can be changed by using the -o option) from ``8472_tf_h13.msr`` and ``8470_tf_h13.msr``.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data [8470:8474:2] _tf_h13
|
||||
|
||||
generates the DB file ``out.db`` (can be changed by using the -o option) from ``8470_tf_h13.msr``, ``8472_tf_h13.msr``, and ``8474_tf_h13.msr``.
|
||||
|
||||
.. _run-list-file_structure:
|
||||
|
||||
Run List File Structure
|
||||
+++++++++++++++++++++++
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data run.list _tf_h13
|
||||
|
||||
generates the DB file ``out.db`` (can be changed by using the -o option) from all runs listed in the ASCII file ``run.list`` in the working directory.
|
||||
In this file it is also possible to include *external* parameters which should be put in the resulting DB file. The structure of the ``run.list`` is the following:
|
||||
|
||||
::
|
||||
|
||||
RUN VAR1 VAR2 VAR3 ...
|
||||
8460 200 27.1 46.2 ...
|
||||
8472 205 27.1 46.3 ...
|
||||
8453 210 27.2 45.9 ...
|
||||
· · · ·
|
||||
· · · ·
|
||||
· · · ·
|
||||
|
||||
*The first not commented and not empty line determines the parameter names and labels and has to be present!*
|
||||
|
||||
It is allowed to add comments (with a preceding '#') or empty lines to the run-list file.
|
||||
|
||||
The following should be mentioned together with the above examples:
|
||||
|
||||
* The output files in the examples above are only newly created if they did *not* exist before invoking ``msr2data``.
|
||||
If the files were already present the msr file data would be appended!
|
||||
* If the files have been newly created, also the DB file header is written. If the files were present before, only
|
||||
the data blocks are appended. The output of the header can either be forced or completely suppressed with the ``header``
|
||||
and ``noheader`` options as shall be seen later.
|
||||
* If the ``musrfit`` output files do not have an ``<extension>`` as specified above like ``8472.msr`` one has to call ``msr2data`` like in the following example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8472 8460 ""
|
||||
|
||||
.. _msr2data-opt-param:
|
||||
|
||||
Optional Parameters
|
||||
-------------------
|
||||
|
||||
As mentioned already above there are some optional parameters which change the behavior of ``msr2data`` and can be passed in any order. Here is a complete list:
|
||||
|
||||
**data**
|
||||
The output file format is changed to a simple column ASCII file (default output file name: out.dat).
|
||||
**new**
|
||||
An existing output file is deleted before new information is written to it.
|
||||
**header**
|
||||
Force the output of the file header even if the output file was present before.
|
||||
**noheader**
|
||||
The output of the file header is suppressed—also if the output file is newly created.
|
||||
If either both or none of the header options are given, ``msr2data`` writes the file header only to new files
|
||||
and it solely appends the data blocks to an existing output file assuming that the header is present already.
|
||||
**nosummary**
|
||||
There will be no attempt to read additional information like the temperature or the applied magnetic field from
|
||||
the data files even if these information were present there.
|
||||
**paramList <param>**
|
||||
option used to select the parameters which shall be exported. ``<param>`` is a list of parameter numbers to be exported.
|
||||
Allowed lists are: ``<startNo>-<endNo>``, *e.g.* ``1-16`` will export parameters 1 to 16. Space separated numbers, *e.g.:* ``1 3 5``.
|
||||
A combination of both is possible, *e.g.* ``1-16 19 31 62``, and so on.
|
||||
**-o<outputFileName>, -o <outputFileName>**
|
||||
The processed data will be written to the file ``<outputFileName>`` instead of the default ``out.db`` or ``out.dat``.
|
||||
If ``<outputFileName>`` is equal to none (case-insensitive) the parameter data are not appended to any output file.
|
||||
**fit**
|
||||
Additionally to the final data collection ``msr2data`` will invoke ``musrfit`` to fit the specified runs.
|
||||
All msr files are assumed to be present, none is newly generated!
|
||||
**fit-<template>[!]**
|
||||
Additionally to the final data collection ``msr2data`` will generate msr files for the runs specified in the list
|
||||
of runs and invoke :ref:`musrfit <musrfit>` for performing fits of the data. As template for the first run the file
|
||||
``<template><extension>.msr`` (or if not available: ``<template><extension>.mlog``) is used; the subsequent input
|
||||
files will be created using the msr output of the last processed runs ("chain fit"). However, if for all runs only
|
||||
the given template should be used one has to append an exclamation mark (**!**) to the ``<template>``.
|
||||
**msr-<template>**
|
||||
The same as ``fit-<template>[!]``, *without* calling ``musrfit`` and the final data collection, *i.e.* only the msr files for the given runs are generated.
|
||||
**-k**
|
||||
If specified together with the ``fit-<template>`` option, the :ref:`- -keep-mn2-output <musrfit>` option is passed to ``musrfit``.
|
||||
In the case no fits should be done, this option is ignored.
|
||||
**-t**
|
||||
In case this option is given additionally to the ``fit-<template> option``, ``musrfit`` is called with
|
||||
the :ref:`- -title-from-data-file <musrfit>` option. If no fitting is done, this option is ignored.
|
||||
|
||||
**Examples:**
|
||||
|
||||
In order to illustrate the usage of these parameters a few examples with explanations are given below:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8400 8460 _tf_h13 -oABC.db fit-8472
|
||||
|
||||
Using ``8472_tf_h13.msr`` as first template, ``msr2data`` generates subsequent msr input files ``8400_tf_h13.msr`` through ``8460_tf_h13.msr``,
|
||||
calls ``musrfit`` to perform a fit of these files and collects the results of the fits together with the DB header in the new file ``ABC.db``.
|
||||
Additionally, some information about external parameters like the temperature will be passed to ``ABC.db`` if it is present in the data files.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data [8500 8502-8504 8507] _zf fit-8472 noheader nosummary -o DEF.db
|
||||
|
||||
Using ``8472_zf.msr`` as first template, ``msr2data`` generates subsequent msr input files ``8500_zf.msr``, ``8502_zf.msr``, ``8503_zf.msr``,
|
||||
``8504_zf.msr``, and ``8507_zf.msr``, calls ``musrfit`` to perform a fit of these files and collects the results of the fits in the file ``DEF.db``
|
||||
*without* writing the DB file header or attempting to read additional information from the data files.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8595 8585 "" noheader fit-8472! -oGHI.dat data nosummary -k
|
||||
|
||||
Using ``8472.msr`` as template for all runs, ``msr2data`` generates the msr input files ``8595.msr`` through ``8585.msr``, calls ``musrfit`` with
|
||||
the option ``--keep-mn2-ouput`` to perform a fit of these files and collects the results of the fits in the column-structured ASCII file ``GHI.dat``
|
||||
*without* writing any file header or attempting to read additional information from the data files.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8472 8475 "" fit -o none
|
||||
|
||||
Take the *given* msr files ``8472.msr`` through ``8475.msr`` and call ``musrfit`` *without* finally summarizing the results.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8472 8475 _tf_h13 msr-8471!
|
||||
|
||||
Using ``8471_tf_h13.msr`` as template for all runs, ``msr2data`` generates the msr input files ``8472_tf_h13.msr`` through ``8475_tf_h13.msr``.
|
||||
*No fitting will be performed and no DB or ASCII output will be generated!*
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data [8472 8475-8479] _tf_h13 paramList 1-16 data -o bestData.dat
|
||||
|
||||
Will collect the parameters 1 to 16 from the msr-files ``8472_tf_h13.msr``, ``8475_tf_h13.msr``, ``8476_tf_h13.msr``, ``8477_tf_h13.msr``, ``8478_tf_h13.msr``,
|
||||
and ``8479_tf_h13.msr`` and write these parameters into a column like output file ``bestData.dat``.
|
||||
|
||||
.. index:: msr2-data-global-mode
|
||||
|
||||
The Global Mode
|
||||
---------------
|
||||
|
||||
Apart from all the options described :ref:`above <msr2data-opt-param>` there is another program option: **global**.
|
||||
This option changes the general behavior of ``msr2data`` in that way that instead of processing one msr file for each
|
||||
run it combines all specified runs in *one single msr file* with the possibility to define common parameters for all
|
||||
runs as well as run-specific parameters. When writing the obtained parameters to a DB file or a column-structured
|
||||
ASCII file that single msr file is read and the parameters valid for each run are extracted. The global option can be
|
||||
used in conjunction with any of the described invocations of ``msr2data`` and together with all options stated :ref:`above <msr2data-opt-param>`.
|
||||
|
||||
File Generation
|
||||
+++++++++++++++
|
||||
|
||||
The general idea of this mode is to generate a global msr file on the basis of a working single-run msr file. For this
|
||||
purpose a single-run template containing information about common and run-specific parameters should be created. These
|
||||
parameters are identified through their parameter names:
|
||||
|
||||
**run-specific parameters**
|
||||
these parameters are tagged with the current run number in the format ``%0Xu``, *i.e.* ``X`` digits with leading zeros,
|
||||
at the end of the parameter name, *e.g.* for a 4-digit-formatted run number ``alpha0123`` if the run number was 123 or
|
||||
for a 8-digit-formatted run number ``alpha00123456`` if the run number was 123456. ``X`` has to be at least 4.
|
||||
**common parameters**
|
||||
all parameters that are not run specific
|
||||
|
||||
The :ref:`FITPARAMETER block <msr-fitparameter-block>` of an exemplary template file ``8472_example.msr`` could therefore look like:
|
||||
|
||||
::
|
||||
|
||||
FITPARAMETER
|
||||
# No Name Value Step Pos_Error Boundaries
|
||||
1 Phase 35.8359 -3.94496 3.93749
|
||||
2 Asy8472 0.04501 -0.00208 0.00211 0 0.33
|
||||
3 Field 143.212 -0.27960 0.27885 100 200
|
||||
4 Rate8472 0.14245 -0.02501 0.02279 0 1
|
||||
|
||||
Here the parameters **2** and **4** would be treated as *run-specific* whereas the parameters **1** and **3** would be *common* to the original and all newly added runs.
|
||||
|
||||
Normally, within the template file there should *not* appear explicitly any run-specific parameters in the :ref:`THEORY <msr-theory-block>` and
|
||||
:ref:`FUNCTIONS <msr-functions-block>` blocks. If however, those parameters are met, ``msr2data`` will try to substitute them by mapped parameters
|
||||
and add them accordingly to the map contained in each :ref:`RUN block <msr-run-block>`.
|
||||
|
||||
When ``msr2data`` is called to generate a global msr file, *e.g.*
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8471 8470 _example msr-8472 global
|
||||
|
||||
a new msr file ``8471+global_example.msr`` is created. As can be seen in the example, the name of the global msr file always starts with the
|
||||
first specified run number followed by the ``+global`` identifier and the template ``<extension>``. The example's global FITPARAMETER block would be:
|
||||
|
||||
::
|
||||
|
||||
FITPARAMETER
|
||||
# No Name Value Step Pos_Error Boundaries
|
||||
|
||||
# Common parameters for all runs
|
||||
|
||||
1 Phase 35.8359 -3.94496 3.93749
|
||||
2 Field 143.212 -0.27960 0.27885 100 200
|
||||
|
||||
# Specific parameters for run 8471
|
||||
|
||||
3 Asy8471 0.04501 -0.00208 0.00211 0 0.33
|
||||
4 Rate8471 0.14245 -0.02501 0.02279 0 1
|
||||
|
||||
# Specific parameters for run 8470
|
||||
|
||||
5 Asy8470 0.04501 -0.00208 0.00211 0 0.33
|
||||
6 Rate8470 0.14245 -0.02501 0.02279 0 1
|
||||
|
||||
This shows that the fit parameters are reorganized in a way that the common parameters appear at the beginning of the parameter list and they are
|
||||
followed by copies of the parameters specific to each run (in the specified order!). Additionally, for each specified run new RUN blocks are
|
||||
created — for each run as many as found for the template run.
|
||||
|
||||
During this reorganization all the affected parameter occurrences are changed accordingly!
|
||||
|
||||
.. note::
|
||||
|
||||
Please be aware of the fact that comments in the template msr file are *not* propagated to the newly generated global msr file!
|
||||
|
||||
.. index:: msr2data-global-param-extraction
|
||||
|
||||
Parameter Extraction
|
||||
++++++++++++++++++++
|
||||
|
||||
After fitting some model to the specified data the fit parameters can be extracted from the global msr file to a DB or column-structured ASCII file;
|
||||
as usual this includes also parameters stored in the run data files or externally specified parameters given in a :ref:`run-list file <run-list-file_structure>`.
|
||||
In order to reach this goal the global msr file has to obey certain rules:
|
||||
|
||||
* The order of the parameters has to match the one described above, meaning the common parameters are listed first followed by
|
||||
the same number of parameters specific to each run tagged by the according run numbers at the end of the parameter names and
|
||||
having the same order as the specified list of runs.
|
||||
* The RUN blocks have to be ordered according to the list of runs to be processed.
|
||||
|
||||
Following these rules -- which is achieved most easily by generating the global msr file using ``msr2data`` as shown above -- the parameters can be extracted *e.g.* like
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8471 8470 _example global data -o globalFit.dat
|
||||
|
||||
This will read in the file ``8471+global_example.msr``, extract for each run all relevant parameters from the msr file as well as
|
||||
from the according data files (if available) and append all of them in columns to the ASCII file ``globalFit.dat``.
|
||||
|
||||
.. index:: msr2data-global-extended
|
||||
|
||||
The Extended Global Mode
|
||||
++++++++++++++++++++++++
|
||||
|
||||
If a new global input file is generated, it is also possible to do an automatic pre-analysis for each single run using the specified template first;
|
||||
afterwards the run-specific parameters of these single-run msr files are collected into the global msr file. In special cases this might be useful
|
||||
to obtain a better set of starting values for the parameters, however, in most cases it will not replace the "manual review" of the generated global
|
||||
input file. The option is activated by choosing the keyword **global+**. For example
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8471 8470 _example global+ msr-8472
|
||||
|
||||
Here, ``8472_example.msr`` is first used as template to generate the file ``8471-OneRunFit_example.msr``, then ``musrfit`` is called for it, the result
|
||||
is used to generate ``8470-OneRunFit_example.msr`` and ``musrfit`` is called for that file. Finally, the global fit file ``8471+global_example.msr`` is
|
||||
produced — including the fit results of the ``OneRunFit`` files for the run-specific parameters.
|
||||
|
||||
By appending an exclamation mark **!** to the **global+** option, the given template will be used for every new file generation (similar to the fit option
|
||||
explained before). The **+[!]** extension will be ignored, if no new global input file is generated.
|
||||
The single run msr files are *not* deleted at the moment. The information contained in them might be useful for some people. Of course the data can also
|
||||
be collected by ``msr2data``. *E.g.* in order to produce a DB file ``OneRunFits.db`` one could call
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 8471 8470 -OneRunFit_example -o OneRunFits.db
|
||||
|
||||
.. note::
|
||||
|
||||
Please be aware that the program in this mode *always* generates new single-run msr files and *always* calls ``musrfit`` for them. In case there are
|
||||
already single-run fits present, these cannot be used in conjunction with this option. The program on purpose behaves in this way in order to ensure
|
||||
the file integrity and correct parameter order within these files.
|
||||
|
||||
Known Limitations
|
||||
-----------------
|
||||
|
||||
* The indexing run number of the msr file has to be at the begin of every filename.
|
||||
* Within the data file name the ``RUN#`` has the format ``%0Xu``, *i.e.* ``X`` digits with leading zeros, and has to be the rightmost number given in this
|
||||
format in the file name. ``X`` has to be at least 4. The highest treatable run number is :math:`2^{32}-1 = 4294967295`.
|
||||
* In order to keep ``msr2data`` working properly the msr files should only contain *one* STATISTIC block at the end of the file and *one* FITPARAMETER block
|
||||
right after the TITLE — ``musrfit`` itself allows to have more creative msr files...
|
||||
* The msr-file generation from a template takes only care of runs given on the *first* line of a ``RUN block``. :ref:`ADDRUN <msr-addrun>` statements are simply
|
||||
copied! Since this is most probably *not* what one likes to do, it is suggested *not* to use the ``fit-<template>`` and ``msr-<template>`` options if
|
||||
ADDRUN statements were present in the template file.
|
||||
* ``msr2data`` will write only up to two successive empty lines in newly generated msr files. In case more subsequent empty lines are encountered in a template file,
|
||||
these are not copied! Actually, this measure is not a limitation but has been introduced to keep the msr files in a reasonable shape.
|
||||
|
||||
The Graphical User Interface for msr2data Provided by musredit
|
||||
--------------------------------------------------------------
|
||||
|
||||
:ref:`musredit <musredit-sec>`, designed especially for the manipulation of ``musrfit`` msr files and graphical front ends to ``musrfit``, offer an almost
|
||||
self-explanatory graphical user interface to ``msr2data`` depicted below:
|
||||
|
||||
.. image:: ../images/msr2data-GUI.*
|
||||
|
||||
1. and 2. Choose one of the ways to specify your list of runs as described under :ref:`basic usage <msr2data-basic-usage>`.
|
||||
|
||||
3. Give the file extension here, *e.g.* ``_zf`` for files like ``8472_zf.msr``. If the files do not have an extension this
|
||||
field stays empty. ``musredit`` takes care of passing the "" to ``msr2data`` as mentioned above.
|
||||
4. Activates the ``fit-<template>`` option if ``<template>`` is entered. In case the option ``Chain Fit`` is *not* set the
|
||||
given template will be used for the input-file generation for all runs to be fitted — otherwise the output of the first
|
||||
fit serves as template for the second and so on. The template field stays empty if *no* fits should be performed!
|
||||
5. Activates the ``-o <outputFileName>`` option if ``<outputFileName>`` is entered. If nothing is entered the default output file ``out.db`` or ``out.dat`` is used.
|
||||
|
||||
The options tags correspond essentially to the description in :ref:`optional parameters <msr2data-opt-param>`.
|
@ -1,166 +0,0 @@
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: mupp
|
||||
.. _mupp:
|
||||
|
||||
mupp - |mgr|\SR Parameter Plotter
|
||||
=================================
|
||||
|
||||
``mupp`` is a little helper program which allows to quickly plot a collection of msr-file parameters,
|
||||
as for instance generated by :ref:`msr2data <msr2data>`. It can handle ``db``- and ``dat``-files.
|
||||
Also a collection of ``msr``-files can be invoked. ``mupp`` is heavily inspired by |mgr|\View (see
|
||||
`here <http://musr.org/muview/>`_).
|
||||
|
||||
``mupp`` can be operated from within as graphical user interface or via a command line scripting interface.
|
||||
The ``mupp`` GUI can be invoked either directly from the command line or from within :ref:`musredit <musredit-sec>`.
|
||||
|
||||
.. index:: mupp-gui
|
||||
|
||||
The Graphical User Interface
|
||||
----------------------------
|
||||
|
||||
A typical setting could look like this
|
||||
|
||||
.. image:: ../images/mupp-gui-0.*
|
||||
|
||||
1. shows the list of loaded collections. A collection is defined as ``db``- or ``dat``-file (typically the
|
||||
output from :ref:`msr2data <msr2data>`). If you call the open-dialog and select a collection of
|
||||
``msr``-files, ``mupp`` will call ``msr2data`` and tries to generate a collection on-the-fly.
|
||||
2. in this list, the data-tags of the currently selected collection is presented. The data-tags can be
|
||||
directly dragged over to the ``x``- and ``y``-axis list. Another way is to select the data-tag
|
||||
wished and click ``add X`` to add the selected data-tag to the ``x``-axis list. Analogous it is done
|
||||
for the ``y``-axis.
|
||||
3. ``x``-axis list. The labels are followed by ``(-X-)`` where the number ``X`` corresponds to the
|
||||
selection it corresponds to. The numbering of the collection is as given in the collection list.
|
||||
4. ``y``-axis list. The labels are followed by ``(-X-)`` where the number ``X`` corresponds to the
|
||||
selection it corresponds to. The numbering of the collection is as given in the collection list.
|
||||
5. ``add X`` allows to add the currently selected data-tag to the ``x``-axis list.
|
||||
6. ``add Y`` allows to add the currently selected data-tag to the ``y``-axis list.
|
||||
7. ``remove X`` will remove the selected ``x``-axis tag.
|
||||
8. ``remove Y`` will remove the selected ``y``-axis tag.
|
||||
9. Often one would like to compare trends of different settings. In the above example each collections
|
||||
holds an energy scans for a given temperature. Each collection is measured at a different temperature.
|
||||
Now, instead of adding ``x``- and ``y``-axis tags for each collection, you can do the following:
|
||||
you add ``x``- and ``y``-axis data-tags for the first collection. Afterwards you select all the other
|
||||
collections of interest and click on ``Add Ditto``. ``mupp`` will then add the corresponding
|
||||
``x``- and ``y``-axis data-tags accordingly. This is less error prone and quicker!
|
||||
10. Clicking the ``Plot`` button will invoke ``mupp_plot`` (a ``ROOT`` based application) which will
|
||||
present the data, as shown here
|
||||
|
||||
.. image:: ../images/mupp-plot-0.*
|
||||
:height: 600px
|
||||
|
||||
11. ``Remove Collection``: will remove the selected collection
|
||||
12. ``Refresh Collection``: will reload the collection (``db``- or ``dat``-file). This is often useful
|
||||
during beamtime where the collection is growing run-by-run.
|
||||
13. This is the script command line. Currently it allows to perform the tasks without mouse gambling.
|
||||
In the future much more commands are planed. See the ``Help / Cmd's`` for the currently available
|
||||
commands.
|
||||
|
||||
.. index:: mupp-scripting
|
||||
|
||||
The Scripting Interface
|
||||
-----------------------
|
||||
|
||||
``mupp`` can also be operated in a scripting like manner. The use cases are plot updates during run time,
|
||||
or web-based interaction which requests figures. A script is invoked by the command line option ``-s`` (see
|
||||
:ref:`mupp command line summary <mupp-usage>`. Currently the following scripting commands are available:
|
||||
|
||||
**loadPath <dir>**
|
||||
set the load path to ``<dir>``. Bash variables like $HOME are accepted. This is the path where to look for collection files (``db``- and ``dat``-files).
|
||||
|
||||
**load <coll>**
|
||||
will load the collection ``<coll>``.
|
||||
|
||||
**selectAll**
|
||||
will select all loaded collections. This means every plot of variable x/y will be carried out to *ALL* collections.
|
||||
|
||||
**select <nn>**
|
||||
selects collection ``<nn>``, where ``<nn>`` is either the *number* of the collections, or its *name*, *e.g.*
|
||||
select YBCO-40nm-T5K-FC150mT-Escan.db.
|
||||
|
||||
**addX <label>**
|
||||
add ``<label>`` as a *x*-variable. Only *one* is allowed.
|
||||
|
||||
**addY <label(s)>**
|
||||
add ``<label(s)>`` as *y*-variable. *Multiple* labels are possible.
|
||||
|
||||
**savePath <dir>**
|
||||
set the save path to ``<dir>``. The place where the macros, and/or the plot output will be saved.
|
||||
|
||||
**plot <fln>**
|
||||
where ``<fln>`` is the file name with extension under which the plot should be saved.
|
||||
|
||||
**macro <fln>**
|
||||
where ``<fln>`` is the file name under which the root macro should be saved.
|
||||
|
||||
An example script file ``field-vs-energy.txt`` might look like this:
|
||||
|
||||
::
|
||||
|
||||
# This is a comment
|
||||
|
||||
loadPath ./
|
||||
|
||||
load YBCO-40nm-T5K-FC150mT-Escan.db
|
||||
load YBCO-40nm-T30K-FC150mT-Escan.db
|
||||
load YBCO-40nm-T60K-FC150mT-Escan.db
|
||||
load YBCO-40nm-T120K-FC150mT-Escan.db
|
||||
|
||||
selectAll
|
||||
|
||||
addX dataE
|
||||
addY Field
|
||||
|
||||
savePath ./
|
||||
plot FieldVsEnergy.pdf
|
||||
|
||||
macro FieldVsEnergy.C
|
||||
|
||||
# end
|
||||
|
||||
|
||||
.. index:: mupp-usage
|
||||
.. _mupp-usage:
|
||||
|
||||
The Usage Summary
|
||||
-----------------
|
||||
|
||||
::
|
||||
|
||||
usage: mupp [OPTIONS] [[--path <fit-param-path>] <fit-param-file-names>]
|
||||
|
||||
OPTIONS:
|
||||
-h, --help: this help
|
||||
-v, --version: current mupp version
|
||||
-s <fln>, --script <fln>: <fln> being a mupp script.
|
||||
--path <fit-param-path>: path where to look for the <fit-param-file-names>
|
||||
<fit-param-file-names>: list of file name(s) to be loaded.
|
||||
allowed formats are: db, dat, msr
|
||||
|
||||
SCRIPT COMMANDS:
|
||||
Lines starting with '#', '%', or '//' are comments and will be ignored.
|
||||
The same is true for empty lines. Comments are also allowed at the end
|
||||
for a command, i.e. loadPath ./ # the best place ever.
|
||||
|
||||
loadPath <dir> : set the load path to <dir>. Bash variables like
|
||||
$HOME are accepted.
|
||||
load <coll> : will load a collection <coll>. Currently *.db and *.dat
|
||||
are handled.
|
||||
selectAll : will select all loaded collections. Thie means every plot
|
||||
of variable x/y will be carried out to ALL collections.
|
||||
select <nn> : selects collection <nn>, where <nn> is either the number
|
||||
of the collections, or its name, e.g.
|
||||
select YBCO-40nm-T5K-FC150mT-Escan.db
|
||||
addX <label> : add <label> as a x-variable. Only one is allowed.
|
||||
addY <label(s)>: add <label(s)> as y-variable. Multiple labls are possible.
|
||||
savePath <dir> : set the save path to <dir>. The place where the macros,
|
||||
and/or the plot output will be saved.
|
||||
plot <fln> : where <fln> is the file name with extension under which
|
||||
the plot should be saved.
|
||||
macro <fln> : where <fln> is the file name under which the root macro
|
||||
should be saved.
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,681 +0,0 @@
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: MusrRoot
|
||||
|
||||
.. _MusrRoot:
|
||||
|
||||
MusrRoot - an Extensible Open File Format for |mgr|\SR
|
||||
======================================================
|
||||
|
||||
Until 2011 different |mgr|\SR file formats were used within PSI. The bulk-|mgr|\SR instruments were
|
||||
writing their data in the ``PSI-BIN`` file format, which is a fixed binary format with rather stringent
|
||||
limitations. The LE-|mgr|\SR (LEM) instrument was using a ROOT (CERN) based file format which was tightly
|
||||
tailored to the special needs of the LEM instrument. This situation was unsatisfactorily and hence it
|
||||
was decided to move forward to a open file format called ``MusrRoot`` to be described in the following.
|
||||
|
||||
Some Basics Concerning ROOT Files
|
||||
---------------------------------
|
||||
|
||||
The |mgr|\SR data acquisition systems at PSI are utilizing MIDAS (see `Midas Home Page <https://midas.triumf.ca/MidasWiki/index.php/Main_Page>`_).
|
||||
The MIDAS analyzer, which is responsible to build histograms, especially the |mgr|\SR decay histograms, makes
|
||||
it very easy to build ROOT (see `ROOT/CERN home page <https://root.cern.ch>`_ ) histogram objects (these
|
||||
are ``TH1F`` objects for |mgr|\SR decay histograms). ROOT is a ``C++`` object-oriented data mining and
|
||||
analysis frame work. These histograms can be collected and saved in ROOT files (``TFile``). In order to ease
|
||||
the understanding of the upcoming definitions, a few ROOT related things shall be summaries here. For details
|
||||
concerning the ROOT frame work documentation please check `ROOT/CERN Users Guide(s) <https://root.cern.ch/root-user-guides-and-manuals>`_
|
||||
and `ROOT/CERN Reference Guide <https://root.cern.ch/guides/reference-guide>`_.
|
||||
|
||||
ROOT files (``TFile``) are binary files which can hold any kind of objects. A ``TFile`` is organized similarly
|
||||
to a directory structure of an operating system. Within the ROOT framework, there is a ``TFile`` browser available
|
||||
which allows to inspect these files. This browser (``TBrowser``) will show all object saved in the ``TFile`` directly,
|
||||
if they derive from ``TObject``.
|
||||
|
||||
The ``MusrRoot`` file format to be described below is only using a small subset of possible ROOT objects, namely:
|
||||
|
||||
* ``TFolder``: this are the top level objects in the ``MusrRoot`` file.
|
||||
* ``TH1F``: Hold the |mgr|-decay-histograms.
|
||||
* ``TObjArray``: Holding collection of header information.
|
||||
* ``TObjString``: Holding the content of any header information.
|
||||
|
||||
Since all these objects are deriving form ``TObject``, they will be directly accessible via the ``TBrowser``-object.
|
||||
For instance, the |mgr|-decay-histograms can be directly plotted, are even fitted, out of the box.
|
||||
|
||||
MusrRoot an Extensible Open File Format for |mgr|\SR
|
||||
----------------------------------------------------
|
||||
|
||||
As mentioned before, ROOT files are open-file-format files meaning that they can contain more entries (and most probably will) than the ones specified in the following. The specified ones will be the mandatory ones for all instruments. Before defining all mandatory entries, the MusrRoot file structure shall be sketched.
|
||||
|
||||
The MusrRoot file structure looks like:
|
||||
|
||||
::
|
||||
|
||||
histos ---|
|
||||
|- DecayAnaModule ---|
|
||||
| |- hDecay001
|
||||
| |- hDecay002
|
||||
| ...
|
||||
|
|
||||
|- SCAnaModule ---|
|
||||
... |- hSampleTemperature
|
||||
|- hSampleMagneticField
|
||||
...
|
||||
RunHeader ---|
|
||||
|- RunInfo
|
||||
|- DetectorInfo ---|
|
||||
| |- Detector001
|
||||
| |- Detector002
|
||||
| ...
|
||||
|
|
||||
|- SampleEnvironmentInfo
|
||||
|- MagneticFieldEnvironmentInfo
|
||||
|- BeamlineInfo
|
||||
...
|
||||
|
||||
where ``hDecay001``, etc. are ROOT histograms (to be more specific: ``TH1F``), containing the |mgr|\SR decay histograms. There can be as many as needed, especially there is no limitation about their length. The histogram object names will be ``hDecayXXX``, where ``XXX`` (leading zero int, *i.e.* ``%03d``
|
||||
in ``C/C++`` notation, starting with '1') is the histogram number. The title and name of the histogram (see description of the ``TH1F`` ROOT class) contains the label of the histogram, like 'top', 'forward', etc. How many of these histograms are present is accessible through the ``RunInfo`` folder in which the necessary header information are found (details see next sections). The folder ``SCAnaModule`` contains histograms of some of the slow-control parameters, as for instance the sample temperature versus time, the applied field versus time, etc. Again the label of the histogram will give more specific information about its content.
|
||||
|
||||
Run Information Contained in ``RunHeader``
|
||||
++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
The ``RunHeader`` contains all needed meta-information to describe a |mgr|\SR-run. The list of the minimal number of required "folders" of the ``RunHeader`` is given in the following structure:
|
||||
|
||||
::
|
||||
|
||||
RunHeader (TFolder) ---|
|
||||
|- RunInfo (TObjArray)
|
||||
|- DetectorInfo (TObjArray)
|
||||
|- SampleEnvironmentInfo (TObjArray)
|
||||
|- MagneticFieldEnvironmentInfo (TObjArray)
|
||||
|- BeamlineInfo (TObjArray)
|
||||
|
||||
In brackets the object type is given. ``RunInfo`` contains most information relevant for the user and will be itemized in :ref:`RunInfo Overview <musr-root-overview>` and :ref:`RunInfo Required <run-info-required>`. ``DetectorInfo`` contains detector specific information, like detector name, time zero bin, etc. (details is found under :ref:`DetectorInfo Required <detector-info-required>`). ``SampleEnvironmentInfo`` (details under :ref:`SampleEnvironmentInfo Required <sample-environment-info-required>`), and ``MagneticFieldEnvironmentInfo`` (details under :ref:`MagneticFieldEnvironmentInfo Required <magnetic-field-environment-info-required>`) store additional, more detailed information concerning the sample environment. ``BeamlineInfo`` stores beamline relevant information (details under :ref:`BeamlineInfo Required <beamline-info-required>`).
|
||||
|
||||
Before elaborating more on the required items within this structure, a few words on the ROOT types used here: ``RunHeader`` is a ``TFolder`` object. All the "sub-directory" entries are of type ``TObjArray`` and collect items of type ``TObjString`` or other ``TObjArray`` (*i.e.* sub-directories and sub-sub-directories, etc.).
|
||||
|
||||
.. index:: MusrRoot-Overview
|
||||
.. _musr-root-overview:
|
||||
|
||||
``RunInfo`` Overview
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
======================== ============================ =====================================================
|
||||
Name Internal Type Comment
|
||||
======================== ============================ =====================================================
|
||||
Version ``TString`` GIT version of ``TMusrRunHeader``
|
||||
Generic Validator URL ``TString`` URL of the generic ``MusrRoot`` validation xsd-file.
|
||||
Specific Validator URL ``TString`` URL of the instrument specific validation xsd-file.
|
||||
Generator ``TString`` Program which wrote the ``MusrRoot`` file, *e.g.* ``nemu_analyzer``
|
||||
File Name ``TString`` File name of the ``MusrRoot`` file, *e.g.* ``deltat_tdc_gps_4295.root``
|
||||
Run Title ``TString``
|
||||
Run Number ``Int_t``
|
||||
Run Start Time ``TString`` ISO 8601 date time
|
||||
Run Stop Time ``TString`` ISO 8601 date time
|
||||
Run Duration ``TMusrRunPhysicalQuantity`` run duration in sec
|
||||
Laboratory ``TString`` *e.g.* PSI
|
||||
Instrument ``TString`` *e.g.* GPS
|
||||
Muon Beam Momentum ``TMusrRunPhysicalQuantity`` *e.g.* 28.1 MeV/c
|
||||
Muon Species ``TString`` positive, or negative muon
|
||||
Muon Source ``TString`` *e.g.* Target E - Low Energy Muons or "Target M" ...
|
||||
Setup ``TString``
|
||||
Comment ``TString``
|
||||
Sample Name ``TString``
|
||||
Sample Temperature ``TMusrRunPhysicalQuantity`` *e.g.* 3.21 +- 0.05 K; SP: 3.2; CF1
|
||||
Sample Magnetic Field ``TMusrRunPhysicalQuantity`` *e.g.* 350.002 +- 0.005 G; SP: 350; WXY
|
||||
No of Histos ``Int_t``
|
||||
Time Resolution ``TMusrRunPhysicalQuantity`` *e.g.* 0.1953125 ns
|
||||
RedGreen Offsets ``TIntVector`` *e.g.* 0; 20
|
||||
======================== ============================ =====================================================
|
||||
|
||||
These entries should be clear except for the ``RedGreen Offsets`` and the column "Internal Type" which shortly will be discussed before specifying the content of the other required folders.
|
||||
|
||||
#. ``RedGreen Offsets``: in case experiments are performed with external stimuli, there will be a collection of related histograms.
|
||||
For instance for electrical field experiments, there will be histograms for field on/off, doubling the number of needed histograms.
|
||||
In order to distinguish them easier in the data file, the ``RedGreen Offsets`` were introduced. One selection of histograms
|
||||
(assuming for the moment 8 detectors) will be numbered from 1 to 8 (lets say the field off ones). The other set of histograms
|
||||
(field on in this example) will then start with 21 through 28 (see table above). The same will be true for the detector information
|
||||
(see :ref:`DetectorInfo Required <detector-info-required>`). The entry ``No of Histos`` will only give 8 for the given example,
|
||||
meaning that red/green multiplication is defined rather via ``RedGreen Offsets`` than the number of histograms.
|
||||
#. Internal Types: in order to ease the handling of the ``MusrRoot`` run header, a class ``TMusrRunHeader`` is available which deals
|
||||
with it. The "Internal Type" specified, corresponds to the internal representation in within this class. In the ``MusrRoot`` file
|
||||
these entries are all saved as browsable ROOT strings (``TObjStringv). The only special type is ``TMusrRunPhysicalQuantity`` which
|
||||
is introduced to deal with physical quantities. They always can be represented in the following way:
|
||||
|
||||
::
|
||||
|
||||
<property name> <value> +- <estimated error> <unit>; SP: <demand>; <description>
|
||||
|
||||
Not all of these values are needed to be given and depending on which are given, the representation in the ``MusrRootv file will be different (handled by ``TMusrRunHeader``). Examples are given in the comment column of the table above. For details see :ref:`TMusrRunPhysicalQuantity - Possible Representations <musr-run-physical-quantity>`.
|
||||
|
||||
A mock-up ``TBrowser`` print-out would look like the one shown in the following figure. You might notice, that at the end of each entry you find a ``-@X``, where ``X`` is a number. This is an encoding of the internal type of the entry and is the price to be payed not using derived types. The next section will explain this in much more detail.
|
||||
|
||||
.. image:: ../images/MusrRoot-RunInfo.*
|
||||
|
||||
``TMusrRunHeader`` mock up. The red shaded entries are of type ``TMusrRunPhysicalQuantity``
|
||||
|
||||
.. _musr-run-header-concept:
|
||||
|
||||
TMusrRunHeader Concept
|
||||
----------------------
|
||||
|
||||
The different |mgr|\SR instruments need different information to be written into the data file (next to the most important ones: the histograms). The above defined properties are the *minimal number of required* ones. There are different possible approaches to deal with it on the implementation level.
|
||||
|
||||
* A base class dealing with *minimal* required standard is defined. Afterwards for each instrument a class
|
||||
is derived which is extending the base class to the needs of the instrument.
|
||||
* The base class is defined in a more abstract way, and some external, text-based description is given which defines the details of the instrument.
|
||||
|
||||
Even though the first approach is very clean, it would mean a lot of maintenance work. The 2nd approach is slightly more demanding for the handling class (``TMusrRunHeader`` and helper classes), but having the advantage of easy maintainability and expandability. The idea is that all header information can be classified into 7 groups (see previous and following section(s))
|
||||
|
||||
#. Strings, represented by ``TString``
|
||||
#. Integers, represented by ``Int_t``
|
||||
#. Floating point numbers, represented by ``Double_t``
|
||||
#. Physical quantities, represented by :ref:`TMusrRunPhysicalQuantity - Possible Representations <musr-run-physical-quantity>`
|
||||
#. Collection of strings, represented by ``TStringVector``
|
||||
#. Collection of integers, represented by ``TIntVector``
|
||||
#. Collection of floating point numbers, represented by ``TDoubleVector``
|
||||
|
||||
These properties can be collected by themselves in form of vectors. This way any needed information can be written into the ROOT file. The class ``TMusrRunHeader`` is implementing this run header concept. In following section code snippets will be discussed, showing how this is used on level of the ``MIDAS`` analyzer, ``musrfit`` reader routine, and ``any2many`` conversion routines. The section :ref:`Validation <musr-root-validation>` will discuss how to validate ``MusrRoot`` files.
|
||||
|
||||
|
||||
User Interface for MusrRoot Run Header
|
||||
++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
There are two things needed to deal with the ``MusrRoot`` run header, namely writing it and reading it. I will start with the writing as will be done in the ``MIDAS`` analyzer.
|
||||
|
||||
Writing a MusrRoot Run Header
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
An example program ``write_musrRoot_runHeader`` which is writing a full run header is part of the ``musrfit`` package. Here I will concentrate just on the most essential parts. First one needs an instance of ``TMusrRunHeader``
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
TMusrRunHeader *header = new TMusrRunHeader();
|
||||
TMusrRunPhysicalQuantity prop;
|
||||
|
||||
``header`` is the instance of ``TMusrRunHeader``. ``prop`` is an instance of ``TMusrRunPhysicalQuantity`` which will be needed further down in the description. In the next step some run header entries will be added
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
header->Set("RunInfo/File Name", "deltat_tdc_gps_2871.root");
|
||||
header->Set("RunInfo/Run Title", "here comes the run title");
|
||||
header->Set("RunInfo/Run Number", 2871);
|
||||
|
||||
Adding information is done via the multiple overloaded ``Set(<pathName>,<value>)`` method. Here ``<pathName>`` is a string representing the "path" like representation in the ``MusrRoot`` file structure, followed by the "value" to be set, *e.g.* "=File Name=". ``<value>`` can be any of the types listed at the beginning of :ref:`Sec. TMusrRunHeader Concept <musr-run-header-concept>`. Here a few examples how to set ``TMusrRunPhysicalQuantity``.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
prop.Set("Sample Temperature", 3.2, 3.21, 0.05, "K", "CF1");
|
||||
header->Set("RunInfo/Sample Temperature", prop);
|
||||
|
||||
prop.Set("Time Resolution", 0.1953125, "ns", "TDC 9999");
|
||||
header->Set("RunInfo/Time Resolution", prop);
|
||||
|
||||
prop.Set("CF3", MRH_UNDEFINED, 3.27, 0.09, "K", "strange temperature");
|
||||
header->Set("SampleEnvironmentInfo/CF3", prop);
|
||||
|
||||
Here ``TMusrRunPhysicalQuantity`` objects are fed via the use of the overloaded set-method. For details see :ref:`TMusrRunPhysicalQuantity - Possible Representations <musr-run-physical-quantity>`.
|
||||
|
||||
To set some property within "sub-sub-directories" it would like this:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
header->Set("DetectorInfo/Detector001/Time Zero Bin", 3419.0);
|
||||
|
||||
To write the whole run header into a file would look something like this:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
TFile *f = new TFile(fileName, "RECREATE", "write_musrRoot_runHeader");
|
||||
if (f->IsZombie()) {
|
||||
delete f;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// create the needed TFolder object
|
||||
TFolder *runHeader = new TFolder("RunHeader", "MusrRoot Run Header Info");
|
||||
|
||||
// create the "directory" structure
|
||||
if (header->FillFolder(runHeader)) {
|
||||
runHeader->Write(); // write run header to file
|
||||
}
|
||||
|
||||
f->Close();
|
||||
|
||||
Reading a MusrRoot Run Header
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The following code snippet shows how the extract the full run header from the ``MusrRoot`` file.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
TFile *f = new TFile(fileName, "READ", "read_musrRoot_runHeader");
|
||||
if (f->IsZombie()) {
|
||||
delete f;
|
||||
return -1;
|
||||
}
|
||||
|
||||
TFolder *runHeader = 0;
|
||||
f->GetObject("RunHeader", runHeader);
|
||||
if (runHeader == 0) {
|
||||
cerr << endl << ">> **ERROR** Couldn't get top folder RunHeader";
|
||||
closeFile(f);
|
||||
return -1;
|
||||
}
|
||||
|
||||
TMusrRunHeader *header = new TMusrRunHeader(fileName);
|
||||
|
||||
if (!header->ExtractAll(runHeader)) {
|
||||
cerr << endl << ">> **ERROR** couldn't extract all RunHeader information";
|
||||
closeFile(f);
|
||||
return -1;
|
||||
}
|
||||
|
||||
f->Close();
|
||||
delete f;
|
||||
|
||||
|
||||
The routine ``ExtractAll(TFolder *runHeader)`` decodes all the ``TObjString`` objects and fills internal data structures. This means when reading a MusrRoot -file the above handling is always needed. After the ``ExtractAll`` call, parameters can be extracted via the getter routines available. For instance to read the Run Number, the code would look like
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
Bool_t ok;
|
||||
Int_t ival;
|
||||
header->Get("RunInfo/Run Number", ival, ok);
|
||||
if (ok)
|
||||
cout << endl << "Run Number: " << ival;
|
||||
else
|
||||
cout << endl << "**ERROR** Couldn't obtain the 'Run Number'.";
|
||||
|
||||
Reading a ``TMusrRunPhysicalQuantity`` object, *e.g.* the sample temperature looks like this
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
TMusrRunPhysicalQuantity prop;
|
||||
|
||||
header->Get("RunInfo/Sample Temperature", prop, ok);
|
||||
if (ok) {
|
||||
cout << endl << "Sample Temperature: " << prop.GetValue() << " +- ";
|
||||
cout << prop.GetError() << " " << prop.GetUnit().Data();
|
||||
cout << "; SP: " << prop.GetDemand() << "; " << prop.GetDescription().Data();
|
||||
} else {
|
||||
cout << endl << "**ERROR** Couldn't obtain the 'Sample Temperature'.";
|
||||
}
|
||||
|
||||
.. index:: MusrRoot-Validation
|
||||
.. _musr-root-validation:
|
||||
|
||||
Validation of a MusrRoot File
|
||||
+++++++++++++++++++++++++++++
|
||||
|
||||
Since ``MusrRoot`` is an open and extensible file format a mechanism is needed to validate that a given file is indeed holding the minimum of required entries. To check this the following scheme is implemented in the program ``musrRootValidation``:
|
||||
|
||||
.. image:: ../images/MusrRootValidationScheme.*
|
||||
|
||||
``MusrRoot`` validation scheme
|
||||
|
||||
In the following this validation scheme will be discussed as it is implemented in ``musrRootValidation``:
|
||||
|
||||
#. It is checked if the given file name is a ``TFile``
|
||||
#. The file structure is recursively parsed and mapped into an temporary XML file. XML is used
|
||||
since there are ample of parser and validation frameworks at hand. For details check any decent
|
||||
book about XML. Here the ``libxml2`` is used, because also ROOT is requiring it.
|
||||
#. In a next step the XML file (holding the structure of the supposed ``MusrRoot`` file is validated
|
||||
against a XML schema. The minimum of required entries is described by ``MusrRoot.xsd`` which is
|
||||
part of ``musrfit`` but also available from the PSI/LMU web-page.
|
||||
#. If the schema validation is successful additional semantic checks (like is the number of decay
|
||||
histograms the same as the number of detector entries, etc.) will be preformed.
|
||||
|
||||
This validation scheme is useful for people which define instrument specific extensions of the base ``MusrRoot``, as for instance the LEM instrument at PSI. It is also useful for people writing file converters in order to cross check if the generated file is valid.
|
||||
|
||||
.. _run-info-required:
|
||||
|
||||
RunInfo (Required)
|
||||
------------------
|
||||
|
||||
========================== ============================= =====================================================
|
||||
Name Internal Type Comment
|
||||
========================== ============================= =====================================================
|
||||
Version ``TString`` GIT version of ``TMusrRunHeader``
|
||||
Generic Validator URL ``TString`` URL of the generic ``MusrRoot`` validation xsd-file.
|
||||
*e.g.* `<http://lmu.web.psi.ch/facilities/software/MusrRoot/Validation/MusrRoot.xsd>`_
|
||||
Specific Validator URL ``TString`` URL of the instrument specific validation xsd-file.
|
||||
*e.g.* for LEM: `<http://lmu.web.psi.ch/facilities/software/MusrRoot/Validation/MusrRootLEM.xsd>`_
|
||||
Generator ``TString`` Program which wrote the ``MusrRoot`` file, *e.g.* ``nemu_analyzer``
|
||||
File Name ``TString`` File name of the ``MusrRoot`` file, *e.g.* ``deltat_tdc_gps_4295.root``
|
||||
Run Title ``TString``
|
||||
Run Number ``Int_t``
|
||||
Run Start Time ``TString`` ISO 8601 date time
|
||||
Run Stop Time ``TString`` ISO 8601 date time
|
||||
Run Duration ``TMusrRunPhysicalQuantity`` run duration in sec
|
||||
Laboratory ``TString`` *e.g.* PSI
|
||||
Instrument ``TString`` *e.g.* GPS
|
||||
Muon Beam Momentum ``TMusrRunPhysicalQuantity`` *e.g.* 28.1 MeV/c
|
||||
Muon Species ``TString`` poitive or negative muon
|
||||
Muon Source ``TString`` *e.g.* "Target E - Low Energy Muons" or "Target M" ...
|
||||
Setup ``TString``
|
||||
Comment ``TString``
|
||||
Sample Name ``TString``
|
||||
Sample Temperature ``TMusrRunPhysicalQuantity`` *e.g.* 3.21 +- 0.05 K; SP: 3.2; CF1
|
||||
Sample Magnetic Field ``TMusrRunPhysicalQuantity`` *e.g.* 350.002 +- 0.005 G; SP: 350; WEW
|
||||
No of Histos ``Int_t``
|
||||
Time Resolution ``TMusrRunPhysicalQuantity`` *e.g.* 0.1953125 ns
|
||||
RedGreen Offsets ``TIntVector`` *e.g.* 0; 20
|
||||
========================== ============================= =====================================================
|
||||
|
||||
.. _detector-info-required:
|
||||
|
||||
DetectorInfo (Required)
|
||||
-----------------------
|
||||
|
||||
The ``DetectorInfo`` is organized in a sub-tree like
|
||||
|
||||
::
|
||||
|
||||
DetectorInfo ---|
|
||||
|- Detector001
|
||||
|- Detector002
|
||||
...
|
||||
|
||||
|
||||
|
||||
For each histogram in the ``histos/DecayAnaModule`` corresponds detector entry here.
|
||||
|
||||
The numbering of the detectors has to correspond the its histogram, *e.g.* ``hDecay023 <=> Detector023``, *i.e.* potentially discontinuous to show red / green breaks.
|
||||
|
||||
``Detector<XXX>`` has the elements
|
||||
|
||||
========================== ============================= =====================================================
|
||||
Name Internal Type Comment
|
||||
========================== ============================= =====================================================
|
||||
Name ``TString`` detector name, *e.g.* Left-NPP
|
||||
Histo Number ``Int_t`` histogram number. This number corresponds to the histogram
|
||||
number in the ``histos/DecayAnaModule`` sub-tree.
|
||||
Histo Length ``Int_t`` length of the histogram (in bins)
|
||||
Time Zero Bin ``Double_t`` The type is ``Double_t`` since for the high-field spectrometer
|
||||
at PSI an ``Int_t`` representation would be not good enough.
|
||||
First Good Bin ``Int_t``
|
||||
Last Good Bin ``Int_t``
|
||||
========================== ============================= =====================================================
|
||||
|
||||
.. _sample-environment-info-required:
|
||||
|
||||
SampleEnvironmentInfo (Required)
|
||||
--------------------------------
|
||||
|
||||
Here only a single entry is required, namely
|
||||
|
||||
========================== ============================= =====================================================
|
||||
Name Internal Type Comment
|
||||
========================== ============================= =====================================================
|
||||
Cryo ``TString`` name of the used cryostat/oven, *e.g.* ``Konti-2``
|
||||
========================== ============================= =====================================================
|
||||
|
||||
.. _magnetic-field-environment-info-required:
|
||||
|
||||
MagneticFieldEnvironmentInfo (Required)
|
||||
---------------------------------------
|
||||
|
||||
Here only a single entry is required, namely
|
||||
|
||||
========================== ============================= =====================================================
|
||||
Name Internal Type Comment
|
||||
========================== ============================= =====================================================
|
||||
Magnet Name ``TString`` name of the used magnet, *e.g.* ``WEW``.
|
||||
In case of ZF measurements, there might be an entry like ZF.
|
||||
========================== ============================= =====================================================
|
||||
|
||||
.. _beamline-info-required:
|
||||
|
||||
BeamlineInfo (Required)
|
||||
-----------------------
|
||||
|
||||
Here only a single entry is required, namely
|
||||
|
||||
========================== ============================= =====================================================
|
||||
Name Internal Type Comment
|
||||
========================== ============================= =====================================================
|
||||
Name ``TString`` name of the beamline, *e.g.* ``piM3.2``
|
||||
========================== ============================= =====================================================
|
||||
|
||||
Exhaustive MusrRoot Tree Including Everything Required
|
||||
------------------------------------------------------
|
||||
|
||||
Here it is assumed that there are hypothetical *red / green data* with electric field on/off and light on/off,
|
||||
and hence 4 data sets per detector, and 8 detectors of the instrument: ``left/forward``, ``top/forward``, ``right/forward``,
|
||||
``bottom/forward``, ``left/backward``, ``top/backward``, ``right/backward``, ``bottom/backward``. To show the whole
|
||||
tree structure, it will be split in the representation afterwards, but keep in mind: this will be all part of a
|
||||
single ``MusrRoot`` file. I will add comments in the tree structure by the symbol ``#``. Lets start with the |mgr|\SR data histograms:
|
||||
|
||||
::
|
||||
|
||||
histos -|
|
||||
|- DecayAnaModule -|
|
||||
|- hDecay001 # left/forward, electric field off, light off
|
||||
|- hDecay002 # top/forward, electric field off, light off
|
||||
|- hDecay003 # right/forward, electric field off, light off
|
||||
|- hDecay004 # bottom/forward, electric field off, light off
|
||||
...
|
||||
|- hDecay007 # right/backward, electric field off, light off
|
||||
|- hDecay008 # bottom/backward, electric field off, light off
|
||||
|- hDecay011 # left/forward, electric field on, light off
|
||||
|- hDecay012 # top/forward, electric field on, light off
|
||||
|- hDecay013 # right/forward, electric field on, light off
|
||||
|- hDecay014 # bottom/forward, electric field on, light off
|
||||
...
|
||||
|- hDecay017 # right/backward, electric field on, light off
|
||||
|- hDecay018 # bottom/backward, electric field on, light off
|
||||
|- hDecay021 # left/forward, electric field off, light on
|
||||
|- hDecay022 # top/forward, electric field off, light on
|
||||
|- hDecay023 # right/forward, electric field off, light on
|
||||
|- hDecay024 # bottom/forward, electric field off, light on
|
||||
...
|
||||
|- hDecay027 # right/backward, electric field off, light on
|
||||
|- hDecay028 # bottom/backward, electric field off, light on
|
||||
|- hDecay031 # left/forward, electric field on, light on
|
||||
|- hDecay032 # top/forward, electric field on, light on
|
||||
|- hDecay033 # right/forward, electric field on, light on
|
||||
|- hDecay034 # bottom/forward, electric field on, light on
|
||||
...
|
||||
|- hDecay037 # right/backward, electric field on, light on
|
||||
|- hDecay038 # bottom/backward, electric field on, light on
|
||||
...
|
||||
|
||||
*Comments*: as can be seen the histograms are continuous numbered until there is a red / green mode switch where
|
||||
the histogram number "jumps" (*e.g.* from ``008`` to ``011``). In order to fill in the different red / green
|
||||
histograms an offset is added (here 10, 20, and 30).
|
||||
|
||||
Next the whole ``RunHeader``. Here the information will be grouped in different folders collecting related information,
|
||||
like general run info, detector info, sample and magnetic field environment info, beamline info, etc.
|
||||
|
||||
::
|
||||
|
||||
RunInfo:
|
||||
000 - Version: $Id: TMusrRunHeader.cpp 5092 2012-03-13 07:47:00Z nemu $ -@0
|
||||
001 - Generic Validator URL: http://lmu.web.psi.ch/facilities/software/MusrRoot/Validation/MusrRoot.xsd -@0
|
||||
002 - Specific Validator URL: http://lmu.web.psi.ch/facilities/software/MusrRoot/Validation/MusrRootLEM.xsd -@0
|
||||
003 - Generator: nemu_analyzer -@0
|
||||
004 - File Name: lem12_his_0234.root -@0
|
||||
005 - Run Title: here comes the run title -@0
|
||||
006 - Run Number: 234 -@1
|
||||
007 - Run Start Time: 2012-04-19 14:25:22 -@0
|
||||
008 - Run Stop Time: 2012-04-19 19:13:47 -@0
|
||||
009 - Run Duration: 17305 sec -@3
|
||||
010 - Laboratory: PSI -@0
|
||||
011 - Instrument: LEM -@0
|
||||
012 - Muon Beam Momentum: 28.1 MeV/c -@3
|
||||
013 - Muon Species: positive muon -@0
|
||||
014 - Muon Source: target E -@0
|
||||
015 - Setup: a very special setup -@0
|
||||
016 - Comment: nothing more to be said -@0
|
||||
017 - Sample Name: the best ever -@0
|
||||
018 - Sample Temperature: 3.21 +- 0.05 K; SP: 3.2 -@3
|
||||
019 - Sample Magnetic Field: 350.002 +- 0.005 G; SP: 350 -@3
|
||||
020 - No of Histos: 8 -@1
|
||||
021 - Time Resolution: 0.1953125 ns; TDC 9999 -@3
|
||||
022 - RedGreen Offsets: 0; 10; 20; 30
|
||||
DetectorInfo:
|
||||
Detector001:
|
||||
023 - Name: Left/Forward - electric field off, light off -@0
|
||||
024 - Histo Number: 1 -@1
|
||||
025 - Histo Length: 66661 -@1
|
||||
026 - Time Zero Bin: 3419.000000 -@2
|
||||
027 - First Good Bin: 3419 -@1
|
||||
028 - Last Good Bin: 66661 -@1
|
||||
Detector002:
|
||||
029 - Name: Top/Forward - electric field off, light off -@0
|
||||
030 - Histo Number: 2 -@1
|
||||
031 - Histo Length: 66661 -@1
|
||||
032 - Time Zero Bin: 3419.000000 -@2
|
||||
033 - First Good Bin: 3419 -@1
|
||||
034 - Last Good Bin: 66661 -@1
|
||||
|
||||
...
|
||||
|
||||
Detector038:
|
||||
213 - Name: Bottom/Backward - electric field on, light on -@0
|
||||
214 - Histo Number: 38 -@1
|
||||
215 - Histo Length: 66661 -@1
|
||||
216 - Time Zero Bin: 3419.000000 -@2
|
||||
217 - First Good Bin: 3419 -@1
|
||||
218 - Last Good Bin: 66661 -@1
|
||||
|
||||
SampleEnvironmentInfo:
|
||||
219 - Cryo: Konti-1 -@0
|
||||
220 - Insert: X123 -@0
|
||||
221 - Orientation: c-axis perp spin, perp field. spin perp field -@0
|
||||
MagneticFieldEnvironmentInfo:
|
||||
222 - Magnet Name: WEW -@0
|
||||
223 - Current: 17.34 A -@3
|
||||
BeamlineInfo:
|
||||
224 - Name: muE4 -@0
|
||||
ScalerInfo:
|
||||
225 - Ip: 12332123 -@1
|
||||
RunSummary:
|
||||
0000 - Wed Oct 5 01:30:37 2011 Run 2856 started.
|
||||
0001 - Wed Oct 5 02:02:51 2011 Run 2856 stopped.
|
||||
0002 -
|
||||
0003 - LCO, T=170.02(K), wTF ~30(G)/5.18(A), Tr/Sa=15.02/8.50(kV), E=5.63(keV), LEDb off, BP off
|
||||
0004 - =========================================================================================
|
||||
0005 -
|
||||
0006 - #BUC---- B e g i n of User Comment ------ Do not edit this line
|
||||
0007 - #EUC---- E n d of User Comment ------ Do not edit this line
|
||||
0008 -
|
||||
0009 - ====================== E v e n t definition =========================
|
||||
0010 -
|
||||
0011 - Events:
|
||||
0012 - Event_0: (BC)-MCP1-(e+); Event_1:( BC)-TD-MCP2-(e+); Event_2: LEmuSR, (BC)-TD-e
|
||||
...
|
||||
|
||||
|
||||
|
||||
*Comment*: the last sub-tree ``RunSummary`` is not following ``TMusrRunHeader`` rule ``<number> - <label>: <value> -@<type>``.
|
||||
It is added in the instrument analyzer directly by other means than the ``TMusrRunHeader::Set``-method. This is no problem!
|
||||
Since ``RunSummary`` is not part of the required ``MusrRoot``-file. One is quite free in adding any ROOT based information here.
|
||||
|
||||
.. index:: MusrRoot-TMusrRunPhysicalQuantity
|
||||
.. _musr-run-physical-quantity:
|
||||
|
||||
TMusrRunPhysicalQuantity - Possible Representations
|
||||
---------------------------------------------------
|
||||
|
||||
A physical property can be described as
|
||||
|
||||
::
|
||||
|
||||
<property name>: <value> +- <estimated error> <unit>; SP: <demand>; <description>
|
||||
|
||||
where ``<property name>`` is the name of the quantity, *e.g.* Sample Temperature, ``<value>`` the value
|
||||
of the quantity, ``<estimated error>`` the error estimate, *e.g.* the standard deviation, ``<unit>`` the unit,
|
||||
*e.g.* K, ``<demand>`` a demand value, *e.g.* the set point of the temperature. ``<description>`` is a
|
||||
possible additional comment for this quantity.
|
||||
|
||||
.. note::
|
||||
|
||||
Not *all* of these quantities are always needed. The list of handled combination are given
|
||||
hereafter together with the ``C++`` code snipped how to set it. It is assumed that ``TMusrRunPhysicalQuantity prop;``
|
||||
is somewhere defined.
|
||||
|
||||
**Possibility 1**
|
||||
|
||||
::
|
||||
|
||||
<property name>: <value> <unit> [; <description>]
|
||||
|
||||
Code snippet:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
prop.Set("Muon Beam Momentum", 28.1, "MeV/c");
|
||||
header->Set("RunInfo/Muon Beam Momentum", prop);
|
||||
|
||||
prop.Set("Time Resolution", 0.1953125, "ns", "TDC 9999");
|
||||
header->Set("RunInfo/Time Resolution", prop);
|
||||
|
||||
Result in the ``RunHeader/RunInfo``:
|
||||
|
||||
::
|
||||
|
||||
011 - Muon Beam Momentum: 28.1 MeV/c -@3
|
||||
013 - Time Resolution: 0.1953125 ns; TDC 9999 -@3
|
||||
|
||||
The number on front of the token (*e.g.* ``011`` in front of Muon Beam Momentum) will depend on the position where
|
||||
the entry has been added. The last token, ``-@3``, is the encoding of the type: here ``TMusrRunPhysicalQuantity``.
|
||||
|
||||
**Possibility 2**
|
||||
|
||||
::
|
||||
|
||||
<property name>: <val> +- <err> <unit>[; <description>]
|
||||
|
||||
Code snippet:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
prop.Set("CF3", MRH_UNDEFINED, 3.27, 0.09, "K", "strange temperature");
|
||||
header->Set("SampleEnvironmentInfo/CF3", prop);
|
||||
|
||||
Result in the ``RunHeader/SampleEnvironmentInfo``:
|
||||
|
||||
::
|
||||
|
||||
033 - CF3: 3.27 +- 0.09 K; strange temperature -@3
|
||||
|
||||
**Possibility 3**
|
||||
|
||||
::
|
||||
|
||||
<property name>: <val> <unit>; SP: <demand>[; <description>]
|
||||
|
||||
Code snippet:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
prop.Set("CF4", 3.25, 3.28, "K");
|
||||
header->Set("SampleEnvironmentInfo/CF4", prop);
|
||||
|
||||
prop.Set("CF5", 3.26, 3.29, "K", "another strange temperature");
|
||||
header->Set("SampleEnvironmentInfo/CF5", prop);
|
||||
|
||||
Result in the ``RunHeader/SampleEnvironmentInfo``:
|
||||
|
||||
::
|
||||
|
||||
034 - CF4: 3.28 K; SP: 3.25 -@3
|
||||
035 - CF5: 3.29 K; SP: 3.26; another strange temperature -@3
|
||||
|
||||
**Possibility 4**
|
||||
|
||||
::
|
||||
|
||||
<property name>: <value> +- <estimated error> <unit>; SP: <demand>; <description>
|
||||
|
||||
Code snippet:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
prop.Set("Sample Magnetic Field", 350.0, 350.002, 0.005, "G", "WXY");
|
||||
header->Set("RunInfo/Sample Magnetic Field", prop);
|
||||
|
||||
Result in the ``RunHeader/SampleEnvironmentInfo``:
|
||||
|
||||
::
|
||||
|
||||
017 - Sample Magnetic Field: 350.002 +- 0.005 G; SP: 350.0; WXY -@3
|
@ -1,515 +0,0 @@
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: musredit
|
||||
|
||||
.. _musredit-sec:
|
||||
|
||||
``musredit``: the GUI Based Interface to ``musrfit``
|
||||
====================================================
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
.. _Qt: https://qt.io
|
||||
|
||||
``musredit`` is an editor which also provide a graphical user interface to the programs contained in the ``musrfit`` suite and are intended
|
||||
to help the user handle ``musrfit`` msr files. It is implemented in ``C++`` and use the `Qt`_ framework. ``musredit`` is based on Qt 4.6 or Qt 5.6 (or above).
|
||||
The Qt 5.6 version of ``musredit`` will be actively developed, whereas the Qt 4.x version will only get bug fixing and eventually will be dropped.
|
||||
On this documentation page only the features related to ``musrfit`` are described — the basic editor functions which should be self-explanatory are *not*.
|
||||
``musrgui`` is an outdated early version of ``musredit`` and will not described anymore. If still in use, the user is urged to switch to ``musredit``.
|
||||
|
||||
.. note::
|
||||
|
||||
Before going on using ``musredit`` it is strongly recommended to read the :ref:`manual of musrfit <user-manual>` first!
|
||||
|
||||
Available Executable, Configuration Files and their Basic Usage
|
||||
----------------------------------------------------------------
|
||||
|
||||
musredit (musrgui)
|
||||
++++++++++++++++++
|
||||
|
||||
``musredit`` (``musrgui``) is the editor executable. If called from within a shell it accepts a few optional parameters:
|
||||
|
||||
**<msr-files>**
|
||||
File names of the msr files that should be opened in separate editor tabs on startup of ``musredit``.
|
||||
**- -help**
|
||||
Displays a small help notice in the shell explaining the basic usage of the program.
|
||||
**- -version**
|
||||
Prints the version number of ``musredit``.
|
||||
|
||||
If called without any parameters an empty editor window opens.
|
||||
|
||||
.. index:: musredit_startup
|
||||
|
||||
musredit_startup.xml
|
||||
++++++++++++++++++++
|
||||
|
||||
``musredit_startup.xml`` is the configuration file located under ``$HOME\.musrfit\musredit``. It is also possible to have another version
|
||||
of this file in the working directory which then will be used!
|
||||
|
||||
In this file the following ``XML`` tags are allowed to define settings and might proof useful for all users of ``musredit``:
|
||||
|
||||
**<general></general>**
|
||||
set the default paths to executable and files in this environment
|
||||
|
||||
**<exec_path>PATH_TO_EXEC</exec_path>**
|
||||
set the path ``PATH_TO_EXEC`` where the executable ``musrfit``, ``musrview``, ``musrt0``, etc. can be found (inside the ``<general>`` environment)
|
||||
**<default_save_path>SAVE_PATH</default_save_path>**
|
||||
specify the path ``SAVE_PATH`` where ``musredit`` point by default when opening and saving msr files (inside the ``<general>`` environment). Default is the current directory.
|
||||
**<msr_default_file_path>MSR_DEF_PATH</msr_default_file_path>**
|
||||
set the path ``MSR_DEF_PATH`` where the default msr files provided by ``musredit`` are stored (inside the ``<general>`` environment)
|
||||
**<timeout>3600</timeout>**
|
||||
timeout in seconds after which :ref:`musrview <musrview>` canvas will automatically quit. A value of 0 or
|
||||
a negative number will keep the ``musrview`` canvas open without self-determination.
|
||||
**<keep_minuit2_output>y/n</keep_minuit2_output>**
|
||||
flag indicating if the ``MINUIT2`` output shall be kept per msr-file ('y') or only for the current msr-file ('n').
|
||||
**<dump_ascii>y/n</dump_ascii>**
|
||||
flag indicating if ``musrfit`` shall dump fit data into ascii format. See help of :ref:`musrfit <musrfit>`.
|
||||
**<dump_root>y/n</dump_root>**
|
||||
flag indicating if ``musrfit`` shall dump fit data into root format. See help of :ref:`musrfit <musrfit>`.
|
||||
**<title_from_data_file>y/n</title_from_data_file>**
|
||||
specify if ``musrfit`` should be called with the ``-t`` option by default (inside the ``<general>`` environment)
|
||||
**<chisq_pre_run_block>y/n</chisq_pre_run_block>**
|
||||
flag indicating if per-run chisq shall be written into the msr-output-file.
|
||||
**<estimate_n0>y/n</estimate_n0>**
|
||||
flag indicating if for a single histogram fit :math:`N_0` shall be estimated before the fit procedure starts.
|
||||
**<musrview_show_fourier>y/n</musrview_show_fourier>**
|
||||
flag indicating if ``musrview`` will directly present the Fourier transform rather than the time domain data.
|
||||
**<musrview_show_avg>y/n</musrview_show_avg>**
|
||||
flag indicating if ``musrview`` will directly present averaged data, typically used for Fourier power spectra.
|
||||
**<enable_musrt0>y/n</enable_musrt0>**
|
||||
specify if :ref:`musrt0 <musrt0>` can be called from within ``musredit`` (inside the ``<general>`` environment)
|
||||
|
||||
**<font_settings></font_settings>**
|
||||
set the default font in this environment
|
||||
|
||||
**<font_name>FONT</font_name>**
|
||||
specify the name of the font ``FONT`` to be used by default in ``musredit`` (inside the ``<font_settings>`` environment)
|
||||
**<font_size>N</font_size>**
|
||||
specify the size ``N`` of the font to be used by default in ``musredit`` (inside the ``<font_settings>`` environment)
|
||||
|
||||
**<msr_file_defaults></msr_file_defaults>**
|
||||
put the default settings for newly created msr files in this environment
|
||||
|
||||
**<beamline>BL</beamline>**
|
||||
set the name of the muon beamline ``BL`` here (inside a ``<msr_file_defaults>`` environment)
|
||||
**<institute>INST</institute>**
|
||||
set the name of the facility ``INST`` where the beamline ``BL`` is located. Valid settings are ``PSI``, ``RAL``, ``JPARC``, and ``TRIUMF`` (inside a ``<msr_file_defaults>`` environment)
|
||||
**<file_format>FF</file_format>**
|
||||
specify the default data file format ``FF`` here. Valid formats are ``NEXUS``, ``MUSR-ROOT``, ``ROOT-NPP``, ``ROOT-PPC``, ``PSI-BIN``, ``PSI-MDU``, ``MDU-ASCII``, ``WKM``, ``MUD``, ``ASCII``, and ``DB`` (inside a ``<msr_file_defaults>`` environment)
|
||||
**<lifetime_correction>y/n</lifetime_correction>**
|
||||
choose if by default the ``lifetimecorrection`` option should be set (inside a ``<msr_file_defaults>`` environment)
|
||||
|
||||
**<msr2data_defaults></msr2data_defaults>**
|
||||
define the default options for calling :ref:`msr2data <msr2data>` in this environment; the options set here are ticked by default in the graphical interface of ``musredit``.
|
||||
|
||||
**<chain_fit>y/n</chain_fit>**
|
||||
(un)set the chain fit (!) option (inside a ``<msr2data_defaults>`` environment)
|
||||
**<write_data_header>y/n</write_data_header>**
|
||||
(un)set the noheader option (inside a ``<msr2data_defaults>`` environment)
|
||||
**<ignore_data_header_info>y/n</ignore_data_header_info>**
|
||||
(un)set the nosummary option (inside a ``<msr2data_defaults>`` environment)
|
||||
**<keep_minuit2_output>y/n</keep_minuit2_output>**
|
||||
(un)set the ``-k`` option (inside a ``<msr2data_defaults>`` environment)
|
||||
**<write_column_data>y/n</write_column_data>**
|
||||
(un)set the ``data`` option (inside a ``<msr2data_defaults>`` environment)
|
||||
**<create_msr_file_only>y/n</create_msr_file_only>**
|
||||
(un)set the ``msr`` option in case a template run is specified (inside a ``<msr2data_defaults>`` environment)
|
||||
**<fit_only>y/n</fit_only>**
|
||||
(un)set the ``fit`` option in case no template run is specified (inside a ``<msr2data_defaults>`` environment)
|
||||
**<global>y/n</global>**
|
||||
(un)set the ``global`` option (inside a ``<msr2data_defaults>`` environment)
|
||||
**<global_plus>y/n</global_plus>**
|
||||
(un)set the ``global+`` option (inside a ``<msr2data_defaults>`` environment)
|
||||
**<recreate_data_file>y/n</recreate_data_file>**
|
||||
(un)set the ``musredit`` option for recreating the output file (inside a ``<msr2data_defaults>`` environment)
|
||||
**<open_file_after_fitting>y/n</open_file_after_fitting>**
|
||||
(un)set the ``musredit`` option for opening msr files after fitting (inside a ``<msr2data_defaults>`` environment)
|
||||
|
||||
Additionally, there are some settings defined in this XML file which should be only changed by experienced users who like to add new features to ``musredit``:
|
||||
|
||||
**<help_section></help_section>**
|
||||
define various help messages in this environment
|
||||
|
||||
**<musr_web_X>LINK</musr_web_X>**
|
||||
define the ``LINK`` to the help page ``musr_web_X``, where ``X`` is ``main``, ``title``, ``parameters``, ``theory``, ``functions``, ``run``,
|
||||
``command``, ``fourier``, ``plot``, ``statistics``, ``msr2data``, or ``musrFT`` (inside a ``<help_section>`` environment)
|
||||
|
||||
**<func_pixmap_path>PIX_PATH</func_pixmap_path>**
|
||||
set the path ``PIX_PATH`` to LaTeX pixmaps visualizing the various supported theory functions
|
||||
|
||||
**<theory_functions></theory_functions>**
|
||||
define the functions for a msr file's :ref:`THEORY block <msr-theory-block>` according to the correct syntax in this environment
|
||||
|
||||
**<func></func>**
|
||||
specify a function here (inside a ``<theory_functions>`` environment)
|
||||
|
||||
**<name>NAME</name>**
|
||||
the ``NAME`` of the function in the msr file (inside a ``<func>`` environment)
|
||||
**<comment>COMMENT</comment>**
|
||||
description of the used parameters (inside a ``<func>`` environment)
|
||||
**<label>LABEL</label>**
|
||||
``LABEL`` of the function in the ``musredit`` menu (inside a ``<func>`` environment)
|
||||
**<pixmap>PIXMAP</pixmap>**
|
||||
LaTeX picture used to describe the function and stored in the ``PIX_PATH`` (inside a ``<func>`` environment)
|
||||
**<params>N</params>**
|
||||
number of parameters ``N`` used by the function (inside a ``<func>`` environment)
|
||||
|
||||
An example of the ``musredit_startup.xml`` looks like:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<musredit_startup xmlns="http://lmu.web.psi.ch/musrfit/user/MUSR/MusrGui.html">
|
||||
<comment>
|
||||
This is handling default setting parameters for the musredit.
|
||||
</comment>
|
||||
<general>
|
||||
<exec_path>/usr/local/root/bin</exec_path>
|
||||
<default_save_path>./</default_save_path>
|
||||
<msr_default_file_path>/usr/local/root/share/doc/musrfit/templates</msr_default_file_path>
|
||||
<timeout>3600</timeout>
|
||||
<keep_minuit2_output>n</keep_minuit2_output>
|
||||
<dump_ascii>n</dump_ascii>
|
||||
<dump_root>n</dump_root>
|
||||
<title_from_data_file>y</title_from_data_file>
|
||||
<chisq_per_run_block>n</chisq_per_run_block>
|
||||
<estimate_n0>y</estimate_n0>
|
||||
<musrview_show_fourier>n</musrview_show_fourier>
|
||||
<musrview_show_avg>n</musrview_show_avg>
|
||||
<enable_musrt0>y</enable_musrt0>
|
||||
</general>
|
||||
<recent_files>
|
||||
<path_file_name>/usr/local/root/share/doc/musrfit/examples/test-histo-PSI-BIN.msr</path_file_name>
|
||||
</recent_files>
|
||||
<help_section>
|
||||
<musr_web_main>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html</musr_web_main>
|
||||
<musr_web_title>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#TheTitle</musr_web_title>
|
||||
<musr_web_parameters>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#TheFitparameterBlock</musr_web_parameters>
|
||||
<musr_web_theory>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#TheTheoryBlock</musr_web_theory>
|
||||
<musr_web_functions>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#TheFunctionsBlock</musr_web_functions>
|
||||
<musr_web_run>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#TheRunBlock</musr_web_run>
|
||||
<musr_web_command>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#TheCommandsBlock</musr_web_command>
|
||||
<musr_web_fourier>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#TheFourierBlock</musr_web_fourier>
|
||||
<musr_web_plot>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#ThePlotBlock</musr_web_plot>
|
||||
<musr_web_statistic>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#TheStatisticBlock</musr_web_statistic>
|
||||
<musr_web_msr2data>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/Msr2Data.html</musr_web_msr2data>
|
||||
<musr_web_musrFT>file:///usr/local/root/share/doc/musrfit/html/user/MUSR/MusrFit.html#A_2.3_musrFT</musr_web_musrFT>
|
||||
</help_section>
|
||||
<font_settings>
|
||||
<font_name>Monospace</font_name>
|
||||
<font_size>12</font_size>
|
||||
</font_settings>
|
||||
<msr_file_defaults>
|
||||
<beamline>mue4</beamline>
|
||||
<institute>psi</institute>
|
||||
<file_format>musr-root</file_format>
|
||||
<lifetime_correction>y</lifetime_correction>
|
||||
</msr_file_defaults>
|
||||
<msr2data_defaults>
|
||||
<chain_fit>y</chain_fit>
|
||||
<write_data_header>y</write_data_header>
|
||||
<ignore_data_header_info>n</ignore_data_header_info>
|
||||
<keep_minuit2_output>n</keep_minuit2_output>
|
||||
<write_column_data>n</write_column_data>
|
||||
<recreate_data_file>n</recreate_data_file>
|
||||
<open_file_after_fitting>y</open_file_after_fitting>
|
||||
<create_msr_file_only>n</create_msr_file_only>
|
||||
<fit_only>n</fit_only>
|
||||
<global>n</global>
|
||||
<global_plus>n</global_plus>
|
||||
</msr2data_defaults>
|
||||
<func_pixmap_path>/usr/local/root/share/doc/musrfit/latex_images</func_pixmap_path>
|
||||
<theory_functions>
|
||||
<func>
|
||||
<name>asymmetry</name>
|
||||
<comment></comment>
|
||||
<label>Asymmetry</label>
|
||||
<pixmap>asymmetry.png</pixmap>
|
||||
<params>1</params>
|
||||
</func>
|
||||
<func>
|
||||
<name>statGssKT</name>
|
||||
<comment>(rate)</comment>
|
||||
<label>static Gauss KT</label>
|
||||
<pixmap>statGssKT.png</pixmap>
|
||||
<params>1</params>
|
||||
</func>
|
||||
</theory_functions>
|
||||
</musredit_startup>
|
||||
|
||||
.. index:: musredit-features
|
||||
|
||||
musredit Features
|
||||
-----------------
|
||||
|
||||
The features of ``musrfit`` which can be accessed by the graphical front ends ``musredit`` will be described in the following. All functions
|
||||
can either be called by choosing them from the *MusrFit menu*, by clicking the respective button in the *MusrFit bar*, or by using a *keyboard shortcut*.
|
||||
|
||||
**musrWiz**
|
||||
|
||||
.. image:: ../images/musrWiz.*
|
||||
|
||||
``musrWiz`` is a helper programs which allows to create a msr-file from scratch without too much a priori knowledge. For details see :ref:`musrWiz <musrWiz>`.
|
||||
|
||||
.. index:: musrWiz
|
||||
.. _musrWiz:
|
||||
|
||||
**Calculate Chisq**
|
||||
|
||||
.. image:: ../images/musrchisq.*
|
||||
|
||||
Calls ``musrfit`` with the option ``-c``, *i.e.* calculates the :math:`\chi^2` or log max-likelihood for the active msr file tab. Shortcut-key: ``Alt+C``.
|
||||
The equivalent call on the command line would be
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ musrfit -c <msr-file>
|
||||
|
||||
**Fit**
|
||||
|
||||
.. image:: ../images/musrfit.*
|
||||
|
||||
Calls ``musrfit`` for fitting of the active msr file in the currently active tab. Shortcut-key: ``Alt+F``.
|
||||
The equivalent call on the command line could look like
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ musrfit <msr-file> [optional parameters]
|
||||
|
||||
The optional parameters may be chosen under :ref:`Preferences <musredit-prefs>`. For further information refer to the manual of :ref:`musrfit <user-manual>`.
|
||||
|
||||
**Swap Msr <-> Mlog**
|
||||
|
||||
.. image:: ../images/musrswap.*
|
||||
|
||||
Swap the msr and mlog files. *E.g.*, for a file called ``8472_zf.msr``, this is copied to ``8472_zf.mlog`` and vice versa. Shortcut-key: ``Alt+S``.
|
||||
|
||||
**Set Steps**
|
||||
|
||||
.. image:: ../images/musrStep.*
|
||||
|
||||
``musrStep`` allows to adjust the step size, *i.e.* the initial steps for the fitter. Shortcut-key: ``Alt+P``.
|
||||
|
||||
**Msr2Data**
|
||||
|
||||
.. image:: ../images/msr2data.*
|
||||
|
||||
Opens a graphical interface to the ``msr2data`` program described in detail in its :ref:`own manual <msr2data>`. Shortcut-key: ``Alt+2``.
|
||||
|
||||
**mupp**
|
||||
|
||||
.. image:: ../images/mupp.*
|
||||
|
||||
Application which allows to plot ``*.db`` and ``*.dat`` parameter files. Shortcut-key: ``Alt+U``.
|
||||
For a detailed description see the :ref:`mupp docu <mupp>`.
|
||||
|
||||
**View**
|
||||
|
||||
.. image:: ../images/musrview.*
|
||||
|
||||
Calls ``musrview`` from the active tab of ``musredit``. For more details see the :ref:`musrview <musrview>` docu. Shortcut-key: ``Alt+V``.
|
||||
The equivalent call on the command line could look like
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ musrview <msr-file> [optional parameters]
|
||||
|
||||
**T0**
|
||||
|
||||
.. image:: ../images/musrt0-icon.*
|
||||
|
||||
Calls ``musrt0`` which allows to set the ``T0`` values for all the runs. For more details see the :ref:`musrt0 <musrt0>` docu.
|
||||
The equivalent call on the command line could look like
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ musrt0 <msr-file> [optional parameters]
|
||||
|
||||
**Raw Fourier**
|
||||
|
||||
.. image:: ../images/musrFT.*
|
||||
|
||||
Calls ``musrFT`` which allows to perform a Fourier transform of the raw data. For more details see the :ref:`musrFT <musrFT>` docu.
|
||||
The equivalent call on the command line could look like
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ musrFT <msr-file> [optional parameters]
|
||||
|
||||
.. _musredit-prefs:
|
||||
|
||||
**Preferences**
|
||||
|
||||
.. image:: ../images/musrprefs.*
|
||||
|
||||
Opens a window in which the optional parameters that should be passed to musrfit can be chosen.
|
||||
For further information refer to the manual of :ref:`musrfit <musrfit>`.
|
||||
|
||||
**Dump Header**
|
||||
|
||||
.. image:: ../images/musrdump.*
|
||||
|
||||
Opens a file dialog which allows to select a |mgr|\SR data file. When this file can be read, the run header info is dumped into a dialog window.
|
||||
Essentially this calls ``dump_header`` internally.
|
||||
|
||||
musrWiz
|
||||
-------
|
||||
|
||||
``musrWiz`` is a helper program which allows to easily create the necessary msr-file needed as an input for ``musrfit``.
|
||||
``musrWiz`` is still in it's early stage; not all options are already implemented and here and there you will likely find some bugs.
|
||||
From ``musredit`` it can be accessed via the MusrFit menu or the wand
|
||||
|
||||
.. image:: ../images/musredit-musrWiz.*
|
||||
|
||||
The ``musrWiz`` GUI is organized in a couple of different dialogues which some information needs to be provided by the user.
|
||||
In the following these different dialogues will be discussed briefly.
|
||||
|
||||
.. index:: musrWiz-Introduction
|
||||
|
||||
musrWiz-Introduction
|
||||
++++++++++++++++++++
|
||||
|
||||
The introduction dialogue
|
||||
|
||||
.. image:: ../images/musrWiz-Intro.*
|
||||
|
||||
#. an explicit msr-file name can be provided here. More often the msr-file name is generated out of the run number.
|
||||
#. year of the run data.
|
||||
#. run number. If no explicit msr-file is provided, the run number together with fit type and type of measurement will be used to generate the msr-file name.
|
||||
#. from the pull down menu the institute (for which a necessary ``xml``-file is provided) has to be choosen.
|
||||
#. from the pull down menu the the instrument can be chosen.
|
||||
#. the fit type has to be chosen. Possible fit types are: ``Single Histo`` / ``Single Histo RRF`` / ``Asymmetry`` / ``Asymmetry RRF`` / ``Mu Minus`` / ``None muSR``
|
||||
#. type of measurement is essentially needed for the grouping of the detectors. Possible are: ``ZF`` for zero field measurements / ``TF`` for transverse field measurements / ``LF`` for longitudinal field measurements.
|
||||
Depending on the choice and instrument some additional question might be asked, *e.g.* which magnet has been used.
|
||||
#. ``T0``'s: this last menu defines from where to get the t0's. The options are: ``from data file``, *i.e.* the t0 are assumed to be correctly set
|
||||
in the provided data file ``call musrT0``, *i.e.* after the msr-file is generated, ``musrt0`` will be called which allows the user to find the
|
||||
proper t0 from the prompt peak ``enter here`` will provide a pop-up menu where the t0 parameter can be given explicitly.
|
||||
|
||||
If all this information have been provided ``Next>`` will lead you the the theory dialogue.
|
||||
|
||||
.. index:: musrWiz-Theory
|
||||
|
||||
musrWiz - Theory
|
||||
++++++++++++++++
|
||||
|
||||
The theory dialogue is used to define the fitting function. There are two ways of using it:
|
||||
|
||||
#. choose a template theory function. This option has the advantage that the next steps will be very easy because
|
||||
within the template almost everything is already pre-defined. The disadvantage is that you are not free in setting
|
||||
up your theory function as you would like to have.
|
||||
#. freely write your theory function. The advantage here is that you can customize your theory function at your needs.
|
||||
This will come at the cost that you also will need to define ``maps``, ``functions``, etc. yourself. The good thing
|
||||
though is that at the very end you can save this as a template for future re-use.
|
||||
|
||||
First the template path will be described. The theory dialogue looks like this
|
||||
|
||||
.. image:: ../images/musrWiz-Theory.*
|
||||
|
||||
#. This is a text edit field were you can enter the theory fit function as you would like to have it. In the example
|
||||
given the theory reads :math:`p1 \exp(-p2\, t) \cos(2 \pi\, f1 + m1)`, where ``pX`` stands for parameter, ``fX`` for function,
|
||||
``mX`` for map, and ``X`` for the corresponding number.
|
||||
#. The ``Clear All`` button will clear whatever you entered in the text field above.
|
||||
#. This pull-down menu allows to select a theory function which will be added to the text field above by pressing
|
||||
the ``Add`` button. Pre defined theory function starting with a ``T`` are templates rather than only theory function strings.
|
||||
#. The ``Add`` button is used to add the chosen theory function / template from the pull-down menu to its left.
|
||||
#. The ``Check`` button is used to make a syntactical check of whatever is written in the text edit field.
|
||||
|
||||
.. index:: musrWiz-Functions
|
||||
|
||||
musrWiz - Functions
|
||||
+++++++++++++++++++
|
||||
|
||||
In the Functions dialogue all the necessary functions can be entered. A function operates *only* on fitting parameters.
|
||||
This is different to the theory function which operates on the fitting parameters and the time. The dialogue looks like this
|
||||
|
||||
.. image:: ../images/musrWiz-Functions.*
|
||||
|
||||
|
||||
#. a text edit field in which the various needed functions can be entered. In case a template theory is used, the appropriate function should be shown here and *no* editing will be needed here.
|
||||
#. pressing ``Show Theory`` button will pop-up a little window showing the previously entered theory function. This is handy when defining its own theory, *i.e.* not working with a template.
|
||||
|
||||
.. image:: ../images/musrWiz-Functions-and-Theory.*
|
||||
|
||||
.. index:: musrWiz-Maps
|
||||
|
||||
musrWiz - Maps
|
||||
++++++++++++++
|
||||
|
||||
.. image:: ../images/musrWiz-Maps.*
|
||||
|
||||
The map dialogue will list the maps previously used in the theory and functions blocks/dialogues before. Again, if a template is used, nothing needs to be entered here.
|
||||
|
||||
#. The ``Show Theory`` button allows to show the currently defined theory and the functions.
|
||||
|
||||
.. index:: musrWiz-FitParam
|
||||
|
||||
musrWiz - Fit Parameters
|
||||
++++++++++++++++++++++++
|
||||
|
||||
.. image:: ../images/musrWiz-FitParam.*
|
||||
|
||||
In the fit parameter dialogue all parameter names can be defined. Furthermore the starting values for the parameters, the step
|
||||
(initial step size for the parameter fit), and any boundaries can be defined here.
|
||||
|
||||
#. The ``Show Theory`` button allows to show the currently defined theory and the functions.
|
||||
|
||||
.. index:: musrWiz-FitInfo
|
||||
|
||||
musrWiz - Fit Info
|
||||
++++++++++++++++++
|
||||
|
||||
Collects all the ``musrfit`` and ``MINUIT2`` specific fit commands.
|
||||
|
||||
.. image:: ../images/musrWiz-FitInfo.*
|
||||
|
||||
|
||||
#. allows to define the time fit range (start time, end time).
|
||||
#. packing defines how many bins of the original data shall be combined (added, also called re-binning).
|
||||
#. in this text field to fitting commands are given (see the ``MINUIT`` and :ref:`musrfit <msr-commands-block>` manual for details).
|
||||
|
||||
.. index:: musrWiz-Create
|
||||
|
||||
musrWiz - Create
|
||||
++++++++++++++++
|
||||
|
||||
Collects the last necessary information before creating the msr-file.
|
||||
|
||||
.. image:: ../images/musrWiz-Create.*
|
||||
|
||||
|
||||
#. shows the path where the msr-file will be saved. If you would like to save it somewhere else press the ``Save As (msr-file path)`` button.
|
||||
#. pressing this button will allow you to find the path where to save the msr-file.
|
||||
#. pressing this button will save to current configuration as a template for future re-use.
|
||||
|
||||
.. index:: musrStep
|
||||
|
||||
musrStep
|
||||
--------
|
||||
|
||||
``musrStep`` is a little helper program which allows to reset the initial step size. This sometimes comes very handy if working on an instrument
|
||||
with many detectors after a fit slightly went wrong leaving you with a far too small initial step size for further iterations. To edit all the steps
|
||||
individually is tedious and error prone. Here ``musrStep`` can help.
|
||||
|
||||
.. image:: ../images/musrStep-GUI.*
|
||||
|
||||
When invoking ``musrStep`` the above dialogue will popup
|
||||
|
||||
#. shows the relevant parts of the FITPARAMETER block. The only editable column is step.
|
||||
#. ``Check Specific`` will popup a dialogue where a template string can be entered, *e.g.* ``Asym``. As a result all fit parameters containing the template string will be selected.
|
||||
#. ``Check All`` will select all fit parameters.
|
||||
#. ``Uncheck All`` will unselect all fit parameters.
|
||||
#. ``Modify Automatic`` will change all the step values automatically. It basically sets all the step sizes to 1% of
|
||||
the corresponding fit parameter value, except the phases where the step will be set to a value of 5 degrees.
|
||||
#. ``Modify Selected`` will start the dialogue shown beneath. Follow the description there.
|
||||
#. ``Save&Quit`` will save the current step values, close the dialogue and reload the modified msr-file.
|
||||
#. ``Cancel`` will cancel the ``musrStep`` dialogue without modifying anything.
|
||||
|
||||
.. image:: ../images/musrStep-Modify-Selected.*
|
||||
|
||||
When clicking on ``Modify Selected`` the above dialogue will be presented. It allows to manipulate all selected fit parameter step values according to the following rules
|
||||
|
||||
#. ``Scale by Factor`` will scale the step value by the factor given in the field (2). If the ``Absolute Value`` check box is selected, rather than scaling the factor value will be used to modify the step value.
|
||||
#. scaling factor or absolute value to modify the step values of the selected fit parameters.
|
||||
#. checking the ``Absolute Value`` check box will change the meaning from *Scale by Factor* to *Copy Factor Value*.
|
||||
#. ``Scale Automatically`` will modify the step values of the selected fit parameters according to the rules described before.
|
||||
#. ``Cancel`` will cancel the dialogue.
|
@ -1,275 +0,0 @@
|
||||
:tocdepth: 3
|
||||
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: dks
|
||||
|
||||
.. _setup-dks:
|
||||
|
||||
Setting up ``musrfit`` / ``DKS``: High Speed Fitting with GPU's
|
||||
===============================================================
|
||||
|
||||
In the years 2016/2017 we explored ways to speed up current fitting frameworks, especially ``musrfit.``
|
||||
This allows now to analyze histogram sets of high field spectrometers like ``HAL-9500`` at PSI without
|
||||
the *error-prone* RRF fitting (see U. Locans and A. Suter,
|
||||
`musrfit - Real Time Parameter Fitting Using GPU <http://dx.doi.org/10.7566/JPSCP.21.011051>`_, and the
|
||||
Memo from A. Suter, "Rotating Reference Frame Fits", in the ``musrfit`` source code). At the same time
|
||||
it can help to speed-up elaborate global fits tremendously, and dealing properly with muonium. It also
|
||||
allows Apple macOS users to speed up their fitting code on the CPU. Currently it is not straight forward
|
||||
to get ``musrfit`` multi-threaded under macOS since Apple doesn't be default support ``OpenMP``. ``DKS``
|
||||
enables ``musrfit`` to utilize ``OpenCL`` instead which is present on macOS by default.
|
||||
|
||||
.. warning::
|
||||
|
||||
Before you run into the shop to buy a gamer graphic card or a Tesla card, make sure that you have an
|
||||
appropriate server with a sufficiently strong power supply!
|
||||
|
||||
.. note::
|
||||
|
||||
However, the current ``musrfit/DKS`` version doesn't yet support all theory functions on the GPU.
|
||||
In case the theory function is not yet available for the GPU, ``musrfit`` will fall back to the CPU implementation.
|
||||
|
||||
Conceptually the setup of ``musrfit/DKS`` is as following:
|
||||
|
||||
#. install the latest hardware driver for your graphic card.
|
||||
#. install the GPU SDK which enables number crunching (``CUDA`` for NVIDIA, ``OpenCL`` for AMD)
|
||||
#. install ``DKS``
|
||||
#. install the ``musrfit`` version which is ``DKS`` ready
|
||||
|
||||
In the following the description for the installation of ``musrfit/DKS`` for the following systems will be discussed in some more detail:
|
||||
|
||||
* NVIDIA Tesla K40c
|
||||
* AMD Graphic Card (Radeon R9 390X)
|
||||
* macOS in order to get ``OpenCL`` support
|
||||
|
||||
The usage of ``musrfit`` with GPU acceleration and ``OpenCL`` support is described in the
|
||||
:ref:`User manual of the μSR data analysis software musrfit <user-manual>`. The additional
|
||||
``musrfit/DKS`` are found :ref:`here <msr-commands-block-dks>`.
|
||||
|
||||
.. index:: dks-setup-tesla
|
||||
|
||||
Setting up ``musrfit/DKS`` for a Tesla K40c (NVIDIA)
|
||||
----------------------------------------------------
|
||||
|
||||
It is assumed that the Tesla K40c is already physically installed on your system. For now I only
|
||||
will discuss to set it up for a Linux based system. In order to check that your operating systems
|
||||
see the card, enter the following command in the terminal:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ lspci | grep NVIDIA
|
||||
|
||||
The response should look something like
|
||||
|
||||
::
|
||||
|
||||
05:00.0 3D controller: NVIDIA Corporation GK110BGL [Tesla K40c] (rev a1)
|
||||
|
||||
which means that the OS physically recognizes your card.
|
||||
|
||||
Driver Installation for the Tesla K40c
|
||||
++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
Next, you will need to download and install the driver for your card. Select the proper operating system,
|
||||
card, etc. from the `NVIDIA download center <http://www.nvidia.com/Download/index.aspx?lang=en-us>`_. At PSI
|
||||
we are running currently Red Hat Enterprise Linux 7.x (RHEL) for which we will get a ``rpm`` (something like
|
||||
``nvidia-diag-driver-local-repo-rhel7-375.66-1.x86_64.rpm``). Install it and make sure there is no conflict
|
||||
with the nouveau driver of the system.
|
||||
|
||||
.. index:: cuda-install
|
||||
|
||||
Installation of CUDA
|
||||
++++++++++++++++++++
|
||||
|
||||
Download the `CUDA SDK <https://developer.nvidia.com/cuda-downloads>`_ form NVIDIA for your system. Again,
|
||||
for the RHEL 7.x this is an ``rpm``. After the installation of the rpm you should reboot your machine.
|
||||
Afterwards you are ready for the installation of ``DKS``.
|
||||
|
||||
.. index:: dks-install
|
||||
|
||||
Installation of DKS
|
||||
+++++++++++++++++++
|
||||
|
||||
For the following list of commands the ``'$'`` will be given as the command prompt. *Do not enter it!*
|
||||
Also some comments will be added starting with a ``'#'`` which can be omitted. They are only there to
|
||||
explain what is going on. ``DKS`` stands for Dynamical Kernel Scheduler and provides a thin interface
|
||||
allowing host applications to incorporate GPU's and other hardware accelerators.
|
||||
|
||||
Details can be found in the papers listed :ref:`here <cite>`, or on the `DKS wiki page <https://gitlab.psi.ch/uldis_l/DKS/wikis/home>`_.
|
||||
|
||||
In brief the installation should be something like this:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# go to whatever directory you would like to clone/install DKS
|
||||
# For macOS DKS will likely to got to $HOME/Applications to be consistent with the musrfit docu for macOS
|
||||
$ cd $HOME/Apps
|
||||
$ git clone https://gitlab.psi.ch/uldis_l/DKS.git
|
||||
$ cd DKS
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ cmake ../ -DENABLE_MUSR=1 -DCMAKE_INSTALL_PREFIX=../exec
|
||||
$ cmake --build ./ --clean-first
|
||||
$ make install
|
||||
|
||||
Since ``DKS`` is installed in a non-standard path, a couple of additional small steps are required.
|
||||
This will be different for Linux compared to macOS.
|
||||
|
||||
For **Linux:**
|
||||
|
||||
add the ``DKS`` library path to ``/etc/ld.so.conf.d/musrfit-x86_64.conf`` and execute as super user
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ /sbin/ldconfig
|
||||
|
||||
For **macOS:**
|
||||
|
||||
add the ``DKS`` path to ``$HOME/.profile``:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
export DKS=$HOME/Applications/DKS/exec
|
||||
export LD_LIBRARY_PATH=$DKS/lib:$LD_LIBRARY_PATH
|
||||
|
||||
launchctl setenv DKS $DKS
|
||||
launchctl setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH
|
||||
|
||||
|
||||
.. _musrfit-dks-install:
|
||||
|
||||
Installation of musrfit for DKS
|
||||
+++++++++++++++++++++++++++++++
|
||||
|
||||
Most of the installation steps are the same as described for ``musrfit`` without GPU support.
|
||||
Here only the differences are explained. First checkout ``musrfit``, then you will need to
|
||||
switch the working branch which is done by
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cd $HOME/Apps/musrfit
|
||||
$ git checkout dks6
|
||||
|
||||
Install via cmake
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
There is on more configuration switch
|
||||
|
||||
**-Ddks=<value>**
|
||||
it allows to enable/disable ``DKS`` support. The default is ``<value>=1``, *i.e.* enabled. To disable use ``<value>=0``.
|
||||
|
||||
For a typical setup on a RHEL or macOS system it could look like this
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cmake ../ -DCMAKE_INSTALL_PREFIX=$ROOTSYS -DASlibs=1 -DBMWlibs=1 -Dnexus=1 -Ddks=1
|
||||
|
||||
After
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cmake --build ./ --clean-first -- -j8
|
||||
$ make install
|
||||
|
||||
and updating the shared library lookup table (*only* needed for Linux)
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ /sbin/ldconfig # as superuser / root
|
||||
|
||||
you are done with the setup.
|
||||
|
||||
.. index:: dks-setup-amd-graphic-card
|
||||
|
||||
Setting up ``musrfit/DKS`` for a AMD Graphic Card (Radeon R9 390X)
|
||||
------------------------------------------------------------------
|
||||
|
||||
Driver Installation for an AMD Graphic Card, *e.g.* Radeon R9 390X
|
||||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
This will depend slightly on the AMD Card and operating system. Here I will summaries how it was done
|
||||
on a RHEL (Linux) system using a Radeon R9 390X.
|
||||
|
||||
It is assumed that the Radeon R9 390X is already physically installed on your system. For now I only
|
||||
will discuss to set it up for a Linux based system. In order to check that your operating systems see
|
||||
the card, enter the following command in the terminal:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ lspci | grep AMD
|
||||
|
||||
The response should look something like
|
||||
|
||||
::
|
||||
|
||||
84:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii XT / Grenada XT [Radeon R9 290X/390X] (rev 80)
|
||||
|
||||
which means that the OS physically recognizes your card.
|
||||
|
||||
For RHEL7.x the AMDGPU-PRO driver should be used. It can be downloaded from `AMD <http://support.amd.com/en-us/kb-articles/Pages/AMDGPU-PRO-RedHat-Install.aspx>`_. Unpack the driver
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ tar -Jxvf amdgpu-pro-17.10-414273.tar.xz
|
||||
$ cd amdgpu-pro-17.10-414273
|
||||
|
||||
Install the driver as root
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ ./amdgpu-pro-install --compute -y
|
||||
|
||||
Here I assume that the AMD graphic card is only used for computation. You need to add the following command
|
||||
in order that the user **blabla** (change this to the appropriate user name) can access the GPU (otherwise
|
||||
only root works):
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ /sbin/usermod -a -G video blabla
|
||||
|
||||
Reboot the machine.
|
||||
|
||||
AMD APP Software Development Kit (SDK) to enable ``OpenCL`` support
|
||||
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
The AMD APP Software Development Kit (SDK) is a complete development platform created by AMD to allow you to
|
||||
quickly and easily develop applications accelerated by AMD APP technology. The SDK provides samples, documentation,
|
||||
and other materials to quickly get you started leveraging accelerated compute using ``OpenCL`` or ``C++ AMP`` in your
|
||||
``C/C++`` applications.
|
||||
|
||||
Download the AMD APP SDK 3.0 from `AMD-SDK <http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/>`_.
|
||||
|
||||
Extract the installer
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ tar -xvjf AMD-APP-SDKInstaller-v3.0.130.136-GA-linux64.tar.bz2
|
||||
|
||||
Run the installer
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ ./AMD-APP-SDK-v3.0.130.136-GA-linux64.sh
|
||||
|
||||
This will install the AMD APP SDK to ``/opt/AMDAPPSDK-3.0/`` where you can find the ``OpenCL`` include
|
||||
and library files, as well as documentation and sample code. The install guide for AMD OpenCL SDK can
|
||||
be found at `AMD SDK Installation Notes <http://developer.amd.com/wordpress/media/2012/10/AMD_APP_SDK_InstallationNotes.pdf>`_.
|
||||
|
||||
Installation of DKS and musrfit
|
||||
+++++++++++++++++++++++++++++++
|
||||
|
||||
To install ``DKS`` and ``musrfit`` follow the instructions :ref:`above <musrfit-dks-install>`.
|
||||
|
||||
.. index:: dks-opencl-macOS
|
||||
|
||||
Setting up ``musrfit/DKS`` for macOS for OpenCL support
|
||||
-------------------------------------------------------
|
||||
|
||||
Since Apple is not providing an out-of-the-box ``OpenMP`` support on their macOS compiler framework (Xcode),
|
||||
typically ``musrfit`` is just running *single threaded*. Here ``DKS`` can help since it delivers ``OpenCL``
|
||||
support which is present on macOS. Hence, if you would like to run ``musrfit`` multi-threaded the easiest
|
||||
way is to use ``DKS``.
|
||||
|
||||
Since there is no graphic card involved, you do not need any graphic card driver of additional SDK.
|
||||
The only thing you need ``DKS`` and the proper ``musrfit`` version.
|
||||
|
||||
The installation instruction for ``DKS/musrfit`` can be found :ref:`here <musrfit-dks-install>`.
|
@ -1,417 +0,0 @@
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: tutorial
|
||||
|
||||
Tutorial for ``musrfit``
|
||||
========================
|
||||
|
||||
Single-histogram-fit tutorial
|
||||
-----------------------------
|
||||
|
||||
The |mgr|\SR-data-analysis process using musrfit is based on so-called msr files. These files contain all
|
||||
information needed for the analysis such as names of the data files, a theory function, fit and plot parameters,
|
||||
and so on. It is the idea of this page to explain the basic use of an msr file and the different programs
|
||||
of the ``musrfit`` suite using the example of a single-histogram fit to time-differential transverse-field
|
||||
|mgr|\SR data. For a complete description of all options please refer to the :ref:`manual <user-manual>`.
|
||||
|
||||
The example deals with a diamagnetic sample that has been measured in an applied field of approximately 150 G in
|
||||
the `GPS spectrometer <https://www.psi.ch/smus/gps>`_ at `PSI <https://www.psi.ch>`_ using the "transverse geometry".
|
||||
In this geometry the muon spin is rotated about 50° up and the field is applied parallel to the muon momentum.
|
||||
Hence, the relevant positron counters (to detect the spin precession) are placed above (histogram 3), below (histogram 4) and right of (histogram 5) the sample. The run numbers start from 3110.
|
||||
|
||||
To analyze these data (in a simple way) one starts out from the msr file ``3110_tutorial.msr`` provided together
|
||||
with the source-code distribution in the sub-directory ``doc/examples/``. This ASCII file can be edited using any
|
||||
text editor. For convenience the editor ``musredit`` is provided which offer some msr-file-specific functionalities
|
||||
and additionally serve as front ends to the underlying programs. In the following it is assumed that the file is
|
||||
open within ``musredit``.
|
||||
|
||||
The msr file
|
||||
++++++++++++
|
||||
|
||||
The msr file itself is divided into different blocks; a full description of the format can be found :ref:`here <msr-file-format>`.
|
||||
In the file ``3110_tutorial.msr`` these blocks are successively:
|
||||
|
||||
:ref:`The title <msr-title-block>`
|
||||
|
||||
::
|
||||
|
||||
sample XYZ
|
||||
|
||||
A descriptive title of the file.
|
||||
|
||||
:ref:`The FITPARAMETER block <msr-fitparameter-block>`
|
||||
|
||||
::
|
||||
|
||||
FITPARAMETER
|
||||
# No Name Value Step Pos_Error Boundaries
|
||||
1 NormUp 4500 5 none 0 none
|
||||
2 BgUp 200 1 none 0 none
|
||||
3 PhaseUp 15 1 none
|
||||
|
||||
4 NormDown 4500 5 none 0 none
|
||||
5 BgDown 200 1 none 0 none
|
||||
6 PhaseDown 195 1 none
|
||||
|
||||
7 NormRight 600 5 none 0 none
|
||||
8 BgRight 40 1 none 0 none
|
||||
9 PhaseRight 285 1 none
|
||||
|
||||
10 AsymSig1 0.17 0.01 none 0 0.33
|
||||
11 RateSig1 2.5 0.1 none 0 none
|
||||
12 FieldSig1 100 1 none
|
||||
|
||||
13 AsymSig2 0.02 0.01 none 0 0.33
|
||||
14 RateSig2 0.5 0.1 none
|
||||
15 FieldSig2 150 1 none
|
||||
|
||||
The list of parameters used in the theory function to describe the set of data.
|
||||
Each parameter has a number, a name, an initial value and an initial step (for
|
||||
the fitting process). If a parameter should be fixed, the initial step is set
|
||||
to 0. After a fit (see below), this block contains the determined parameter values
|
||||
and uncertainties (in the ``Step`` column). If asymmetric errors are determined, these
|
||||
will be listed in the ``Step`` column (negative) and the ``Pos_Error`` column (positive).
|
||||
Optionally, lower and upper boundaries for the parameters can be specified as
|
||||
shown above.
|
||||
|
||||
The meaning of the parameters above is explained in the following:
|
||||
|
||||
Since a :ref:`single-histogram fit <single-histogram-fit>` should be done, some
|
||||
histogram-specific parameters are needed. These are a normalization constant (parameter 1),
|
||||
a parameter describing the background of uncorrelated events (parameter 2) and the initial
|
||||
phase of the spin precession with respect to the detector (parameter 3). As stated above,
|
||||
there are three histograms containing useful information ("Up", "Down", "Right"); hence,
|
||||
this set of parameters has to be present for each of them (parameters 1–9).
|
||||
The remaining parameters are used to model the decay asymmetry which is assumed to be equal
|
||||
for all histograms. In this example one has two signals (*e.g.* from the sample and the
|
||||
sample holder), each with an amplitude (parameters 10 and 13), a depolarization rate
|
||||
(parameters 11 and 14) and a mean field (here given in Gauss, parameters 12 and 15).
|
||||
|
||||
:ref:`The THEORY block <msr-theory-block>`
|
||||
|
||||
::
|
||||
|
||||
THEORY
|
||||
asymmetry 10
|
||||
simplExpo 11 (rate)
|
||||
TFieldCos map1 fun1 (phase frequency)
|
||||
+
|
||||
asymmetry 13
|
||||
simpleGss 14 (rate)
|
||||
TFieldCos map1 fun2 (phase frequency)
|
||||
|
||||
The THEORY block is used to define a fit-parameter-dependent theory function used to model
|
||||
the decay asymmetry. Different :ref:`predefined <msr-theory-block>` and :ref:`user-defined <user-functions>`
|
||||
functions can be combined here. Theory lines following each other are *multiplied* and the **+** sign
|
||||
is used to add different (here: two) signal contributions. The numbers are the parameter numbers
|
||||
according to the ``FITPARAMETER block``. ``map`` and ``fun`` are used to refer to
|
||||
histogram-dependent parameters and to interrelate fit parameters, respectively (see below).
|
||||
|
||||
:ref:`The FUNCTIONS block <msr-functions-block>`
|
||||
|
||||
::
|
||||
|
||||
FUNCTIONS
|
||||
fun1 = gamma_mu * par12
|
||||
fun2 = gamma_mu * par15
|
||||
|
||||
Here functions interrelating different fit parameters and predefined constants can be defined for
|
||||
the use in the ``THEORY block``. In the example, the functions are used to calculate the
|
||||
muon-spin-precession frequencies for the given fields [:math:`\nu = \gamma_\mu B / (2\pi)`]. One
|
||||
function is used for each signal. Altogether, the theory function defined above is
|
||||
:math:`A(t) = p_{10} e^{-p_{11} t} \cos(\varphi_i \pi/180 + \gamma_\mu p_{12} t) + p_{13} e^{-(p_{14} t)^2/2} \cos(\varphi_i \pi/180 + \gamma_\mu p_{15} t)`, where the *p* are the parameters in the ``FITPARAMETER block`` and :math:`\varphi_i = p_3, p_6, p_9`
|
||||
depending on the histogram as shall be seen later.
|
||||
|
||||
:ref:`The RUN block <msr-run-block>`
|
||||
|
||||
::
|
||||
|
||||
RUN data/deltat_pta_gps_3110 PIM3 PSI PSI-BIN (name beamline institute data-file-format)
|
||||
fittype 0 (single histogram fit)
|
||||
norm 1
|
||||
backgr.fit 2
|
||||
map 3 0 0 0 0 0 0 0 0 0
|
||||
forward 3
|
||||
data 1 8000
|
||||
t0 1
|
||||
fit 0 4.9
|
||||
packing 20
|
||||
|
||||
The RUN blocks are used to collect information on the data to be analyzed. Specifically, these are:
|
||||
|
||||
::
|
||||
|
||||
RUN data/deltat_pta_gps_3110 PIM3 PSI PSI-BIN (name beamline institute data-file-format)
|
||||
|
||||
The path to the data file and the file format (NEXUS, ROOT-NPP, ROOT-PPC, PSI-BIN, PSI-MDU, WKM, MUD, MDU-ASCII).
|
||||
|
||||
::
|
||||
|
||||
fittype 0 (single histogram fit)
|
||||
|
||||
the fit type (0 = single-histogram fit)
|
||||
|
||||
::
|
||||
|
||||
norm 1
|
||||
|
||||
the number of the fit parameter representing the normalization constant
|
||||
|
||||
::
|
||||
|
||||
backgr.fit 2
|
||||
|
||||
the number of the fit parameter representing the background
|
||||
|
||||
::
|
||||
|
||||
map 3 0 0 0 0 0 0 0 0 0
|
||||
|
||||
the definition of the **maps** used in the ``THEORY block`` — RUN-block-specific
|
||||
parameters are given here; in this example, **map1** is substituted by **parameter 3**
|
||||
in the ``THEORY block`` for this RUN block and **map2**, **map3**, and so on are undefined.
|
||||
|
||||
::
|
||||
|
||||
forward 3
|
||||
|
||||
the histogram number; in this example 3 corresponds to the histogram of the "Up" positron counter
|
||||
|
||||
::
|
||||
|
||||
data 1 8000
|
||||
|
||||
start and end bins of the range containing useful data in the histogram (to be adjusted, *e.g.* by using ``musrt0``, see below)
|
||||
|
||||
::
|
||||
|
||||
t0 1
|
||||
|
||||
histogram bin corresponding to the time zero (muon implantation time) (to be adjusted, *e.g.* by ``musrt0``, see below)
|
||||
|
||||
::
|
||||
|
||||
fit 0 4.9
|
||||
|
||||
start and end times (in |mgr|\s) defining the fit range. *In case the fit range
|
||||
exceeds the range of useful data (specified above using the data tag), eventually
|
||||
this data range is used as fit range.*
|
||||
|
||||
::
|
||||
|
||||
packing 20
|
||||
|
||||
the packing of the histograms (in histogram bins)
|
||||
|
||||
Since the data of three histograms is to be analyzed, the file contains not only one but
|
||||
three RUN blocks — each defining the histogram-specific information following the example given above.
|
||||
|
||||
:ref:`The COMMAND block <msr-commands-block>`
|
||||
|
||||
::
|
||||
|
||||
COMMANDS
|
||||
MINIMIZE
|
||||
MINOS
|
||||
SAVE
|
||||
|
||||
In the ``COMMANDS block``, a sequence of operations that should be performed is defined.
|
||||
Here, the requested operations are the minimization of :math:`\chi^2` (MINIMIZE), the
|
||||
calculation of *asymmetric errors* (MINOS) as well as saving the found parameter values
|
||||
and uncertainties to the msr file (SAVE). A full description of the possible commands can
|
||||
be found :ref:`here <msr-commands-block>`.
|
||||
|
||||
:ref:`The FOURIER block <msr-fourier-block>`
|
||||
|
||||
::
|
||||
|
||||
FOURIER
|
||||
units Gauss # units either 'Gauss', 'MHz', or 'Mc/s'
|
||||
fourier_power 10
|
||||
apodization WEAK # NONE, WEAK, MEDIUM, STRONG
|
||||
plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE
|
||||
phase par3
|
||||
range 0.0 600.0
|
||||
|
||||
The ``FOURIER block`` is used to define basic settings for the Fourier transform available
|
||||
in :ref:`musrview <musrview>`. These are:
|
||||
|
||||
::
|
||||
|
||||
units Gauss # units either 'Gauss', 'MHz', or 'Mc/s'
|
||||
|
||||
the units of the Fourier domain
|
||||
|
||||
::
|
||||
|
||||
fourier_power 10
|
||||
|
||||
the number of data points used for the discrete transform, here :math:`2^{10}=1024`.
|
||||
|
||||
::
|
||||
|
||||
apodization WEAK # NONE, WEAK, MEDIUM, STRONG
|
||||
|
||||
the :ref:`apodization <msr-fourier-block-apodization>` to be used
|
||||
|
||||
::
|
||||
|
||||
plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE
|
||||
|
||||
what should be plotted (real part, imaginary part, and so on)
|
||||
|
||||
::
|
||||
|
||||
phase par3
|
||||
|
||||
the initial phase of the input data is given here in degrees. Optionally, a phase parameter
|
||||
from the ``FITPARAMETER block`` can be given, here **par3** takes the value of **parameter 3**.
|
||||
|
||||
::
|
||||
|
||||
range 0.0 600.0
|
||||
|
||||
the start and end points of the range of the Fourier transform in the units specified above
|
||||
|
||||
:ref:`The PLOT block <msr-plot-block>`
|
||||
|
||||
::
|
||||
|
||||
PLOT 0 (single histo plot)
|
||||
runs 1 2
|
||||
range 0 4 -0.2 0.2
|
||||
|
||||
The ``PLOT block`` defines which data (corresponding to the given RUN blocks) is plotted when
|
||||
:ref:`musrview <musrview>` is called. In the given example, a canvas would be drawn containing
|
||||
the (life-time-corrected) data of the first two ``RUN blocks`` ("Up" and "Down" positron counters).
|
||||
The abscissa would range from 0 to 4 |mgr|\s, the axis of ordinates from -0.2 to 0.2.
|
||||
It is possible to define more than one ``PLOT block``. Each ``PLOT block`` corresponds to a
|
||||
separate canvas. Therefore, the second ``PLOT block`` in the file
|
||||
|
||||
::
|
||||
|
||||
PLOT 0 (single histo plot)
|
||||
runs 3
|
||||
use_fit_ranges
|
||||
|
||||
produces an additional window containing the (not life-time-corrected) data of the third ``RUN block``
|
||||
("Right" positron counter). The abscissa ranges from 0 to 4.9 |mgr|\s (according to the fit range given
|
||||
in the ``RUN block``).
|
||||
|
||||
:ref:`The STATISTIC block <msr-statistic-block>`
|
||||
|
||||
::
|
||||
|
||||
STATISTIC --- 2011-07-09 10:58:44
|
||||
chisq = 1348.1764, NDF = 1146, chisq/NDF = 1.176419
|
||||
|
||||
This block is the last block of a msr file. It contains some information on the fit: the
|
||||
date and time as well as the absolute and normalized values of :math:`\chi^2` and the
|
||||
number of degrees of freedom in the fit.
|
||||
These information only have a meaning if the fitting procedure has been executed at
|
||||
least once and the fit has converged!
|
||||
|
||||
Determine t0 and the data range using musrt0
|
||||
++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
Before the given model can be fitted to the data, the data ranges and time zeros of the different
|
||||
``RUN blocks`` have to be set correctly. This can be achieved using :ref:`musrt0 <musrt0>`.
|
||||
Starting this program by selecting the ``musrt0`` button in ``musredit`` or calling from a terminal
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ musrt0 3110_tutorial.msr
|
||||
|
||||
opens an interactive window plotting the data of the first RUN block:
|
||||
|
||||
.. image:: ../images/tutorial-musrt0-1.*
|
||||
|
||||
The green line (at bin 1) represents time zero, the blue lines the start (at bin 1) and end (at bin 8000)
|
||||
of the data range and the optional red lines give the limits of the background range (if the background
|
||||
shall not be determined by the fit). All lines can be either dragged to reasonable locations or set by
|
||||
pressing the corresponding keyboard shortcuts. In the example the time zero can be set by pressing **T**
|
||||
(which moves the green line to the bin containing the maximum number of counts), the start of the data
|
||||
range should be set to about five bins later by zooming into the graph around bin 250 and pressing **d**
|
||||
when the cursor is found at a suitable location:
|
||||
|
||||
.. image:: ../images/tutorial-musrt0-2.*
|
||||
|
||||
After all lines have been adjusted for the first histogram, one can go on to the second by pressing **q**.
|
||||
This procedure is repeated until all ranges have been set correctly. When finished with the last histogram
|
||||
the new t0 and data-range values will be written to the msr file. A full description of ``musrt0`` can be
|
||||
found :ref:`here <musrt0>`.
|
||||
|
||||
Fit the model to the data using ``musrfit``
|
||||
+++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
Now that the basics of the msr file have been introduced and the necessary adjustments have been done one
|
||||
can proceed with fitting the specified model to the data. This is done by selecting the ``musrfit`` icon
|
||||
in ``musredit`` or calling from a terminal
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ musrfit 3110_tutorial.msr
|
||||
|
||||
After the fitting procedure has finished the msr file is updated and contains the newly determined values
|
||||
of the fit parameters.
|
||||
|
||||
View the data and the fit using ``musrview``
|
||||
++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
The data and the corresponding fit can be visualized by choosing the ``musrview`` icon in ``musredit`` or
|
||||
calling from a terminal
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ musrview 3110_tutorial.msr
|
||||
|
||||
This creates the windows according to the given PLOT blocks in the msr file:
|
||||
|
||||
.. image:: ../images/tutorial-musrview-1.*
|
||||
|
||||
The basic features of ``musrview`` can be found in the ``Musrfit menu``. They include:
|
||||
|
||||
* export the shown data and the model to an ASCII file with comma-separated values
|
||||
* presenting the difference between the shown data and the model (keyboard shortcut: **d**)
|
||||
* calculate and show the Fourier transform of the shown data (keyboard shortcut: **f**), *e.g.* for
|
||||
the asymmetry of the "Up" and "Down" detectors:
|
||||
|
||||
.. image:: ../images/tutorial-musrview-FT.*
|
||||
|
||||
Process multiple msr files using ``msr2data``
|
||||
+++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
This short introduction is concluded by calling attention to the program :ref:`msr2data <msr2data>`.
|
||||
As the name indicates the main purpose of this program is to extract the ``FITPARAMETER`` block
|
||||
information from multiple msr files with the same structure and to summarize them in a single
|
||||
ASCII file (either in ``TRIUMF DB`` format or simple columns). However, as described in detail
|
||||
in the manual, it is not only possible to collect data from msr files but also to create new
|
||||
msr files from a template and to process these files using ``musrfit`` on the fly.
|
||||
|
||||
Assuming the successive runs **3111** through **3114** can be analyzed using the same model introduced
|
||||
above for run **3110** (*e.g.* in the case one has done measurements at different temperatures) one can
|
||||
use the file ``3110_tutorial.msr`` as template, generate the files ``3111_tutorial.msr`` through
|
||||
``3114_tutorial.msr`` with the corresponding updates in the RUN blocks, call for each one ``musrfit``
|
||||
and finally summarize the FITPARAMETER block information of all processed files in an ASCII output
|
||||
file ``tutorial-T-dependence.dat`` (simple columns). If further information on the temperature or the
|
||||
applied field is available in the data files these will be included as well in the resulting ASCII file.
|
||||
From the terminal this would be done as follows:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ msr2data 3110 3114 _tutorial fit-3110 -o tutorial-T-dependence.dat data
|
||||
|
||||
To achieve the same in ``musredit`` (in this snapshot in the *dark theme*) one selects the ``msr2data`` icon and fills the form accordingly:
|
||||
|
||||
.. image:: ../images/tutorial-musredit-msr2data.*
|
||||
|
||||
Further reading
|
||||
+++++++++++++++
|
||||
|
||||
This page only summarizes the very basic features and options of the programs contained in the ``musrfit`` suite.
|
||||
For a complete description please refer to the manuals of :ref:`musrfit <musrfit>` (including :ref:`musrview <musrview>`,
|
||||
:ref:`musrt0 <musrt0>`, and :ref:`musrFT <musrFT>`), :ref:`mupp <mupp>`, :ref:`musredit <musredit-sec>`, and :ref:`msr2data <msr2data>`.
|
||||
|
||||
Asymmtery-fit tutorial
|
||||
----------------------
|
||||
|
||||
to be written yet.
|
@ -1,747 +0,0 @@
|
||||
:tocdepth: 3
|
||||
|
||||
.. include:: <isogrk1.txt>
|
||||
.. index:: user-libs
|
||||
|
||||
.. _user-libs:
|
||||
|
||||
Documentation of user libs (user functions)
|
||||
===========================================
|
||||
|
||||
.. index:: BMW-libs
|
||||
.. _BMW-libs:
|
||||
|
||||
Meissner-Profiles / Vortex-Lattice related functions (BMW libs)
|
||||
---------------------------------------------------------------
|
||||
|
||||
.. index:: libFitPofB
|
||||
|
||||
libFitPofB
|
||||
++++++++++
|
||||
|
||||
Introduction
|
||||
^^^^^^^^^^^^
|
||||
|
||||
``libFitPofB`` is a collection of ``C++`` classes using the ``musrfit`` :ref:`user-functions <user-functions>`
|
||||
interface in order to facilitate the usage in conjunction with ``musrfit``. The classes contained in this
|
||||
library generally implement calculations of one-dimensional static magnetic field distributions
|
||||
:math:`p(B)` which lead to the muon-spin depolarization functions
|
||||
|
||||
.. math::
|
||||
|
||||
{\cal P}(t) = \int p(B) \cos(\gamma_\mu B t + \varphi) dB,
|
||||
|
||||
where :math:`\gamma_\mu = 2 \pi \times 135.54` MHz/T is the gyromagnetic ratio of the muon and :math:`\varphi`
|
||||
is the initial phase of the muon spins with respect to the positron detector. At the moment the only available
|
||||
implementations deal with field distributions measured in local isotropic superconductors, either by means of
|
||||
low-energy |mgr|\SR (see `<https://www.psi.ch/smus/lem>`_) in the Meissner state or by bulk |mgr|\SR in the mixed state.
|
||||
In the following the basic usage of the library in ``musrfit`` is explained—the calculations by themselves are only
|
||||
outlined. For further information please refer to the original literature and/or the source code of the implementation.
|
||||
|
||||
.. note::
|
||||
|
||||
In order to supply certain information needed for the calculations but not suited to be stored in the ``musrfit``
|
||||
msr files an ``XML`` configuration file in the working directory is used. For details, see below.
|
||||
|
||||
.. note::
|
||||
|
||||
The implementations in this library heavily rely on `FFTW3 <http://fftw.org/>`_. In principle, it always checks what
|
||||
is the best way to do efficient Fourier transforms for a given machine before the transforms are actually done. If
|
||||
repeatedly Fourier transforms of the same (sizable) length should be done, it might be worth storing the once
|
||||
obtained information in an external file and just load it the next time this information is needed
|
||||
(`wisdom handling <http://fftw.org/fftw3_doc/Wisdom.html>`_). In case this feature shall be used, a valid wisdom
|
||||
file has to be specified in the ``XML`` file.
|
||||
|
||||
.. note::
|
||||
|
||||
The model functions described in the following do generally *not behave nicely* in conjunction with ``MINUIT``
|
||||
function minimizations (or maximizations). The analysis process at the moment in most cases involves some
|
||||
tedious trial-and-error procedure, where the displayed MINUIT information as always deserves attention.
|
||||
This is especially true if small effects should be analyzed (*e.g.* small diamagnetic shifts in superconductors).
|
||||
The parameter uncertainty in many cases has to be estimated independently. Due to these limitations, also
|
||||
the use of the fit option of ``msr2data`` *cannot* be advised.
|
||||
|
||||
.. note::
|
||||
|
||||
If these classes still prove useful and results obtained through them are part of scientific publications,
|
||||
an acknowledgment of the use of the library is appreciated.
|
||||
|
||||
LE-|mgr|\SR
|
||||
^^^^^^^^^^^
|
||||
|
||||
.. index:: 1D-London-Meissner
|
||||
|
||||
One-dimensional London model for the Meissner state of isotropic superconductors
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
The models for analyzing LE-|mgr|\SR data assume the magnetic induction :math:`B(z)` to vary only in the
|
||||
dimension parallel to the momentum of the incident muons. In such a case the magnetic field distribution is given by
|
||||
|
||||
.. math::
|
||||
|
||||
p(B) = n(z) \left| \frac{dB(z)}{dz} \right|^{-1}
|
||||
|
||||
where :math:`n(z)` is the muon implantation profile simulated by ``TRIM.SP``.
|
||||
|
||||
Assuming an array of *N* isotropic local superconductors with a total thickness *d* in the Meissner state
|
||||
the magnetic induction is given by solving the 1D London equation
|
||||
|
||||
.. math::
|
||||
|
||||
\frac{\partial^2}{\partial z^2}B_i(z) = \frac{1}{\lambda_i^2}B_i(z)
|
||||
|
||||
for each layer *i* taking into account the boundary conditions (F. London, Superfluids: Macroscopic Theory of Superconductivity, Dover (1961), p. 34)
|
||||
|
||||
.. math::
|
||||
|
||||
B_1(0) = B_N(d) = \mu_0H
|
||||
|
||||
B_i(d_i) = B_{i+1}(d_i)
|
||||
|
||||
\lambda_i^2B_i'(z)\Big\vert_{z=d_i} = \lambda_{i+1}^2B_{i+1}'(z)\Big\vert_{z=d_i},
|
||||
|
||||
where the :math:`d_i` specify the interfaces between two adjacent layers and :math:`\lambda_i` is
|
||||
the magnetic field penetration depth in the constituent :math:`i`.
|
||||
|
||||
The calculation of the field distribution has been set up for a superconducting half-space as well
|
||||
as superconducting thin films with up to three superconducting layers with different penetration depths.
|
||||
The muon-spin depolarization functions are calculated using the following lines in the ``THEORY`` block
|
||||
of a ``musrfit`` msr file:
|
||||
|
||||
.. index:: TLondon1DHS
|
||||
|
||||
**Superconducting half-space**
|
||||
|
||||
::
|
||||
|
||||
userFcn libFitPofB TLondon1DHS 1 2 3 4 5
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. phase (deg)
|
||||
#. muon implantation energy as specified in the :ref:`XML startup <BMWlibs-XML>` file (keV)
|
||||
#. applied field (G)
|
||||
#. thickness of the dead layer (nm)
|
||||
#. magnetic field penetration depth (nm)
|
||||
|
||||
.. index:: TLondon1D1L
|
||||
|
||||
**Superconducting thin film (one layer)**
|
||||
|
||||
::
|
||||
|
||||
userFcn libFitPofB TLondon1D1L 1 2 3 4 5 6 [a b]
|
||||
|
||||
The mandatory parameters are:
|
||||
|
||||
#. phase (deg)
|
||||
#. muon implantation energy as specified in the :ref:`XML startup <BMWlibs-XML>` file (keV)
|
||||
#. applied field (G)
|
||||
#. thickness of the dead layer (nm)
|
||||
#. thickness of the actually superconducting layer (nm)
|
||||
#. magnetic field penetration depth (nm)
|
||||
|
||||
The optional parameters are:
|
||||
|
||||
a. fraction f\ :sub:`1` of muons in the thin film contributing to the signal (0 ≤ f\ :sub:`1` ≤ 1)
|
||||
b. fraction f\ :sub:`s` of muons in the substrate contributing to the signal (0 ≤ f\ :sub:`s` ≤ 1)
|
||||
|
||||
.. index:: TLondon1D2L
|
||||
|
||||
**Superconducting thin-film bilayer heterostructure**
|
||||
|
||||
::
|
||||
|
||||
userFcn libFitPofB TLondon1D2L 1 2 3 4 5 6 7 8 [a b c]
|
||||
|
||||
The mandatory parameters are:
|
||||
|
||||
#. phase (deg)
|
||||
#. muon implantation energy as specified in the :ref:`XML startup <BMWlibs-XML>` file (keV)
|
||||
#. applied field (G)
|
||||
#. thickness of the dead layer (nm)
|
||||
#. thickness of the actually superconducting first layer (nm)
|
||||
#. thickness of the actually superconducting second layer (nm)
|
||||
#. magnetic field penetration depth of the first layer (nm)
|
||||
#. magnetic field penetration depth of the second layer (nm)
|
||||
|
||||
The optional parameters are:
|
||||
|
||||
a. fraction f\ :sub:`1` of muons in the dead and first layer contributing to the signal (0 ≤ f\ :sub:`1` ≤ 1)
|
||||
b. fraction f\ :sub:`2` of muons in the second layer contributing to the signal (0 ≤ f\ :sub:`2` ≤ 1)
|
||||
c. fraction f\ :sub:`s` of muons in the substrate contributing to the signal (0 ≤ f\ :sub:`s` ≤ 1)
|
||||
|
||||
.. index:: TLondon1D3L
|
||||
|
||||
**Superconducting thin-film trilayer heterostructure**
|
||||
|
||||
::
|
||||
|
||||
userFcn libFitPofB TLondon1D3L 1 2 3 4 5 6 7 8 9 10 [a b c d]
|
||||
|
||||
The mandatory parameters are:
|
||||
|
||||
#. phase (deg)
|
||||
#. muon implantation energy as specified in the :ref:`XML startup <BMWlibs-XML>` file (keV)
|
||||
#. applied field (G)
|
||||
#. thickness of the dead layer (nm)
|
||||
#. thickness of the actually superconducting first layer (nm)
|
||||
#. thickness of the actually superconducting second layer (nm)
|
||||
#. thickness of the actually superconducting third layer (nm)
|
||||
#. magnetic field penetration depth of the first layer (nm)
|
||||
#. magnetic field penetration depth of the second layer (nm)
|
||||
#. magnetic field penetration depth of the third layer (nm)
|
||||
|
||||
The optional parameters are:
|
||||
|
||||
a. fraction f\ :sub:`1` of muons in the dead and first layer contributing to the signal (0 ≤ f\ :sub:`1` ≤ 1)
|
||||
b. fraction f\ :sub:`2` of muons in the second layer contributing to the signal (0 ≤ f\ :sub:`2` ≤ 1)
|
||||
c. fraction f\ :sub:`3` of muons in the third layer contributing to the signal (0 ≤ f\ :sub:`3` ≤ 1)
|
||||
d. fraction f\ :sub:`s` of muons in the substrate contributing to the signal (0 ≤ f\ :sub:`s` ≤ 1)
|
||||
|
||||
Bulk |mgr|\SR
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
.. index:: Vortex-State-Isotropic
|
||||
|
||||
Field distributions in the mixed state of isotropic superconductors
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
When investigating superconductors in the mixed state by means of conventional |mgr|\SR a
|
||||
two-dimensional flux-line lattice is probed randomly by the muons. The spatial field
|
||||
distributions within such an ordered lattice are modeled using the Fourier series
|
||||
|
||||
.. math::
|
||||
|
||||
B(\mathbf{r}) = \langle B \rangle \sum\limits_{\mathbf{K}}B_{\mathbf{K}}\exp(-\imath\mathbf{K}\mathbf{r}),
|
||||
|
||||
where :math:`\mathbf{r}=(x,y)`, **K** are the reciprocal lattice vectors of a two-dimensional
|
||||
vortex lattice and the :math:`B_{\mathbf{K}}` are the Fourier coefficients depending on the
|
||||
magnetic penetration depth :math:`\lambda` and the superconducting coherence length :math:`\xi`.
|
||||
The :math:`B_{\mathbf{K}}` for some specific models are as follows:
|
||||
|
||||
**London model with Gaussian cutoff** (E.H. Brandt, `J. Low Temp. Phys. 73, 355 (1988) <http://dx.doi.org/10.1007/BF00683568>`_.)
|
||||
|
||||
.. math::
|
||||
|
||||
B_{\mathbf{K}} = \frac{\exp\left({-K^2\xi^2/2}\right)}{1 + K^2\lambda^2}
|
||||
|
||||
**Modified London model** (T.M. Riseman *et al.*, `Phys. Rev. B 52, 10569 (1995) <http://dx.doi.org/10.1103/PhysRevB.52.10569>`_.)
|
||||
|
||||
.. math::
|
||||
|
||||
B_{\mathbf{K}} = \frac{\exp\left({-K^2\xi^2/2(1-b)}\right)}{1 + K^2\lambda^2/(1-b)},
|
||||
|
||||
where :math:`b = \langle B \rangle / (\mu_0 H_{\rm c2})`.
|
||||
|
||||
**Analytical Ginzburg-Landau model** ( A. Yaouanc, P. Dalmas de Réotier and E.H. Brandt, `Phys. Rev. B 55, 11107 (1997) <http://dx.doi.org/10.1103/PhysRevB.55.11107>`_)
|
||||
|
||||
.. math::
|
||||
|
||||
B_{\mathbf{K}} = \frac{f_{\infty}K_1\left(\frac{\xi_v}{\lambda}\sqrt{f_{\infty}^2+\lambda^2K^2}\right)}{K_1\left(\frac{\xi_v}{\lambda}f_{\infty}\right)\sqrt{f_{\infty}^2+\lambda^2K^2}},
|
||||
|
||||
where :math:`f_{\infty} = 1 - b^4,~\xi_v = \xi\left(\sqrt{2}-{3\xi}/\left({4\lambda}\right)\right)\sqrt{(1+b^4)(1-2b(1-b)^2)}` and
|
||||
:math:`K_1` is a modified Bessel function.
|
||||
|
||||
Apart from the mentioned analytic models the **numerical Ginzburg-Landau model** (`E.H. Brandt, Phys. Rev. B 68, 054506 (2003). <http://dx.doi.org/10.1103/PhysRevB.68.054506>`_) is available. In this case :math:`B(\mathbf{r})` is obtained by an iterative minimization of the free energy of the vortex lattice.
|
||||
|
||||
**Concerning the applicability (e.g. field regions) of each of the mentioned models please refer to the original publications!**
|
||||
|
||||
At the moment, the calculation of the field distribution has been implemented for *triangular* flux-line lattices.
|
||||
The number of grid lines in which the inter-vortex distance is divided for the calculations to be specified through
|
||||
the :ref:`XML startup <BMWlibs-XML>`.
|
||||
The muon-spin depolarization functions finally are calculated using the following lines in the THEORY block of a ``musrfit`` msr file:
|
||||
|
||||
.. index:: Vortex-Gaussian-CutOff
|
||||
|
||||
**2D triangular vortex lattice, London model with Gaussian cutoff**
|
||||
|
||||
::
|
||||
|
||||
userFcn libFitPofB TBulkTriVortexLondon 1 2 3 4
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. phase (deg)
|
||||
#. mean magnetic induction (G)
|
||||
#. magnetic penetration depth (nm)
|
||||
#. Ginzburg-Landau coherence length (nm)
|
||||
|
||||
.. index:: Vortex-London-modified
|
||||
|
||||
**2D triangular vortex lattice, modified London model**
|
||||
|
||||
::
|
||||
|
||||
userFcn libFitPofB TBulkTriVortexML 1 2 3 4
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. phase (deg)
|
||||
#. mean magnetic induction (G)
|
||||
#. magnetic penetration depth (nm)
|
||||
#. Ginzburg-Landau coherence length (nm)
|
||||
|
||||
.. index:: Vortex-Analytic-GL
|
||||
|
||||
**2D triangular vortex lattice, analytic Ginzburg-Landau model**
|
||||
|
||||
::
|
||||
|
||||
userFcn libFitPofB TBulkTriVortexAGL 1 2 3 4
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. phase (deg)
|
||||
#. mean magnetic induction (G)
|
||||
#. magnetic penetration depth (nm)
|
||||
#. Ginzburg-Landau coherence length (nm)
|
||||
|
||||
.. index:: Vortex-Numeric-GL
|
||||
|
||||
**2D triangular vortex lattice, numerical Ginzburg-Landau model**
|
||||
|
||||
::
|
||||
|
||||
userFcn libFitPofB TBulkTriVortexNGL 1 2 3 4
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. phase (deg)
|
||||
#. mean magnetic induction (G)
|
||||
#. magnetic penetration depth (nm)
|
||||
#. Ginzburg-Landau coherence length (nm)
|
||||
|
||||
.. note::
|
||||
|
||||
In order to improve the convergence of ``MIGRAD`` it has proven useful to use the log-likelihood
|
||||
maximization instead of the :math:`\chi^2` minimization routines and to choose sufficiently large
|
||||
initial steps for the parameters. Calling ``MINOS`` in conjunction with these functions is futile.
|
||||
|
||||
Therefore, the :ref:`COMMANDS block <msr-commands-block>` of the msr file could look like:
|
||||
|
||||
::
|
||||
|
||||
COMMANDS
|
||||
STRATEGY 2
|
||||
MAX_LIKELIHOOD
|
||||
MIGRAD
|
||||
HESSE
|
||||
SAVE
|
||||
|
||||
.. index:: BMWlibs-XML
|
||||
.. _BMWlibs-XML:
|
||||
|
||||
The XML startup file
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``BMW_startup.xml`` is a configuration file located in the working directory. In this file some settings
|
||||
like the time and field resolution of the calculations as well as the present muon implantation profiles
|
||||
for a LE-|mgr|\SR analysis have to be defined. The following XML tags are allowed to define settings:
|
||||
|
||||
**<debug>ONE_OR_ZERO</debug>**
|
||||
activate the debugging output of the settings read from the XML file by setting 1, deactivate it with 0.
|
||||
**<wisdom>PATH_TO_FILE</wisdom>**
|
||||
specify the ``PATH_TO_FILE`` to an `FFTW3 wisdom file <http://fftw.org/fftw3_doc/Wisdom.html#Wisdom>`_
|
||||
that should be used; if the ``PATH_TO_FILE`` is invalid, no ``FFTW3`` wisdom will be used.
|
||||
**<delta_t>ResT</delta_t>**
|
||||
set the time resolution ``ResT`` for the calculated depolarization function in microseconds.
|
||||
**<delta_B>ResB</delta_B>**
|
||||
set the field resolution ``ResB`` for the calculated field distribution in Gauss.
|
||||
**<VortexLattice></VortexLattice>**
|
||||
set the parameters used for the calculation of the spatial field distribution of a vortex lattice.
|
||||
|
||||
**<N_VortexGrid>N</N_VortexGrid>**
|
||||
specify the number of points **N** (in each of the two dimensions) for which the fields within the
|
||||
vortex lattice are calculated (inside a **<VortexLattice>** environment)
|
||||
|
||||
**<LEM></LEM>**
|
||||
set the parameters used for the calculation of LE-|mgr|\SR field distributions
|
||||
|
||||
**<data_path>DATA_PATH_PREFIX</data_path>**
|
||||
specify the ``DATA_PATH_PREFIX`` to the ``TRIM.SP`` implantation profiles (inside a **<LEM>** environment)
|
||||
**<N_theory>N_THEORY</N_theory>**
|
||||
specify the number of points **N_THEORY** for which *B(z)* is calculated (inside a **<LEM>** environment)
|
||||
The specification of this number is not needed if the calculation of the inverse of *B(z)* is implemented!
|
||||
**<energy_list></energy_list>**
|
||||
set the energies for which ``TRIM.SP`` implantation profiles are available (inside a **<LEM>** environment)
|
||||
|
||||
**<energy_label>LABEL</energy_label>**
|
||||
specify the **LABEL** within the file name of a available ``TRIM.SP`` ``RGE`` file (inside a **<energy_list>** environment)
|
||||
The expected name of the ``RGE`` file will be: ``DATA_PATH_PREFIX + LABEL + .rge``
|
||||
**<energy>E</energy>**
|
||||
specify the muon energy *E* (in keV) belonging to the ``TRIM.SP`` ``RGE`` file given above (inside a **<energy_list>** environment)
|
||||
|
||||
An example XML file looks as follows:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<BMW>
|
||||
<debug>0</debug>
|
||||
<wisdom>/home/user/WordsOfWisdom.dat</wisdom>
|
||||
<delta_t>0.01</delta_t>
|
||||
<delta_B>0.5</delta_B>
|
||||
<VortexLattice>
|
||||
<N_VortexGrid>1024</N_VortexGrid>
|
||||
</VortexLattice>
|
||||
<LEM>
|
||||
<data_path>/home/user/TrimSP/some-sample-</data_path>
|
||||
<N_theory>5000</N_theory>
|
||||
<energy_list>
|
||||
<energy_label>02_0</energy_label>
|
||||
<energy>2.0</energy>
|
||||
<energy_label>03_0</energy_label>
|
||||
<energy>3.0</energy>
|
||||
<energy_label>03_6</energy_label>
|
||||
<energy>3.6</energy>
|
||||
<energy_label>05_0</energy_label>
|
||||
<energy>5.0</energy>
|
||||
<energy_label>05_3</energy_label>
|
||||
<energy>5.3</energy>
|
||||
</energy_list>
|
||||
</LEM>
|
||||
</BMW>
|
||||
|
||||
Nonlocal superconductivity related Meissner screening functions (AS libs)
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
To be written yet ...
|
||||
|
||||
.. index:: BNMR-libs
|
||||
.. _BNMR-libs:
|
||||
|
||||
Functions to analyze |bgr|-NMR data (BNMR libs)
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
This is a collection of ``C++`` classes using the ``musrfit`` :ref:`user-functions <user-functions>`
|
||||
interface in order to facilitate the usage in conjunction with ``musrfit``. It consists of two libraries:
|
||||
|
||||
* ``libBNMR`` contains functions to fit spin lattice relaxation (SLR) data.
|
||||
* ``libLineProfile`` contains functions to fit resonance lineshapes.
|
||||
|
||||
|
||||
.. note::
|
||||
|
||||
Currently it is recommended to read in the data in ASCII format as a non-|mgr|\SR fit :ref:`(fit type 8) <non-musr-fit>`.
|
||||
|
||||
.. index:: libBNMR
|
||||
|
||||
libBNMR
|
||||
++++++++++
|
||||
|
||||
In |bgr|-NMR the SLR is usually measured by implanting a pulse of :math:`^8`\ Li with a length :math:`t_0` into the sample.
|
||||
The asymmetry is measured both during the pulse and afterwards. For a a general spin relaxation function :math:`f(t)` the time evolution of the asymmetry is then given by [`Z. Salman, et al., PRL 96, 147601 (2006) <http://dx.doi.org/10.1103/PhysRevLett.96.147601>`_]:
|
||||
|
||||
|
||||
|
||||
.. index:: SLR
|
||||
.. _SLR:
|
||||
|
||||
.. math::
|
||||
P(t) = \left\{\begin{matrix}
|
||||
\frac{\int_0^t e^{-(t-t')/\tau_{\mathrm{Li}}}f(t-t')dt'}{\int_0^t e^{-t'/\tau_{\mathrm{Li}}}dt' } & t\leq t_0\\[6pt]
|
||||
\frac{\int_0^{t_0}e^{-(t_0-t')/\tau_{\mathrm{Li}}}f(t-t')dt'}{\int_0^{t_0}e^{-t'/\tau_{\mathrm{Li}}}dt'} & t> t_0,
|
||||
\end{matrix}\right.
|
||||
|
||||
where :math:`\tau_{\mathrm{Li}}=1.21`\ s is the :math:`^8`\ Li lifetime.
|
||||
|
||||
|
||||
Functions
|
||||
^^^^^^^^^^^^
|
||||
The ``libBNMR`` library currently contains the following functions:
|
||||
|
||||
|
||||
|
||||
|
||||
.. index:: ExpRlx
|
||||
|
||||
**Exponential relaxation**
|
||||
|
||||
::
|
||||
|
||||
userFcn libBNMR ExpRlx 1 2
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. pulse length :math:`t_0` (s)
|
||||
#. relaxation rate :math:`\lambda` (s\ :math:`^{-1}`\ )
|
||||
|
||||
This function implements :math:`f(t)=e^{-\lambda t}`.
|
||||
|
||||
.. index:: SExpRlx
|
||||
|
||||
**Stretched exponential relaxation**
|
||||
|
||||
::
|
||||
|
||||
userFcn libBNMR SExpRlx 1 2 3
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. pulse length :math:`t_0` (s)
|
||||
#. relaxation rate :math:`\lambda` (s\ :math:`^{-1}`\ )
|
||||
#. stretching exponent :math:`\beta`
|
||||
|
||||
This function implements :math:`f(t)=e^{-(\lambda t)^{\beta}}`.
|
||||
|
||||
|
||||
|
||||
.. index:: libLineProfile
|
||||
|
||||
libLineProfile
|
||||
+++++++++++++++++
|
||||
In addition to some simple line shapes ``libLineProfile`` contains functions to fit chemical shift anisotropies in the powder average.
|
||||
Their functional form can be found in `M. Mehring, Principles of High Resolution NMR in Solids (Springer 1983) <http://dx.doi.org/10.1007/978-3-642-68756-3_2>`_.
|
||||
|
||||
For an axially symmetric interaction it is given by:
|
||||
|
||||
.. index:: Iax
|
||||
.. _Iax:
|
||||
|
||||
.. math::
|
||||
|
||||
I_{\mathrm ax}(f)=\left\{\begin{matrix} \frac{1}{2\sqrt{(f_\parallel-f_\perp)(f-f_\perp)}}& f\in(f_\perp,f_\parallel)\cup(f_\parallel,f_\perp)\\[6pt] 0 & \text{otherwise}\end{matrix} \right.
|
||||
|
||||
where :math:`f_\parallel` and :math:`f_\perp` are the frequencies that would be observed if the field is oriented paralell or perpendicular to the symmetry axis, respectively.
|
||||
|
||||
|
||||
| In case of a completely anisotropic interaction, the powder average can be described by the frequencies along the three principle axis :math:`f_1,f_2,f_3`.
|
||||
| Assume without loss of generality that :math:`f_1<f_2<f_3`, then
|
||||
|
||||
.. index:: Ianiso
|
||||
.. _Ianiso:
|
||||
|
||||
.. math::
|
||||
I(f)&=\left\{\begin{matrix}
|
||||
\frac{K(m)}{\pi\sqrt{(f-f_1)(f_3-f_2)}},& f_3\geq f>f_2 \\[9pt]
|
||||
\frac{K(m)}{\pi\sqrt{(f_3-f)(f_2-f_1)}},& f_2>f\geq f_1\\[9pt]
|
||||
0 & \text{otherwise}
|
||||
\end{matrix} \right. \\
|
||||
\\
|
||||
m&=\left\{\begin{matrix}
|
||||
\frac{(f_2-f_1)(f_3-f)}{(f_3-f_2)(f-f_1)},& f_3\geq f>f_2 \\[6pt]
|
||||
\frac{(f-f_1)(f_3-f_2)}{(f_3-f)(f_2-f_1)},& f_2>f\geq f_1\\[6pt]
|
||||
\end{matrix} \right. \\
|
||||
\\
|
||||
K(m)&=\int_0^{\pi/2}\frac{\mathrm d\varphi}{\sqrt{1-m^2\sin^2{\varphi}}},
|
||||
|
||||
|
||||
:math:`K(m)` is the complete elliptic integral of the first kind.
|
||||
|
||||
|
||||
|
||||
Functions
|
||||
^^^^^^^^^^^^
|
||||
The ``libLineProfile`` library currently contains the following functions:
|
||||
|
||||
|
||||
|
||||
|
||||
.. index:: LineGauss
|
||||
|
||||
**Gaussian**
|
||||
|
||||
::
|
||||
|
||||
userFcn libLineProfile LineGauss 1 2
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. center of the line :math:`f_0`
|
||||
#. FWHM of the line :math:`\sigma`
|
||||
|
||||
| The height of the peak is 1.
|
||||
| The functional form is given by
|
||||
|
||||
.. math::
|
||||
A(f)=e^{-\frac{4\ln 2 (f-f_0)^2}{ \sigma^2}}
|
||||
|
||||
|
||||
.. index:: LineLorentzian
|
||||
|
||||
**Lorentzian**
|
||||
|
||||
::
|
||||
|
||||
userFcn libLineProfile LineLorentzian 1 2
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. center of the line :math:`f_0`
|
||||
#. FWHM of the line :math:`w`
|
||||
|
||||
| The height of the peak is 1.
|
||||
| The functional form is given by
|
||||
|
||||
.. math::
|
||||
A(f)= \frac{w^2}{4(f-f_0)^2+w^2}
|
||||
|
||||
|
||||
.. index:: LineLaplace
|
||||
|
||||
**Laplacian**
|
||||
|
||||
::
|
||||
|
||||
userFcn libLineProfile LineLaplace 1 2
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. center of the line :math:`f_0`
|
||||
#. FWHM of the line :math:`w`
|
||||
|
||||
| The height of the peak is 1.
|
||||
| The functional form is given by
|
||||
|
||||
.. math::
|
||||
A(f)=e^{-2\ln 2 \left|\frac{f-f_0}{w}\right|}
|
||||
|
||||
|
||||
|
||||
.. index:: LineSkewLorentzian
|
||||
|
||||
**Skewed Lorentzian**
|
||||
|
||||
::
|
||||
|
||||
userFcn libLineProfile LineSkewLorentzian 1 2 3
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. center of the line :math:`f_0`
|
||||
#. width of the line :math:`w`
|
||||
#. skewness parameter :math:`a`
|
||||
|
||||
| The height of the peak is 1.
|
||||
| The functional form is given by
|
||||
|
||||
.. math::
|
||||
A(f)= \frac{w w_a}{4(f-f_0)^2+w_a^2}, \quad w_a=\frac{2w}{1+e^{a(f-f_0)}}
|
||||
|
||||
|
||||
|
||||
.. index:: LineSkewLorentzian2
|
||||
|
||||
**Skewed Lorentzian 2**
|
||||
|
||||
::
|
||||
|
||||
userFcn libLineProfile LineSkewLorentzian2 1 2 3
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. center of the line :math:`f_0`
|
||||
#. width left of the center :math:`w_1`
|
||||
#. width right of the center :math:`w_2`
|
||||
|
||||
| The height of the peak is 1.
|
||||
| The functional form is given by
|
||||
|
||||
.. math::
|
||||
A(f)= \left\{\begin{matrix}\frac{{w_1}^2}{4{(f-f_0)}^2+{w_1}^2},&f\leq f_0\\[9pt] \frac{{w_2}^2}{4{(f-f_0)}^2+{w_2}^2},&f>f_0\end{matrix}\right.
|
||||
|
||||
|
||||
|
||||
.. index:: PowderLineAxialLor
|
||||
|
||||
|
||||
**Powder average of an axially symmetric interaction convoluted with a Lorentzian**
|
||||
|
||||
::
|
||||
|
||||
userFcn libLineProfile PowderLineAxialLor 1 2 3
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. frequency for the field oriented paralell to the symmetry axis :math:`f_\parallel`
|
||||
#. frequency for the field oriented perpendicular to the symmetry axis :math:`f_\parallel`
|
||||
#. FWHM of the Lorentzian :math:`w`
|
||||
|
||||
| The height of the peak is :math:`\sim`\ 1.
|
||||
| The functional form is given by
|
||||
|
||||
.. math::
|
||||
A(f)= I_{\mathrm ax}(f)\circledast\left( \frac{w^2}{4f^2+w^2} \right)
|
||||
|
||||
with :math:`I_{\mathrm ax}(f)` defined :ref:`above <Iax>`.
|
||||
|
||||
|
||||
|
||||
.. index:: PowderLineAxialGss
|
||||
|
||||
|
||||
**Powder average of an axially symmetric interaction convoluted with a Gaussian**
|
||||
|
||||
::
|
||||
|
||||
userFcn libLineProfile PowderLineAxialGss 1 2 3
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. frequency for the field oriented paralell to the symmetry axis :math:`f_\parallel`
|
||||
#. frequency for the field oriented perpendicular to the symmetry axis :math:`f_\parallel`
|
||||
#. FWHM of the Gaussian :math:`\sigma`
|
||||
|
||||
| The height of the peak is :math:`\sim`\ 1.
|
||||
| The functional form is given by
|
||||
|
||||
.. math::
|
||||
A(f)= I_{\mathrm ax}(f)\circledast\left( e^{-\frac{4\ln 2 (f-f_0)^2}{ \sigma^2}} \right)
|
||||
|
||||
with :math:`I_{\mathrm ax}(f)` defined :ref:`above <Iax>`.
|
||||
|
||||
|
||||
|
||||
.. index:: PowderLineAsymLor
|
||||
|
||||
|
||||
**Powder average of an anisotropic interaction convoluted with a Lorentzian**
|
||||
|
||||
::
|
||||
|
||||
userFcn libLineProfile PowderLineAsymLor 1 2 3 4
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. :math:`f_1`
|
||||
#. :math:`f_1`
|
||||
#. :math:`f_3` frequencies along the principal axes
|
||||
#. FWHM of the Lorentzian :math:`w`
|
||||
|
||||
| The height of the peak is :math:`\sim`\ 1.
|
||||
| The functional form is given by
|
||||
|
||||
.. math::
|
||||
A(f)= I(f)\circledast\left( \frac{w^2}{4f^2+w^2} \right)
|
||||
|
||||
with :math:`I(f)` defined :ref:`above <Ianiso>`. Note that :math:`f_1<f_2<f_3` is not required by the code.
|
||||
|
||||
|
||||
|
||||
.. index:: PowderLineAsymGss
|
||||
|
||||
|
||||
**Powder average of an anisotropic interaction convoluted with a Gaussian**
|
||||
|
||||
::
|
||||
|
||||
userFcn libLineProfile PowderLineAsymGss 1 2 3 4
|
||||
|
||||
The parameters are:
|
||||
|
||||
#. :math:`f_1`
|
||||
#. :math:`f_1`
|
||||
#. :math:`f_3` frequencies along the principal axes
|
||||
#. FWHM of the Gaussian :math:`\sigma`
|
||||
|
||||
| The height of the peak is :math:`\sim`\ 1.
|
||||
| The functional form is given by
|
||||
|
||||
.. math::
|
||||
A(f)= I(f)\circledast\left( e^{-\frac{4\ln 2 (f-f_0)^2}{ \sigma^2}} \right)
|
||||
|
||||
with :math:`I(f)` defined :ref:`above <Ianiso>`. Note that :math:`f_1<f_2<f_3` is not required by the code.
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 673 B |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 368 B |
Before Width: | Height: | Size: 363 B |
Before Width: | Height: | Size: 372 B |
Before Width: | Height: | Size: 363 B |
@ -1,808 +0,0 @@
|
||||
/*
|
||||
* websupport.js
|
||||
* ~~~~~~~~~~~~~
|
||||
*
|
||||
* sphinx.websupport utilties for all documentation.
|
||||
*
|
||||
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
$.fn.autogrow = function() {
|
||||
return this.each(function() {
|
||||
var textarea = this;
|
||||
|
||||
$.fn.autogrow.resize(textarea);
|
||||
|
||||
$(textarea)
|
||||
.focus(function() {
|
||||
textarea.interval = setInterval(function() {
|
||||
$.fn.autogrow.resize(textarea);
|
||||
}, 500);
|
||||
})
|
||||
.blur(function() {
|
||||
clearInterval(textarea.interval);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.autogrow.resize = function(textarea) {
|
||||
var lineHeight = parseInt($(textarea).css('line-height'), 10);
|
||||
var lines = textarea.value.split('\n');
|
||||
var columns = textarea.cols;
|
||||
var lineCount = 0;
|
||||
$.each(lines, function() {
|
||||
lineCount += Math.ceil(this.length / columns) || 1;
|
||||
});
|
||||
var height = lineHeight * (lineCount + 1);
|
||||
$(textarea).css('height', height);
|
||||
};
|
||||
})(jQuery);
|
||||
|
||||
(function($) {
|
||||
var comp, by;
|
||||
|
||||
function init() {
|
||||
initEvents();
|
||||
initComparator();
|
||||
}
|
||||
|
||||
function initEvents() {
|
||||
$('a.comment-close').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
hide($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.vote').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
handleVote($(this));
|
||||
});
|
||||
$('a.reply').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
openReply($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.close-reply').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
closeReply($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.sort-option').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
handleReSort($(this));
|
||||
});
|
||||
$('a.show-proposal').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
showProposal($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.hide-proposal').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
hideProposal($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.show-propose-change').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
showProposeChange($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.hide-propose-change').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
hideProposeChange($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.accept-comment').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
acceptComment($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.delete-comment').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
deleteComment($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.comment-markup').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
toggleCommentMarkupBox($(this).attr('id').substring(2));
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Set comp, which is a comparator function used for sorting and
|
||||
* inserting comments into the list.
|
||||
*/
|
||||
function setComparator() {
|
||||
// If the first three letters are "asc", sort in ascending order
|
||||
// and remove the prefix.
|
||||
if (by.substring(0,3) == 'asc') {
|
||||
var i = by.substring(3);
|
||||
comp = function(a, b) { return a[i] - b[i]; };
|
||||
} else {
|
||||
// Otherwise sort in descending order.
|
||||
comp = function(a, b) { return b[by] - a[by]; };
|
||||
}
|
||||
|
||||
// Reset link styles and format the selected sort option.
|
||||
$('a.sel').attr('href', '#').removeClass('sel');
|
||||
$('a.by' + by).removeAttr('href').addClass('sel');
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a comp function. If the user has preferences stored in
|
||||
* the sortBy cookie, use those, otherwise use the default.
|
||||
*/
|
||||
function initComparator() {
|
||||
by = 'rating'; // Default to sort by rating.
|
||||
// If the sortBy cookie is set, use that instead.
|
||||
if (document.cookie.length > 0) {
|
||||
var start = document.cookie.indexOf('sortBy=');
|
||||
if (start != -1) {
|
||||
start = start + 7;
|
||||
var end = document.cookie.indexOf(";", start);
|
||||
if (end == -1) {
|
||||
end = document.cookie.length;
|
||||
by = unescape(document.cookie.substring(start, end));
|
||||
}
|
||||
}
|
||||
}
|
||||
setComparator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a comment div.
|
||||
*/
|
||||
function show(id) {
|
||||
$('#ao' + id).hide();
|
||||
$('#ah' + id).show();
|
||||
var context = $.extend({id: id}, opts);
|
||||
var popup = $(renderTemplate(popupTemplate, context)).hide();
|
||||
popup.find('textarea[name="proposal"]').hide();
|
||||
popup.find('a.by' + by).addClass('sel');
|
||||
var form = popup.find('#cf' + id);
|
||||
form.submit(function(event) {
|
||||
event.preventDefault();
|
||||
addComment(form);
|
||||
});
|
||||
$('#s' + id).after(popup);
|
||||
popup.slideDown('fast', function() {
|
||||
getComments(id);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide a comment div.
|
||||
*/
|
||||
function hide(id) {
|
||||
$('#ah' + id).hide();
|
||||
$('#ao' + id).show();
|
||||
var div = $('#sc' + id);
|
||||
div.slideUp('fast', function() {
|
||||
div.remove();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform an ajax request to get comments for a node
|
||||
* and insert the comments into the comments tree.
|
||||
*/
|
||||
function getComments(id) {
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: opts.getCommentsURL,
|
||||
data: {node: id},
|
||||
success: function(data, textStatus, request) {
|
||||
var ul = $('#cl' + id);
|
||||
var speed = 100;
|
||||
$('#cf' + id)
|
||||
.find('textarea[name="proposal"]')
|
||||
.data('source', data.source);
|
||||
|
||||
if (data.comments.length === 0) {
|
||||
ul.html('<li>No comments yet.</li>');
|
||||
ul.data('empty', true);
|
||||
} else {
|
||||
// If there are comments, sort them and put them in the list.
|
||||
var comments = sortComments(data.comments);
|
||||
speed = data.comments.length * 100;
|
||||
appendComments(comments, ul);
|
||||
ul.data('empty', false);
|
||||
}
|
||||
$('#cn' + id).slideUp(speed + 200);
|
||||
ul.slideDown(speed);
|
||||
},
|
||||
error: function(request, textStatus, error) {
|
||||
showError('Oops, there was a problem retrieving the comments.');
|
||||
},
|
||||
dataType: 'json'
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a comment via ajax and insert the comment into the comment tree.
|
||||
*/
|
||||
function addComment(form) {
|
||||
var node_id = form.find('input[name="node"]').val();
|
||||
var parent_id = form.find('input[name="parent"]').val();
|
||||
var text = form.find('textarea[name="comment"]').val();
|
||||
var proposal = form.find('textarea[name="proposal"]').val();
|
||||
|
||||
if (text == '') {
|
||||
showError('Please enter a comment.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Disable the form that is being submitted.
|
||||
form.find('textarea,input').attr('disabled', 'disabled');
|
||||
|
||||
// Send the comment to the server.
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: opts.addCommentURL,
|
||||
dataType: 'json',
|
||||
data: {
|
||||
node: node_id,
|
||||
parent: parent_id,
|
||||
text: text,
|
||||
proposal: proposal
|
||||
},
|
||||
success: function(data, textStatus, error) {
|
||||
// Reset the form.
|
||||
if (node_id) {
|
||||
hideProposeChange(node_id);
|
||||
}
|
||||
form.find('textarea')
|
||||
.val('')
|
||||
.add(form.find('input'))
|
||||
.removeAttr('disabled');
|
||||
var ul = $('#cl' + (node_id || parent_id));
|
||||
if (ul.data('empty')) {
|
||||
$(ul).empty();
|
||||
ul.data('empty', false);
|
||||
}
|
||||
insertComment(data.comment);
|
||||
var ao = $('#ao' + node_id);
|
||||
ao.find('img').attr({'src': opts.commentBrightImage});
|
||||
if (node_id) {
|
||||
// if this was a "root" comment, remove the commenting box
|
||||
// (the user can get it back by reopening the comment popup)
|
||||
$('#ca' + node_id).slideUp();
|
||||
}
|
||||
},
|
||||
error: function(request, textStatus, error) {
|
||||
form.find('textarea,input').removeAttr('disabled');
|
||||
showError('Oops, there was a problem adding the comment.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively append comments to the main comment list and children
|
||||
* lists, creating the comment tree.
|
||||
*/
|
||||
function appendComments(comments, ul) {
|
||||
$.each(comments, function() {
|
||||
var div = createCommentDiv(this);
|
||||
ul.append($(document.createElement('li')).html(div));
|
||||
appendComments(this.children, div.find('ul.comment-children'));
|
||||
// To avoid stagnating data, don't store the comments children in data.
|
||||
this.children = null;
|
||||
div.data('comment', this);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* After adding a new comment, it must be inserted in the correct
|
||||
* location in the comment tree.
|
||||
*/
|
||||
function insertComment(comment) {
|
||||
var div = createCommentDiv(comment);
|
||||
|
||||
// To avoid stagnating data, don't store the comments children in data.
|
||||
comment.children = null;
|
||||
div.data('comment', comment);
|
||||
|
||||
var ul = $('#cl' + (comment.node || comment.parent));
|
||||
var siblings = getChildren(ul);
|
||||
|
||||
var li = $(document.createElement('li'));
|
||||
li.hide();
|
||||
|
||||
// Determine where in the parents children list to insert this comment.
|
||||
for(i=0; i < siblings.length; i++) {
|
||||
if (comp(comment, siblings[i]) <= 0) {
|
||||
$('#cd' + siblings[i].id)
|
||||
.parent()
|
||||
.before(li.html(div));
|
||||
li.slideDown('fast');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If we get here, this comment rates lower than all the others,
|
||||
// or it is the only comment in the list.
|
||||
ul.append(li.html(div));
|
||||
li.slideDown('fast');
|
||||
}
|
||||
|
||||
function acceptComment(id) {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: opts.acceptCommentURL,
|
||||
data: {id: id},
|
||||
success: function(data, textStatus, request) {
|
||||
$('#cm' + id).fadeOut('fast');
|
||||
$('#cd' + id).removeClass('moderate');
|
||||
},
|
||||
error: function(request, textStatus, error) {
|
||||
showError('Oops, there was a problem accepting the comment.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function deleteComment(id) {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: opts.deleteCommentURL,
|
||||
data: {id: id},
|
||||
success: function(data, textStatus, request) {
|
||||
var div = $('#cd' + id);
|
||||
if (data == 'delete') {
|
||||
// Moderator mode: remove the comment and all children immediately
|
||||
div.slideUp('fast', function() {
|
||||
div.remove();
|
||||
});
|
||||
return;
|
||||
}
|
||||
// User mode: only mark the comment as deleted
|
||||
div
|
||||
.find('span.user-id:first')
|
||||
.text('[deleted]').end()
|
||||
.find('div.comment-text:first')
|
||||
.text('[deleted]').end()
|
||||
.find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
|
||||
', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
|
||||
.remove();
|
||||
var comment = div.data('comment');
|
||||
comment.username = '[deleted]';
|
||||
comment.text = '[deleted]';
|
||||
div.data('comment', comment);
|
||||
},
|
||||
error: function(request, textStatus, error) {
|
||||
showError('Oops, there was a problem deleting the comment.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function showProposal(id) {
|
||||
$('#sp' + id).hide();
|
||||
$('#hp' + id).show();
|
||||
$('#pr' + id).slideDown('fast');
|
||||
}
|
||||
|
||||
function hideProposal(id) {
|
||||
$('#hp' + id).hide();
|
||||
$('#sp' + id).show();
|
||||
$('#pr' + id).slideUp('fast');
|
||||
}
|
||||
|
||||
function showProposeChange(id) {
|
||||
$('#pc' + id).hide();
|
||||
$('#hc' + id).show();
|
||||
var textarea = $('#pt' + id);
|
||||
textarea.val(textarea.data('source'));
|
||||
$.fn.autogrow.resize(textarea[0]);
|
||||
textarea.slideDown('fast');
|
||||
}
|
||||
|
||||
function hideProposeChange(id) {
|
||||
$('#hc' + id).hide();
|
||||
$('#pc' + id).show();
|
||||
var textarea = $('#pt' + id);
|
||||
textarea.val('').removeAttr('disabled');
|
||||
textarea.slideUp('fast');
|
||||
}
|
||||
|
||||
function toggleCommentMarkupBox(id) {
|
||||
$('#mb' + id).toggle();
|
||||
}
|
||||
|
||||
/** Handle when the user clicks on a sort by link. */
|
||||
function handleReSort(link) {
|
||||
var classes = link.attr('class').split(/\s+/);
|
||||
for (var i=0; i<classes.length; i++) {
|
||||
if (classes[i] != 'sort-option') {
|
||||
by = classes[i].substring(2);
|
||||
}
|
||||
}
|
||||
setComparator();
|
||||
// Save/update the sortBy cookie.
|
||||
var expiration = new Date();
|
||||
expiration.setDate(expiration.getDate() + 365);
|
||||
document.cookie= 'sortBy=' + escape(by) +
|
||||
';expires=' + expiration.toUTCString();
|
||||
$('ul.comment-ul').each(function(index, ul) {
|
||||
var comments = getChildren($(ul), true);
|
||||
comments = sortComments(comments);
|
||||
appendComments(comments, $(ul).empty());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to process a vote when a user clicks an arrow.
|
||||
*/
|
||||
function handleVote(link) {
|
||||
if (!opts.voting) {
|
||||
showError("You'll need to login to vote.");
|
||||
return;
|
||||
}
|
||||
|
||||
var id = link.attr('id');
|
||||
if (!id) {
|
||||
// Didn't click on one of the voting arrows.
|
||||
return;
|
||||
}
|
||||
// If it is an unvote, the new vote value is 0,
|
||||
// Otherwise it's 1 for an upvote, or -1 for a downvote.
|
||||
var value = 0;
|
||||
if (id.charAt(1) != 'u') {
|
||||
value = id.charAt(0) == 'u' ? 1 : -1;
|
||||
}
|
||||
// The data to be sent to the server.
|
||||
var d = {
|
||||
comment_id: id.substring(2),
|
||||
value: value
|
||||
};
|
||||
|
||||
// Swap the vote and unvote links.
|
||||
link.hide();
|
||||
$('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
|
||||
.show();
|
||||
|
||||
// The div the comment is displayed in.
|
||||
var div = $('div#cd' + d.comment_id);
|
||||
var data = div.data('comment');
|
||||
|
||||
// If this is not an unvote, and the other vote arrow has
|
||||
// already been pressed, unpress it.
|
||||
if ((d.value !== 0) && (data.vote === d.value * -1)) {
|
||||
$('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
|
||||
$('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
|
||||
}
|
||||
|
||||
// Update the comments rating in the local data.
|
||||
data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
|
||||
data.vote = d.value;
|
||||
div.data('comment', data);
|
||||
|
||||
// Change the rating text.
|
||||
div.find('.rating:first')
|
||||
.text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
|
||||
|
||||
// Send the vote information to the server.
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: opts.processVoteURL,
|
||||
data: d,
|
||||
error: function(request, textStatus, error) {
|
||||
showError('Oops, there was a problem casting that vote.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a reply form used to reply to an existing comment.
|
||||
*/
|
||||
function openReply(id) {
|
||||
// Swap out the reply link for the hide link
|
||||
$('#rl' + id).hide();
|
||||
$('#cr' + id).show();
|
||||
|
||||
// Add the reply li to the children ul.
|
||||
var div = $(renderTemplate(replyTemplate, {id: id})).hide();
|
||||
$('#cl' + id)
|
||||
.prepend(div)
|
||||
// Setup the submit handler for the reply form.
|
||||
.find('#rf' + id)
|
||||
.submit(function(event) {
|
||||
event.preventDefault();
|
||||
addComment($('#rf' + id));
|
||||
closeReply(id);
|
||||
})
|
||||
.find('input[type=button]')
|
||||
.click(function() {
|
||||
closeReply(id);
|
||||
});
|
||||
div.slideDown('fast', function() {
|
||||
$('#rf' + id).find('textarea').focus();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the reply form opened with openReply.
|
||||
*/
|
||||
function closeReply(id) {
|
||||
// Remove the reply div from the DOM.
|
||||
$('#rd' + id).slideUp('fast', function() {
|
||||
$(this).remove();
|
||||
});
|
||||
|
||||
// Swap out the hide link for the reply link
|
||||
$('#cr' + id).hide();
|
||||
$('#rl' + id).show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively sort a tree of comments using the comp comparator.
|
||||
*/
|
||||
function sortComments(comments) {
|
||||
comments.sort(comp);
|
||||
$.each(comments, function() {
|
||||
this.children = sortComments(this.children);
|
||||
});
|
||||
return comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the children comments from a ul. If recursive is true,
|
||||
* recursively include childrens' children.
|
||||
*/
|
||||
function getChildren(ul, recursive) {
|
||||
var children = [];
|
||||
ul.children().children("[id^='cd']")
|
||||
.each(function() {
|
||||
var comment = $(this).data('comment');
|
||||
if (recursive)
|
||||
comment.children = getChildren($(this).find('#cl' + comment.id), true);
|
||||
children.push(comment);
|
||||
});
|
||||
return children;
|
||||
}
|
||||
|
||||
/** Create a div to display a comment in. */
|
||||
function createCommentDiv(comment) {
|
||||
if (!comment.displayed && !opts.moderator) {
|
||||
return $('<div class="moderate">Thank you! Your comment will show up '
|
||||
+ 'once it is has been approved by a moderator.</div>');
|
||||
}
|
||||
// Prettify the comment rating.
|
||||
comment.pretty_rating = comment.rating + ' point' +
|
||||
(comment.rating == 1 ? '' : 's');
|
||||
// Make a class (for displaying not yet moderated comments differently)
|
||||
comment.css_class = comment.displayed ? '' : ' moderate';
|
||||
// Create a div for this comment.
|
||||
var context = $.extend({}, opts, comment);
|
||||
var div = $(renderTemplate(commentTemplate, context));
|
||||
|
||||
// If the user has voted on this comment, highlight the correct arrow.
|
||||
if (comment.vote) {
|
||||
var direction = (comment.vote == 1) ? 'u' : 'd';
|
||||
div.find('#' + direction + 'v' + comment.id).hide();
|
||||
div.find('#' + direction + 'u' + comment.id).show();
|
||||
}
|
||||
|
||||
if (opts.moderator || comment.text != '[deleted]') {
|
||||
div.find('a.reply').show();
|
||||
if (comment.proposal_diff)
|
||||
div.find('#sp' + comment.id).show();
|
||||
if (opts.moderator && !comment.displayed)
|
||||
div.find('#cm' + comment.id).show();
|
||||
if (opts.moderator || (opts.username == comment.username))
|
||||
div.find('#dc' + comment.id).show();
|
||||
}
|
||||
return div;
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple template renderer. Placeholders such as <%id%> are replaced
|
||||
* by context['id'] with items being escaped. Placeholders such as <#id#>
|
||||
* are not escaped.
|
||||
*/
|
||||
function renderTemplate(template, context) {
|
||||
var esc = $(document.createElement('div'));
|
||||
|
||||
function handle(ph, escape) {
|
||||
var cur = context;
|
||||
$.each(ph.split('.'), function() {
|
||||
cur = cur[this];
|
||||
});
|
||||
return escape ? esc.text(cur || "").html() : cur;
|
||||
}
|
||||
|
||||
return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
|
||||
return handle(arguments[2], arguments[1] == '%' ? true : false);
|
||||
});
|
||||
}
|
||||
|
||||
/** Flash an error message briefly. */
|
||||
function showError(message) {
|
||||
$(document.createElement('div')).attr({'class': 'popup-error'})
|
||||
.append($(document.createElement('div'))
|
||||
.attr({'class': 'error-message'}).text(message))
|
||||
.appendTo('body')
|
||||
.fadeIn("slow")
|
||||
.delay(2000)
|
||||
.fadeOut("slow");
|
||||
}
|
||||
|
||||
/** Add a link the user uses to open the comments popup. */
|
||||
$.fn.comment = function() {
|
||||
return this.each(function() {
|
||||
var id = $(this).attr('id').substring(1);
|
||||
var count = COMMENT_METADATA[id];
|
||||
var title = count + ' comment' + (count == 1 ? '' : 's');
|
||||
var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
|
||||
var addcls = count == 0 ? ' nocomment' : '';
|
||||
$(this)
|
||||
.append(
|
||||
$(document.createElement('a')).attr({
|
||||
href: '#',
|
||||
'class': 'sphinx-comment-open' + addcls,
|
||||
id: 'ao' + id
|
||||
})
|
||||
.append($(document.createElement('img')).attr({
|
||||
src: image,
|
||||
alt: 'comment',
|
||||
title: title
|
||||
}))
|
||||
.click(function(event) {
|
||||
event.preventDefault();
|
||||
show($(this).attr('id').substring(2));
|
||||
})
|
||||
)
|
||||
.append(
|
||||
$(document.createElement('a')).attr({
|
||||
href: '#',
|
||||
'class': 'sphinx-comment-close hidden',
|
||||
id: 'ah' + id
|
||||
})
|
||||
.append($(document.createElement('img')).attr({
|
||||
src: opts.closeCommentImage,
|
||||
alt: 'close',
|
||||
title: 'close'
|
||||
}))
|
||||
.click(function(event) {
|
||||
event.preventDefault();
|
||||
hide($(this).attr('id').substring(2));
|
||||
})
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
var opts = {
|
||||
processVoteURL: '/_process_vote',
|
||||
addCommentURL: '/_add_comment',
|
||||
getCommentsURL: '/_get_comments',
|
||||
acceptCommentURL: '/_accept_comment',
|
||||
deleteCommentURL: '/_delete_comment',
|
||||
commentImage: '/static/_static/comment.png',
|
||||
closeCommentImage: '/static/_static/comment-close.png',
|
||||
loadingImage: '/static/_static/ajax-loader.gif',
|
||||
commentBrightImage: '/static/_static/comment-bright.png',
|
||||
upArrow: '/static/_static/up.png',
|
||||
downArrow: '/static/_static/down.png',
|
||||
upArrowPressed: '/static/_static/up-pressed.png',
|
||||
downArrowPressed: '/static/_static/down-pressed.png',
|
||||
voting: false,
|
||||
moderator: false
|
||||
};
|
||||
|
||||
if (typeof COMMENT_OPTIONS != "undefined") {
|
||||
opts = jQuery.extend(opts, COMMENT_OPTIONS);
|
||||
}
|
||||
|
||||
var popupTemplate = '\
|
||||
<div class="sphinx-comments" id="sc<%id%>">\
|
||||
<p class="sort-options">\
|
||||
Sort by:\
|
||||
<a href="#" class="sort-option byrating">best rated</a>\
|
||||
<a href="#" class="sort-option byascage">newest</a>\
|
||||
<a href="#" class="sort-option byage">oldest</a>\
|
||||
</p>\
|
||||
<div class="comment-header">Comments</div>\
|
||||
<div class="comment-loading" id="cn<%id%>">\
|
||||
loading comments... <img src="<%loadingImage%>" alt="" /></div>\
|
||||
<ul id="cl<%id%>" class="comment-ul"></ul>\
|
||||
<div id="ca<%id%>">\
|
||||
<p class="add-a-comment">Add a comment\
|
||||
(<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
|
||||
<div class="comment-markup-box" id="mb<%id%>">\
|
||||
reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
|
||||
<tt>``code``</tt>, \
|
||||
code blocks: <tt>::</tt> and an indented block after blank line</div>\
|
||||
<form method="post" id="cf<%id%>" class="comment-form" action="">\
|
||||
<textarea name="comment" cols="80"></textarea>\
|
||||
<p class="propose-button">\
|
||||
<a href="#" id="pc<%id%>" class="show-propose-change">\
|
||||
Propose a change ▹\
|
||||
</a>\
|
||||
<a href="#" id="hc<%id%>" class="hide-propose-change">\
|
||||
Propose a change ▿\
|
||||
</a>\
|
||||
</p>\
|
||||
<textarea name="proposal" id="pt<%id%>" cols="80"\
|
||||
spellcheck="false"></textarea>\
|
||||
<input type="submit" value="Add comment" />\
|
||||
<input type="hidden" name="node" value="<%id%>" />\
|
||||
<input type="hidden" name="parent" value="" />\
|
||||
</form>\
|
||||
</div>\
|
||||
</div>';
|
||||
|
||||
var commentTemplate = '\
|
||||
<div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
|
||||
<div class="vote">\
|
||||
<div class="arrow">\
|
||||
<a href="#" id="uv<%id%>" class="vote" title="vote up">\
|
||||
<img src="<%upArrow%>" />\
|
||||
</a>\
|
||||
<a href="#" id="uu<%id%>" class="un vote" title="vote up">\
|
||||
<img src="<%upArrowPressed%>" />\
|
||||
</a>\
|
||||
</div>\
|
||||
<div class="arrow">\
|
||||
<a href="#" id="dv<%id%>" class="vote" title="vote down">\
|
||||
<img src="<%downArrow%>" id="da<%id%>" />\
|
||||
</a>\
|
||||
<a href="#" id="du<%id%>" class="un vote" title="vote down">\
|
||||
<img src="<%downArrowPressed%>" />\
|
||||
</a>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="comment-content">\
|
||||
<p class="tagline comment">\
|
||||
<span class="user-id"><%username%></span>\
|
||||
<span class="rating"><%pretty_rating%></span>\
|
||||
<span class="delta"><%time.delta%></span>\
|
||||
</p>\
|
||||
<div class="comment-text comment"><#text#></div>\
|
||||
<p class="comment-opts comment">\
|
||||
<a href="#" class="reply hidden" id="rl<%id%>">reply ▹</a>\
|
||||
<a href="#" class="close-reply" id="cr<%id%>">reply ▿</a>\
|
||||
<a href="#" id="sp<%id%>" class="show-proposal">proposal ▹</a>\
|
||||
<a href="#" id="hp<%id%>" class="hide-proposal">proposal ▿</a>\
|
||||
<a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
|
||||
<span id="cm<%id%>" class="moderation hidden">\
|
||||
<a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
|
||||
</span>\
|
||||
</p>\
|
||||
<pre class="proposal" id="pr<%id%>">\
|
||||
<#proposal_diff#>\
|
||||
</pre>\
|
||||
<ul class="comment-children" id="cl<%id%>"></ul>\
|
||||
</div>\
|
||||
<div class="clearleft"></div>\
|
||||
</div>\
|
||||
</div>';
|
||||
|
||||
var replyTemplate = '\
|
||||
<li>\
|
||||
<div class="reply-div" id="rd<%id%>">\
|
||||
<form id="rf<%id%>">\
|
||||
<textarea name="comment" cols="80"></textarea>\
|
||||
<input type="submit" value="Add reply" />\
|
||||
<input type="button" value="Cancel" />\
|
||||
<input type="hidden" name="parent" value="<%id%>" />\
|
||||
<input type="hidden" name="node" value="" />\
|
||||
</form>\
|
||||
</div>\
|
||||
</li>';
|
||||
|
||||
$(document).ready(function() {
|
||||
init();
|
||||
});
|
||||
})(jQuery);
|
||||
|
||||
$(document).ready(function() {
|
||||
// add comment anchors for all paragraphs that are commentable
|
||||
$('.sphinx-has-comment').comment();
|
||||
|
||||
// highlight search words in search results
|
||||
$("div.context").each(function() {
|
||||
var params = $.getQueryParameters();
|
||||
var terms = (params.q) ? params.q[0].split(/\s+/) : [];
|
||||
var result = $(this);
|
||||
$.each(terms, function() {
|
||||
result.highlightText(this.toLowerCase(), 'highlighted');
|
||||
});
|
||||
});
|
||||
|
||||
// directly open comment window if requested
|
||||
var anchor = document.location.hash;
|
||||
if (anchor.substring(0, 9) == '#comment-') {
|
||||
$('#ao' + anchor.substring(9)).click();
|
||||
document.location.hash = '#s' + anchor.substring(9);
|
||||
}
|
||||
});
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Acknowledgements — musrfit 1.5.1 documentation</title>
|
||||
<title>Acknowledgements — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="Bugtracking" href="bugtracking.html" />
|
||||
<link rel="prev" title="MusrRoot - an Extensible Open File Format for μSR" href="musr-root.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="musr-root.html" title="MusrRoot - an Extensible Open File Format for μSR"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -112,12 +112,12 @@ extremely competent way to deal with his projects as well as to deal with the ch
|
||||
<li class="right" >
|
||||
<a href="musr-root.html" title="MusrRoot - an Extensible Open File Format for μSR"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>any2many - a Universal μSR-file-format converter — musrfit 1.5.1 documentation</title>
|
||||
<title>any2many - a Universal μSR-file-format converter — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="MusrRoot - an Extensible Open File Format for μSR" href="musr-root.html" />
|
||||
<link rel="prev" title="msr2data - A Program for Automatically Processing Multiple musrfit msr Files" href="msr2data.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="msr2data.html" title="msr2data - A Program for Automatically Processing Multiple musrfit msr Files"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -102,12 +102,12 @@ For a detailed description see <a class="reference internal" href="user-manual.h
|
||||
<li class="right" >
|
||||
<a href="msr2data.html" title="msr2data - A Program for Automatically Processing Multiple musrfit msr Files"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Bugtracking — musrfit 1.5.1 documentation</title>
|
||||
<title>Bugtracking — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="prev" title="Acknowledgements" href="acknowledgement.html" />
|
||||
</head>
|
||||
<body>
|
||||
@ -37,7 +37,7 @@
|
||||
<li class="right" >
|
||||
<a href="acknowledgement.html" title="Acknowledgements"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -93,12 +93,12 @@ or send an e-mail to A. Suter at PSI.</p>
|
||||
<li class="right" >
|
||||
<a href="acknowledgement.html" title="Acknowledgements"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>How to Cite musrfit? — musrfit 1.5.1 documentation</title>
|
||||
<title>How to Cite musrfit? — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="Tutorial for musrfit" href="tutorial.html" />
|
||||
<link rel="prev" title="Welcome to the musrfit documentation!" href="index.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="index.html" title="Welcome to the musrfit documentation!"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -114,12 +114,12 @@
|
||||
<li class="right" >
|
||||
<a href="index.html" title="Welcome to the musrfit documentation!"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -7,7 +7,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Index — musrfit 1.5.1 documentation</title>
|
||||
<title>Index — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -15,7 +15,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -25,7 +25,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
@ -34,7 +34,7 @@
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="#" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -89,21 +89,21 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-18">addrun</a>
|
||||
<dt><a href="user-manual.html#index-19">addrun</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-35">addt0-asymmetry</a>
|
||||
<dt><a href="user-manual.html#index-36">addt0-asymmetry</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-34">addt0-single-histo</a>
|
||||
<dt><a href="user-manual.html#index-35">addt0-single-histo</a>
|
||||
</dt>
|
||||
|
||||
</dl></td>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-20">alpha-beta</a>
|
||||
<dt><a href="user-manual.html#index-21">alpha-beta</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -111,11 +111,11 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-66">asymmetry-fit</a>
|
||||
<dt><a href="user-manual.html#index-70">asymmetry-fit</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-67">asymmetry-rrf-fit</a>
|
||||
<dt><a href="user-manual.html#index-71">asymmetry-rrf-fit</a>
|
||||
</dt>
|
||||
|
||||
</dl></td>
|
||||
@ -125,19 +125,19 @@
|
||||
<table style="width: 100%" class="indextable genindextable"><tr>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-22">backgr.fit</a>
|
||||
<dt><a href="user-manual.html#index-23">backgr.fit</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-27">backgr.fix</a>
|
||||
<dt><a href="user-manual.html#index-28">backgr.fix</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-29">background-asymmetry</a>
|
||||
<dt><a href="user-manual.html#index-30">background-asymmetry</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-28">background-single-histo</a>
|
||||
<dt><a href="user-manual.html#index-29">background-single-histo</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -151,7 +151,7 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-69">bnmr-asymmetry-fit</a>
|
||||
<dt><a href="user-manual.html#index-73">bnmr-asymmetry-fit</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -193,11 +193,11 @@
|
||||
<table style="width: 100%" class="indextable genindextable"><tr>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-31">data-asymmetry</a>
|
||||
<dt><a href="user-manual.html#index-32">data-asymmetry</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-30">data-single-histo</a>
|
||||
<dt><a href="user-manual.html#index-31">data-single-histo</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -205,6 +205,10 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-42">dks-command-overview</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="setup-dks.html#index-3">dks-install</a>
|
||||
</dt>
|
||||
|
||||
@ -251,57 +255,57 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-37">fit</a>
|
||||
<dt><a href="user-manual.html#index-38">fit</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-63">fit-types</a>
|
||||
<dt><a href="user-manual.html#index-67">fit-types</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-19">fittype</a>
|
||||
<dt><a href="user-manual.html#index-20">fittype</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-25">forward</a>
|
||||
<dt><a href="user-manual.html#index-26">forward</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-26">forward-backward</a>
|
||||
<dt><a href="user-manual.html#index-27">forward-backward</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-45">fourier-block-apodization</a>
|
||||
<dt><a href="user-manual.html#index-49">fourier-block-apodization</a>
|
||||
</dt>
|
||||
|
||||
</dl></td>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-44">fourier-block-dc-corrected</a>
|
||||
<dt><a href="user-manual.html#index-48">fourier-block-dc-corrected</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-43">fourier-block-fourier_power</a>
|
||||
<dt><a href="user-manual.html#index-47">fourier-block-fourier_power</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-47">fourier-block-phase</a>
|
||||
<dt><a href="user-manual.html#index-51">fourier-block-phase</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-46">fourier-block-plot</a>
|
||||
<dt><a href="user-manual.html#index-50">fourier-block-plot</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-49">fourier-block-range</a>
|
||||
<dt><a href="user-manual.html#index-53">fourier-block-range</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-48">fourier-block-range_for_phase_correction</a>
|
||||
<dt><a href="user-manual.html#index-52">fourier-block-range_for_phase_correction</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-42">fourier-block-units</a>
|
||||
<dt><a href="user-manual.html#index-46">fourier-block-units</a>
|
||||
</dt>
|
||||
|
||||
</dl></td>
|
||||
@ -379,7 +383,7 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-23">lifetime</a>
|
||||
<dt><a href="user-manual.html#index-24">lifetime</a>
|
||||
</dt>
|
||||
|
||||
</dl></td>
|
||||
@ -415,7 +419,11 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-24">map</a>
|
||||
<dt><a href="user-manual.html#index-25">map</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-16">meta-information</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -423,11 +431,15 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-39">msr-commands-block</a>
|
||||
<dt><a href="user-manual.html#index-41">minuit2-command-overview</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-40">msr-commands-block-dks</a>
|
||||
<dt><a href="user-manual.html#index-40">msr-commands-block</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-44">msr-commands-block-dks</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -439,7 +451,7 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-41">msr-fourier-block</a>
|
||||
<dt><a href="user-manual.html#index-45">msr-fourier-block</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -447,63 +459,63 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-16">msr-global-block</a>
|
||||
<dt><a href="user-manual.html#index-17">msr-global-block</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-50">msr-plot-block</a>
|
||||
<dt><a href="user-manual.html#index-54">msr-plot-block</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-51">msr-plot-block-lifetimecorrection</a>
|
||||
<dt><a href="user-manual.html#index-55">msr-plot-block-lifetimecorrection</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-57">msr-plot-block-logx</a>
|
||||
<dt><a href="user-manual.html#index-61">msr-plot-block-logx</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-58">msr-plot-block-logy</a>
|
||||
<dt><a href="user-manual.html#index-62">msr-plot-block-logy</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-53">msr-plot-block-range</a>
|
||||
<dt><a href="user-manual.html#index-57">msr-plot-block-range</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-60">msr-plot-block-rrf_freq</a>
|
||||
<dt><a href="user-manual.html#index-64">msr-plot-block-rrf_freq</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-59">msr-plot-block-rrf_packing</a>
|
||||
<dt><a href="user-manual.html#index-63">msr-plot-block-rrf_packing</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-61">msr-plot-block-rrf_phase</a>
|
||||
<dt><a href="user-manual.html#index-65">msr-plot-block-rrf_phase</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-52">msr-plot-block-runs</a>
|
||||
<dt><a href="user-manual.html#index-56">msr-plot-block-runs</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-54">msr-plot-block-sub_ranges</a>
|
||||
<dt><a href="user-manual.html#index-58">msr-plot-block-sub_ranges</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-55">msr-plot-block-use_fit_ranges</a>
|
||||
<dt><a href="user-manual.html#index-59">msr-plot-block-use_fit_ranges</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-56">msr-plot-block-view_packing</a>
|
||||
<dt><a href="user-manual.html#index-60">msr-plot-block-view_packing</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-17">msr-run-block</a>
|
||||
<dt><a href="user-manual.html#index-18">msr-run-block</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-62">msr-statistc-block</a>
|
||||
<dt><a href="user-manual.html#index-66">msr-statistc-block</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -605,6 +617,10 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-43">musrfit-command-block-details</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="setup-standard.html#index-19">musrfit-post-install-linux</a>
|
||||
</dt>
|
||||
|
||||
@ -691,7 +707,7 @@
|
||||
<table style="width: 100%" class="indextable genindextable"><tr>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-68">negative-muon-musr-fit</a>
|
||||
<dt><a href="user-manual.html#index-72">negative-muon-musr-fit</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -717,11 +733,11 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-70">non-musr-fit</a>
|
||||
<dt><a href="user-manual.html#index-74">non-musr-fit</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-21">norm</a>
|
||||
<dt><a href="user-manual.html#index-22">norm</a>
|
||||
</dt>
|
||||
|
||||
</dl></td>
|
||||
@ -741,7 +757,7 @@
|
||||
<table style="width: 100%" class="indextable genindextable"><tr>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-38">packing</a>
|
||||
<dt><a href="user-manual.html#index-39">packing</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -815,13 +831,13 @@
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-64">single-histogram-fit</a>
|
||||
<dt><a href="user-manual.html#index-68">single-histogram-fit</a>
|
||||
</dt>
|
||||
|
||||
</dl></td>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-65">single-histogram-rrf-fit</a>
|
||||
<dt><a href="user-manual.html#index-69">single-histogram-rrf-fit</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -839,15 +855,15 @@
|
||||
<table style="width: 100%" class="indextable genindextable"><tr>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-33">t0-asymmetry</a>
|
||||
<dt><a href="user-manual.html#index-34">t0-asymmetry</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-32">t0-single-histo</a>
|
||||
<dt><a href="user-manual.html#index-33">t0-single-histo</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-74">technical-musrfit</a>
|
||||
<dt><a href="user-manual.html#index-78">technical-musrfit</a>
|
||||
</dt>
|
||||
|
||||
|
||||
@ -879,15 +895,15 @@
|
||||
<table style="width: 100%" class="indextable genindextable"><tr>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-71">user-functions</a>
|
||||
<dt><a href="user-manual.html#index-75">user-functions</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-73">user-functions-with-global-part</a>
|
||||
<dt><a href="user-manual.html#index-77">user-functions-with-global-part</a>
|
||||
</dt>
|
||||
|
||||
|
||||
<dt><a href="user-manual.html#index-72">user-functions-without-global-part</a>
|
||||
<dt><a href="user-manual.html#index-76">user-functions-without-global-part</a>
|
||||
</dt>
|
||||
|
||||
</dl></td>
|
||||
@ -935,7 +951,7 @@
|
||||
<table style="width: 100%" class="indextable genindextable"><tr>
|
||||
<td style="width: 33%" valign="top"><dl>
|
||||
|
||||
<dt><a href="user-manual.html#index-36">xy-data</a>
|
||||
<dt><a href="user-manual.html#index-37">xy-data</a>
|
||||
</dt>
|
||||
|
||||
</dl></td>
|
||||
@ -974,12 +990,12 @@
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="#" title="General Index"
|
||||
>index</a></li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Welcome to the musrfit documentation! — musrfit 1.5.1 documentation</title>
|
||||
<title>Welcome to the musrfit documentation! — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="#" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="#" />
|
||||
<link rel="next" title="How to Cite musrfit?" href="cite.html" />
|
||||
</head>
|
||||
<body>
|
||||
@ -37,7 +37,7 @@
|
||||
<li class="right" >
|
||||
<a href="cite.html" title="How to Cite musrfit?"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li><a href="#">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="#">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -61,7 +61,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="user-manual.html#available-executables-configuration-files-and-their-basic-usage">Available Executables, Configuration Files and their Basic Usage</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="user-manual.html#description-of-the-msr-file-format">Description of the msr File Format</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="user-manual.html#fit-types">Fit Types</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="user-manual.html#id22">User Functions</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="user-manual.html#id38">User Functions</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="user-manual.html#technical-description-of-the-musrfit-framework">Technical Description of the musrfit framework</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@ -180,12 +180,12 @@
|
||||
<li class="right" >
|
||||
<a href="cite.html" title="How to Cite musrfit?"
|
||||
>next</a> |</li>
|
||||
<li><a href="#">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="#">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>msr2data - A Program for Automatically Processing Multiple musrfit msr Files — musrfit 1.5.1 documentation</title>
|
||||
<title>msr2data - A Program for Automatically Processing Multiple musrfit msr Files — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="any2many - a Universal μSR-file-format converter" href="any2many.html" />
|
||||
<link rel="prev" title="mupp - μSR Parameter Plotter" href="mupp.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="mupp.html" title="mupp - μSR Parameter Plotter"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -434,12 +434,12 @@ fit serves as template for the second and so on. The template field stays empty
|
||||
<li class="right" >
|
||||
<a href="mupp.html" title="mupp - μSR Parameter Plotter"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>mupp - μSR Parameter Plotter — musrfit 1.5.1 documentation</title>
|
||||
<title>mupp - μSR Parameter Plotter — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="msr2data - A Program for Automatically Processing Multiple musrfit msr Files" href="msr2data.html" />
|
||||
<link rel="prev" title="musredit: the GUI Based Interface to musrfit" href="musredit.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="musredit.html" title="musredit: the GUI Based Interface to musrfit"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -58,6 +58,10 @@ Also a collection of <tt class="docutils literal"><span class="pre">msr</span></
|
||||
<a class="reference external" href="http://musr.org/muview/">here</a>).</p>
|
||||
<p><tt class="docutils literal"><span class="pre">mupp</span></tt> can be operated from within as graphical user interface or via a command line scripting interface.
|
||||
The <tt class="docutils literal"><span class="pre">mupp</span></tt> GUI can be invoked either directly from the command line or from within <a class="reference internal" href="musredit.html#musredit-sec"><em>musredit</em></a>.</p>
|
||||
<p>Each collection bundles a number of runs, where a run is a single μSR measurement.
|
||||
A run is analyzed by a number of parameters (defined in the msr-files), and complemented by
|
||||
additional physical parameters as the temperature, magnetic field, implantation energy, etc.
|
||||
Hence parameters can be seen as vectors and can be plot against each other.</p>
|
||||
<div class="section" id="the-graphical-user-interface">
|
||||
<span id="index-1"></span><h2>The Graphical User Interface<a class="headerlink" href="#the-graphical-user-interface" title="Permalink to this headline">¶</a></h2>
|
||||
<p>A typical setting could look like this</p>
|
||||
@ -101,11 +105,29 @@ present the data, as shown here</p>
|
||||
<li><p class="first"><tt class="docutils literal"><span class="pre">Refresh</span> <span class="pre">Collection</span></tt>: will reload the collection (<tt class="docutils literal"><span class="pre">db</span></tt>- or <tt class="docutils literal"><span class="pre">dat</span></tt>-file). This is often useful
|
||||
during beamtime where the collection is growing run-by-run.</p>
|
||||
</li>
|
||||
<li><p class="first">Command history window.</p>
|
||||
</li>
|
||||
<li><p class="first">This is the script command line. Currently it allows to perform the tasks without mouse gambling.
|
||||
In the future much more commands are planed. See the <tt class="docutils literal"><span class="pre">Help</span> <span class="pre">/</span> <span class="pre">Cmd's</span></tt> for the currently available
|
||||
commands.</p>
|
||||
</li>
|
||||
</ol>
|
||||
<div class="section" id="define-variable-dialog">
|
||||
<h3>Define Variable Dialog<a class="headerlink" href="#define-variable-dialog" title="Permalink to this headline">¶</a></h3>
|
||||
<img src="_images/mupp-add-var.svg" /><ol class="arabic simple">
|
||||
<li>Variable text edit window.</li>
|
||||
<li>Collection link window.</li>
|
||||
<li>Shows the parameters of the selected collection.</li>
|
||||
<li>Check if the variable/error variable from the edit window is valid.</li>
|
||||
<li>Add the variable to the selected collection(s) if the parsing is successful.</li>
|
||||
</ol>
|
||||
<p>A variable defined here is a mathematical expression defined by parameters of loaded collections.
|
||||
Since a parameter also has an associated error, also newly defined variables <strong>always</strong> need
|
||||
to be defined together with a corresponding error variable. If the name of a variable is defined
|
||||
as <tt class="docutils literal"><span class="pre">SigmaSC_10</span></tt> (see the above snapshot), the error variable need to be named as <tt class="docutils literal"><span class="pre">SigmaSC_10Err</span></tt>.</p>
|
||||
<p>Currently the following mathematical functions are defined: <tt class="docutils literal"><span class="pre">max</span></tt>, <tt class="docutils literal"><span class="pre">min</span></tt>, <tt class="docutils literal"><span class="pre">abs</span></tt>, <tt class="docutils literal"><span class="pre">sin</span></tt>, <tt class="docutils literal"><span class="pre">cos</span></tt>,
|
||||
<tt class="docutils literal"><span class="pre">tan</span></tt>, <tt class="docutils literal"><span class="pre">exp</span></tt>, <tt class="docutils literal"><span class="pre">log</span></tt>, <tt class="docutils literal"><span class="pre">ln</span></tt>, <tt class="docutils literal"><span class="pre">pow</span></tt>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="the-scripting-interface">
|
||||
<span id="index-2"></span><h2>The Scripting Interface<a class="headerlink" href="#the-scripting-interface" title="Permalink to this headline">¶</a></h2>
|
||||
@ -122,36 +144,74 @@ or web-based interaction which requests figures. A script is invoked by the comm
|
||||
<dt><strong>select <nn></strong></dt>
|
||||
<dd>selects collection <tt class="docutils literal"><span class="pre"><nn></span></tt>, where <tt class="docutils literal"><span class="pre"><nn></span></tt> is either the <em>number</em> of the collections, or its <em>name</em>, <em>e.g.</em>
|
||||
select YBCO-40nm-T5K-FC150mT-Escan.db.</dd>
|
||||
<dt><strong>addX <label></strong></dt>
|
||||
<dt><strong>x <label></strong></dt>
|
||||
<dd>add <tt class="docutils literal"><span class="pre"><label></span></tt> as a <em>x</em>-variable. Only <em>one</em> is allowed.</dd>
|
||||
<dt><strong>addY <label(s)></strong></dt>
|
||||
<dt><strong>y <label(s)></strong></dt>
|
||||
<dd>add <tt class="docutils literal"><span class="pre"><label(s)></span></tt> as <em>y</em>-variable. <em>Multiple</em> labels are possible.</dd>
|
||||
<dt><strong>norm</strong></dt>
|
||||
<dd>this will normalize all the <em>y</em>-variables by their maximum.</dd>
|
||||
<dt><strong>savePath <dir></strong></dt>
|
||||
<dd>set the save path to <tt class="docutils literal"><span class="pre"><dir></span></tt>. The place where the macros, and/or the plot output will be saved.</dd>
|
||||
<dt><strong>plot <fln></strong></dt>
|
||||
<dd>where <tt class="docutils literal"><span class="pre"><fln></span></tt> is the file name with extension under which the plot should be saved.</dd>
|
||||
<dt><strong>macro <fln></strong></dt>
|
||||
<dd>where <tt class="docutils literal"><span class="pre"><fln></span></tt> is the file name under which the root macro should be saved.</dd>
|
||||
<dt><strong>var <var_name> = <expr></strong></dt>
|
||||
<dd><p class="first">defines a variable.
|
||||
<expr> is a mathematical expression where collection variables are addressed
|
||||
via the ‘$’, e.g. <tt class="docutils literal"><span class="pre">dataT</span></tt> is addressed by <tt class="docutils literal"><span class="pre">$dataT</span></tt>, etc. An example:</p>
|
||||
<p><tt class="docutils literal"><span class="pre">var</span> <span class="pre">invT</span> <span class="pre">=</span> <span class="pre">1000.0</span> <span class="pre">/</span> <span class="pre">$dataT</span></tt></p>
|
||||
<p>Each variable has to be accompanied by its error variable. An error variable
|
||||
is defined by the <tt class="docutils literal"><span class="pre"><var_name></span></tt> followed by <tt class="docutils literal"><span class="pre">Err</span></tt>
|
||||
For the above example the error variable is</p>
|
||||
<p class="last"><tt class="docutils literal"><span class="pre">var</span> <span class="pre">invTErr</span> <span class="pre">=</span> <span class="pre">$invT</span> <span class="pre">*</span> <span class="pre">$dataTErr</span> <span class="pre">/</span> <span class="pre">$dataT</span></tt></p>
|
||||
</dd>
|
||||
<dt><strong>col <nn> : <var_name></strong></dt>
|
||||
<dd>links <var_name> to the collection <nn>, where <nn> is the number of the
|
||||
collection as defined by the order of load, starting with 0.</dd>
|
||||
</dl>
|
||||
<p>An example script file <tt class="docutils literal"><span class="pre">field-vs-energy.txt</span></tt> might look like this:</p>
|
||||
<p>An example script file <tt class="docutils literal"><span class="pre">sigmaSC-vs-temp.txt</span></tt> might look like this:</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span># This is a comment
|
||||
# Script: sigmaSC-vs-temp.txt
|
||||
|
||||
loadPath ./
|
||||
|
||||
load YBCO-40nm-T5K-FC150mT-Escan.db
|
||||
load YBCO-40nm-T30K-FC150mT-Escan.db
|
||||
load YBCO-40nm-T60K-FC150mT-Escan.db
|
||||
load YBCO-40nm-T120K-FC150mT-Escan.db
|
||||
load YBCO-40nm-FC-E3p8keV-B10mT-Tscan.db # collection 0
|
||||
load YBCO-40nm-FC-E3p8keV-B150mT-Tscan.db # collection 1
|
||||
|
||||
selectAll
|
||||
# define variables: for each variable an associated error variable is needed.
|
||||
# B=10mT
|
||||
var SigmaSC_10 = pow(abs(pow($Sigma,2.0)-pow(0.11,2.0)), 0.5) # 0.11 (1/us) is the nuclear contribution (T>Tc)
|
||||
var SigmaSC_10Err = pow(pow($Sigma*$SigmaErr,2.0)+pow(0.11*0.0025,2.0), 0.5)/$SigmaSC_10
|
||||
# B=150mT
|
||||
var SigmaSC_150 = pow(abs(pow($Sigma,2.0)-pow(0.075,2.0)), 0.5) # 0.075 (1/us) is the nuclear contribution (T>Tc)
|
||||
var SigmaSC_150Err = pow(pow($Sigma*$SigmaErr,2.0)+pow(0.075*0.0025,2.0), 0.5)/$SigmaSC_150
|
||||
|
||||
addX dataE
|
||||
addY Field
|
||||
# link variables to collections
|
||||
col 0 : SigmaSC_10 # error variable SigmaSC_10Err doesn't need to be given, it is automatically linked to SigmaSC_10
|
||||
col 1 : SigmaSC_150
|
||||
|
||||
norm # normalize the plot to the maximum of each y-data-set
|
||||
|
||||
# the next 3 cmds means the following: use collection 0, add dataT to the x-axis,
|
||||
# and SigmaSC_10 to the y-axis
|
||||
select 0
|
||||
x dataT
|
||||
y SigmaSC_10
|
||||
|
||||
select 1
|
||||
x dataT
|
||||
y SigmaSC_150
|
||||
|
||||
# where to save the output
|
||||
savePath ./
|
||||
plot FieldVsEnergy.pdf
|
||||
|
||||
macro FieldVsEnergy.C
|
||||
# create a pdf output file of the above defined xy-data sets. Currently also
|
||||
# other file formats are supported, like png, jpg, etc.
|
||||
plot SigmaSCVsTemp.pdf
|
||||
|
||||
# creates a ROOT macro which can be used for further refinement
|
||||
macro SigmaSCVsTemp.C
|
||||
|
||||
# end
|
||||
</pre></div>
|
||||
@ -169,28 +229,37 @@ OPTIONS:
|
||||
<fit-param-file-names>: list of file name(s) to be loaded.
|
||||
allowed formats are: db, dat, msr
|
||||
|
||||
SCRIPT COMMANDS:
|
||||
Lines starting with '#', '%', or '//' are comments and will be ignored.
|
||||
The same is true for empty lines. Comments are also allowed at the end
|
||||
for a command, i.e. loadPath ./ # the best place ever.
|
||||
|
||||
loadPath <dir> : set the load path to <dir>. Bash variables like
|
||||
$HOME are accepted.
|
||||
load <coll> : will load a collection <coll>. Currently *.db and *.dat
|
||||
are handled.
|
||||
selectAll : will select all loaded collections. Thie means every plot
|
||||
of variable x/y will be carried out to ALL collections.
|
||||
select <nn> : selects collection <nn>, where <nn> is either the number
|
||||
of the collections, or its name, e.g.
|
||||
select YBCO-40nm-T5K-FC150mT-Escan.db
|
||||
addX <label> : add <label> as a x-variable. Only one is allowed.
|
||||
addY <label(s)>: add <label(s)> as y-variable. Multiple labls are possible.
|
||||
savePath <dir> : set the save path to <dir>. The place where the macros,
|
||||
and/or the plot output will be saved.
|
||||
plot <fln> : where <fln> is the file name with extension under which
|
||||
the plot should be saved.
|
||||
macro <fln> : where <fln> is the file name under which the root macro
|
||||
should be saved.
|
||||
SCRIPT COMMANDS:
|
||||
Lines starting with '#', '%', or '//' are comments and will be ignored.
|
||||
The same is true for empty lines. Comments are also allowed at the end
|
||||
for a command, i.e. loadPath ./ # the best place ever.
|
||||
|
||||
load <coll> : load a collection. <coll> is the filename of the
|
||||
collection (*.db, *.dat)
|
||||
loadPath <path> : set the load path to <path>; accepting bash variables
|
||||
like $HOME, etc.
|
||||
x <var-name> : set a x-axis variable. <var-name> is a data tag of
|
||||
the db/dat-file.
|
||||
y <var-name> : set a y-axis variable. <var-name> is a data tag of
|
||||
the db/dat-file.
|
||||
select <nn> : select collection <nn>, where <nn> is the row-number
|
||||
or the name of the collection to be selected.
|
||||
selectAll : i.e. already set 'x', 'y' will apply to ALL collections
|
||||
present.
|
||||
savePath <path> : sets the save path to <path>; accepting bash variables
|
||||
like $HOME, etc.
|
||||
plot <fln> : where <fln> is the file name with extension under which
|
||||
the plot should be saved.
|
||||
macro <fln> : where <fln> is the file name under which the root macro
|
||||
should be saved.
|
||||
var <var_name> = <expr> : defines a variable.
|
||||
<expr> is a mathematical expression where
|
||||
collection variables are addressed via the '$',
|
||||
e.g. dataT is addressed by $dataT, etc.
|
||||
col <nn> : <var_name> : links <var_name> to the collection <nn>, where
|
||||
<nn> is the number of the collection as defined
|
||||
by the order of load, starting with 0.
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
@ -205,7 +274,10 @@ SCRIPT COMMANDS:
|
||||
<h3><a href="index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">mupp - μSR Parameter Plotter</a><ul>
|
||||
<li><a class="reference internal" href="#the-graphical-user-interface">The Graphical User Interface</a></li>
|
||||
<li><a class="reference internal" href="#the-graphical-user-interface">The Graphical User Interface</a><ul>
|
||||
<li><a class="reference internal" href="#define-variable-dialog">Define Variable Dialog</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#the-scripting-interface">The Scripting Interface</a></li>
|
||||
<li><a class="reference internal" href="#the-usage-summary">The Usage Summary</a></li>
|
||||
</ul>
|
||||
@ -252,12 +324,12 @@ SCRIPT COMMANDS:
|
||||
<li class="right" >
|
||||
<a href="musredit.html" title="musredit: the GUI Based Interface to musrfit"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>MusrRoot - an Extensible Open File Format for μSR — musrfit 1.5.1 documentation</title>
|
||||
<title>MusrRoot - an Extensible Open File Format for μSR — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="Acknowledgements" href="acknowledgement.html" />
|
||||
<link rel="prev" title="any2many - a Universal μSR-file-format converter" href="any2many.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="any2many.html" title="any2many - a Universal μSR-file-format converter"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -923,12 +923,12 @@ the entry has been added. The last token, <tt class="docutils literal"><span cla
|
||||
<li class="right" >
|
||||
<a href="any2many.html" title="any2many - a Universal μSR-file-format converter"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>musredit: the GUI Based Interface to musrfit — musrfit 1.5.1 documentation</title>
|
||||
<title>musredit: the GUI Based Interface to musrfit — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="mupp - μSR Parameter Plotter" href="mupp.html" />
|
||||
<link rel="prev" title="Setting up musrfit / DKS: High Speed Fitting with GPU’s" href="setup-dks.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="setup-dks.html" title="Setting up musrfit / DKS: High Speed Fitting with GPU’s"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -550,12 +550,12 @@ the corresponding fit parameter value, except the phases where the step will be
|
||||
<li class="right" >
|
||||
<a href="setup-dks.html" title="Setting up musrfit / DKS: High Speed Fitting with GPU’s"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Search — musrfit 1.5.1 documentation</title>
|
||||
<title>Search — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -25,7 +25,7 @@
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<script type="text/javascript" src="_static/searchtools.js"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<script type="text/javascript">
|
||||
jQuery(function() { Search.loadIndex("searchindex.js"); });
|
||||
</script>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -89,12 +89,12 @@
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="genindex.html" title="General Index"
|
||||
>index</a></li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Setting up musrfit / DKS: High Speed Fitting with GPU’s — musrfit 1.5.1 documentation</title>
|
||||
<title>Setting up musrfit / DKS: High Speed Fitting with GPU’s — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="musredit: the GUI Based Interface to musrfit" href="musredit.html" />
|
||||
<link rel="prev" title="Setting up musrfit on Different Platforms" href="setup-standard.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="setup-standard.html" title="Setting up musrfit on Different Platforms"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -321,12 +321,12 @@ The only thing you need <tt class="docutils literal"><span class="pre">DKS</span
|
||||
<li class="right" >
|
||||
<a href="setup-standard.html" title="Setting up musrfit on Different Platforms"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Setting up musrfit on Different Platforms — musrfit 1.5.1 documentation</title>
|
||||
<title>Setting up musrfit on Different Platforms — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="Setting up musrfit / DKS: High Speed Fitting with GPU’s" href="setup-dks.html" />
|
||||
<link rel="prev" title="Documentation of user libs (user functions)" href="user-libs.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="user-libs.html" title="Documentation of user libs (user functions)"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -88,7 +88,7 @@ their header packages:</p>
|
||||
<p>Additionally, <em>only</em> if <tt class="docutils literal"><span class="pre">musrfit</span></tt> should support reading of data files in the <cite>NeXus</cite> format the following libraries are needed:</p>
|
||||
<dl class="docutils" id="index-7">
|
||||
<dt><strong>HDF4</strong></dt>
|
||||
<dd>A library and multi-object file format for storing and managing data (see <a class="reference external" href="http://www.hdfgroup.org/products/hdf4/">HDF4</a>). <tt class="docutils literal"><span class="pre">HDF4</span></tt> is “outdated” and its support will soon be dropped.</dd>
|
||||
<dd>A library and multi-object file format for storing and managing data (see <a class="reference external" href="http://www.hdfgroup.org/products/hdf4/">HDF4</a>). <tt class="docutils literal"><span class="pre">HDF4</span></tt> is “outdated” and its support will soon be dropped. The single only reason why it is still required is that ISIS is not able to cope to implement HDF5 V2 of the NeXus muon instrument specification which has been agreed in 2012!</dd>
|
||||
</dl>
|
||||
<dl class="docutils" id="index-8">
|
||||
<dt><strong>HDF5</strong></dt>
|
||||
@ -180,16 +180,16 @@ the source code from the corresponding website, or to clone the git repo. If you
|
||||
software has to be set up. The required libraries and header files could either be available through the user’s
|
||||
GNU/Linux distribution or if this is not the case, the packages can be installed from the source code. In principle
|
||||
NeXus should support <tt class="docutils literal"><span class="pre">MXML</span></tt>, <tt class="docutils literal"><span class="pre">HDF4</span></tt>, and <tt class="docutils literal"><span class="pre">HDF5</span></tt>. At the time of this writing, the <tt class="docutils literal"><span class="pre">MXML</span></tt> support in the
|
||||
NeXus project is broken, and <tt class="docutils literal"><span class="pre">HDF4</span></tt> is outdated on most platforms, hence currently only the <tt class="docutils literal"><span class="pre">HDF5</span></tt> binding is
|
||||
used. Hence, the necessary package to build <tt class="docutils literal"><span class="pre">NeXus</span></tt> is <tt class="docutils literal"><span class="pre">HDF5</span></tt>. This means, for a rpm-package based distro try something like:</p>
|
||||
NeXus project is broken, and <tt class="docutils literal"><span class="pre">HDF4</span></tt> is outdated on most platforms, yet since ISIS/RAL is still <strong>not</strong> up-to-date <tt class="docutils literal"><span class="pre">HDF4</span></tt> still
|
||||
needs to be dragged on (comment: if you are a ISIS user, please complain about <tt class="docutils literal"><span class="pre">HDF4</span></tt>). Hence, the necessary packages to build <tt class="docutils literal"><span class="pre">NeXus</span></tt> are <tt class="docutils literal"><span class="pre">HDF4</span></tt> and <tt class="docutils literal"><span class="pre">HDF5</span></tt>. This means, for a rpm-package based distro try something like:</p>
|
||||
<blockquote>
|
||||
<div><div class="highlight-bash"><div class="highlight"><pre><span></span>$ yum install hdf5-devel
|
||||
<div><div class="highlight-bash"><div class="highlight"><pre><span></span>$ yum install hdf-devel hdf5-devel
|
||||
</pre></div>
|
||||
</div>
|
||||
</div></blockquote>
|
||||
<p>and on a deb-package based distro try something like:</p>
|
||||
<blockquote>
|
||||
<div><div class="highlight-bash"><div class="highlight"><pre><span></span>$ apt-get install libhdf5-dev
|
||||
<div><div class="highlight-bash"><div class="highlight"><pre><span></span>$ apt-get install libhdf4-dev libhdf5-dev
|
||||
</pre></div>
|
||||
</div>
|
||||
</div></blockquote>
|
||||
@ -206,7 +206,7 @@ $ git clone https://github.com/nexusformat/code.git
|
||||
$ <span class="c1"># next we will build NeXus out-of-source</span>
|
||||
$ mkdir build
|
||||
$ <span class="nb">cd</span> build
|
||||
$ cmake -DENABLE_HDF5<span class="o">=</span><span class="m">1</span> -DENABLE_HDF4<span class="o">=</span><span class="m">0</span> -DENABLE_MXML<span class="o">=</span><span class="m">0</span> ../code
|
||||
$ cmake -DENABLE_HDF5<span class="o">=</span><span class="m">1</span> -DENABLE_HDF4<span class="o">=</span><span class="m">1</span> -DENABLE_MXML<span class="o">=</span><span class="m">0</span> ../code
|
||||
$ cmake --build ./ --clean-first
|
||||
$ <span class="c1"># make install needs either to be carried out as root or sudo depending on your linux flavour.</span>
|
||||
$ sudo make install
|
||||
@ -513,7 +513,7 @@ $ git clone https://github.com/nexusformat/code.git
|
||||
$ <span class="c1"># next we will build NeXus out-of-source</span>
|
||||
$ mkdir build
|
||||
$ <span class="nb">cd</span> build
|
||||
$ cmake -DENABLE_HDF5<span class="o">=</span><span class="m">1</span> -DENABLE_HDF4<span class="o">=</span><span class="m">0</span> -DENABLE_MXML<span class="o">=</span><span class="m">0</span> ../code
|
||||
$ cmake -DENABLE_HDF5<span class="o">=</span><span class="m">1</span> -DENABLE_HDF4<span class="o">=</span><span class="m">1</span> -DENABLE_MXML<span class="o">=</span><span class="m">0</span> ../code
|
||||
$ make
|
||||
$ make install
|
||||
</pre></div>
|
||||
@ -684,11 +684,22 @@ and <tt class="docutils literal"><span class="pre">C:\cygwin\bin\bash.exe</span>
|
||||
</div>
|
||||
<div class="section" id="mac-os-x-macos">
|
||||
<h2>Mac OS X / macOS<a class="headerlink" href="#mac-os-x-macos" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="admonition note">
|
||||
<p class="first admonition-title">Note</p>
|
||||
<p class="last">macOS Catalina is slightly different in some aspects, so if it happens that you have it installed, please
|
||||
first check <a class="reference internal" href="#note-on-catalina"><em>Notes on macOS Catalina</em></a> before you proceed.</p>
|
||||
</div>
|
||||
<p>With Mac OS X / macOS the situation is up to some extent similar like on MS Windows but still different since
|
||||
Mac OS X is a UNIX system. The similarity is that also on OS X a helping framework — either <a class="reference external" href="https://www.macports.org/">MacPorts</a>
|
||||
or <a class="reference external" href="http://www.finkproject.org/">Fink</a> — which provides open-source software is employed to fulfill the basic software requirements of <tt class="docutils literal"><span class="pre">musrfit</span></tt>.
|
||||
In the following, both possibilities (using MacPorts or Fink) are described but it is emphasized here that
|
||||
it should be followed only <em>one</em> of the possible routes .</p>
|
||||
<div class="admonition warning">
|
||||
<p class="first admonition-title">Warning</p>
|
||||
<p class="last">If you decide to upgrade your macOS, e.g. from <tt class="docutils literal"><span class="pre">High</span> <span class="pre">Sierra</span></tt> to <tt class="docutils literal"><span class="pre">Mojave</span></tt>, you will typically need to
|
||||
unistall <tt class="docutils literal"><span class="pre">musrfit</span></tt>, <tt class="docutils literal"><span class="pre">ROOT</span></tt>, and <a class="reference external" href="https://www.macports.org/">MacPorts</a> / <a class="reference external" href="http://www.finkproject.org/">Fink</a> first, do the upgrade of the macOS and start the
|
||||
installation of <a class="reference external" href="https://www.macports.org/">MacPorts</a> / <a class="reference external" href="http://www.finkproject.org/">Fink</a> , <tt class="docutils literal"><span class="pre">ROOT</span></tt>, and <tt class="docutils literal"><span class="pre">musrfit</span></tt> from scratch!</p>
|
||||
</div>
|
||||
<div class="section" id="requirements-macports">
|
||||
<span id="index-27"></span><h3>Requirements (MacPorts)<a class="headerlink" href="#requirements-macports" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Before proceeding with the usage of the <tt class="docutils literal"><span class="pre">MacPorts</span></tt> system first a few useful tools provided by Apple together
|
||||
@ -750,7 +761,7 @@ please change over to <tt class="docutils literal"><span class="pre">musredit</s
|
||||
<div class="section" id="index-28">
|
||||
<span id="id14"></span><h4>Installation of NeXus requirements (optional)<a class="headerlink" href="#index-28" title="Permalink to this headline">¶</a></h4>
|
||||
<p><em>Only</em> if <tt class="docutils literal"><span class="pre">musrfit</span></tt> should support reading data files in the <tt class="docutils literal"><span class="pre">NeXus</span></tt> format the further required packages are set up:</p>
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ sudo port -v install hdf5
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ sudo port -v install hdf4 hdf5
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><strong>Only NeXus Version ≥ 4.4 is support!</strong></p>
|
||||
@ -763,7 +774,7 @@ $ <span class="c1"># next we will build NeXus out-of-source</span>
|
||||
$ <span class="nb">cd</span> nexus
|
||||
$ mkdir build
|
||||
$ <span class="nb">cd</span> build
|
||||
$ cmake -DENABLE_HDF5<span class="o">=</span><span class="m">1</span> -DENABLE_HDF4<span class="o">=</span><span class="m">0</span> -DENABLE_MXML<span class="o">=</span><span class="m">0</span> ../code
|
||||
$ cmake -DENABLE_HDF5<span class="o">=</span><span class="m">1</span> -DENABLE_HDF4<span class="o">=</span><span class="m">1</span> -DENABLE_MXML<span class="o">=</span><span class="m">0</span> ../code
|
||||
$ make
|
||||
$ sudo make install
|
||||
</pre></div>
|
||||
@ -861,6 +872,25 @@ launchctl setenv LD_LIBRARY_PATH <span class="nv">$LD_LIBRARY_PATH</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="notes-on-macos-catalina">
|
||||
<span id="note-on-catalina"></span><h4>Notes on macOS Catalina<a class="headerlink" href="#notes-on-macos-catalina" title="Permalink to this headline">¶</a></h4>
|
||||
<p>Apple introduced a couple of changes on macOS Catalina compared to its previous versions of macOS which might
|
||||
be a stumble block. Here I <strong>very</strong> briefly try to add some notes in order to get a smooth installation for
|
||||
<tt class="docutils literal"><span class="pre">musrfit</span></tt>.</p>
|
||||
<ol class="arabic">
|
||||
<li><p class="first">You should switch from the bash to the zsh. Please check, e.g. <a class="reference external" href="https://scriptingosx.com/2019/06/moving-to-zsh/">Moving to zsh</a>.</p>
|
||||
</li>
|
||||
<li><p class="first">Instead of <tt class="docutils literal"><span class="pre">.profile</span></tt> you will need to setup a <tt class="docutils literal"><span class="pre">.zprofile</span></tt>.</p>
|
||||
</li>
|
||||
<li><p class="first">macports: currently there is a little nuisance with the <tt class="docutils literal"><span class="pre">fftw-3</span></tt> port. My bug report is already out since a while
|
||||
but no proper fix is available. The workaround to get it right is to install the port from source which is done by</p>
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ port -s install fftw-3
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>If you fail to do so, you might trigger a crash in the Fourier transform for 2^N, N=12.</p>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="requirements-fink">
|
||||
<span id="index-30"></span><h3>Requirements (Fink)<a class="headerlink" href="#requirements-fink" title="Permalink to this headline">¶</a></h3>
|
||||
@ -938,7 +968,7 @@ $ <span class="nb">cd</span> nexus
|
||||
$ <span class="c1"># build NeXus out-of-source</span>
|
||||
$ mkdir build
|
||||
$ <span class="nb">cd</span> build
|
||||
$ cmake ../code -DENABLE_HDF5<span class="o">=</span><span class="m">1</span> -DENABLE_HDF4<span class="o">=</span><span class="m">0</span> -DENABLE_MXML<span class="o">=</span><span class="m">0</span>
|
||||
$ cmake ../code -DENABLE_HDF5<span class="o">=</span><span class="m">1</span> -DENABLE_HDF4<span class="o">=</span><span class="m">1</span> -DENABLE_MXML<span class="o">=</span><span class="m">0</span>
|
||||
$ cmake --build ./ --clean-first -- -j8
|
||||
$ sudo make install
|
||||
</pre></div>
|
||||
@ -1219,6 +1249,7 @@ $ musrview test-histo-ROOT-NPP.msr
|
||||
<li><a class="reference internal" href="#requirements-macports">Requirements (MacPorts)</a><ul>
|
||||
<li><a class="reference internal" href="#index-28">Installation of NeXus requirements (optional)</a></li>
|
||||
<li><a class="reference internal" href="#index-29">ROOT</a></li>
|
||||
<li><a class="reference internal" href="#notes-on-macos-catalina">Notes on macOS Catalina</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#requirements-fink">Requirements (Fink)</a><ul>
|
||||
@ -1280,12 +1311,12 @@ $ musrview test-histo-ROOT-NPP.msr
|
||||
<li class="right" >
|
||||
<a href="user-libs.html" title="Documentation of user libs (user functions)"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Tutorial for musrfit — musrfit 1.5.1 documentation</title>
|
||||
<title>Tutorial for musrfit — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="User manual" href="user-manual.html" />
|
||||
<link rel="prev" title="How to Cite musrfit?" href="cite.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="cite.html" title="How to Cite musrfit?"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -132,7 +132,7 @@ TFieldCos map1 fun2 (phase frequency)
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The THEORY block is used to define a fit-parameter-dependent theory function used to model
|
||||
the decay asymmetry. Different <a class="reference internal" href="user-manual.html#msr-theory-block"><em>predefined</em></a> and <a class="reference internal" href="user-manual.html#id22"><em>user-defined</em></a>
|
||||
the decay asymmetry. Different <a class="reference internal" href="user-manual.html#msr-theory-block"><em>predefined</em></a> and <a class="reference internal" href="user-manual.html#id38"><em>user-defined</em></a>
|
||||
functions can be combined here. Theory lines following each other are <em>multiplied</em> and the <strong>+</strong> sign
|
||||
is used to add different (here: two) signal contributions. The numbers are the parameter numbers
|
||||
according to the <tt class="docutils literal"><span class="pre">FITPARAMETER</span> <span class="pre">block</span></tt>. <tt class="docutils literal"><span class="pre">map</span></tt> and <tt class="docutils literal"><span class="pre">fun</span></tt> are used to refer to
|
||||
@ -443,12 +443,12 @@ For a complete description please refer to the manuals of <a class="reference in
|
||||
<li class="right" >
|
||||
<a href="cite.html" title="How to Cite musrfit?"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Documentation of user libs (user functions) — musrfit 1.5.1 documentation</title>
|
||||
<title>Documentation of user libs (user functions) — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="Setting up musrfit on Different Platforms" href="setup-standard.html" />
|
||||
<link rel="prev" title="User manual" href="user-manual.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="user-manual.html" title="User manual"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -58,7 +58,7 @@
|
||||
<span id="index-2"></span><h3>libFitPofB<a class="headerlink" href="#libfitpofb" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="section" id="introduction">
|
||||
<h4>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h4>
|
||||
<p><tt class="docutils literal"><span class="pre">libFitPofB</span></tt> is a collection of <tt class="docutils literal"><span class="pre">C++</span></tt> classes using the <tt class="docutils literal"><span class="pre">musrfit</span></tt> <a class="reference internal" href="user-manual.html#id22"><em>user-functions</em></a>
|
||||
<p><tt class="docutils literal"><span class="pre">libFitPofB</span></tt> is a collection of <tt class="docutils literal"><span class="pre">C++</span></tt> classes using the <tt class="docutils literal"><span class="pre">musrfit</span></tt> <a class="reference internal" href="user-manual.html#id38"><em>user-functions</em></a>
|
||||
interface in order to facilitate the usage in conjunction with <tt class="docutils literal"><span class="pre">musrfit</span></tt>. The classes contained in this
|
||||
library generally implement calculations of one-dimensional static magnetic field distributions
|
||||
<span class="math">\(p(B)\)</span> which lead to the muon-spin depolarization functions</p>
|
||||
@ -372,7 +372,7 @@ The expected name of the <tt class="docutils literal"><span class="pre">RGE</spa
|
||||
</div>
|
||||
<div class="section" id="functions-to-analyze-bgr-nmr-data-bnmr-libs">
|
||||
<span id="bnmr-libs"></span><span id="index-14"></span><h2>Functions to analyze β-NMR data (BNMR libs)<a class="headerlink" href="#functions-to-analyze-bgr-nmr-data-bnmr-libs" title="Permalink to this headline">¶</a></h2>
|
||||
<p>This is a collection of <tt class="docutils literal"><span class="pre">C++</span></tt> classes using the <tt class="docutils literal"><span class="pre">musrfit</span></tt> <a class="reference internal" href="user-manual.html#id22"><em>user-functions</em></a>
|
||||
<p>This is a collection of <tt class="docutils literal"><span class="pre">C++</span></tt> classes using the <tt class="docutils literal"><span class="pre">musrfit</span></tt> <a class="reference internal" href="user-manual.html#id38"><em>user-functions</em></a>
|
||||
interface in order to facilitate the usage in conjunction with <tt class="docutils literal"><span class="pre">musrfit</span></tt>. It consists of two libraries:</p>
|
||||
<ul class="simple">
|
||||
<li><tt class="docutils literal"><span class="pre">libBNMR</span></tt> contains functions to fit spin lattice relaxation (SLR) data.</li>
|
||||
@ -662,12 +662,12 @@ K(m)&=\int_0^{\pi/2}\frac{\mathrm d\varphi}{\sqrt{1-m^2\sin^2{\varphi}}},\en
|
||||
<li class="right" >
|
||||
<a href="user-manual.html" title="User manual"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>User manual — musrfit 1.5.1 documentation</title>
|
||||
<title>User manual — musrfit 1.6.4 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@ -14,7 +14,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '1.5.1',
|
||||
VERSION: '1.6.4',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@ -24,7 +24,7 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<link rel="top" title="musrfit 1.5.1 documentation" href="index.html" />
|
||||
<link rel="top" title="musrfit 1.6.4 documentation" href="index.html" />
|
||||
<link rel="next" title="Documentation of user libs (user functions)" href="user-libs.html" />
|
||||
<link rel="prev" title="Tutorial for musrfit" href="tutorial.html" />
|
||||
</head>
|
||||
@ -41,7 +41,7 @@
|
||||
<li class="right" >
|
||||
<a href="tutorial.html" title="Tutorial for musrfit"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -109,6 +109,8 @@
|
||||
<dd>will directly present the Fourier transform of the <msr_file> with Fourier options as defined in the <msr_file>.</dd>
|
||||
<dt><strong>-a, - -avg</strong></dt>
|
||||
<dd>will directly present the averaged data/Fourier of the <msr_file>.</dd>
|
||||
<dt><strong>-1, - -one_to_one</strong></dt>
|
||||
<dd>calculate the theory points <em>only</em> at the data points.</dd>
|
||||
<dt><strong>- -<graphic_format_extension></strong></dt>
|
||||
<dd>will produce a graphics output file without starting a ROOT session. The filename is based on the name of the <msr_file>, <em>e.g.</em> 8472.msr will result in 8472_0.png.
|
||||
Supported values for <tt class="docutils literal"><span class="pre"><graphic_format_extension></span></tt> are <em>eps</em>, <em>pdf</em>, <em>gif</em>, <em>jpg</em>, <em>png</em>, <em>svg</em>, <em>xpm</em>, and, <em>root</em>.</dd>
|
||||
@ -159,6 +161,8 @@ Supported values for <tt class="docutils literal"><span class="pre"><graphic_
|
||||
<dd>reset the plotting range to the area given in the msr file (“un-zoom”).</dd>
|
||||
<dt><strong>c</strong></dt>
|
||||
<dd>toggles between normal and cross-hair cursor.</dd>
|
||||
<dt><strong>t</strong></dt>
|
||||
<dd>a plot of a <strong>single</strong> data set allows to toggle the color of the theory function line.</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
@ -616,7 +620,7 @@ in case a <span class="math">\(\chi^2\)</span> single-histogram fit is done, als
|
||||
<tr class="row-odd"><td>generExpo</td>
|
||||
<td>ge</td>
|
||||
<td><span class="math">\(\lambda (\mu \mathrm{s}^{-1}) \beta(1)\)</span></td>
|
||||
<td><span class="math">\(\exp\left[(-\lambda t)^\beta\right]\)</span></td>
|
||||
<td><span class="math">\(\exp\left[-(\lambda t)^\beta\right]\)</span></td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr class="row-even"><td>simpleGss</td>
|
||||
@ -935,7 +939,7 @@ Whereas the theory is operating on the parameters and the time, functions curren
|
||||
<span id="msr-theory-block-user-functions"></span><h4>User Functions<a class="headerlink" href="#user-functions" title="Permalink to this headline">¶</a></h4>
|
||||
<p>In the case complicated and not predefined functions are needed to fit data, <tt class="docutils literal"><span class="pre">musrfit</span></tt> offers the possibility to implement external functions
|
||||
and introduce them to <tt class="docutils literal"><span class="pre">musrfit</span></tt> through the ROOT dictionary mechanism. The detailed rules these user-defined functions have to obey will be discussed
|
||||
in the according <a class="reference internal" href="#id22"><em>section</em></a>. Here only the syntax for the msr file is provided. To call a user function in the <a class="reference internal" href="#msr-theory-block"><em>THEORY block</em></a> the
|
||||
in the according <a class="reference internal" href="#id38"><em>section</em></a>. Here only the syntax for the msr file is provided. To call a user function in the <a class="reference internal" href="#msr-theory-block"><em>THEORY block</em></a> the
|
||||
keyword <tt class="docutils literal"><span class="pre">userFcn</span></tt> is used. It is followed by the name of the shared library which holds the C++ class where the function is implemented and the name of
|
||||
the class. Finally, all parameters are given in the order needed by the class. Of course it is also possible to use mapped parameters or functions
|
||||
instead of specifying the parameters directly.</p>
|
||||
@ -951,8 +955,9 @@ userFcn libMyLibrary.so TMyFunction 2 3 4 map1 fun1
|
||||
</div>
|
||||
<div class="section" id="the-functions-block">
|
||||
<span id="msr-functions-block"></span><span id="index-15"></span><h3>The FUNCTIONS Block<a class="headerlink" href="#the-functions-block" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Here some auxiliary functions can be defined. These functions can currently <em>only</em> operate on the defined parameters. They can be used in the
|
||||
<a class="reference internal" href="#msr-theory-block"><em>THEORY block</em></a> and for one specific case in the <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a>. Supported is the use of basic arithmetic:</p>
|
||||
<p>Here some auxiliary functions can be defined. These functions can currently <em>only</em> operate on the defined parameters, and some meta information from the data files.
|
||||
They can be used in the <a class="reference internal" href="#msr-theory-block"><em>THEORY block</em></a> and for three specific cases in the <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a> (<cite>norm</cite>, <cite>alpha</cite>, and <cite>beta</cite>).
|
||||
Supported is the use of basic arithmetic:</p>
|
||||
<dl class="docutils">
|
||||
<dt><span class="math">\(+\)</span></dt>
|
||||
<dd>Addition</dd>
|
||||
@ -974,6 +979,37 @@ acosh(), asinh(), atanh(), exp(), log(), ln(), sqrt(), pow(base, exponent)</stro
|
||||
</ul>
|
||||
<p>The fit parameters are accessed either directly through parX, where ‘X’ is the number of the parameter in the <a class="reference internal" href="#msr-fitparameter-block"><em>FITPARAMETER block</em></a>,
|
||||
<em>e.g.</em> <em>par5</em> or through a mapping with mapY, where ‘Y’ specifies the mapping number in the <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a> as explained below.</p>
|
||||
<p id="index-16">The available meta information form the data files are:</p>
|
||||
<table border="1" class="docutils">
|
||||
<colgroup>
|
||||
<col width="29%" />
|
||||
<col width="23%" />
|
||||
<col width="15%" />
|
||||
<col width="34%" />
|
||||
</colgroup>
|
||||
<tbody valign="top">
|
||||
<tr class="row-odd"><td>Meta Information</td>
|
||||
<td>Symbol</td>
|
||||
<td>Units</td>
|
||||
<td>Comments</td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>Field</strong></td>
|
||||
<td><em>B</em> or <em>b</em></td>
|
||||
<td><cite>(G)</cite></td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>Energy</strong></td>
|
||||
<td><em>En</em> or <em>en</em></td>
|
||||
<td><cite>(keV)</cite></td>
|
||||
<td>mainly LEM</td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>Temperature</strong></td>
|
||||
<td><em>Tx</em></td>
|
||||
<td><cite>(K)</cite></td>
|
||||
<td>x=0,1,.. e.g. <em>t0</em></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>The defined functions are denoted as funX, where ‘X’ is the function number, <em>i.e.</em> fun1, fun2, etc. and have to be placed separately on one
|
||||
line each. Afterwards they can be used in the <a class="reference internal" href="#msr-theory-block"><em>THEORY block</em></a>.</p>
|
||||
<p>It follows an example to illustrate the usage of functions in the <a class="reference internal" href="#msr-theory-block"><em>THEORY block</em></a>. The total asymmetry of a signal
|
||||
@ -1003,7 +1039,7 @@ fun2 = par3 * ( 1.0 - par5 )
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="the-global-block">
|
||||
<span id="msr-global-block"></span><span id="index-16"></span><h3>The GLOBAL Block<a class="headerlink" href="#the-global-block" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="msr-global-block"></span><span id="index-17"></span><h3>The GLOBAL Block<a class="headerlink" href="#the-global-block" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The GLOBAL block is used to collect data which otherwise need to be specified in every single run entry of the <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a>.
|
||||
Therefore, this block is only present to potentially shorten the msr file and to ease the handling for the user. The logic will by like that:</p>
|
||||
<ol class="arabic simple">
|
||||
@ -1110,7 +1146,7 @@ fittype 0 (single histogram fit)
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="the-run-block">
|
||||
<span id="msr-run-block"></span><span id="index-17"></span><h3>The RUN Block<a class="headerlink" href="#the-run-block" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="msr-run-block"></span><span id="index-18"></span><h3>The RUN Block<a class="headerlink" href="#the-run-block" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The RUN block is used to collect the data needed for a particular run to be fitted. This includes the run name, fit type, data format, etc.
|
||||
The RUN block is slightly differently organized than the other blocks. The information is collected via labels followed by the information.
|
||||
Each run to be fitted has its <em>own</em> RUN block. A RUN block starts with a run-file line which has the structure</p>
|
||||
@ -1184,7 +1220,7 @@ RUN beautiful-data MUE4 PSI DB
|
||||
</div>
|
||||
<p>After this short digression back to the RUN-block description.</p>
|
||||
<p>In order to describe the operations needed for fitting and plotting, quite some information are needed. These information are following the RUN statement and are listed below. Depending on the fit type these information vary and hence it is indicated for which fit/plot type the information is applicable</p>
|
||||
<span id="index-18"></span><dl class="docutils" id="msr-addrun">
|
||||
<span id="index-19"></span><dl class="docutils" id="msr-addrun">
|
||||
<dt><strong>ADDRUN <run_file_name> <beamline> <facility> <file_format></strong> (optional)</dt>
|
||||
<dd><p class="first">If an ADDRUN is just following after a RUN statement, these runs will be added. More than one ADDRUN statements are possible, <em>i.e.</em> adding up as many runs as wished. It is also possible to add runs with different file formats. If the t0’s are given in the data files, the ADDRUN statement is all what is needed, otherwise just add the t0’s with the addt0 statement.</p>
|
||||
<p>For a <a class="reference internal" href="#single-histogram-fit"><em>Single Histogram Fit</em></a> or a <a class="reference internal" href="#negative-muon-musr-fit"><em>MuMinus Fit</em></a> it will be</p>
|
||||
@ -1203,7 +1239,7 @@ etc.
|
||||
<p class="last">ADDRUN is <em>not</em> available for the fit type <a class="reference internal" href="#non-musr-fit"><em>Non-muSR Fit</em></a>.</p>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-19"></span><dl class="docutils" id="msr-fittype">
|
||||
<span id="index-20"></span><dl class="docutils" id="msr-fittype">
|
||||
<dt><strong>fittype</strong> (required if not already defined in the GLOBAL block)</dt>
|
||||
<dd><p class="first">This tag is used to indicate which type of fit is wished. The supported fit types are:</p>
|
||||
<dl class="docutils">
|
||||
@ -1228,18 +1264,22 @@ etc.
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-20"></span><dl class="docutils" id="msr-alpha-beta">
|
||||
<span id="index-21"></span><dl class="docutils" id="msr-alpha-beta">
|
||||
<dt><strong>alpha, beta</strong> (fit type 2, 3, 5)</dt>
|
||||
<dd><p class="first">These parameters are used to correct the asymmetry for different detector efficiencies, solid angles and initial asymmetries. They are defined as <span class="math">\(\alpha = N_{0,b}/N_{0,f}\)</span> and <span class="math">\(\beta = A_{0,b}/A_{0,f}\)</span>. If the parameters are not specified in the <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a>, for each one the value of 1 is assumed (for fittype 5, alpha is estimated from the ratio of <span class="math">\(\sum_i \left( N_{\mathrm{bp}}(i)+N_{\mathrm{bm}}(i) \right)\)</span> and <span class="math">\(\sum_i \left( N_{\mathrm{fp}}(i)+N_{\mathrm{fm}}(i) \right)\)</span>). Example for alpha with fit parameter number 1:</p>
|
||||
<div class="last highlight-python"><div class="highlight"><pre><span></span>alpha 1
|
||||
<dd><p class="first">These parameters are used to correct the asymmetry for different detector efficiencies, solid angles and initial asymmetries. They are defined as <span class="math">\(\alpha = N_{0,b}/N_{0,f}\)</span> and <span class="math">\(\beta = A_{0,b}/A_{0,f}\)</span>. If the parameters are not specified in the <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a>, for each one the value of 1 is assumed (for fittype 5, alpha is estimated from the ratio of <span class="math">\(\sum_i \left( N_{\mathrm{bp}}(i)+N_{\mathrm{bm}}(i) \right)\)</span> and <span class="math">\(\sum_i \left( N_{\mathrm{fp}}(i)+N_{\mathrm{fm}}(i) \right)\)</span>). Both, <cite>alpha</cite> as well as <cite>beta</cite> can be expressed through a function. Example for alpha with fit parameter number 1:</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>alpha 1
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Example for an <tt class="docutils literal"><span class="pre">alpha</span></tt> defined via function number 1:</p>
|
||||
<div class="last highlight-python"><div class="highlight"><pre><span></span>alpha fun1
|
||||
</pre></div>
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-21"></span><dl class="docutils" id="msr-norm">
|
||||
<span id="index-22"></span><dl class="docutils" id="msr-norm">
|
||||
<dt><strong>norm</strong> (fit type 0)</dt>
|
||||
<dd><p class="first">Number of the fit parameter that represents the normalization constant <span class="math">\(N_0\)</span> of the histogram; the value of this parameter is given either per nanosecond or per bin (see <a class="reference internal" href="#msr-commands-block"><em>below</em></a>).
|
||||
It is possible to substitute the parameter number by a function here (and only here in a RUN block), for instance to relate <span class="math">\(N_0\)</span>‘s of different histograms through an <span class="math">\(\alpha\)</span>
|
||||
It is possible to substitute the parameter number by a function, for instance to relate <span class="math">\(N_0\)</span>‘s of different histograms through an <span class="math">\(\alpha\)</span>
|
||||
parameter. Example for a <tt class="docutils literal"><span class="pre">norm</span></tt> defined by fit parameter number 12:</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>norm 12
|
||||
</pre></div>
|
||||
@ -1250,25 +1290,25 @@ parameter. Example for a <tt class="docutils literal"><span class="pre">norm</sp
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-22"></span><dl class="docutils" id="msr-backgr-fit">
|
||||
<span id="index-23"></span><dl class="docutils" id="msr-backgr-fit">
|
||||
<dt><strong>backgr.fit</strong> (fit type 0)</dt>
|
||||
<dd>Parameter number specifying the constant background in a histogram. Its value is given either per nanosecond or per bin (see <a class="reference internal" href="#msr-commands-block"><em>below</em></a>). If this keyword is present,
|
||||
any information on a background line are ignored.</dd>
|
||||
</dl>
|
||||
<span id="index-23"></span><dl class="docutils" id="msr-lifetime">
|
||||
<span id="index-24"></span><dl class="docutils" id="msr-lifetime">
|
||||
<dt><strong>lifetime</strong> (fit type 0)</dt>
|
||||
<dd>Fit parameter representing the lifetime of the muon. If it is not specified the value <span class="math">\(\tau_\mu=2.197019~ \mu\mathrm{s}\)</span> is used in the calculations.</dd>
|
||||
<dt><strong>lifetimecorrection</strong> (fit type 0) <em>obsolete</em></dt>
|
||||
<dd>Does not accept any arguments. If present, the output in <tt class="docutils literal"><span class="pre">musrview</span></tt> is corrected for the exponential decay of the muon. This item is <em>obsolete</em> in the RUN block
|
||||
and will be transferred to the <a class="reference internal" href="#msr-plot-block"><em>PLOT block</em></a>, which allows switching between histogram view and asymmetry view much quicker.</dd>
|
||||
</dl>
|
||||
<span id="index-24"></span><dl class="docutils" id="msr-map">
|
||||
<span id="index-25"></span><dl class="docutils" id="msr-map">
|
||||
<dt><strong>map</strong></dt>
|
||||
<dd>On this line the mapping of run-dependent parameters is done. Parameter numbers given here may be accessed through map1, map2, etc. in the
|
||||
<a class="reference internal" href="#msr-theory-block"><em>THEORY</em></a> and <a class="reference internal" href="#msr-functions-block"><em>FUNCTIONS</em></a> blocks (see also <a class="reference internal" href="#msr-map-intro"><em>maps</em></a>). The first ten maps
|
||||
are always present and have the value 0 if not used; however, the total number of maps is not restricted!</dd>
|
||||
</dl>
|
||||
<span id="index-25"></span><dl class="docutils" id="msr-forward">
|
||||
<span id="index-26"></span><dl class="docutils" id="msr-forward">
|
||||
<dt><strong>forward</strong> (fit type 0, 1, 4)</dt>
|
||||
<dd><p class="first">Number of the histogram in the data file to be processed. If histograms shall be grouped, all the numbers which shall be grouped. Examples:</p>
|
||||
<div class="last highlight-python"><div class="highlight"><pre><span></span>forward 3 # no grouping, take histogram number 3
|
||||
@ -1278,7 +1318,7 @@ forward 1-10 12 # group histograms with numbers from 1 to 10 and additionally hi
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-26"></span><dl class="docutils" id="msr-forward-backward">
|
||||
<span id="index-27"></span><dl class="docutils" id="msr-forward-backward">
|
||||
<dt><strong>forward, backward</strong> (fit types 2, 3)</dt>
|
||||
<dd><p class="first">Numbers of the histograms in the data file that should be taken to calculate the asymmetry. If histograms shall be grouped, all the numbers which shall be grouped. Examples:</p>
|
||||
<div class="last highlight-python"><div class="highlight"><pre><span></span># build forward/backward asymmetry with histogram 1 and 3
|
||||
@ -1302,12 +1342,12 @@ backward 3 4
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-27"></span><dl class="docutils" id="msr-backgr-fix">
|
||||
<span id="index-28"></span><dl class="docutils" id="msr-backgr-fix">
|
||||
<dt><strong>backgr.fix</strong> (fit types 0, 1, 2, 3, 5)</dt>
|
||||
<dd>A fixed constant background in counts per nanosecond or per bin (see <a class="reference internal" href="#msr-commands-block"><em>below</em></a>) may be given at this point.
|
||||
The background is specified for all histograms in the order <span class="math">\(B_f B_b [B_r B_l]\)</span>. If this keyword is present, <em>any</em> information on a <tt class="docutils literal"><span class="pre">background</span></tt> line is ignored.</dd>
|
||||
</dl>
|
||||
<span id="index-28"></span><dl class="docutils" id="msr-background-single-histo">
|
||||
<span id="index-29"></span><dl class="docutils" id="msr-background-single-histo">
|
||||
<dt><strong>background</strong> (fit type 0, 1)</dt>
|
||||
<dd><p class="first">The numbers of the first and the last channel of an interval from which the constant background should be calculated are specified here.
|
||||
In case histograms are being grouped, the specified channels are interpreted with respect to the first histogram. Example:</p>
|
||||
@ -1316,7 +1356,7 @@ In case histograms are being grouped, the specified channels are interpreted wit
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-29"></span><dl class="docutils" id="msr-background-asymmetry">
|
||||
<span id="index-30"></span><dl class="docutils" id="msr-background-asymmetry">
|
||||
<dt><strong>background</strong> (fit types 2, 3, 5)</dt>
|
||||
<dd><p class="first">The numbers of the first and the last channel of an interval from which the constant background should be calculated are specified here.
|
||||
For all the histograms this is done together in the following order: <span class="math">\(k_{f,\rm first} k_{f,\rm last} k_{b,\rm first} k_{b, \rm last} [k_{r,\rm first} k_{r,\rm last} k_{l,\rm first} k_{l,\rm last}]\)</span>.
|
||||
@ -1326,7 +1366,7 @@ In case histograms are being grouped, the specified channels are interpreted wit
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-30"></span><dl class="docutils" id="msr-data-single-histo">
|
||||
<span id="index-31"></span><dl class="docutils" id="msr-data-single-histo">
|
||||
<dt><strong>data</strong> (fit type 0, 1, 4)</dt>
|
||||
<dd><p class="first">The numbers of the first and the last channel of an interval from which the data is taken are specified here.
|
||||
In case histograms are being grouped, the specified channels are interpreted with respect to the first histogram.
|
||||
@ -1336,7 +1376,7 @@ Typically these channels are referred to as <tt class="docutils literal"><span c
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-31"></span><dl class="docutils" id="msr-data-asymmetry">
|
||||
<span id="index-32"></span><dl class="docutils" id="msr-data-asymmetry">
|
||||
<dt><strong>data</strong> (fit type 2, 3, 5)</dt>
|
||||
<dd><p class="first">The numbers of the first and the last channel of an interval from which the data is taken are specified here.
|
||||
Typically these channels are referred to as first good bin / last good bin (fgb/lgb). For all the histograms this is
|
||||
@ -1347,7 +1387,7 @@ In case histograms are being grouped, the specified channels are interpreted wit
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-32"></span><dl class="docutils" id="msr-t0-single-histo">
|
||||
<span id="index-33"></span><dl class="docutils" id="msr-t0-single-histo">
|
||||
<dt><strong>t0</strong> (fit type 0, 1, 4)</dt>
|
||||
<dd><p class="first">The number of the time-zero channel of the histogram. Example:</p>
|
||||
<div class="last highlight-python"><div class="highlight"><pre><span></span>t0 3419 # t0 channel = 3419
|
||||
@ -1356,7 +1396,7 @@ t0 3419 3434 # t0 channels for groupings: forward f1 f2. 3419 t0 for f1, 3434
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-33"></span><dl class="docutils" id="msr-t0-asymmetry">
|
||||
<span id="index-34"></span><dl class="docutils" id="msr-t0-asymmetry">
|
||||
<dt><strong>t0</strong> (fit type 2, 3, 5)</dt>
|
||||
<dd><p class="first">The numbers of time-zero channels of the histograms in the order <span class="math">\(t_{0,f} t_{0,b}\)</span>. For fit type 5, the time-zero is the channel of the start of beam pulse. Example:</p>
|
||||
<div class="last highlight-python"><div class="highlight"><pre><span></span>t0 3419 3418 # t0 channels: forward (3419), backward (3418)
|
||||
@ -1365,25 +1405,25 @@ t0 3419 3418 3417 3416 # t0 channels (assuming forward f1 f2, backward b1 b2): f
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-34"></span><dl class="docutils" id="msr-addt0-single-histo">
|
||||
<span id="index-35"></span><dl class="docutils" id="msr-addt0-single-histo">
|
||||
<dt><strong>addt0</strong> (fit type 0, 1, 4)</dt>
|
||||
<dd>The number of the time-zero channel of the histogram. If grouping of histograms is present (see <a class="reference internal" href="#msr-forward"><em>forward</em></a>) the
|
||||
same syntax as for <a class="reference internal" href="#msr-t0-single-histo"><em>t0</em></a> applies. If one addt0 is given, the total number of addt0’s needs to be equal to
|
||||
the total number of <a class="reference internal" href="#msr-addrun"><em>ADDRUN</em></a>‘s!</dd>
|
||||
</dl>
|
||||
<span id="index-35"></span><dl class="docutils" id="msr-addt0-asymmetry">
|
||||
<span id="index-36"></span><dl class="docutils" id="msr-addt0-asymmetry">
|
||||
<dt><strong>addt0</strong> (fit type 2, 3, 5)</dt>
|
||||
<dd>The numbers of time-zero channels of the histograms in the order <span class="math">\(t_{0,f} t_{0,b} [t_{0,r} t_{0,l}]\)</span>.
|
||||
If grouping of histograms is present (see <a class="reference internal" href="#msr-forward-backward"><em>forward</em></a>) the same syntax as for <a class="reference internal" href="#msr-t0-asymmetry"><em>t0</em></a> applies.
|
||||
If one addt0 is given, the total number of addt0’s needs to be equal to the total number of <a class="reference internal" href="#msr-addrun"><em>ADDRUN</em></a>‘s!</dd>
|
||||
</dl>
|
||||
<span id="index-36"></span><dl class="docutils" id="msr-xy-data">
|
||||
<span id="index-37"></span><dl class="docutils" id="msr-xy-data">
|
||||
<dt><strong>xy-data</strong> (fit type 8)</dt>
|
||||
<dd>Specification of the data from an ASCII or DB file which should be used as <em>x</em> and <em>y</em> data (in this order).
|
||||
For a simple ASCII file the column numbers are used, in the case of a DB file one can either specify the variable
|
||||
numbers or the name of the variables as given in the DB header.</dd>
|
||||
</dl>
|
||||
<span id="index-37"></span><dl class="docutils" id="msr-fit">
|
||||
<span id="index-38"></span><dl class="docutils" id="msr-fit">
|
||||
<dt><strong>fit</strong></dt>
|
||||
<dd><p class="first">The range of data that should be considered when the fitting is done. For the μSR fit types 0, 1, 2, 3, and 4 the
|
||||
starting and end times are given in micro-seconds. For the non-μSR fit type 8 the starting and end points of the
|
||||
@ -1407,19 +1447,236 @@ An example:</p>
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-38"></span><dl class="docutils" id="msr-packing">
|
||||
<span id="index-39"></span><dl class="docutils" id="msr-packing">
|
||||
<dt><strong>packing</strong></dt>
|
||||
<dd>Number of data channels to be binned together. For the non-μSR fit type 8 the binning is supposed to be 1.
|
||||
For the single histogram RRF fit (fittype 1) and asymmetry RRF fit (fittype 3) this parameter is meaningless.</dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="section" id="the-commands-block">
|
||||
<span id="msr-commands-block"></span><span id="index-39"></span><h3>The COMMANDS Block<a class="headerlink" href="#the-commands-block" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="msr-commands-block"></span><span id="index-40"></span><h3>The COMMANDS Block<a class="headerlink" href="#the-commands-block" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The COMMANDS block is used to specify the commands which are passed from <tt class="docutils literal"><span class="pre">musrfit</span></tt> to <tt class="docutils literal"><span class="pre">MINUIT2</span></tt>. The supported commands
|
||||
after the COMMANDS keyword are <strong>STRATEGY</strong>, <strong>MIGRAD</strong>, <strong>SIMPLEX</strong>, <strong>MINIMIZE</strong>, <strong>MINOS</strong>, <strong>HESSE</strong>, <strong>SAVE</strong>, and some
|
||||
additional commands described below, and for compatibility reasons <strong>SET BATCH</strong> and <strong>END RETURN</strong>. The last two commands may
|
||||
appear in the COMMANDS block but are simply ignored. A detailed description of all of these commands can be found in the
|
||||
<a class="reference external" href="http://seal.web.cern.ch/seal/documents/minuit/mnusersguide.pdf">MINUIT2 users guide</a>.</p>
|
||||
after the <tt class="docutils literal"><span class="pre">COMMANDS</span></tt> keyword are listed in the two tables below (<a class="reference internal" href="#minuit2-command-overview"><em>Minuit2 Command Overview</em></a> and <a class="reference internal" href="#dks-command-overview"><em>DKS Command Overview</em></a>)
|
||||
and further described in <a class="reference internal" href="#musrfit-command-block-details"><em>musrfit Command Block Details</em></a>.</p>
|
||||
<div class="section" id="minuit2-command-overview">
|
||||
<span id="index-41"></span><span id="id21"></span><h4>Minuit2 Command Overview<a class="headerlink" href="#minuit2-command-overview" title="Permalink to this headline">¶</a></h4>
|
||||
<table border="1" class="docutils">
|
||||
<colgroup>
|
||||
<col width="20%" />
|
||||
<col width="37%" />
|
||||
<col width="42%" />
|
||||
</colgroup>
|
||||
<thead valign="bottom">
|
||||
<tr class="row-odd"><th class="head"><strong>Cmd</strong></th>
|
||||
<th class="head">brief description</th>
|
||||
<th class="head">Reference</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<tr class="row-even"><td><strong>STRATEGY</strong></td>
|
||||
<td>0 (low), 1 (default), and 2 (high)</td>
|
||||
<td><a class="footnote-reference" href="#f3" id="id22">[15]</a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>MIGRAD</strong></td>
|
||||
<td>This is the best minimizer for
|
||||
nearly all functions.</td>
|
||||
<td><a class="footnote-reference" href="#f3" id="id23">[15]</a></td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>SIMPLEX</strong></td>
|
||||
<td>This genuine multidimensional
|
||||
minimization routine is usually
|
||||
much slower than MIGRAD.</td>
|
||||
<td><a class="footnote-reference" href="#f3" id="id24">[15]</a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>MINIMIZE</strong></td>
|
||||
<td>This is equivalent to MIGRAD,
|
||||
except that if MIGRAD fails, it
|
||||
reverts to SIMPLEX and then calls
|
||||
MIGRAD again.</td>
|
||||
<td><a class="footnote-reference" href="#f3" id="id25">[15]</a></td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>MINOS</strong></td>
|
||||
<td>Calculate parameter errors taking
|
||||
into account both parameter
|
||||
correlations and non-linearities.</td>
|
||||
<td><a class="footnote-reference" href="#f3" id="id26">[15]</a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>HESSE</strong></td>
|
||||
<td>Calculates an error matrix.</td>
|
||||
<td><a class="footnote-reference" href="#f3" id="id27">[15]</a></td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>SAVE</strong></td>
|
||||
<td>Writes the <tt class="docutils literal"><span class="pre">MINUIT2.OUTPUT</span></tt> and
|
||||
<tt class="docutils literal"><span class="pre">MINUIT2.root</span></tt> files which
|
||||
contained detailed information
|
||||
about the fit, like the
|
||||
<tt class="docutils literal"><span class="pre">COVARIANCE</span> <span class="pre">MATRIX</span></tt>,
|
||||
<tt class="docutils literal"><span class="pre">CORRELATION</span> <span class="pre">COEFFICIENTS</span></tt>, etc.</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>SET BATCH</strong></td>
|
||||
<td>Obsolate. Only present for
|
||||
backward compatibilty.</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>END RETURN</strong></td>
|
||||
<td>Obsolete. Only present for
|
||||
backward compatibility.</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>MAX_LIKELIHOOD</strong></td>
|
||||
<td>If present, use max. log likelihood
|
||||
rather than the default
|
||||
<span class="math">\(\chi^2\)</span>.</td>
|
||||
<td>see <a class="reference internal" href="#musrfit-command-block-details"><em>musrfit Command Block Details</em></a></td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>PRINT_LEVEL</strong></td>
|
||||
<td>Prints more or less messages to the
|
||||
stdout. Allowed values: 0-3</td>
|
||||
<td><a class="footnote-reference" href="#f3" id="id28">[15]</a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>SCAN</strong></td>
|
||||
<td>A command line based option, which
|
||||
allows to scan <span class="math">\(\chi^2\)</span> by
|
||||
vary a single parameter.
|
||||
<tt class="docutils literal"><span class="pre">SCAN</span></tt> needs to be followed by
|
||||
the command <tt class="docutils literal"><span class="pre">MNPLOT</span></tt>.</td>
|
||||
<td><a class="footnote-reference" href="#f3" id="id29">[15]</a></td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>CONTOURS</strong></td>
|
||||
<td>A command line based option. It
|
||||
allows to plot the contour of
|
||||
parX vs parY.
|
||||
<tt class="docutils literal"><span class="pre">CONTOURS</span></tt> needs to be followed
|
||||
by the command <tt class="docutils literal"><span class="pre">MNPLOT</span></tt>.</td>
|
||||
<td><a class="footnote-reference" href="#f3" id="id30">[15]</a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>MNPLOT</strong></td>
|
||||
<td>Helper command for the commands
|
||||
<tt class="docutils literal"><span class="pre">SCAN</span></tt> and <tt class="docutils literal"><span class="pre">CONTOURS</span></tt>.</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>FIX</strong></td>
|
||||
<td>Allows to fix parameters on the
|
||||
command level. It can help to guide
|
||||
a complicated fit (e.g. muonium
|
||||
<span class="math">\(\mu^+\)</span>.</td>
|
||||
<td>see <a class="reference internal" href="#musrfit-command-block-details"><em>musrfit Command Block Details</em></a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>RELEASE</strong></td>
|
||||
<td>Allows to release parameters on the
|
||||
command level which have been fixed
|
||||
before. It can help to guide
|
||||
a complicated fit (e.g. muonium
|
||||
<span class="math">\(\mu^+\)</span>.</td>
|
||||
<td>see <a class="reference internal" href="#musrfit-command-block-details"><em>musrfit Command Block Details</em></a></td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>RESTORE</strong></td>
|
||||
<td>Releases <strong>all</strong> fixed parameters.</td>
|
||||
<td>see <a class="reference internal" href="#musrfit-command-block-details"><em>musrfit Command Block Details</em></a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>FIT_RANGE</strong></td>
|
||||
<td>Allows to change the fit range on
|
||||
the command level. This might be
|
||||
helpful in conjunction with
|
||||
multiple signals in the spectrum.</td>
|
||||
<td>see <a class="reference internal" href="#musrfit-command-block-details"><em>musrfit Command Block Details</em></a></td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>SCALE_N0_BKG</strong></td>
|
||||
<td>For histogram fits only.
|
||||
If set true (default), it will
|
||||
scale <span class="math">\(N_0\)</span> to 1/ns,
|
||||
Otherwise <span class="math">\(N_0\)</span> is given in
|
||||
counts.</td>
|
||||
<td>see <a class="reference internal" href="#musrfit-command-block-details"><em>musrfit Command Block Details</em></a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>SECTOR</strong></td>
|
||||
<td>Allows to output <span class="math">\(\chi^2\)</span> or
|
||||
maxLH values for a sub-range of the
|
||||
fitted time range.
|
||||
Used for statistical analysis only.</td>
|
||||
<td>see <a class="reference internal" href="#musrfit-command-block-details"><em>musrfit Command Block Details</em></a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p class="rubric">Minuit2 Command Notes</p>
|
||||
<table class="docutils footnote" frame="void" id="f3" rules="none">
|
||||
<colgroup><col class="label" /><col /></colgroup>
|
||||
<tbody valign="top">
|
||||
<tr><td class="label">[15]</td><td><em>(<a class="fn-backref" href="#id22">1</a>, <a class="fn-backref" href="#id23">2</a>, <a class="fn-backref" href="#id24">3</a>, <a class="fn-backref" href="#id25">4</a>, <a class="fn-backref" href="#id26">5</a>, <a class="fn-backref" href="#id27">6</a>, <a class="fn-backref" href="#id28">7</a>, <a class="fn-backref" href="#id29">8</a>, <a class="fn-backref" href="#id30">9</a>)</em> see <a class="reference external" href="https://root.cern.ch/root/htmldoc/guides/minuit2/Minuit2.html">MINUIT2 users guide</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="section" id="dks-command-overview">
|
||||
<span id="index-42"></span><span id="id31"></span><h4>DKS Command Overview<a class="headerlink" href="#dks-command-overview" title="Permalink to this headline">¶</a></h4>
|
||||
<table border="1" class="docutils">
|
||||
<colgroup>
|
||||
<col width="28%" />
|
||||
<col width="53%" />
|
||||
<col width="19%" />
|
||||
</colgroup>
|
||||
<thead valign="bottom">
|
||||
<tr class="row-odd"><th class="head"><strong>DKS Extension</strong></th>
|
||||
<th class="head">brief description</th>
|
||||
<th class="head">Reference</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<tr class="row-even"><td><strong>OpenMP</strong></td>
|
||||
<td>Invoke OpenMP if allowed by the OS.
|
||||
Currently macOS does <em>not</em> support
|
||||
OpenMP out of the box. All Linux
|
||||
flavours do so.</td>
|
||||
<td><a class="footnote-reference" href="#f4" id="id32">[16]</a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>CUDA</strong></td>
|
||||
<td>For properly setup Nvidia graphic
|
||||
cards (e.g. Tesla K40c).
|
||||
Allows to off-load the minimization
|
||||
to the GPU. Speedups of up to 50
|
||||
are possible!</td>
|
||||
<td><a class="footnote-reference" href="#f5" id="id33">[17]</a></td>
|
||||
</tr>
|
||||
<tr class="row-even"><td><strong>OpenCL-CPU</strong></td>
|
||||
<td>Invoke OpenCL on the CPU if the
|
||||
OS supports it. This might be useful
|
||||
for macOS.</td>
|
||||
<td><a class="footnote-reference" href="#f6" id="id34">[18]</a></td>
|
||||
</tr>
|
||||
<tr class="row-odd"><td><strong>OpenCL-GPU</strong></td>
|
||||
<td>Invoke OpenCL on the GPU if the
|
||||
OS supports it. This might be useful
|
||||
for macOS and for systems having a
|
||||
powerful AMD graphics card in place.</td>
|
||||
<td><a class="footnote-reference" href="#f6" id="id35">[18]</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p class="rubric">DKS Command Notes</p>
|
||||
<table class="docutils footnote" frame="void" id="f4" rules="none">
|
||||
<colgroup><col class="label" /><col /></colgroup>
|
||||
<tbody valign="top">
|
||||
<tr><td class="label"><a class="fn-backref" href="#id32">[16]</a></td><td>Standard <tt class="docutils literal"><span class="pre">musrfit</span></tt> as well as DKS support <a class="reference external" href="https://www.openmp.org/">OpenMP</a>.
|
||||
It allows to use all your threads of your CPU(s) during the minimization.</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="docutils footnote" frame="void" id="f5" rules="none">
|
||||
<colgroup><col class="label" /><col /></colgroup>
|
||||
<tbody valign="top">
|
||||
<tr><td class="label"><a class="fn-backref" href="#id33">[17]</a></td><td>This is only supported for the <tt class="docutils literal"><span class="pre">DKS</span></tt> version of <tt class="docutils literal"><span class="pre">musrfit</span></tt>. For details about
|
||||
<tt class="docutils literal"><span class="pre">CUDA</span></tt> see <a class="reference external" href="https://developer.nvidia.com/cuda-zone">NVIDIA</a>.</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="docutils footnote" frame="void" id="f6" rules="none">
|
||||
<colgroup><col class="label" /><col /></colgroup>
|
||||
<tbody valign="top">
|
||||
<tr><td class="label">[18]</td><td><em>(<a class="fn-backref" href="#id34">1</a>, <a class="fn-backref" href="#id35">2</a>)</em> This is only supported for the <tt class="docutils literal"><span class="pre">DKS</span></tt> version of <tt class="docutils literal"><span class="pre">musrfit</span></tt>. For details about
|
||||
<tt class="docutils literal"><span class="pre">OpenCL</span></tt> see <a class="reference external" href="https://www.khronos.org/opencl/">the Khronos Group</a>.</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="section" id="musrfit-command-block-details">
|
||||
<span id="index-43"></span><span id="id36"></span><h4><tt class="docutils literal"><span class="pre">musrfit</span></tt> Command Block Details<a class="headerlink" href="#musrfit-command-block-details" title="Permalink to this headline">¶</a></h4>
|
||||
<p>A standard COMMANDS block then looks like this:</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">COMMANDS</span>
|
||||
<span class="n">MINIMIZE</span>
|
||||
@ -1489,7 +1746,7 @@ MINOS
|
||||
SAVE
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The last accepted command in the COMMAND block is <strong>SCALE_N0_BKG TRUE | FALSE</strong>. This command is only used in conjunction with single-histogram fits.
|
||||
<p>The command <strong>SCALE_N0_BKG TRUE | FALSE</strong> is only used in conjunction with single-histogram fits.
|
||||
The default is <strong>SCALE_N0_BKG TRUE</strong> which will result in a scaling of <em>N(t)</em> such that it is given in ns<sup>-1</sup>, whereas with <strong>SCALE_N0_BKG FALSE</strong>
|
||||
<em>no scaling</em> is performed and <em>N(t)</em> will be given in bin<sup>-1</sup>. If the command is not present at all, it will be interpreted as if <strong>SCALE_N0_BKG TRUE</strong> was present.</p>
|
||||
<p>For “debug” purposes it is possible to force MINUIT2 to print out additional information. The COMMAND block command is <strong>PRINT_LEVEL <n></strong>,
|
||||
@ -1504,8 +1761,19 @@ SAVE
|
||||
</div>
|
||||
<p>Here the MINOS command will print out lot of additional information to the standard output. Notice there are 2 SAVE commands here. This will write the result of
|
||||
MIGRAD to the MINUIT2.OUTPUT file and at the end append the MINOS results to this file.</p>
|
||||
<p>The command <strong>SECTOR <list-of-sector-times></strong>, where <tt class="docutils literal"><span class="pre"><list-of-sector-times></span></tt> is a list of time values (space or comma separated) which have to range between the fit-start-time and the fit-end-time, allows to report <span class="math">\(\chi^2\)</span> and maxLH values for sub-intervals of the given fit-range. Its only purpose is for a statistical analysis of complicated fits. The results will be written to the <tt class="docutils literal"><span class="pre">MINUIT2.OUTPUT</span></tt> file.</p>
|
||||
<p>An example might look like this (assuming a fit-range from 0.005 to 10 us):</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>COMMANDS
|
||||
MINIMIZE
|
||||
MINOS
|
||||
SECTOR 5.0, 7.5, 9.0
|
||||
SAVE
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><em>Note:</em> If a fit is invoked, the sector command results will only be written to file, if the fit <em>has converged</em>!</p>
|
||||
</div>
|
||||
<div class="section" id="dks-extensions-of-the-commands-block-enabling-gpu-and-general-opencl-support">
|
||||
<span id="msr-commands-block-dks"></span><span id="index-40"></span><h4>DKS extensions of the COMMANDS block enabling GPU and general OpenCL support<a class="headerlink" href="#dks-extensions-of-the-commands-block-enabling-gpu-and-general-opencl-support" title="Permalink to this headline">¶</a></h4>
|
||||
<span id="msr-commands-block-dks"></span><span id="index-44"></span><h4>DKS extensions of the COMMANDS block enabling GPU and general OpenCL support<a class="headerlink" href="#dks-extensions-of-the-commands-block-enabling-gpu-and-general-opencl-support" title="Permalink to this headline">¶</a></h4>
|
||||
<p>In case you are running the musrfit / DKS version, there are a couple commands which allow you to control the way how the fit shall be performed. These commands are:</p>
|
||||
<table border="1" class="docutils">
|
||||
<colgroup>
|
||||
@ -1538,27 +1806,27 @@ In the <a class="reference internal" href="#msr-theory-block"><em>THEORY table</
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="the-fourier-block">
|
||||
<span id="msr-fourier-block"></span><span id="index-41"></span><h3>The FOURIER Block<a class="headerlink" href="#the-fourier-block" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="msr-fourier-block"></span><span id="index-45"></span><h3>The FOURIER Block<a class="headerlink" href="#the-fourier-block" title="Permalink to this headline">¶</a></h3>
|
||||
<p>If a Fourier transform is carried out the results are plotted within <tt class="docutils literal"><span class="pre">musrview</span></tt>. As input data the actual data <em>shown</em> in <tt class="docutils literal"><span class="pre">musrview</span></tt> is used,
|
||||
<em>i.e.</em> the currently time range shown in <tt class="docutils literal"><span class="pre">musrview</span></tt>! In the FOURIER block of the msr file all necessary parameters for calculating and presenting
|
||||
the Fourier transform of the data specified in the <a class="reference internal" href="#msr-plot-block"><em>PLOT block</em></a> is given. If the FOURIER block is not present in the msr file,
|
||||
either the parameters set in the <a class="reference internal" href="#musrfit-startup"><em>XML startup</em></a> file or the system defaults are taken when the Fourier transform is performed.
|
||||
The block starts with the <em>FOURIER</em> keyword and may contain the following entries on the successive lines:</p>
|
||||
<span id="index-42"></span><dl class="docutils" id="msr-fourier-block-units">
|
||||
<span id="index-46"></span><dl class="docutils" id="msr-fourier-block-units">
|
||||
<dt><strong>units</strong></dt>
|
||||
<dd>Here is specified in which domain the Fourier-transformed data is presented. One may choose between the fields (<em>Gauss</em>) or (<em>Tesla</em>), the frequency (<em>MHz</em>), and the angular-frequency domain (<em>Mc/s</em>).</dd>
|
||||
</dl>
|
||||
<span id="index-43"></span><dl class="docutils" id="msr-fourier-block-fourier-power">
|
||||
<span id="index-47"></span><dl class="docutils" id="msr-fourier-block-fourier-power">
|
||||
<dt><strong>fourier_power</strong></dt>
|
||||
<dd>It is possible (but not necessary) to set the number of data points used for the Fourier transform here. As argument the exponent <em>n<21</em> of a power of 2 is accepted.
|
||||
The number of data points is then 2<sup>n</sup>. <strong>Attention:</strong> If the number of points given here is bigger than the actual number of available data points,
|
||||
the input data vector is filled with zeros until the number of requested points is reached (<em>zero padding</em>)!</dd>
|
||||
</dl>
|
||||
<span id="index-44"></span><dl class="docutils" id="msr-fourier-block-dc-corrected">
|
||||
<span id="index-48"></span><dl class="docutils" id="msr-fourier-block-dc-corrected">
|
||||
<dt><strong>dc-corrected</strong></dt>
|
||||
<dd>a flag to remove a potential DC-offset of the signal. Allowed entries are <tt class="docutils literal"><span class="pre">dc-corrected</span> <span class="pre">true</span> <span class="pre">|</span> <span class="pre">1</span> <span class="pre">|</span> <span class="pre">false</span> <span class="pre">|</span> <span class="pre">0</span></tt>.</dd>
|
||||
</dl>
|
||||
<span id="index-45"></span><dl class="docutils" id="msr-fourier-block-apodization">
|
||||
<span id="index-49"></span><dl class="docutils" id="msr-fourier-block-apodization">
|
||||
<dt><strong>apodization</strong></dt>
|
||||
<dd><p class="first">Here is decided if the data should be apodized before the Fourier transform is performed and if yes, which apodization should be used (for further details about apodization of
|
||||
μSR data refer to the <a class="reference external" href="https://open.library.ubc.ca/cIRcle/collections/ubctheses/831/items/1.0085550">PhD thesis of T.M. Riseman (UBC)</a>). The argument to be put after the
|
||||
@ -1576,7 +1844,7 @@ keyword is therefore one of the following: <strong>NONE, WEAK, MEDIUM</strong> o
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-46"></span><dl class="docutils" id="msr-fourier-block-plot">
|
||||
<span id="index-50"></span><dl class="docutils" id="msr-fourier-block-plot">
|
||||
<dt><strong>plot</strong></dt>
|
||||
<dd><p class="first">At this point it is possible to set the part of the Fourier-transformed data which should be plotted by default if the Fourier transform is done by pressing the <em>f</em>-key in <tt class="docutils literal"><span class="pre">musrview</span></tt>.
|
||||
The argument may be one of the following:</p>
|
||||
@ -1594,7 +1862,7 @@ The argument may be one of the following:</p>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-47"></span><dl class="docutils" id="msr-fourier-block-phase">
|
||||
<span id="index-51"></span><dl class="docutils" id="msr-fourier-block-phase">
|
||||
<dt><strong>phase</strong></dt>
|
||||
<dd><p class="first">If a real Fourier shall be plotted, it is necessary to adopt the phases of the different detectors. The number of potentially provided phases can be either <strong>one</strong>, which means that this phase will be applied to <em>all</em> Fourier spectra,
|
||||
or the number of phases have to correspond to the number of runs in the plot block.</p>
|
||||
@ -1647,12 +1915,12 @@ list example, the first parameter number will be the reference phase. The compac
|
||||
</ol>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-48"></span><dl class="docutils" id="msr-fourier-block-range-for-phase-correction">
|
||||
<span id="index-52"></span><dl class="docutils" id="msr-fourier-block-range-for-phase-correction">
|
||||
<dt><strong>range_for_phase_correction</strong></dt>
|
||||
<dd>An interval in Fourier space given in units as define with the ‘units’ tag, or the tag ‘all’ in which case the range given under ‘range’ will be used.
|
||||
The given interval will be used for an automatic phasing of the real Fourier transform. This will allow to add real Fourier spectra coherently.</dd>
|
||||
</dl>
|
||||
<span id="index-49"></span><dl class="docutils" id="msr-fourier-block-range">
|
||||
<span id="index-53"></span><dl class="docutils" id="msr-fourier-block-range">
|
||||
<dt><strong>range</strong></dt>
|
||||
<dd>The plotting range is set here. The interval is specified through its start and end points given in the <em>units</em> set after the <strong>units</strong> tag.</dd>
|
||||
</dl>
|
||||
@ -1668,20 +1936,20 @@ range 0.0 17.03
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="the-plot-block">
|
||||
<span id="msr-plot-block"></span><span id="index-50"></span><h3>The PLOT Block<a class="headerlink" href="#the-plot-block" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="msr-plot-block"></span><span id="index-54"></span><h3>The PLOT Block<a class="headerlink" href="#the-plot-block" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The PLOT block is intended to collect all the information needed for the graphical presentation of the data and fits using <tt class="docutils literal"><span class="pre">musrview</span></tt>.
|
||||
The PLOT keyword at the beginning of the block is followed by a number which indicates the plot type. The plot types have to match the <a class="reference internal" href="#fit-types"><em>fit types</em></a>.
|
||||
Additionally, it is possible to provide information using the following keywords:</p>
|
||||
<span id="index-51"></span><dl class="docutils" id="msr-plot-block-lifetimecorrection">
|
||||
<span id="index-55"></span><dl class="docutils" id="msr-plot-block-lifetimecorrection">
|
||||
<dt><strong>lifetimecorrection</strong></dt>
|
||||
<dd>Does not accept any arguments. If present, the output in <tt class="docutils literal"><span class="pre">musrview</span></tt> is corrected for the exponential decay of the muon. Only relevant for (type 0).</dd>
|
||||
</dl>
|
||||
<span id="index-52"></span><dl class="docutils" id="msr-plot-block-runs">
|
||||
<span id="index-56"></span><dl class="docutils" id="msr-plot-block-runs">
|
||||
<dt><strong>runs</strong></dt>
|
||||
<dd>The numbers of the runs to be plotted have to be put here. The runs are numbered according to their appearance in the <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a>.
|
||||
The numbers is either a space separated list of numbers, an interval <em>e.g.</em> 1-16, or a combination of both.</dd>
|
||||
</dl>
|
||||
<span id="index-53"></span><dl class="docutils" id="msr-plot-block-range">
|
||||
<span id="index-57"></span><dl class="docutils" id="msr-plot-block-range">
|
||||
<dt><strong>range</strong></dt>
|
||||
<dd><p class="first">Here it is possible to define the plotting range explicitly. Depending on the plot type the following settings are allowed where the times are given in
|
||||
micro-seconds and the <em>N</em> in counts (types 0-4) or in counts/nsec (type 0, 1):</p>
|
||||
@ -1695,7 +1963,7 @@ micro-seconds and the <em>N</em> in counts (types 0-4) or in counts/nsec (type 0
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-54"></span><dl class="docutils" id="msr-plot-block-sub-ranges">
|
||||
<span id="index-58"></span><dl class="docutils" id="msr-plot-block-sub-ranges">
|
||||
<dt><strong>sub_ranges</strong></dt>
|
||||
<dd><p class="first">Here it is possible to define the plotting range for each run individually. For the different plot types the command has the structure:</p>
|
||||
<dl class="last docutils">
|
||||
@ -1708,31 +1976,31 @@ micro-seconds and the <em>N</em> in counts (types 0-4) or in counts/nsec (type 0
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
<span id="index-55"></span><dl class="docutils" id="msr-plot-block-use-fit-ranges">
|
||||
<span id="index-59"></span><dl class="docutils" id="msr-plot-block-use-fit-ranges">
|
||||
<dt><strong>use_fit_ranges</strong> [ <em>y</em><sub>min</sub> <em>y</em><sub>max</sub> ]</dt>
|
||||
<dd>The fit ranges of the individual runs are used to present the data. Optionally, an ordinate range can be provided.</dd>
|
||||
</dl>
|
||||
<span id="index-56"></span><dl class="docutils" id="msr-plot-block-view-packing">
|
||||
<span id="index-60"></span><dl class="docutils" id="msr-plot-block-view-packing">
|
||||
<dt><strong>view_packing</strong></dt>
|
||||
<dd>The data are presented in the packing given here rather than the binning used for the fit. <strong>WARNING:</strong> This is a global option and applies to all PLOT-blocks.</dd>
|
||||
</dl>
|
||||
<span id="index-57"></span><dl class="docutils" id="msr-plot-block-logx">
|
||||
<span id="index-61"></span><dl class="docutils" id="msr-plot-block-logx">
|
||||
<dt><strong>logx</strong></dt>
|
||||
<dd>Will present the time axis in a logarithmic scale. <em>So far no checking of negative and zero-valued data is performed, hence expect interesting output!</em></dd>
|
||||
</dl>
|
||||
<span id="index-58"></span><dl class="docutils" id="msr-plot-block-logy">
|
||||
<span id="index-62"></span><dl class="docutils" id="msr-plot-block-logy">
|
||||
<dt><strong>logy</strong></dt>
|
||||
<dd>Will present the axis of ordinates in a logarithmic scale. <em>So far no checking of negative and zero-valued data is performed, hence expect interesting output!</em></dd>
|
||||
</dl>
|
||||
<span id="index-59"></span><dl class="docutils" id="msr-plot-block-rrf-packing">
|
||||
<span id="index-63"></span><dl class="docutils" id="msr-plot-block-rrf-packing">
|
||||
<dt><strong>rrf_packing</strong> value</dt>
|
||||
<dd>In the rotating-reference-frame (RRF) representation, this will be the value for the packing. <strong>WARNING:</strong> For the time being, this is a global option and applies to all PLOT blocks.</dd>
|
||||
</dl>
|
||||
<span id="index-60"></span><dl class="docutils" id="msr-plot-block-rrf-freq">
|
||||
<span id="index-64"></span><dl class="docutils" id="msr-plot-block-rrf-freq">
|
||||
<dt><strong>rrf_freq</strong> value unit</dt>
|
||||
<dd>This entry provides the RRF “frequency” given by the value and the unit which can be: <em>kHz</em>, <em>MHz</em>, <em>Mc/s</em>, <em>G</em>, or <em>T</em>.</dd>
|
||||
</dl>
|
||||
<span id="index-61"></span><dl class="docutils" id="msr-plot-block-rrf-phase">
|
||||
<span id="index-65"></span><dl class="docutils" id="msr-plot-block-rrf-phase">
|
||||
<dt><strong>rrf_phase</strong> value</dt>
|
||||
<dd>A phase of the RRF can be provided, either as a value in degrees, or as a parX, <em>e.g.</em> par4, where ‘X’ is supposed to be the phase parameter number in the <a class="reference internal" href="#msr-fitparameter-block"><em>FITPARAMETER block</em></a>.</dd>
|
||||
<dt><strong>Notes:</strong></dt>
|
||||
@ -1767,7 +2035,7 @@ rrf_packing 75
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="the-statistic-block">
|
||||
<span id="msr-statistic-block"></span><span id="index-62"></span><h3>The STATISTIC Block<a class="headerlink" href="#the-statistic-block" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="msr-statistic-block"></span><span id="index-66"></span><h3>The STATISTIC Block<a class="headerlink" href="#the-statistic-block" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The STATISTIC block is the last block of a msr file. It contains some information on the fit: the date and time as well as
|
||||
the absolute and normalized values of <span class="math">\(\chi^2\)</span> and the number of degrees of freedom in the fit.
|
||||
If enabled in the <a class="reference internal" href="#musrfit-startup"><em>XML file</em></a> for <span class="math">\(\chi^2\)</span>-single-histogram fits also <a class="reference external" href="http://en.wikipedia.org/wiki/Pearson's_chi-square_test">Pearson’s</a>
|
||||
@ -1776,9 +2044,9 @@ If enabled in the <a class="reference internal" href="#musrfit-startup"><em>XML
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="fit-types">
|
||||
<span id="index-63"></span><span id="id21"></span><h2>Fit Types<a class="headerlink" href="#fit-types" title="Permalink to this headline">¶</a></h2>
|
||||
<span id="index-67"></span><span id="id37"></span><h2>Fit Types<a class="headerlink" href="#fit-types" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="section" id="single-histogram-fit-fit-type-0">
|
||||
<span id="single-histogram-fit"></span><span id="index-64"></span><h3>Single Histogram Fit (fit type 0)<a class="headerlink" href="#single-histogram-fit-fit-type-0" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="single-histogram-fit"></span><span id="index-68"></span><h3>Single Histogram Fit (fit type 0)<a class="headerlink" href="#single-histogram-fit-fit-type-0" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The single-histogram fit (fit type 0) is used to fit a function directly to the raw data using</p>
|
||||
<div class="math">
|
||||
\[N(t) = N_0 e^{-t/\tau_\mu} [ 1 + A(t) ] + N_{\rm bkg}\]</div>
|
||||
@ -1799,7 +2067,7 @@ If the option lifetimecorrection is <em>set</em> in the PLOT block the asymmetry
|
||||
\[A(t) = \frac{N(t) - N_{\rm bkg}}{N_0} e^{+t/\tau_\mu} - 1\]</div>
|
||||
</div>
|
||||
<div class="section" id="single-histogram-rrf-fit-fit-type-1">
|
||||
<span id="single-histogram-rrf-fit"></span><span id="index-65"></span><h3>Single Histogram RRF Fit (fit type 1)<a class="headerlink" href="#single-histogram-rrf-fit-fit-type-1" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="single-histogram-rrf-fit"></span><span id="index-69"></span><h3>Single Histogram RRF Fit (fit type 1)<a class="headerlink" href="#single-histogram-rrf-fit-fit-type-1" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The single-histogram RRF fit (fit type 1) is used to fit the rotating reference frame asymmetry <span class="math">\(A_{\rm rrf}(t)\)</span> extracted from the raw data.
|
||||
The currently implemented version will fail at low fields/frequencies (for about < 1 Tesla). The same is true, if multiple frequencies with large
|
||||
enough separation are present, <em>e.g.</em> when dealing with muonium. <span class="math">\(A_{\rm rrf}(t)\)</span> is estimated the following way (for more details see the
|
||||
@ -1823,7 +2091,7 @@ of the <span class="math">\(N_0\)</span> estimate, line shape distortion due to
|
||||
For more details see the rrf-memo found in the source code under <musrfit>/doc/memo/rrf/rrf-notes.pdf or <a class="reference external" href="http://dx.doi.org/10.7566/JPSCP.21.011051">Musrfit–Real Time Parameter Fitting Using GPUs</a></p>
|
||||
</div>
|
||||
<div class="section" id="asymmetry-fit-fit-type-2">
|
||||
<span id="asymmetry-fit"></span><span id="index-66"></span><h3>Asymmetry Fit (fit type 2)<a class="headerlink" href="#asymmetry-fit-fit-type-2" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="asymmetry-fit"></span><span id="index-70"></span><h3>Asymmetry Fit (fit type 2)<a class="headerlink" href="#asymmetry-fit-fit-type-2" title="Permalink to this headline">¶</a></h3>
|
||||
<p>For an asymmetry fit (fit type 2) two histograms are needed. These are given by the <a class="reference internal" href="#msr-forward-backward"><em>forward</em></a> and <a class="reference internal" href="#msr-forward-backward"><em>backward</em></a> keywords
|
||||
in the <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a>. Additionally, the parameters <a class="reference internal" href="#msr-alpha-beta"><em>alpha</em></a> and <a class="reference internal" href="#msr-alpha-beta"><em>beta</em></a> which relate the detector
|
||||
efficiencies, solid angles and initial asymmetries of the two detectors can be supplied. The constant background for the two histograms is either given by
|
||||
@ -1857,13 +2125,13 @@ efficiencies, solid angles and initial asymmetries of the two detectors can be s
|
||||
<p>and plotted together with the function given in the THEORY block.</p>
|
||||
</div>
|
||||
<div class="section" id="asymmetry-rrf-fit-fit-type-3">
|
||||
<span id="asymmetry-rrf-fit"></span><span id="index-67"></span><h3>Asymmetry RRF Fit (fit type 3)<a class="headerlink" href="#asymmetry-rrf-fit-fit-type-3" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="asymmetry-rrf-fit"></span><span id="index-71"></span><h3>Asymmetry RRF Fit (fit type 3)<a class="headerlink" href="#asymmetry-rrf-fit-fit-type-3" title="Permalink to this headline">¶</a></h3>
|
||||
<p>For asymmetry RRF Fit (fit type 3) two histograms are needed. In a first step, the unbinned asymmetry is formed as described for the asymmetry fit.
|
||||
Afterwards the RRF transformation is carried out, <em>i.e.</em> point 4. and 5. as sketched in the single histogramm RRF fit. The same reservations as for
|
||||
the single histogram RRF fit apply: <strong>if you not urgently need it: do not use it! There are better ways to deal with the analysis of high frequency data!</strong></p>
|
||||
</div>
|
||||
<div class="section" id="negative-muon-mgrsr-fit-fit-type-4">
|
||||
<span id="negative-muon-musr-fit"></span><span id="index-68"></span><h3>Negative Muon μSR Fit (fit type 4)<a class="headerlink" href="#negative-muon-mgrsr-fit-fit-type-4" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="negative-muon-musr-fit"></span><span id="index-72"></span><h3>Negative Muon μSR Fit (fit type 4)<a class="headerlink" href="#negative-muon-mgrsr-fit-fit-type-4" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The negative muon μSR fit (fit type 4) is used for single histogram fits of MuMinus, <em>i.e.</em></p>
|
||||
<div class="math">
|
||||
\[N(t) = \sum_i N_i\,\mathrm{e}^{-t/\tau_i} \left[ 1 + A_i(t)\right] + N_{\rm bkg}(t)\]</div>
|
||||
@ -1879,7 +2147,7 @@ the single histogram RRF fit apply: <strong>if you not urgently need it: do not
|
||||
<p>Since MuMinus is quite generic, the full functional depends has to be written in the <a class="reference internal" href="#msr-theory-block"><em>THEORY Block</em></a>.</p>
|
||||
</div>
|
||||
<div class="section" id="beta-nmr-asymmetry-fit-fit-type-5">
|
||||
<span id="bnmr-asymmetry-fit"></span><span id="index-69"></span><h3>beta-NMR Asymmetry Fit (fit type 5)<a class="headerlink" href="#beta-nmr-asymmetry-fit-fit-type-5" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="bnmr-asymmetry-fit"></span><span id="index-73"></span><h3>beta-NMR Asymmetry Fit (fit type 5)<a class="headerlink" href="#beta-nmr-asymmetry-fit-fit-type-5" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Four histograms are needed for a beta-NMR asymmetry fit (fit type 5), two for positive helecity and two for negative. These are given by the <a class="reference internal" href="#msr-forward-backward"><em>forward</em></a> and <a class="reference internal" href="#msr-forward-backward"><em>backward</em></a> keywords
|
||||
in the <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a>. Additionally, the parameters <a class="reference internal" href="#msr-alpha-beta"><em>alpha</em></a> and <a class="reference internal" href="#msr-alpha-beta"><em>beta</em></a> which relate the detector
|
||||
efficiencies, solid angles and initial asymmetries of the two detectors can be supplied. The constant background for the two histograms is either given by
|
||||
@ -1919,7 +2187,7 @@ efficiencies, solid angles and initial asymmetries of the two detectors can be s
|
||||
<p>and plotted together with the function given in the THEORY block.</p>
|
||||
</div>
|
||||
<div class="section" id="non-mgrsr-fit-fit-type-8">
|
||||
<span id="non-musr-fit"></span><span id="index-70"></span><h3>Non-μSR Fit (fit type 8)<a class="headerlink" href="#non-mgrsr-fit-fit-type-8" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="non-musr-fit"></span><span id="index-74"></span><h3>Non-μSR Fit (fit type 8)<a class="headerlink" href="#non-mgrsr-fit-fit-type-8" title="Permalink to this headline">¶</a></h3>
|
||||
<p>In the case of a non-μSR fit (fit type 8) the fitting function is</p>
|
||||
<div class="math">
|
||||
\[y = f(x),\]</div>
|
||||
@ -1927,8 +2195,8 @@ efficiencies, solid angles and initial asymmetries of the two detectors can be s
|
||||
<p>The same applies for the plot with plot type 8.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="id22">
|
||||
<span id="index-71"></span><span id="id23"></span><h2>User Functions<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="section" id="id38">
|
||||
<span id="index-75"></span><span id="id39"></span><h2>User Functions<a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h2>
|
||||
<p><tt class="docutils literal"><span class="pre">musrfit</span></tt> offers the possibility to plug-in user-defined functions implemented in <tt class="docutils literal"><span class="pre">C++</span></tt> classes to the fitting and plotting routines.
|
||||
In order to do so, basically two things are needed:</p>
|
||||
<blockquote>
|
||||
@ -1946,7 +2214,7 @@ In order to do so, basically two things are needed:</p>
|
||||
</div></blockquote>
|
||||
<p>Since the first is simpler this will be explained using an explicit example, before it is discussed why the second option is needed and how it can be used.</p>
|
||||
<div class="section" id="user-function-without-global-user-function-object-access">
|
||||
<span id="user-functions-without-global-part"></span><span id="index-72"></span><h3>User Function without global user-function-object access<a class="headerlink" href="#user-function-without-global-user-function-object-access" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="user-functions-without-global-part"></span><span id="index-76"></span><h3>User Function without global user-function-object access<a class="headerlink" href="#user-function-without-global-user-function-object-access" title="Permalink to this headline">¶</a></h3>
|
||||
<p>In the following it is explained in detail how the implementation of a user function is done using the simple example of <span class="math">\(f_a(x) = \sin(a x)/(a x)\)</span>,
|
||||
where the parameter <span class="math">\(a\)</span> should be determined by the fit. Although not necessary for this simple example, the source code is split into two parts,
|
||||
namely a header file <tt class="docutils literal"><span class="pre">TMyFunction.h</span></tt> containing the class declaration and a second file <tt class="docutils literal"><span class="pre">TMyFunction.cpp</span></tt> including the function implementation
|
||||
@ -2049,7 +2317,7 @@ refer to the <a class="reference external" href="https://root.cern.ch/interactin
|
||||
<p>Finally, please be aware of the <a class="reference internal" href="#user-function-important"><em>remark</em></a> at the end of this section.</p>
|
||||
</div>
|
||||
<div class="section" id="user-function-with-global-user-function-object-access">
|
||||
<span id="user-functions-with-global-part"></span><span id="index-73"></span><h3>User Function with global user-function-object access<a class="headerlink" href="#user-function-with-global-user-function-object-access" title="Permalink to this headline">¶</a></h3>
|
||||
<span id="user-functions-with-global-part"></span><span id="index-77"></span><h3>User Function with global user-function-object access<a class="headerlink" href="#user-function-with-global-user-function-object-access" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Before explaining how to use global objects within user functions, it will be shortly explained where is the problem and why this might be a sensible approach.
|
||||
In <tt class="docutils literal"><span class="pre">musrfit</span></tt> each <a class="reference internal" href="#msr-run-block"><em>RUN block</em></a> (histogram, asymmetry, ...) is owning its own theory-function tree. An example is shown in the figure below.
|
||||
The bluish nodes are default musrfit functions, whereas the red nodes represent user functions (here labeled by <tt class="docutils literal"><span class="pre">uF1</span></tt> and <tt class="docutils literal"><span class="pre">uF2</span></tt>). Without global user-function
|
||||
@ -2189,7 +2457,7 @@ In case this cannot be ensured, the parallelization can be disabled by <em>̵
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="technical-description-of-the-musrfit-framework">
|
||||
<span id="technical-musrfit"></span><span id="index-74"></span><h2>Technical Description of the musrfit framework<a class="headerlink" href="#technical-description-of-the-musrfit-framework" title="Permalink to this headline">¶</a></h2>
|
||||
<span id="technical-musrfit"></span><span id="index-78"></span><h2>Technical Description of the musrfit framework<a class="headerlink" href="#technical-description-of-the-musrfit-framework" title="Permalink to this headline">¶</a></h2>
|
||||
<p>A technical description of the musrfit framework can be found on its own <a class="reference external" href="http://lmu.web.psi.ch/musrfit/technical/index.html">docu</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -2239,7 +2507,7 @@ In case this cannot be ensured, the parallelization can be disabled by <em>̵
|
||||
<li><a class="reference internal" href="#non-mgrsr-fit-fit-type-8">Non-μSR Fit (fit type 8)</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#id22">User Functions</a><ul>
|
||||
<li><a class="reference internal" href="#id38">User Functions</a><ul>
|
||||
<li><a class="reference internal" href="#user-function-without-global-user-function-object-access">User Function without global user-function-object access</a></li>
|
||||
<li><a class="reference internal" href="#user-function-with-global-user-function-object-access">User Function with global user-function-object access</a></li>
|
||||
</ul>
|
||||
@ -2289,12 +2557,12 @@ In case this cannot be ensured, the parallelization can be disabled by <em>̵
|
||||
<li class="right" >
|
||||
<a href="tutorial.html" title="Tutorial for musrfit"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">musrfit 1.5.1 documentation</a> »</li>
|
||||
<li><a href="index.html">musrfit 1.6.4 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2019, Andreas Suter.
|
||||
Last updated on Jul 24, 2019.
|
||||
© Copyright 2020, Andreas Suter.
|
||||
Last updated on Aug 29, 2020.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
|
||||
</div>
|
||||
</body>
|
||||
|
2282
doc/mupp_dox.cfg
Normal file
2280
doc/musredit_dox.cfg
Normal file
@ -49,10 +49,12 @@ under Linux, Mac OS X, and (with some more work) under Windows. The musrfit fram
|
||||
- **msr2msr**: old WKM like msr-files can be transformed into musrfit style msr-files with this little program.
|
||||
- musrgui (obsolete): an editor to handle msr-files, calling musrfit, etc. from within the editor, based on Qt3.x.
|
||||
Only bug fixing will be done on this version, and if you have >= Qt4.6 available you should use musredit instead.
|
||||
- **musredit**: an editor to handle msr-files, calling musrfit, etc. from within a simple text editor, based on >= Qt4.6.
|
||||
- **musredit**: an editor to handle msr-files, calling musrfit, etc. from within a simple text editor, based on >= Qt4.6. A technical documentation of musredit can be found
|
||||
\htmlonly <a href="./musredit/html/index.html">here.</a>\endhtmlonly
|
||||
- **musrWiz** (beta): allows to create an initial msr-file by a step-by-step instruction wizard.
|
||||
- **musrStep**: allows to efficiently deal with initial step values of msr-files. Especially useful for msr-files dealing with many runs/detectors.
|
||||
- **mupp**: is the muSR parameter plotter. It allows to plot values in db- or dat-files (collections).
|
||||
- **mupp**: is the muSR parameter plotter. It allows to plot values in db- or dat-files (collections). A technical documentation of mupp can be found
|
||||
\htmlonly <a href="./mupp/html/index.html">here.</a>\endhtmlonly
|
||||
- **MuSRFit**: a graphical user interface based on PerlQt (written by Z. Salman) for an easy to use interface to the musrfit framework.
|
||||
Compared to the more general approach of writing msr-files, it has some limitations, though it might be easier for a first user of the musrfit framework.
|
||||
- **any2many**: should be a "universal" muSR data-file-format converter.
|
||||
|
3667
doc/musrfit_dox.cfg
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -113,14 +113,14 @@ void PFitterFcn::CalcExpectedChiSquare(const std::vector<Double_t> &par, Double_
|
||||
if (fUseChi2) {
|
||||
// single histo
|
||||
for (UInt_t i=0; i<fRunListCollection->GetNoOfSingleHisto(); i++) {
|
||||
value = fRunListCollection->GetSingleHistoChisqExpected(par, i); // calculate the expected chisq for single histo run block 'i'
|
||||
value = fRunListCollection->GetSingleRunChisqExpected(par, i); // calculate the expected chisq for single histo run block 'i'
|
||||
expectedChisqPerRun.push_back(value);
|
||||
totalExpectedChisq += value;
|
||||
}
|
||||
} else { // log max. likelihood
|
||||
// single histo
|
||||
for (UInt_t i=0; i<fRunListCollection->GetNoOfSingleHisto(); i++) {
|
||||
value = fRunListCollection->GetSingleHistoMaximumLikelihoodExpected(par, i); // calculate the expected mlh for single histo run block 'i'
|
||||
value = fRunListCollection->GetSingleRunMaximumLikelihoodExpected(par, i); // calculate the expected mlh for single histo run block 'i'
|
||||
expectedChisqPerRun.push_back(value);
|
||||
totalExpectedChisq += value;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -187,6 +187,16 @@ void PFunction::FillFuncEvalTree(iter_t const& i, PFuncTreeNode &node)
|
||||
} else if (i->value.id() == PFunctionGrammar::constGammaMuID) { // handle constant gamma_mu
|
||||
node.fID = PFunctionGrammar::constGammaMuID; // keep the ID
|
||||
node.fDvalue = GAMMA_BAR_MUON; // keep the value
|
||||
} else if (i->value.id() == PFunctionGrammar::constFieldID) { // handle constant field from meta data
|
||||
node.fID = PFunctionGrammar::constFieldID; // keep the ID
|
||||
} else if (i->value.id() == PFunctionGrammar::constEnergyID) { // handle constant energy from meta data
|
||||
node.fID = PFunctionGrammar::constEnergyID; // keep the ID
|
||||
} else if (i->value.id() == PFunctionGrammar::constTempID) { // handle constant temperature from meta data
|
||||
str = std::string(i->value.begin(), i->value.end()); // get string
|
||||
boost::algorithm::trim(str);
|
||||
status = sscanf(str.c_str(), "T%d", &ivalue); // convert string to temperature index
|
||||
node.fID = PFunctionGrammar::constTempID; // keep the ID
|
||||
node.fIvalue = ivalue; // Temp idx
|
||||
} else if (i->value.id() == PFunctionGrammar::parameterID) { // handle parameter number
|
||||
str = std::string(i->value.begin(), i->value.end()); // get string
|
||||
boost::algorithm::trim(str);
|
||||
@ -343,6 +353,12 @@ Bool_t PFunction::FindAndCheckMapAndParamRange(PFuncTreeNode &node, UInt_t mapSi
|
||||
return true;
|
||||
} else if (node.fID == PFunctionGrammar::constGammaMuID) {
|
||||
return true;
|
||||
} else if (node.fID == PFunctionGrammar::constFieldID) {
|
||||
return true;
|
||||
} else if (node.fID == PFunctionGrammar::constEnergyID) {
|
||||
return true;
|
||||
} else if (node.fID == PFunctionGrammar::constTempID) {
|
||||
return true;
|
||||
} else if (node.fID == PFunctionGrammar::parameterID) {
|
||||
if (node.fIvalue <= static_cast<Int_t>(paramSize))
|
||||
return true;
|
||||
@ -391,9 +407,10 @@ Bool_t PFunction::FindAndCheckMapAndParamRange(PFuncTreeNode &node, UInt_t mapSi
|
||||
*
|
||||
* \param param fit parameter vector
|
||||
*/
|
||||
Double_t PFunction::Eval(std::vector<Double_t> param)
|
||||
Double_t PFunction::Eval(std::vector<Double_t> param, PMetaData metaData)
|
||||
{
|
||||
fParam = param;
|
||||
fMetaData = metaData;
|
||||
|
||||
return EvalNode(fFunc);
|
||||
}
|
||||
@ -414,6 +431,22 @@ Double_t PFunction::EvalNode(PFuncTreeNode &node)
|
||||
return node.fDvalue;
|
||||
} else if (node.fID == PFunctionGrammar::constGammaMuID) {
|
||||
return node.fDvalue;
|
||||
} else if (node.fID == PFunctionGrammar::constFieldID) {
|
||||
return fMetaData.fField;
|
||||
} else if (node.fID == PFunctionGrammar::constEnergyID) {
|
||||
if (fMetaData.fEnergy == PMUSR_UNDEFINED) {
|
||||
std::cerr << std::endl << "**PANIC ERROR**: PFunction::EvalNode: energy meta data not available." << std::endl;
|
||||
std::cerr << std::endl;
|
||||
exit(0);
|
||||
}
|
||||
return fMetaData.fEnergy;
|
||||
} else if (node.fID == PFunctionGrammar::constTempID) {
|
||||
if (node.fIvalue >= fMetaData.fTemp.size()) {
|
||||
std::cerr << std::endl << "**PANIC ERROR**: PFunction::EvalNode: Temp idx=" << node.fIvalue << " requested which is >= #Temp(s)=" << fMetaData.fTemp.size() << " available." << std::endl;
|
||||
std::cerr << std::endl;
|
||||
exit(0);
|
||||
}
|
||||
return fMetaData.fTemp[node.fIvalue];
|
||||
} else if (node.fID == PFunctionGrammar::parameterID) {
|
||||
Double_t dval;
|
||||
if (node.fSign)
|
||||
@ -576,6 +609,13 @@ void PFunction::EvalTreeForStringExpression(iter_t const& i)
|
||||
fFuncString += "Pi";
|
||||
} else if (i->value.id() == PFunctionGrammar::constGammaMuID) {
|
||||
fFuncString += "gamma_mu";
|
||||
} else if (i->value.id() == PFunctionGrammar::constFieldID) {
|
||||
fFuncString += "B";
|
||||
} else if (i->value.id() == PFunctionGrammar::constEnergyID) {
|
||||
fFuncString += "EN";
|
||||
} else if (i->value.id() == PFunctionGrammar::constTempID) {
|
||||
assert(i->children.size() == 0);
|
||||
fFuncString += boost::algorithm::trim_copy(std::string(i->value.begin(), i->value.end())).c_str();
|
||||
} else if (i->value.id() == PFunctionGrammar::funLabelID) {
|
||||
assert(i->children.size() == 0);
|
||||
//SetFuncNo(i);
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -155,7 +155,7 @@ Bool_t PFunctionHandler::CheckMapAndParamRange(UInt_t mapSize, UInt_t paramSize)
|
||||
* \param map map vector
|
||||
* \param param fit parameter vector
|
||||
*/
|
||||
Double_t PFunctionHandler::Eval(Int_t funNo, std::vector<Int_t> map, std::vector<double> param)
|
||||
Double_t PFunctionHandler::Eval(Int_t funNo, std::vector<Int_t> map, std::vector<double> param, PMetaData metaData)
|
||||
{
|
||||
if (GetFuncIndex(funNo) == -1) {
|
||||
std::cerr << std::endl << "**ERROR**: Couldn't find FUN" << funNo << " for evaluation";
|
||||
@ -167,7 +167,7 @@ Double_t PFunctionHandler::Eval(Int_t funNo, std::vector<Int_t> map, std::vector
|
||||
fFuncs[GetFuncIndex(funNo)].SetMap(map);
|
||||
|
||||
// return evaluated function
|
||||
return fFuncs[GetFuncIndex(funNo)].Eval(param);
|
||||
return fFuncs[GetFuncIndex(funNo)].Eval(param, metaData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -819,15 +819,24 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages)
|
||||
} else if (sstr.BeginsWith("alpha ")) {
|
||||
fout.width(16);
|
||||
fout << std::left << "alpha";
|
||||
fout << fRuns[runNo].GetAlphaParamNo() << std::endl;
|
||||
// check of alpha is given as a function
|
||||
if (fRuns[runNo].GetAlphaParamNo() >= MSR_PARAM_FUN_OFFSET)
|
||||
fout << "fun" << fRuns[runNo].GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
else
|
||||
fout << fRuns[runNo].GetAlphaParamNo();
|
||||
fout << std::endl;
|
||||
} else if (sstr.BeginsWith("beta ")) {
|
||||
fout.width(16);
|
||||
fout << std::left << "beta";
|
||||
fout << fRuns[runNo].GetBetaParamNo() << std::endl;
|
||||
if (fRuns[runNo].GetBetaParamNo() >= MSR_PARAM_FUN_OFFSET)
|
||||
fout << "fun" << fRuns[runNo].GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
else
|
||||
fout << fRuns[runNo].GetBetaParamNo();
|
||||
fout << std::endl;
|
||||
} else if (sstr.BeginsWith("norm")) {
|
||||
fout.width(16);
|
||||
fout << std::left << "norm";
|
||||
// check if norm is give as a function
|
||||
// check if norm is given as a function
|
||||
if (fRuns[runNo].GetNormParamNo() >= MSR_PARAM_FUN_OFFSET)
|
||||
fout << "fun" << fRuns[runNo].GetNormParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
else
|
||||
@ -1818,7 +1827,12 @@ Int_t PMsrHandler::WriteMsrFile(const Char_t *filename, std::map<UInt_t, TString
|
||||
if (fGlobal.GetFitRange(j) == -1)
|
||||
break;
|
||||
UInt_t neededWidth = 7;
|
||||
UInt_t neededPrec = LastSignificant(fRuns[i].GetFitRange(j));
|
||||
UInt_t neededPrec = 2;
|
||||
if (fGlobal.GetFitRange(j) > 0.0) { // global fit range present
|
||||
LastSignificant(fGlobal.GetFitRange(j));
|
||||
} else { // global fit range absent
|
||||
neededPrec = LastSignificant(fRuns[i].GetFitRange(j));
|
||||
}
|
||||
fout.width(neededWidth);
|
||||
fout.precision(neededPrec);
|
||||
fout << std::left << std::fixed << fGlobal.GetFitRange(j);
|
||||
@ -1934,14 +1948,24 @@ Int_t PMsrHandler::WriteMsrFile(const Char_t *filename, std::map<UInt_t, TString
|
||||
if (fRuns[i].GetAlphaParamNo() != -1) {
|
||||
fout.width(16);
|
||||
fout << std::left << "alpha";
|
||||
fout << fRuns[i].GetAlphaParamNo() << std::endl;
|
||||
// check if alpha is give as a function
|
||||
if (fRuns[i].GetAlphaParamNo() >= MSR_PARAM_FUN_OFFSET)
|
||||
fout << "fun" << fRuns[i].GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
else
|
||||
fout << fRuns[i].GetAlphaParamNo();
|
||||
fout << std::endl;
|
||||
}
|
||||
|
||||
// beta
|
||||
if (fRuns[i].GetBetaParamNo() != -1) {
|
||||
fout.width(16);
|
||||
fout << std::left << "beta";
|
||||
fout << fRuns[i].GetBetaParamNo() << std::endl;
|
||||
// check if beta is give as a function
|
||||
if (fRuns[i].GetBetaParamNo() >= MSR_PARAM_FUN_OFFSET)
|
||||
fout << "fun" << fRuns[i].GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
else
|
||||
fout << fRuns[i].GetBetaParamNo();
|
||||
fout << std::endl;
|
||||
}
|
||||
|
||||
// norm
|
||||
@ -3374,6 +3398,12 @@ Bool_t PMsrHandler::HandleRunEntry(PMsrLines &lines)
|
||||
param.SetAlphaParamNo(ival);
|
||||
else
|
||||
error = true;
|
||||
} else if (str.Contains("fun")) {
|
||||
Int_t no;
|
||||
if (FilterNumber(str, "fun", MSR_PARAM_FUN_OFFSET, no))
|
||||
param.SetAlphaParamNo(no);
|
||||
else
|
||||
error = true;
|
||||
} else {
|
||||
error = true;
|
||||
}
|
||||
@ -3394,6 +3424,12 @@ Bool_t PMsrHandler::HandleRunEntry(PMsrLines &lines)
|
||||
ival = str.Atoi();
|
||||
if (ival > 0)
|
||||
param.SetBetaParamNo(ival);
|
||||
else
|
||||
error = true;
|
||||
} else if (str.Contains("fun")) {
|
||||
Int_t no;
|
||||
if (FilterNumber(str, "fun", MSR_PARAM_FUN_OFFSET, no))
|
||||
param.SetBetaParamNo(no);
|
||||
else
|
||||
error = true;
|
||||
} else {
|
||||
@ -4577,9 +4613,12 @@ Bool_t PMsrHandler::HandlePlotEntry(PMsrLines &lines)
|
||||
|
||||
// handle a single PLOT block
|
||||
while ((iter1 != iter2) && !error) {
|
||||
TString line = iter1->fLine;
|
||||
if (line.First('#') != -1) // remove trailing comment before proceed
|
||||
line.Resize(line.First('#'));
|
||||
|
||||
if (iter1->fLine.Contains("PLOT")) { // handle plot header
|
||||
tokens = iter1->fLine.Tokenize(" \t");
|
||||
if (line.Contains("PLOT")) { // handle plot header
|
||||
tokens = line.Tokenize(" \t");
|
||||
if (!tokens) {
|
||||
std::cerr << std::endl << ">> PMsrHandler::HandlePlotEntry: **SEVERE ERROR** Couldn't tokenize PLOT in line " << iter1->fLineNo;
|
||||
std::cerr << std::endl << std::endl;
|
||||
@ -4600,9 +4639,9 @@ Bool_t PMsrHandler::HandlePlotEntry(PMsrLines &lines)
|
||||
delete tokens;
|
||||
tokens = nullptr;
|
||||
}
|
||||
} else if (iter1->fLine.Contains("lifetimecorrection", TString::kIgnoreCase)) {
|
||||
} else if (line.Contains("lifetimecorrection", TString::kIgnoreCase)) {
|
||||
param.fLifeTimeCorrection = true;
|
||||
} else if (iter1->fLine.Contains("runs", TString::kIgnoreCase)) { // handle plot runs
|
||||
} else if (line.Contains("runs", TString::kIgnoreCase)) { // handle plot runs
|
||||
TComplex run;
|
||||
PStringNumberList *rl;
|
||||
std::string errorMsg;
|
||||
@ -4618,7 +4657,7 @@ Bool_t PMsrHandler::HandlePlotEntry(PMsrLines &lines)
|
||||
case MSR_PLOT_ASYM_RRF:
|
||||
case MSR_PLOT_NON_MUSR:
|
||||
case MSR_PLOT_MU_MINUS:
|
||||
rl = new PStringNumberList(iter1->fLine.Data());
|
||||
rl = new PStringNumberList(line.Data());
|
||||
if (!rl->Parse(errorMsg, true)) {
|
||||
std::cerr << std::endl << ">> PMsrHandler::HandlePlotEntry: **SEVERE ERROR** Couldn't tokenize PLOT in line " << iter1->fLineNo;
|
||||
std::cerr << std::endl << ">> Error Message: " << errorMsg;
|
||||
@ -4638,14 +4677,14 @@ Bool_t PMsrHandler::HandlePlotEntry(PMsrLines &lines)
|
||||
error = true;
|
||||
break;
|
||||
}
|
||||
} else if (iter1->fLine.Contains("range ", TString::kIgnoreCase)) { // handle plot range
|
||||
} else if (line.Contains("range ", TString::kIgnoreCase)) { // handle plot range
|
||||
// remove previous entries
|
||||
param.fTmin.clear();
|
||||
param.fTmax.clear();
|
||||
param.fYmin.clear();
|
||||
param.fYmax.clear();
|
||||
|
||||
tokens = iter1->fLine.Tokenize(" \t");
|
||||
tokens = line.Tokenize(" \t");
|
||||
if (!tokens) {
|
||||
std::cerr << std::endl << ">> PMsrHandler::HandlePlotEntry: **SEVERE ERROR** Couldn't tokenize PLOT in line " << iter1->fLineNo;
|
||||
std::cerr << std::endl << std::endl;
|
||||
@ -4695,14 +4734,14 @@ Bool_t PMsrHandler::HandlePlotEntry(PMsrLines &lines)
|
||||
delete tokens;
|
||||
tokens = nullptr;
|
||||
}
|
||||
} else if (iter1->fLine.Contains("sub_ranges", TString::kIgnoreCase)) {
|
||||
} else if (line.Contains("sub_ranges", TString::kIgnoreCase)) {
|
||||
// remove previous entries
|
||||
param.fTmin.clear();
|
||||
param.fTmax.clear();
|
||||
param.fYmin.clear();
|
||||
param.fYmax.clear();
|
||||
|
||||
tokens = iter1->fLine.Tokenize(" \t");
|
||||
tokens = line.Tokenize(" \t");
|
||||
if (!tokens) {
|
||||
std::cerr << std::endl << ">> PMsrHandler::HandlePlotEntry: **SEVERE ERROR** Couldn't tokenize PLOT in line " << iter1->fLineNo;
|
||||
std::cerr << std::endl << std::endl;
|
||||
@ -4757,11 +4796,11 @@ Bool_t PMsrHandler::HandlePlotEntry(PMsrLines &lines)
|
||||
delete tokens;
|
||||
tokens = nullptr;
|
||||
}
|
||||
} else if (iter1->fLine.Contains("use_fit_ranges", TString::kIgnoreCase)) {
|
||||
} else if (line.Contains("use_fit_ranges", TString::kIgnoreCase)) {
|
||||
param.fUseFitRanges = true;
|
||||
// check if y-ranges are given
|
||||
|
||||
tokens = iter1->fLine.Tokenize(" \t");
|
||||
tokens = line.Tokenize(" \t");
|
||||
if (!tokens) {
|
||||
std::cerr << std::endl << ">> PMsrHandler::HandlePlotEntry: **SEVERE ERROR** Couldn't tokenize PLOT in line " << iter1->fLineNo;
|
||||
std::cerr << std::endl << std::endl;
|
||||
@ -5202,12 +5241,20 @@ UInt_t PMsrHandler::GetNoOfFitParameters(UInt_t idx)
|
||||
paramVector.push_back(fRuns[idx].GetBkgFitParamNo());
|
||||
|
||||
// get alpha parameter if present (asymmetry fit)
|
||||
if (fRuns[idx].GetAlphaParamNo() != -1)
|
||||
paramVector.push_back(fRuns[idx].GetAlphaParamNo());
|
||||
if (fRuns[idx].GetAlphaParamNo() != -1) {
|
||||
if (fRuns[idx].GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) // parameter
|
||||
paramVector.push_back(fRuns[idx].GetAlphaParamNo());
|
||||
else // function
|
||||
funVector.push_back(fRuns[idx].GetAlphaParamNo() - MSR_PARAM_FUN_OFFSET);
|
||||
}
|
||||
|
||||
// get beta parameter if present (asymmetry fit)
|
||||
if (fRuns[idx].GetBetaParamNo() != -1)
|
||||
paramVector.push_back(fRuns[idx].GetBetaParamNo());
|
||||
if (fRuns[idx].GetBetaParamNo() != -1) {
|
||||
if (fRuns[idx].GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) // parameter
|
||||
paramVector.push_back(fRuns[idx].GetBetaParamNo());
|
||||
else // function
|
||||
funVector.push_back(fRuns[idx].GetBetaParamNo() - MSR_PARAM_FUN_OFFSET);
|
||||
}
|
||||
|
||||
// go through the theory block and collect parameters
|
||||
// possible entries: number -> parameter, fun<number> -> function, map<number> -> maps
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -125,6 +125,7 @@ PMusrCanvas::PMusrCanvas()
|
||||
fValid = false;
|
||||
fAveragedView = false;
|
||||
fDifferenceView = false;
|
||||
fToggleColor = false;
|
||||
fCurrentPlotView = PV_DATA;
|
||||
fPreviousPlotView = PV_DATA;
|
||||
fPlotType = -1;
|
||||
@ -186,8 +187,9 @@ PMusrCanvas::PMusrCanvas()
|
||||
*/
|
||||
PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title,
|
||||
Int_t wtopx, Int_t wtopy, Int_t ww, Int_t wh,
|
||||
const Bool_t batch, const Bool_t fourier, const Bool_t avg) :
|
||||
fStartWithFourier(fourier), fStartWithAvg(avg),
|
||||
const Bool_t batch, const Bool_t fourier, const Bool_t avg,
|
||||
const Bool_t theoAsData) :
|
||||
fTheoAsData(theoAsData), fStartWithFourier(fourier), fStartWithAvg(avg),
|
||||
fBatchMode(batch), fPlotNumber(number)
|
||||
{
|
||||
fTimeout = 0;
|
||||
@ -243,8 +245,9 @@ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title,
|
||||
Int_t wtopx, Int_t wtopy, Int_t ww, Int_t wh,
|
||||
PMsrFourierStructure fourierDefault,
|
||||
const PIntVector markerList, const PIntVector colorList,
|
||||
const Bool_t batch, const Bool_t fourier, const Bool_t avg) :
|
||||
fStartWithFourier(fourier), fStartWithAvg(avg), fBatchMode(batch),
|
||||
const Bool_t batch, const Bool_t fourier, const Bool_t avg,
|
||||
const Bool_t theoAsData) :
|
||||
fTheoAsData(theoAsData), fStartWithFourier(fourier), fStartWithAvg(avg), fBatchMode(batch),
|
||||
fPlotNumber(number), fFourier(fourierDefault),
|
||||
fMarkerList(markerList), fColorList(colorList)
|
||||
{
|
||||
@ -1182,6 +1185,19 @@ void PMusrCanvas::HandleCmdKey(Int_t event, Int_t x, Int_t y, TObject *selected)
|
||||
fDataTheoryPad->SetCrosshair(0);
|
||||
}
|
||||
fMainCanvas->Update();
|
||||
} else if (x == 't') { // toggle theory color
|
||||
if (fData.size() == 1) { // only do something if there is a single data set
|
||||
fToggleColor = !fToggleColor;
|
||||
if (fToggleColor) {
|
||||
fData[0].theory->SetLineColor(kRed);
|
||||
fData[0].theory->SetLineWidth(2);
|
||||
} else {
|
||||
fData[0].theory->SetLineColor(fColorList[0]);
|
||||
fData[0].theory->SetLineWidth(1);
|
||||
}
|
||||
fDataTheoryPad->Modified();
|
||||
fMainCanvas->Update();
|
||||
}
|
||||
} else {
|
||||
fMainCanvas->Update();
|
||||
}
|
||||
@ -2384,6 +2400,7 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy,
|
||||
fValid = false;
|
||||
fAveragedView = false;
|
||||
fDifferenceView = false;
|
||||
fToggleColor = false;
|
||||
fCurrentPlotView = PV_DATA;
|
||||
fPreviousPlotView = PV_DATA;
|
||||
fPlotType = -1;
|
||||
@ -3452,22 +3469,30 @@ void PMusrCanvas::HandleFourier()
|
||||
fData[i].dataFourierPhase->SetMarkerStyle(fData[i].data->GetMarkerStyle());
|
||||
|
||||
// calculate fourier transform of the theory
|
||||
Int_t powerPad = (Int_t)round(log((endTime-startTime)/fData[i].theory->GetBinWidth(1))/log(2))+3;
|
||||
PFourier fourierTheory(fData[i].theory, fFourier.fUnits, startTime, endTime, fFourier.fDCCorrected, powerPad);
|
||||
if (!fourierTheory.IsValid()) {
|
||||
PFourier *fourierTheory = nullptr;
|
||||
if (fTheoAsData) { // theory only at the data points
|
||||
fourierTheory = new PFourier(fData[i].theory, fFourier.fUnits, startTime, endTime, fFourier.fDCCorrected, fFourier.fFourierPower);
|
||||
} else {
|
||||
Int_t powerPad = fFourier.fFourierPower+5; // +5 means 8 times more points on theo (+3) + 4 times more points in fourier (+2)
|
||||
fourierTheory = new PFourier(fData[i].theory, fFourier.fUnits, startTime, endTime, fFourier.fDCCorrected, powerPad);
|
||||
}
|
||||
if (!fourierTheory->IsValid()) {
|
||||
std::cerr << std::endl << ">> PMusrCanvas::HandleFourier(): **SEVERE ERROR** couldn't invoke PFourier to calculate the Fourier theory ..." << std::endl;
|
||||
return;
|
||||
}
|
||||
fourierTheory.Transform(fFourier.fApodization);
|
||||
fourierTheory->Transform(fFourier.fApodization);
|
||||
scale = sqrt(fData[0].theory->GetBinWidth(1)/(endTime-startTime)*fData[0].theory->GetBinWidth(1)/fData[0].data->GetBinWidth(1));
|
||||
// get real part of the data
|
||||
fData[i].theoryFourierRe = fourierTheory.GetRealFourier(scale);
|
||||
fData[i].theoryFourierRe = fourierTheory->GetRealFourier(scale);
|
||||
// get imaginary part of the data
|
||||
fData[i].theoryFourierIm = fourierTheory.GetImaginaryFourier(scale);
|
||||
fData[i].theoryFourierIm = fourierTheory->GetImaginaryFourier(scale);
|
||||
// get power part of the data
|
||||
fData[i].theoryFourierPwr = fourierTheory.GetPowerFourier(scale);
|
||||
fData[i].theoryFourierPwr = fourierTheory->GetPowerFourier(scale);
|
||||
// get phase part of the data
|
||||
fData[i].theoryFourierPhase = fourierTheory.GetPhaseFourier();
|
||||
fData[i].theoryFourierPhase = fourierTheory->GetPhaseFourier();
|
||||
|
||||
// clean up
|
||||
delete fourierTheory;
|
||||
|
||||
// set line colors for the theory
|
||||
fData[i].theoryFourierRe->SetLineColor(fData[i].theory->GetLineColor());
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -56,6 +56,7 @@ PRunAsymmetry::PRunAsymmetry() : PRunBase()
|
||||
{
|
||||
fNoOfFitBins = 0;
|
||||
fPacking = -1;
|
||||
fTheoAsData = false;
|
||||
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
@ -77,7 +78,8 @@ PRunAsymmetry::PRunAsymmetry() : PRunBase()
|
||||
* \param runNo number of the run within the msr-file
|
||||
* \param tag tag showing what shall be done: kFit == fitting, kView == viewing
|
||||
*/
|
||||
PRunAsymmetry::PRunAsymmetry(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag) : PRunBase(msrInfo, rawData, runNo, tag)
|
||||
PRunAsymmetry::PRunAsymmetry(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag, Bool_t theoAsData) :
|
||||
PRunBase(msrInfo, rawData, runNo, tag), fTheoAsData(theoAsData)
|
||||
{
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
@ -111,7 +113,16 @@ PRunAsymmetry::PRunAsymmetry(PMsrHandler *msrInfo, PRunDataHandler *rawData, UIn
|
||||
return;
|
||||
}
|
||||
// check if alpha parameter is within proper bounds
|
||||
if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > static_cast<Int_t>(param->size()))) {
|
||||
if (fRunInfo->GetAlphaParamNo() >= MSR_PARAM_FUN_OFFSET) { // alpha seems to be a function
|
||||
if ((fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET < 0) ||
|
||||
(fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET > msrInfo->GetNoOfFuncs())) {
|
||||
std::cerr << std::endl << ">> PRunAsymmetry::PRunAsymmetry(): **ERROR** alpha parameter is a function with no = " << fRunInfo->GetAlphaParamNo();
|
||||
std::cerr << std::endl << ">> This is out of bound, since there are only " << msrInfo->GetNoOfFuncs() << " functions.";
|
||||
std::cerr << std::endl;
|
||||
fValid = false;
|
||||
return;
|
||||
}
|
||||
} else if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > static_cast<Int_t>(param->size()))) {
|
||||
std::cerr << std::endl << ">> PRunAsymmetry::PRunAsymmetry(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo();
|
||||
std::cerr << std::endl << ">> This is out of bound, since there are only " << param->size() << " parameters.";
|
||||
std::cerr << std::endl;
|
||||
@ -120,10 +131,11 @@ PRunAsymmetry::PRunAsymmetry(PMsrHandler *msrInfo, PRunDataHandler *rawData, UIn
|
||||
}
|
||||
// check if alpha is fixed
|
||||
Bool_t alphaFixedToOne = false;
|
||||
if (((*param)[fRunInfo->GetAlphaParamNo()-1].fStep == 0.0) &&
|
||||
((*param)[fRunInfo->GetAlphaParamNo()-1].fValue == 1.0))
|
||||
alphaFixedToOne = true;
|
||||
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is parameter
|
||||
if (((*param)[fRunInfo->GetAlphaParamNo()-1].fStep == 0.0) &&
|
||||
((*param)[fRunInfo->GetAlphaParamNo()-1].fValue == 1.0))
|
||||
alphaFixedToOne = true;
|
||||
}
|
||||
// check if beta is given
|
||||
Bool_t betaFixedToOne = false;
|
||||
if (fRunInfo->GetBetaParamNo() == -1) { // no beta given hence assuming beta == 1
|
||||
@ -189,13 +201,65 @@ Double_t PRunAsymmetry::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
Double_t time(1.0);
|
||||
Int_t i;
|
||||
|
||||
// determine alpha/beta
|
||||
switch (fAlphaBetaTag) {
|
||||
case 1: // alpha == 1, beta == 1
|
||||
a = 1.0;
|
||||
b = 1.0;
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
b = 1.0;
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
a = 1.0;
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
a = 1.0;
|
||||
b = 1.0;
|
||||
break;
|
||||
}
|
||||
|
||||
// Calculate the theory function once to ensure one function evaluation for the current set of parameters.
|
||||
// This is needed for the LF and user functions where some non-thread-save calculations only need to be calculated once
|
||||
// for a given set of parameters---which should be done outside of the parallelized loop.
|
||||
@ -206,34 +270,12 @@ Double_t PRunAsymmetry::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs();
|
||||
if (chunk < 10)
|
||||
chunk = 10;
|
||||
#pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,a,b,f) schedule(dynamic,chunk) reduction(+:chisq)
|
||||
#pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,f) schedule(dynamic,chunk) reduction(+:chisq)
|
||||
#endif
|
||||
for (i=fStartTimeBin; i<fEndTimeBin; ++i) {
|
||||
time = fData.GetDataTimeStart() + static_cast<Double_t>(i)*fData.GetDataTimeStep();
|
||||
switch (fAlphaBetaTag) {
|
||||
case 1: // alpha == 1, beta == 1
|
||||
asymFcnValue = fTheory->Func(time, par, fFuncValues);
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0));
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0));
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0));
|
||||
break;
|
||||
default:
|
||||
asymFcnValue = 0.0;
|
||||
break;
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0));
|
||||
diff = fData.GetValue()->at(i) - asymFcnValue;
|
||||
chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i));
|
||||
}
|
||||
@ -378,7 +420,7 @@ void PRunAsymmetry::SetFitRangeBin(const TString fitRange)
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// CalcNoOfFitBins (protected)
|
||||
// CalcNoOfFitBins (public)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Calculate the number of fitted bins for the current fit range.
|
||||
@ -415,7 +457,7 @@ void PRunAsymmetry::CalcTheory()
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate asymmetry
|
||||
@ -429,18 +471,46 @@ void PRunAsymmetry::CalcTheory()
|
||||
asymFcnValue = fTheory->Func(time, par, fFuncValues);
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0));
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0));
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0));
|
||||
break;
|
||||
@ -491,6 +561,16 @@ Bool_t PRunAsymmetry::PrepareData()
|
||||
return false;
|
||||
}
|
||||
|
||||
// keep the field from the meta-data from the data-file
|
||||
fMetaData.fField = runData->GetField();
|
||||
|
||||
// keep the energy from the meta-data from the data-file
|
||||
fMetaData.fEnergy = runData->GetEnergy();
|
||||
|
||||
// keep the temperature(s) from the meta-data from the data-file
|
||||
for (unsigned int i=0; i<runData->GetNoOfTemperatures(); i++)
|
||||
fMetaData.fTemp.push_back(runData->GetTemperature(i));
|
||||
|
||||
// collect histogram numbers
|
||||
PUIntVector forwardHistoNo;
|
||||
PUIntVector backwardHistoNo;
|
||||
@ -1138,16 +1218,44 @@ Bool_t PRunAsymmetry::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2])
|
||||
beta = 1.0;
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
alpha = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
beta = 1.0;
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
alpha = 1.0;
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
beta = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
alpha = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
beta = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1184,21 +1292,25 @@ Bool_t PRunAsymmetry::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2])
|
||||
// fill theory vector for kView
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
Double_t time;
|
||||
UInt_t size = runData->GetDataBin(histoNo[0])->size();
|
||||
Double_t factor = 1.0;
|
||||
if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo[0])->size()) {
|
||||
size = fData.GetValue()->size() * 10;
|
||||
factor = static_cast<Double_t>(runData->GetDataBin(histoNo[0])->size()) / static_cast<Double_t>(size);
|
||||
}
|
||||
Int_t factor = 8; // 8 times more points for the theory (if fTheoAsData == false)
|
||||
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
fData.SetTheoryTimeStep(fTimeResolution*factor);
|
||||
if (fTheoAsData) { // cacluate theory only at the data points
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep());
|
||||
} else {
|
||||
// finer binning for the theory (8 times as many points = factor)
|
||||
size *= factor;
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep()/(Double_t)factor);
|
||||
}
|
||||
|
||||
for (UInt_t i=0; i<size; i++) {
|
||||
time = fData.GetTheoryTimeStart() + static_cast<Double_t>(i)*fTimeResolution*factor;
|
||||
time = fData.GetTheoryTimeStart() + static_cast<Double_t>(i)*fData.GetTheoryTimeStep();
|
||||
value = fTheory->Func(time, par, fFuncValues);
|
||||
if (fabs(value) > 10.0) { // dirty hack needs to be fixed!!
|
||||
value = 0.0;
|
||||
@ -1349,16 +1461,44 @@ Bool_t PRunAsymmetry::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]
|
||||
beta = 1.0;
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
alpha = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
beta = 1.0;
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
alpha = 1.0;
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
beta = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
alpha = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
beta = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1460,7 +1600,7 @@ Bool_t PRunAsymmetry::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
Double_t theoryValue;
|
||||
|
@ -57,6 +57,7 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR() : PRunBase()
|
||||
{
|
||||
fNoOfFitBins = 0;
|
||||
fPacking = -1;
|
||||
fTheoAsData = false;
|
||||
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
@ -78,7 +79,8 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR() : PRunBase()
|
||||
* \param runNo number of the run within the msr-file
|
||||
* \param tag tag showing what shall be done: kFit == fitting, kView == viewing
|
||||
*/
|
||||
PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag) : PRunBase(msrInfo, rawData, runNo, tag)
|
||||
PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag, Bool_t theoAsData) :
|
||||
PRunBase(msrInfo, rawData, runNo, tag), fTheoAsData(theoAsData)
|
||||
{
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
@ -199,63 +201,97 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
Double_t time(1.0),alphaest;
|
||||
Int_t i;
|
||||
|
||||
// determine alpha/beta
|
||||
alphaest = fRunInfo->GetEstimatedAlpha();
|
||||
switch (fAlphaBetaTag) {
|
||||
case 1: // alpha == 1, beta == 1
|
||||
a = 1.0;
|
||||
b = 1.0;
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
b = 1.0;
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
a = 1.0;
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
case 5: // alpha ?? , beta == 1
|
||||
a = alphaest;
|
||||
b = 1.0;
|
||||
break;
|
||||
case 6: // alpha ??, beta != 1
|
||||
a = alphaest;
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
a = 1.0;
|
||||
b = 1.0;
|
||||
break;
|
||||
}
|
||||
|
||||
// Calculate the theory function once to ensure one function evaluation for the current set of parameters.
|
||||
// This is needed for the LF and user functions where some non-thread-save calculations only need to be calculated once
|
||||
// for a given set of parameters---which should be done outside of the parallelized loop.
|
||||
// For all other functions it means a tiny and acceptable overhead.
|
||||
asymFcnValue = fTheory->Func(time, par, fFuncValues);
|
||||
alphaest = fRunInfo->GetEstimatedAlpha();
|
||||
|
||||
#ifdef HAVE_GOMP
|
||||
Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs();
|
||||
if (chunk < 10)
|
||||
chunk = 10;
|
||||
#pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,a,b,f) schedule(dynamic,chunk) reduction(+:chisq)
|
||||
#pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,f) schedule(dynamic,chunk) reduction(+:chisq)
|
||||
#endif
|
||||
for (i=fStartTimeBin; i<fEndTimeBin; ++i) {
|
||||
time = fData.GetDataTimeStart() + static_cast<Double_t>(i)*fData.GetDataTimeStep();
|
||||
switch (fAlphaBetaTag) {
|
||||
case 1: // alpha == 1, beta == 1
|
||||
asymFcnValue = fTheory->Func(time, par, fFuncValues);
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues)/2.0;
|
||||
asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0));
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues)/2.0;
|
||||
asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0))-f*(b+1.0)/(2.0+f*(b-1.0));
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues)/2.0;
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0));
|
||||
break;
|
||||
case 5: // alpha ?? , beta == 1
|
||||
a = alphaest;
|
||||
f = fTheory->Func(time, par, fFuncValues)/2.0;
|
||||
asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0));
|
||||
break;
|
||||
case 6: // alpha ??, beta != 1
|
||||
a = alphaest;
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues)/2.0;
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0));
|
||||
break;
|
||||
default:
|
||||
asymFcnValue = 0.0;
|
||||
break;
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues)/2.0;
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0));
|
||||
diff = fData.GetValue()->at(i) - asymFcnValue;
|
||||
chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i));
|
||||
}
|
||||
@ -400,7 +436,7 @@ void PRunAsymmetryBNMR::SetFitRangeBin(const TString fitRange)
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// CalcNoOfFitBins (protected)
|
||||
// CalcNoOfFitBins (public)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Calculate the number of fitted bins for the current fit range.
|
||||
@ -437,7 +473,7 @@ void PRunAsymmetryBNMR::CalcTheory()
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate asymmetry
|
||||
@ -455,18 +491,46 @@ void PRunAsymmetryBNMR::CalcTheory()
|
||||
asymFcnValue = fTheory->Func(time, par, fFuncValues);
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0));
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0))-f*(b+1.0)/(2.0+f*(b-1.0));
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0));
|
||||
break;
|
||||
@ -477,7 +541,14 @@ void PRunAsymmetryBNMR::CalcTheory()
|
||||
break;
|
||||
case 6: // alpha ??, beta != 1
|
||||
a = alphaest;
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0));
|
||||
break;
|
||||
@ -528,6 +599,16 @@ Bool_t PRunAsymmetryBNMR::PrepareData()
|
||||
return false;
|
||||
}
|
||||
|
||||
// keep the field from the meta-data from the data-file
|
||||
fMetaData.fField = runData->GetField();
|
||||
|
||||
// keep the energy from the meta-data from the data-file
|
||||
fMetaData.fEnergy = runData->GetEnergy();
|
||||
|
||||
// keep the temperature(s) from the meta-data from the data-file
|
||||
for (unsigned int i=0; i<runData->GetNoOfTemperatures(); i++)
|
||||
fMetaData.fTemp.push_back(runData->GetTemperature(i));
|
||||
|
||||
// collect histogram numbers
|
||||
PUIntVector forwardHistoNo;
|
||||
PUIntVector backwardHistoNo;
|
||||
@ -1287,16 +1368,44 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2
|
||||
beta = 1.0;
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
alpha = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
beta = 1.0;
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
alpha = 1.0;
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
beta = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
alpha = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
beta = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
case 5: // alpha ?? , beta == 1
|
||||
// use estimated value
|
||||
@ -1304,7 +1413,14 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2
|
||||
break;
|
||||
case 6: // alpha ??, beta != 1
|
||||
// use estimated value
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
beta = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1354,21 +1470,25 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2
|
||||
// fill theory vector for kView
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
Double_t time;
|
||||
UInt_t size = runData->GetDataBin(histoNo[0])->size();
|
||||
Double_t factor = 1.0;
|
||||
if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo[0])->size()) {
|
||||
size = fData.GetValue()->size() * 10;
|
||||
factor = static_cast<Double_t>(runData->GetDataBin(histoNo[0])->size()) / static_cast<Double_t>(size);
|
||||
}
|
||||
|
||||
Int_t factor = 8; // 8 times more points for the theory (if fTheoAsData == false)
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
fData.SetTheoryTimeStep(fTimeResolution*factor);
|
||||
if (fTheoAsData) { // cacluate theory only at the data points
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep());
|
||||
} else {
|
||||
// finer binning for the theory (8 times as many points = factor)
|
||||
size *= factor;
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep()/(Double_t)factor);
|
||||
}
|
||||
|
||||
Double_t time;
|
||||
for (UInt_t i=0; i<size; i++) {
|
||||
time = fData.GetTheoryTimeStart() + static_cast<Double_t>(i)*fTimeResolution*factor;
|
||||
time = fData.GetTheoryTimeStart() + static_cast<Double_t>(i)*fData.GetTheoryTimeStep();
|
||||
value = fTheory->Func(time, par, fFuncValues);
|
||||
if (fabs(value) > 10.0) { // dirty hack needs to be fixed!!
|
||||
value = 0.0;
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -57,6 +57,7 @@ PRunAsymmetryRRF::PRunAsymmetryRRF() : PRunBase()
|
||||
{
|
||||
fNoOfFitBins = 0;
|
||||
fRRFPacking = -1;
|
||||
fTheoAsData = false;
|
||||
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
@ -75,7 +76,8 @@ PRunAsymmetryRRF::PRunAsymmetryRRF() : PRunBase()
|
||||
* \param runNo number of the run within the msr-file
|
||||
* \param tag tag showing what shall be done: kFit == fitting, kView == viewing
|
||||
*/
|
||||
PRunAsymmetryRRF::PRunAsymmetryRRF(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag) : PRunBase(msrInfo, rawData, runNo, tag)
|
||||
PRunAsymmetryRRF::PRunAsymmetryRRF(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag, Bool_t theoAsData) :
|
||||
PRunBase(msrInfo, rawData, runNo, tag), fTheoAsData(theoAsData)
|
||||
{
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
@ -181,13 +183,65 @@ Double_t PRunAsymmetryRRF::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
Double_t time(1.0);
|
||||
Int_t i;
|
||||
|
||||
// determine alpha/beta
|
||||
switch (fAlphaBetaTag) {
|
||||
case 1: // alpha == 1, beta == 1
|
||||
a = 1.0;
|
||||
b = 1.0;
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
b = 1.0;
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
a = 1.0;
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
a = 1.0;
|
||||
b = 1.0;
|
||||
break;
|
||||
}
|
||||
|
||||
// Calculate the theory function once to ensure one function evaluation for the current set of parameters.
|
||||
// This is needed for the LF and user functions where some non-thread-save calculations only need to be calculated once
|
||||
// for a given set of parameters---which should be done outside of the parallelized loop.
|
||||
@ -198,34 +252,12 @@ Double_t PRunAsymmetryRRF::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs();
|
||||
if (chunk < 10)
|
||||
chunk = 10;
|
||||
#pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,a,b,f) schedule(dynamic,chunk) reduction(+:chisq)
|
||||
#pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,f) schedule(dynamic,chunk) reduction(+:chisq)
|
||||
#endif
|
||||
for (i=fStartTimeBin; i<fEndTimeBin; ++i) {
|
||||
time = fData.GetDataTimeStart() + static_cast<Double_t>(i)*fData.GetDataTimeStep();
|
||||
switch (fAlphaBetaTag) {
|
||||
case 1: // alpha == 1, beta == 1
|
||||
asymFcnValue = fTheory->Func(time, par, fFuncValues);
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0));
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0));
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0));
|
||||
break;
|
||||
default:
|
||||
asymFcnValue = 0.0;
|
||||
break;
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0));
|
||||
diff = fData.GetValue()->at(i) - asymFcnValue;
|
||||
chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i));
|
||||
}
|
||||
@ -370,7 +402,7 @@ void PRunAsymmetryRRF::SetFitRangeBin(const TString fitRange)
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// CalcNoOfFitBins (protected)
|
||||
// CalcNoOfFitBins (public)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Calculate the number of fitted bins for the current fit range.
|
||||
@ -407,7 +439,7 @@ void PRunAsymmetryRRF::CalcTheory()
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate asymmetry
|
||||
@ -421,18 +453,46 @@ void PRunAsymmetryRRF::CalcTheory()
|
||||
asymFcnValue = fTheory->Func(time, par, fFuncValues);
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0));
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0));
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
a = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
a = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
b = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
b = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
f = fTheory->Func(time, par, fFuncValues);
|
||||
asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0));
|
||||
break;
|
||||
@ -483,6 +543,16 @@ Bool_t PRunAsymmetryRRF::PrepareData()
|
||||
return false;
|
||||
}
|
||||
|
||||
// keep the field from the meta-data from the data-file
|
||||
fMetaData.fField = runData->GetField();
|
||||
|
||||
// keep the energy from the meta-data from the data-file
|
||||
fMetaData.fEnergy = runData->GetEnergy();
|
||||
|
||||
// keep the temperature(s) from the meta-data from the data-file
|
||||
for (unsigned int i=0; i<runData->GetNoOfTemperatures(); i++)
|
||||
fMetaData.fTemp.push_back(runData->GetTemperature(i));
|
||||
|
||||
// collect histogram numbers
|
||||
PUIntVector forwardHistoNo;
|
||||
PUIntVector backwardHistoNo;
|
||||
@ -1034,16 +1104,44 @@ Bool_t PRunAsymmetryRRF::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]
|
||||
beta = 1.0;
|
||||
break;
|
||||
case 2: // alpha != 1, beta == 1
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
alpha = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
beta = 1.0;
|
||||
break;
|
||||
case 3: // alpha == 1, beta != 1
|
||||
alpha = 1.0;
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
beta = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
case 4: // alpha != 1, beta != 1
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
if (fRunInfo->GetAlphaParamNo() < MSR_PARAM_FUN_OFFSET) { // alpha is a parameter
|
||||
alpha = par[fRunInfo->GetAlphaParamNo()-1];
|
||||
} else { // alpha is function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetAlphaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
alpha = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
if (fRunInfo->GetBetaParamNo() < MSR_PARAM_FUN_OFFSET) { // beta is a parameter
|
||||
beta = par[fRunInfo->GetBetaParamNo()-1];
|
||||
} else { // beta is a function
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetBetaParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
beta = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1127,20 +1225,23 @@ Bool_t PRunAsymmetryRRF::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]
|
||||
// fill theory vector for kView
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
UInt_t size = runData->GetDataBin(histoNo[0])->size();
|
||||
Double_t factor = 1.0;
|
||||
if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo[0])->size()) {
|
||||
size = fData.GetValue()->size() * 10;
|
||||
factor = static_cast<Double_t>(runData->GetDataBin(histoNo[0])->size()) / static_cast<Double_t>(size);
|
||||
}
|
||||
Int_t factor = 8; // 8 times more points for the theory (if fTheoAsData == false)
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
fData.SetTheoryTimeStep(fTimeResolution*factor);
|
||||
if (fTheoAsData) { // cacluate theory only at the data points
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep());
|
||||
} else {
|
||||
// finer binning for the theory (8 times as many points = factor)
|
||||
size *= factor;
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep()/(Double_t)factor);
|
||||
}
|
||||
|
||||
for (UInt_t i=0; i<size; i++) {
|
||||
time = fData.GetTheoryTimeStart() + static_cast<Double_t>(i)*fTimeResolution*factor;
|
||||
time = fData.GetTheoryTimeStart() + static_cast<Double_t>(i)*fData.GetTheoryTimeStep();
|
||||
dval = fTheory->Func(time, par, fFuncValues);
|
||||
if (fabs(dval) > 10.0) { // dirty hack needs to be fixed!!
|
||||
dval = 0.0;
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -49,6 +49,8 @@ PRunBase::PRunBase()
|
||||
fRunNo = -1;
|
||||
fRunInfo = nullptr;
|
||||
fRawData = nullptr;
|
||||
fMetaData.fField = PMUSR_UNDEFINED;
|
||||
fMetaData.fEnergy = PMUSR_UNDEFINED;
|
||||
fTimeResolution = -1.0;
|
||||
|
||||
fFitStartTime = PMUSR_UNDEFINED;
|
||||
@ -90,6 +92,8 @@ PRunBase::PRunBase(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo,
|
||||
}
|
||||
|
||||
// init private variables
|
||||
fMetaData.fField = PMUSR_UNDEFINED;
|
||||
fMetaData.fEnergy = PMUSR_UNDEFINED;
|
||||
fTimeResolution = -1.0;
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++)
|
||||
fFuncValues.push_back(0.0);
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -40,7 +40,8 @@
|
||||
* \param msrInfo pointer to the msr-file handler
|
||||
* \param data pointer to the run-data handler
|
||||
*/
|
||||
PRunListCollection::PRunListCollection(PMsrHandler *msrInfo, PRunDataHandler *data) : fMsrInfo(msrInfo), fData(data)
|
||||
PRunListCollection::PRunListCollection(PMsrHandler *msrInfo, PRunDataHandler *data, Bool_t theoAsData) :
|
||||
fMsrInfo(msrInfo), fData(data), fTheoAsData(theoAsData)
|
||||
{
|
||||
}
|
||||
|
||||
@ -120,32 +121,32 @@ Bool_t PRunListCollection::Add(Int_t runNo, EPMusrHandleTag tag)
|
||||
|
||||
switch (fitType) {
|
||||
case PRUN_SINGLE_HISTO:
|
||||
fRunSingleHistoList.push_back(new PRunSingleHisto(fMsrInfo, fData, runNo, tag));
|
||||
fRunSingleHistoList.push_back(new PRunSingleHisto(fMsrInfo, fData, runNo, tag, fTheoAsData));
|
||||
if (!fRunSingleHistoList[fRunSingleHistoList.size()-1]->IsValid())
|
||||
success = false;
|
||||
break;
|
||||
case PRUN_SINGLE_HISTO_RRF:
|
||||
fRunSingleHistoRRFList.push_back(new PRunSingleHistoRRF(fMsrInfo, fData, runNo, tag));
|
||||
fRunSingleHistoRRFList.push_back(new PRunSingleHistoRRF(fMsrInfo, fData, runNo, tag, fTheoAsData));
|
||||
if (!fRunSingleHistoRRFList[fRunSingleHistoRRFList.size()-1]->IsValid())
|
||||
success = false;
|
||||
break;
|
||||
case PRUN_ASYMMETRY:
|
||||
fRunAsymmetryList.push_back(new PRunAsymmetry(fMsrInfo, fData, runNo, tag));
|
||||
fRunAsymmetryList.push_back(new PRunAsymmetry(fMsrInfo, fData, runNo, tag, fTheoAsData));
|
||||
if (!fRunAsymmetryList[fRunAsymmetryList.size()-1]->IsValid())
|
||||
success = false;
|
||||
break;
|
||||
case PRUN_ASYMMETRY_RRF:
|
||||
fRunAsymmetryRRFList.push_back(new PRunAsymmetryRRF(fMsrInfo, fData, runNo, tag));
|
||||
fRunAsymmetryRRFList.push_back(new PRunAsymmetryRRF(fMsrInfo, fData, runNo, tag, fTheoAsData));
|
||||
if (!fRunAsymmetryRRFList[fRunAsymmetryRRFList.size()-1]->IsValid())
|
||||
success = false;
|
||||
break;
|
||||
case PRUN_ASYMMETRY_BNMR:
|
||||
fRunAsymmetryBNMRList.push_back(new PRunAsymmetryBNMR(fMsrInfo, fData, runNo, tag));
|
||||
fRunAsymmetryBNMRList.push_back(new PRunAsymmetryBNMR(fMsrInfo, fData, runNo, tag, fTheoAsData));
|
||||
if (!fRunAsymmetryBNMRList[fRunAsymmetryBNMRList.size()-1]->IsValid())
|
||||
success = false;
|
||||
break;
|
||||
case PRUN_MU_MINUS:
|
||||
fRunMuMinusList.push_back(new PRunMuMinus(fMsrInfo, fData, runNo, tag));
|
||||
fRunMuMinusList.push_back(new PRunMuMinus(fMsrInfo, fData, runNo, tag, fTheoAsData));
|
||||
if (!fRunMuMinusList[fRunMuMinusList.size()-1]->IsValid())
|
||||
success = false;
|
||||
break;
|
||||
@ -206,18 +207,30 @@ void PRunListCollection::SetFitRange(const TString fitRange)
|
||||
*/
|
||||
void PRunListCollection::SetFitRange(const PDoublePairVector fitRange)
|
||||
{
|
||||
for (UInt_t i=0; i<fRunSingleHistoList.size(); i++)
|
||||
for (UInt_t i=0; i<fRunSingleHistoList.size(); i++) {
|
||||
fRunSingleHistoList[i]->SetFitRange(fitRange);
|
||||
for (UInt_t i=0; i<fRunSingleHistoRRFList.size(); i++)
|
||||
fRunSingleHistoList[i]->CalcNoOfFitBins(); // needed to update fStartTimeBin, fEndTimeBin
|
||||
}
|
||||
for (UInt_t i=0; i<fRunSingleHistoRRFList.size(); i++) {
|
||||
fRunSingleHistoRRFList[i]->SetFitRange(fitRange);
|
||||
for (UInt_t i=0; i<fRunAsymmetryList.size(); i++)
|
||||
fRunSingleHistoRRFList[i]->CalcNoOfFitBins(); // needed to update fStartTimeBin, fEndTimeBin
|
||||
}
|
||||
for (UInt_t i=0; i<fRunAsymmetryList.size(); i++) {
|
||||
fRunAsymmetryList[i]->SetFitRange(fitRange);
|
||||
for (UInt_t i=0; i<fRunAsymmetryRRFList.size(); i++)
|
||||
fRunAsymmetryList[i]->CalcNoOfFitBins(); // needed to update fStartTimeBin, fEndTimeBin
|
||||
}
|
||||
for (UInt_t i=0; i<fRunAsymmetryRRFList.size(); i++) {
|
||||
fRunAsymmetryRRFList[i]->SetFitRange(fitRange);
|
||||
for (UInt_t i=0; i<fRunAsymmetryBNMRList.size(); i++)
|
||||
fRunAsymmetryRRFList[i]->CalcNoOfFitBins(); // needed to update fStartTimeBin, fEndTimeBin
|
||||
}
|
||||
for (UInt_t i=0; i<fRunAsymmetryBNMRList.size(); i++) {
|
||||
fRunAsymmetryBNMRList[i]->SetFitRange(fitRange);
|
||||
for (UInt_t i=0; i<fRunMuMinusList.size(); i++)
|
||||
fRunAsymmetryBNMRList[i]->CalcNoOfFitBins(); // needed to update fStartTimeBin, fEndTimeBin
|
||||
}
|
||||
for (UInt_t i=0; i<fRunMuMinusList.size(); i++) {
|
||||
fRunMuMinusList[i]->SetFitRange(fitRange);
|
||||
fRunMuMinusList[i]->CalcNoOfFitBins(); // needed to update fStartTimeBin, fEndTimeBin
|
||||
}
|
||||
for (UInt_t i=0; i<fRunNonMusrList.size(); i++)
|
||||
fRunNonMusrList[i]->SetFitRange(fitRange);
|
||||
}
|
||||
@ -370,37 +383,39 @@ Double_t PRunListCollection::GetNonMusrChisq(const std::vector<Double_t>& par) c
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// GetSingleHistoChisqExpected (public)
|
||||
// GetSingleRunChisqExpected (public)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Calculates expected chi-square of the single histogram with run block index idx of a msr-file.
|
||||
* <p>Calculates expected chi-square of the run block index idx of a msr-file.
|
||||
*
|
||||
* <b>return:</b>
|
||||
* - expected chi-square of for a single histogram
|
||||
* - expected chi-square of for a single run block
|
||||
*
|
||||
* \param par fit parameter vector
|
||||
* \param idx run block index
|
||||
*/
|
||||
Double_t PRunListCollection::GetSingleHistoChisqExpected(const std::vector<Double_t>& par, const UInt_t idx) const
|
||||
Double_t PRunListCollection::GetSingleRunChisqExpected(const std::vector<Double_t>& par, const UInt_t idx) const
|
||||
{
|
||||
Double_t expectedChisq = 0.0;
|
||||
|
||||
if (idx > fMsrInfo->GetMsrRunList()->size()) {
|
||||
std::cerr << ">> PRunListCollection::GetSingleHistoChisqExpected() **ERROR** idx=" << idx << " is out of range [0.." << fMsrInfo->GetMsrRunList()->size() << "[" << std::endl << std::endl;
|
||||
std::cerr << ">> PRunListCollection::GetSingleRunChisqExpected() **ERROR** idx=" << idx << " is out of range [0.." << fMsrInfo->GetMsrRunList()->size() << "[" << std::endl << std::endl;
|
||||
return expectedChisq;
|
||||
}
|
||||
|
||||
UInt_t subIdx = 0;
|
||||
Int_t type = fMsrInfo->GetMsrRunList()->at(idx).GetFitType();
|
||||
if (type == -1) { // i.e. not found in the RUN block, try the GLOBAL block
|
||||
type = fMsrInfo->GetMsrGlobal()->GetFitType();
|
||||
subIdx = idx;
|
||||
} else { // found in the RUN block
|
||||
// count how many entries of this fit-type are present up to idx
|
||||
for (UInt_t i=0; i<idx; i++) {
|
||||
if (fMsrInfo->GetMsrRunList()->at(i).GetFitType() == type)
|
||||
subIdx++;
|
||||
}
|
||||
}
|
||||
|
||||
// count how many entries of this fit-type are present up to idx
|
||||
UInt_t subIdx = 0;
|
||||
for (UInt_t i=0; i<idx; i++) {
|
||||
if (fMsrInfo->GetMsrRunList()->at(i).GetFitType() == type)
|
||||
subIdx++;
|
||||
}
|
||||
|
||||
// return the chisq of the single run
|
||||
switch (type) {
|
||||
@ -648,36 +663,37 @@ Double_t PRunListCollection::GetNonMusrMaximumLikelihood(const std::vector<Doubl
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// GetSingleHistoMaximumLikelihoodExpected (public)
|
||||
// GetSingleRunMaximumLikelihoodExpected (public)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Calculates expected mlh of the single histogram with run block index idx of a msr-file.
|
||||
* <p>Calculates expected mlh of the run block index idx of a msr-file.
|
||||
*
|
||||
* <b>return:</b>
|
||||
* - expected mlh of for a single histogram
|
||||
* - expected mlh of for a single run block
|
||||
*
|
||||
* \param par fit parameter vector
|
||||
* \param idx run block index
|
||||
*/
|
||||
Double_t PRunListCollection::GetSingleHistoMaximumLikelihoodExpected(const std::vector<Double_t>& par, const UInt_t idx) const
|
||||
Double_t PRunListCollection::GetSingleRunMaximumLikelihoodExpected(const std::vector<Double_t>& par, const UInt_t idx) const
|
||||
{
|
||||
Double_t expected_mlh = 0.0;
|
||||
|
||||
if (idx > fMsrInfo->GetMsrRunList()->size()) {
|
||||
std::cerr << ">> PRunListCollection::GetSingleHistoMaximumLikelihoodExpected() **ERROR** idx=" << idx << " is out of range [0.." << fMsrInfo->GetMsrRunList()->size() << "[" << std::endl << std::endl;
|
||||
std::cerr << ">> PRunListCollection::GetSingleRunMaximumLikelihoodExpected() **ERROR** idx=" << idx << " is out of range [0.." << fMsrInfo->GetMsrRunList()->size() << "[" << std::endl << std::endl;
|
||||
return expected_mlh;
|
||||
}
|
||||
|
||||
UInt_t subIdx = 0;
|
||||
Int_t type = fMsrInfo->GetMsrRunList()->at(idx).GetFitType();
|
||||
if (type == -1) { // i.e. not found in the RUN block, try the GLOBAL block
|
||||
type = fMsrInfo->GetMsrGlobal()->GetFitType();
|
||||
}
|
||||
|
||||
// count how many entries of this fit-type are present up to idx
|
||||
UInt_t subIdx = 0;
|
||||
for (UInt_t i=0; i<idx; i++) {
|
||||
if (fMsrInfo->GetMsrRunList()->at(i).GetFitType() == type)
|
||||
subIdx++;
|
||||
subIdx = idx;
|
||||
} else { // found in the RUN block
|
||||
// count how many entries of this fit-type are present up to idx
|
||||
for (UInt_t i=0; i<idx; i++) {
|
||||
if (fMsrInfo->GetMsrRunList()->at(i).GetFitType() == type)
|
||||
subIdx++;
|
||||
}
|
||||
}
|
||||
|
||||
// return the mlh of the single run
|
||||
@ -759,16 +775,17 @@ UInt_t PRunListCollection::GetNoOfBinsFitted(const UInt_t idx) const
|
||||
return result;
|
||||
}
|
||||
|
||||
Int_t type = fMsrInfo->GetMsrRunList()->at(idx).GetFitType();
|
||||
if (type == -1) { // i.e. not forun in the RUN block, try the GLOBAL block
|
||||
type = fMsrInfo->GetMsrGlobal()->GetFitType();
|
||||
}
|
||||
|
||||
// count how many entries of this fit-type are present up to idx
|
||||
UInt_t subIdx = 0;
|
||||
for (UInt_t i=0; i<idx; i++) {
|
||||
if (fMsrInfo->GetMsrRunList()->at(i).GetFitType() == type)
|
||||
subIdx++;
|
||||
Int_t type = fMsrInfo->GetMsrRunList()->at(idx).GetFitType();
|
||||
if (type == -1) { // i.e. not found in the RUN block, try the GLOBAL block
|
||||
type = fMsrInfo->GetMsrGlobal()->GetFitType();
|
||||
subIdx = idx;
|
||||
} else { // found in the RUN block
|
||||
// count how many entries of this fit-type are present up to idx
|
||||
for (UInt_t i=0; i<idx; i++) {
|
||||
if (fMsrInfo->GetMsrRunList()->at(i).GetFitType() == type)
|
||||
subIdx++;
|
||||
}
|
||||
}
|
||||
|
||||
// return the chisq of the single run
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -53,6 +53,7 @@ PRunMuMinus::PRunMuMinus() : PRunBase()
|
||||
{
|
||||
fNoOfFitBins = 0;
|
||||
fPacking = -1;
|
||||
fTheoAsData = false;
|
||||
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
@ -76,7 +77,8 @@ PRunMuMinus::PRunMuMinus() : PRunBase()
|
||||
* \param runNo number of the run within the msr-file
|
||||
* \param tag tag showing what shall be done: kFit == fitting, kView == viewing
|
||||
*/
|
||||
PRunMuMinus::PRunMuMinus(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag) : PRunBase(msrInfo, rawData, runNo, tag)
|
||||
PRunMuMinus::PRunMuMinus(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag, Bool_t theoAsData) :
|
||||
PRunBase(msrInfo, rawData, runNo, tag), fTheoAsData(theoAsData)
|
||||
{
|
||||
fNoOfFitBins = 0;
|
||||
|
||||
@ -138,7 +140,7 @@ Double_t PRunMuMinus::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
Int_t funcNo = fMsrInfo->GetFuncNo(i);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
@ -186,7 +188,7 @@ Double_t PRunMuMinus::CalcChiSquareExpected(const std::vector<Double_t>& par)
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
Int_t funcNo = fMsrInfo->GetFuncNo(i);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
@ -233,7 +235,7 @@ Double_t PRunMuMinus::CalcMaxLikelihood(const std::vector<Double_t>& par)
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
Int_t funcNo = fMsrInfo->GetFuncNo(i);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate maximum log likelihood
|
||||
@ -382,7 +384,7 @@ void PRunMuMinus::SetFitRangeBin(const TString fitRange)
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// CalcNoOfFitBins (private)
|
||||
// CalcNoOfFitBins (public)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Calculate the number of fitted bins for the current fit range.
|
||||
@ -419,7 +421,7 @@ void PRunMuMinus::CalcTheory()
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
@ -467,6 +469,16 @@ Bool_t PRunMuMinus::PrepareData()
|
||||
return false;
|
||||
}
|
||||
|
||||
// keep the field from the meta-data from the data-file
|
||||
fMetaData.fField = runData->GetField();
|
||||
|
||||
// keep the energy from the meta-data from the data-file
|
||||
fMetaData.fEnergy = runData->GetEnergy();
|
||||
|
||||
// keep the temperature(s) from the meta-data from the data-file
|
||||
for (unsigned int i=0; i<runData->GetNoOfTemperatures(); i++)
|
||||
fMetaData.fTemp.push_back(runData->GetTemperature(i));
|
||||
|
||||
// collect histogram numbers
|
||||
PUIntVector histoNo; // histoNo = msr-file forward + redGreen_offset - 1
|
||||
for (UInt_t i=0; i<fRunInfo->GetForwardHistoNoSize(); i++) {
|
||||
@ -727,11 +739,12 @@ Bool_t PRunMuMinus::PrepareRawViewData(PRawRunData* runData, const UInt_t histoN
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
UInt_t size = fForward.size();
|
||||
/* //as35
|
||||
Double_t factor = 1.0;
|
||||
if (fData.GetValue()->size() * 10 > fForward.size()) {
|
||||
size = fData.GetValue()->size() * 10;
|
||||
@ -741,6 +754,20 @@ Bool_t PRunMuMinus::PrepareRawViewData(PRawRunData* runData, const UInt_t histoN
|
||||
Double_t theoryValue;
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
fData.SetTheoryTimeStep(fTimeResolution*factor);
|
||||
*/ //as35
|
||||
|
||||
Int_t factor = 8; // 8 times more points for the theory (if fTheoAsData == false)
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
if (fTheoAsData) { // cacluate theory only at the data points
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep());
|
||||
} else {
|
||||
// finer binning for the theory (8 times as many points = factor)
|
||||
size *= factor;
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep()/(Double_t)factor);
|
||||
}
|
||||
|
||||
Double_t time;
|
||||
Double_t theoryValue;
|
||||
for (UInt_t i=0; i<size; i++) {
|
||||
time = fData.GetTheoryTimeStart() + i*fData.GetTheoryTimeStep();
|
||||
theoryValue = fTheory->Func(time, par, fFuncValues);
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -103,7 +103,7 @@ Double_t PRunNonMusr::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
@ -345,7 +345,7 @@ Bool_t PRunNonMusr::PrepareViewData()
|
||||
par.push_back((*paramList)[i].fValue);
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// get plot range
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -58,6 +58,7 @@ PRunSingleHisto::PRunSingleHisto() : PRunBase()
|
||||
fNoOfFitBins = 0;
|
||||
fBackground = 0;
|
||||
fPacking = -1;
|
||||
fTheoAsData = false;
|
||||
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
@ -79,7 +80,8 @@ PRunSingleHisto::PRunSingleHisto() : PRunBase()
|
||||
* \param runNo number of the run within the msr-file
|
||||
* \param tag tag showing what shall be done: kFit == fitting, kView == viewing
|
||||
*/
|
||||
PRunSingleHisto::PRunSingleHisto(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag) : PRunBase(msrInfo, rawData, runNo, tag)
|
||||
PRunSingleHisto::PRunSingleHisto(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag, Bool_t theoAsData) :
|
||||
PRunBase(msrInfo, rawData, runNo, tag), fTheoAsData(theoAsData)
|
||||
{
|
||||
fScaleN0AndBkg = IsScaleN0AndBkg();
|
||||
fNoOfFitBins = 0;
|
||||
@ -149,7 +151,7 @@ Double_t PRunSingleHisto::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par);
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// get tau
|
||||
@ -174,7 +176,7 @@ Double_t PRunSingleHisto::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
UInt_t funcNo = fMsrInfo->GetFuncNo(i);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
@ -234,7 +236,7 @@ Double_t PRunSingleHisto::CalcChiSquareExpected(const std::vector<Double_t>& par
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par);
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// get tau
|
||||
@ -259,7 +261,7 @@ Double_t PRunSingleHisto::CalcChiSquareExpected(const std::vector<Double_t>& par
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
Int_t funcNo = fMsrInfo->GetFuncNo(i);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
@ -276,9 +278,9 @@ Double_t PRunSingleHisto::CalcChiSquareExpected(const std::vector<Double_t>& par
|
||||
Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs();
|
||||
if (chunk < 10)
|
||||
chunk = 10;
|
||||
#pragma omp parallel for default(shared) private(i,time,diff) schedule(dynamic,chunk) reduction(+:chisq)
|
||||
#pragma omp parallel for default(shared) private(i,time,theo,diff) schedule(dynamic,chunk) reduction(+:chisq)
|
||||
#endif
|
||||
for (i=fStartTimeBin; i < fEndTimeBin; ++i) {
|
||||
for (i=fStartTimeBin; i<fEndTimeBin; ++i) {
|
||||
time = fData.GetDataTimeStart() + static_cast<Double_t>(i)*fData.GetDataTimeStep();
|
||||
theo = N0*TMath::Exp(-time/tau)*(1.0+fTheory->Func(time, par, fFuncValues))+bkg;
|
||||
diff = fData.GetValue()->at(i) - theo;
|
||||
@ -317,7 +319,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihood(const std::vector<Double_t>& par)
|
||||
// get function number
|
||||
Int_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par);
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// get tau
|
||||
@ -342,7 +344,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihood(const std::vector<Double_t>& par)
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
UInt_t funcNo = fMsrInfo->GetFuncNo(i);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate maximum log likelihood
|
||||
@ -373,9 +375,8 @@ Double_t PRunSingleHisto::CalcMaxLikelihood(const std::vector<Double_t>& par)
|
||||
time = fData.GetDataTimeStart() + static_cast<Double_t>(i)*fData.GetDataTimeStep();
|
||||
// calculate theory for the given parameter set
|
||||
theo = N0*TMath::Exp(-time/tau)*(1.0+fTheory->Func(time, par, fFuncValues))+bkg;
|
||||
theo *= normalizer;
|
||||
|
||||
data = normalizer*fData.GetValue()->at(i);
|
||||
data = fData.GetValue()->at(i);
|
||||
|
||||
if (theo <= 0.0) {
|
||||
std::cerr << ">> PRunSingleHisto::CalcMaxLikelihood: **WARNING** NEGATIVE theory!!" << std::endl;
|
||||
@ -389,7 +390,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihood(const std::vector<Double_t>& par)
|
||||
}
|
||||
}
|
||||
|
||||
return 2.0*mllh;
|
||||
return normalizer*2.0*mllh;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
@ -416,7 +417,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihoodExpected(const std::vector<Double_t>&
|
||||
// get function number
|
||||
Int_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par);
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// get tau
|
||||
@ -441,7 +442,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihoodExpected(const std::vector<Double_t>&
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
UInt_t funcNo = fMsrInfo->GetFuncNo(i);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate maximum log likelihood
|
||||
@ -472,9 +473,8 @@ Double_t PRunSingleHisto::CalcMaxLikelihoodExpected(const std::vector<Double_t>&
|
||||
time = fData.GetDataTimeStart() + static_cast<Double_t>(i)*fData.GetDataTimeStep();
|
||||
// calculate theory for the given parameter set
|
||||
theo = N0*TMath::Exp(-time/tau)*(1.0+fTheory->Func(time, par, fFuncValues))+bkg;
|
||||
theo *= normalizer;
|
||||
|
||||
data = normalizer*fData.GetValue()->at(i);
|
||||
data = fData.GetValue()->at(i);
|
||||
|
||||
if (theo <= 0.0) {
|
||||
std::cerr << ">> PRunSingleHisto::CalcMaxLikelihood: **WARNING** NEGATIVE theory!!" << std::endl;
|
||||
@ -486,7 +486,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihoodExpected(const std::vector<Double_t>&
|
||||
}
|
||||
}
|
||||
|
||||
return 2.0*mllh;
|
||||
return normalizer*2.0*mllh;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
@ -512,7 +512,7 @@ void PRunSingleHisto::CalcTheory()
|
||||
// get function number
|
||||
Int_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par);
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// get tau
|
||||
@ -536,7 +536,7 @@ void PRunSingleHisto::CalcTheory()
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
@ -659,7 +659,7 @@ void PRunSingleHisto::SetFitRangeBin(const TString fitRange)
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// CalcNoOfFitBins (protected)
|
||||
// CalcNoOfFitBins (public)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Calculate the number of fitted bins for the current fit range.
|
||||
@ -711,6 +711,16 @@ Bool_t PRunSingleHisto::PrepareData()
|
||||
return false;
|
||||
}
|
||||
|
||||
// keep the field from the meta-data from the data-file
|
||||
fMetaData.fField = runData->GetField();
|
||||
|
||||
// keep the energy from the meta-data from the data-file
|
||||
fMetaData.fEnergy = runData->GetEnergy();
|
||||
|
||||
// keep the temperature(s) from the meta-data from the data-file
|
||||
for (unsigned int i=0; i<runData->GetNoOfTemperatures(); i++)
|
||||
fMetaData.fTemp.push_back(runData->GetTemperature(i));
|
||||
|
||||
// collect histogram numbers
|
||||
PUIntVector histoNo; // histoNo = msr-file forward + redGreen_offset - 1
|
||||
for (UInt_t i=0; i<fRunInfo->GetForwardHistoNoSize(); i++) {
|
||||
@ -1018,7 +1028,7 @@ Bool_t PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const UInt_t hi
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par);
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
N0 *= theoryNorm;
|
||||
|
||||
@ -1057,20 +1067,23 @@ Bool_t PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const UInt_t hi
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
UInt_t size = fForward.size();
|
||||
Double_t factor = 1.0;
|
||||
if (fData.GetValue()->size() * 10 > fForward.size()) {
|
||||
size = fData.GetValue()->size() * 10;
|
||||
factor = static_cast<Double_t>(fForward.size()) / static_cast<Double_t>(size);
|
||||
Int_t factor = 8; // 8 times more points for the theory (if fTheoAsData == false)
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
if (fTheoAsData) { // cacluate theory only at the data points
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep());
|
||||
} else {
|
||||
// finer binning for the theory (8 times as many points = factor)
|
||||
size *= factor;
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep()/(Double_t)factor);
|
||||
}
|
||||
|
||||
Double_t time;
|
||||
Double_t theoryValue;
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
fData.SetTheoryTimeStep(fTimeResolution*factor);
|
||||
for (UInt_t i=0; i<size; i++) {
|
||||
time = fData.GetTheoryTimeStart() + i*fData.GetTheoryTimeStep();
|
||||
theoryValue = fTheory->Func(time, par, fFuncValues);
|
||||
@ -1192,7 +1205,7 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo
|
||||
// get function number
|
||||
UInt_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET;
|
||||
// evaluate function
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par);
|
||||
N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
N0 *= theoryNorm;
|
||||
|
||||
@ -1297,23 +1310,24 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
Double_t theoryValue;
|
||||
UInt_t size = fForward.size();
|
||||
Double_t factor = 1.0;
|
||||
Int_t factor = 8; // 8 times more points for the theory (if fTheoAsData == false)
|
||||
UInt_t rebinRRF = 0;
|
||||
|
||||
if (wRRF == 0) { // no RRF
|
||||
// check if a finer binning for the theory is needed
|
||||
if (fData.GetValue()->size() * 10 > fForward.size()) {
|
||||
size = fData.GetValue()->size() * 10;
|
||||
factor = static_cast<Double_t>(fForward.size()) / static_cast<Double_t>(size);
|
||||
}
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
fData.SetTheoryTimeStep(fTimeResolution*factor);
|
||||
if (fTheoAsData) { // cacluate theory only at the data points
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep());
|
||||
} else {
|
||||
// finer binning for the theory (8 times as many points = factor)
|
||||
size *= factor;
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep()/(Double_t)factor);
|
||||
}
|
||||
} else { // RRF
|
||||
rebinRRF = static_cast<UInt_t>((TMath::Pi()/2.0/wRRF)/fTimeResolution); // RRF time resolution / data time resolution
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -60,6 +60,7 @@ PRunSingleHistoRRF::PRunSingleHistoRRF() : PRunBase()
|
||||
fBackground = 0.0;
|
||||
fBkgErr = 1.0;
|
||||
fRRFPacking = -1;
|
||||
fTheoAsData = false;
|
||||
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
@ -80,7 +81,8 @@ PRunSingleHistoRRF::PRunSingleHistoRRF() : PRunBase()
|
||||
* \param runNo number of the run within the msr-file
|
||||
* \param tag tag showing what shall be done: kFit == fitting, kView == viewing
|
||||
*/
|
||||
PRunSingleHistoRRF::PRunSingleHistoRRF(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag) : PRunBase(msrInfo, rawData, runNo, tag)
|
||||
PRunSingleHistoRRF::PRunSingleHistoRRF(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag, Bool_t theoAsData) :
|
||||
PRunBase(msrInfo, rawData, runNo, tag), fTheoAsData(theoAsData)
|
||||
{
|
||||
fNoOfFitBins = 0;
|
||||
|
||||
@ -154,7 +156,7 @@ Double_t PRunSingleHistoRRF::CalcChiSquare(const std::vector<Double_t>& par)
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
UInt_t funcNo = fMsrInfo->GetFuncNo(i);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
@ -202,7 +204,7 @@ Double_t PRunSingleHistoRRF::CalcChiSquareExpected(const std::vector<Double_t>&
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
UInt_t funcNo = fMsrInfo->GetFuncNo(i);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate chi square
|
||||
@ -265,7 +267,7 @@ void PRunSingleHistoRRF::CalcTheory()
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
@ -388,7 +390,7 @@ void PRunSingleHistoRRF::SetFitRangeBin(const TString fitRange)
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// CalcNoOfFitBins (protected)
|
||||
// CalcNoOfFitBins (public)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Calculate the number of fitted bins for the current fit range.
|
||||
@ -440,6 +442,16 @@ Bool_t PRunSingleHistoRRF::PrepareData()
|
||||
return false;
|
||||
}
|
||||
|
||||
// keep the field from the meta-data from the data-file
|
||||
fMetaData.fField = runData->GetField();
|
||||
|
||||
// keep the energy from the meta-data from the data-file
|
||||
fMetaData.fEnergy = runData->GetEnergy();
|
||||
|
||||
// keep the temperature(s) from the meta-data from the data-file
|
||||
for (unsigned int i=0; i<runData->GetNoOfTemperatures(); i++)
|
||||
fMetaData.fTemp.push_back(runData->GetTemperature(i));
|
||||
|
||||
// collect histogram numbers
|
||||
PUIntVector histoNo; // histoNo = msr-file forward + redGreen_offset - 1
|
||||
for (UInt_t i=0; i<fRunInfo->GetForwardHistoNoSize(); i++) {
|
||||
@ -743,23 +755,24 @@ Bool_t PRunSingleHistoRRF::PrepareViewData(PRawRunData* runData, const UInt_t hi
|
||||
|
||||
// calculate functions
|
||||
for (Int_t i=0; i<fMsrInfo->GetNoOfFuncs(); i++) {
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par);
|
||||
fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par, fMetaData);
|
||||
}
|
||||
|
||||
// check if a finer binning for the theory is needed
|
||||
UInt_t size = fForward.size();
|
||||
Double_t factor = 1.0;
|
||||
Double_t time = 0.0;
|
||||
Double_t theoryValue = 0.0;
|
||||
|
||||
if (fData.GetValue()->size() * 10 > fForward.size()) {
|
||||
size = fData.GetValue()->size() * 10;
|
||||
factor = static_cast<Double_t>(fForward.size()) / static_cast<Double_t>(size);
|
||||
}
|
||||
Int_t factor = 8; // 8 times more points for the theory (if fTheoAsData == false)
|
||||
fData.SetTheoryTimeStart(fData.GetDataTimeStart());
|
||||
fData.SetTheoryTimeStep(fTimeResolution*factor);
|
||||
if (fTheoAsData) { // cacluate theory only at the data points
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep());
|
||||
} else {
|
||||
// finer binning for the theory (8 times as many points = factor)
|
||||
size *= factor;
|
||||
fData.SetTheoryTimeStep(fData.GetDataTimeStep()/(Double_t)factor);
|
||||
}
|
||||
|
||||
// calculate theory
|
||||
Double_t time = 0.0;
|
||||
Double_t theoryValue = 0.0;
|
||||
for (UInt_t i=0; i<size; i++) {
|
||||
time = fData.GetTheoryTimeStart() + static_cast<Double_t>(i)*fData.GetTheoryTimeStep();
|
||||
theoryValue = fTheory->Func(time, par, fFuncValues);
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
2
src/external/BMWtools/BMWStartupHandler.cpp
vendored
@ -11,7 +11,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2014 by Andreas Suter, Bastian M. Wojek *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter, Bastian M. Wojek *
|
||||
* *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
2
src/external/BMWtools/BMWStartupHandler.h
vendored
@ -11,7 +11,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter, Bastian M. Wojek *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter, Bastian M. Wojek *
|
||||
* *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
2
src/external/MusrRoot/TMusrRunHeader.cpp
vendored
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
2
src/external/MusrRoot/TMusrRunHeader.h
vendored
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
2
src/external/libGbGLF/PGbGLF.cpp
vendored
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
2
src/external/libGbGLF/PGbGLF.h
vendored
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
10
src/external/nexus/PNeXus.cpp
vendored
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -2045,7 +2045,14 @@ int PNeXus::ReadFile(const char *fileName)
|
||||
// close file
|
||||
NXclose(&fFileHandle);
|
||||
|
||||
std::stringstream ss;
|
||||
switch (fIdfVersion) {
|
||||
case 0:
|
||||
fErrorCode = PNEXUS_IDF_NOT_IMPLEMENTED;
|
||||
ss << ">> **ERROR** update of the HDF4/HDF5 libs without recompilation of the NeXus lib?";
|
||||
fErrorMsg = ss.str();
|
||||
status = NX_ERROR;
|
||||
break;
|
||||
case 1:
|
||||
status = ReadFileIdf1();
|
||||
if (status != NX_OK) {
|
||||
@ -2062,7 +2069,6 @@ int PNeXus::ReadFile(const char *fileName)
|
||||
break;
|
||||
default:
|
||||
fErrorCode = PNEXUS_IDF_NOT_IMPLEMENTED;
|
||||
std::stringstream ss;
|
||||
ss << ">> **ERROR** idf_version=" << fIdfVersion << " not yet implemented.";
|
||||
fErrorMsg = ss.str();
|
||||
status = NX_ERROR;
|
||||
|
2
src/external/nexus/PNeXus.h
vendored
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -58,7 +58,51 @@
|
||||
#define PMN_USER_COVARIANCE 17
|
||||
#define PMN_USER_PARAM_STATE 18
|
||||
#define PMN_PRINT 19
|
||||
#define PMN_SECTOR 20
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>The PSectorChisq class is needed to store the chisq/maxLH of a sector.
|
||||
* A sector is a time window from fgb to fLast (fLast < lgb). It also stores
|
||||
* these information for each run of the msr-file.
|
||||
*/
|
||||
class PSectorChisq
|
||||
{
|
||||
public:
|
||||
PSectorChisq(UInt_t noOfRuns);
|
||||
|
||||
void SetRunFirstTime(Double_t first, UInt_t idx);
|
||||
void SetSectorTime(Double_t last) { fLast = last; }
|
||||
void SetChisq(Double_t chisq) { fChisq = chisq; }
|
||||
void SetChisq(Double_t chisq, UInt_t idx);
|
||||
void SetExpectedChisq(Double_t expChisq) { fExpectedChisq = expChisq; }
|
||||
void SetExpectedChisq(Double_t chisq, UInt_t idx);
|
||||
void SetNDF(UInt_t ndf) { fNDF = ndf; }
|
||||
void SetNDF(UInt_t ndf, UInt_t idx);
|
||||
|
||||
Double_t GetTimeRangeFirst(UInt_t idx);
|
||||
Double_t GetTimeRangeLast() { return fLast; }
|
||||
Double_t GetChisq() { return fChisq; }
|
||||
Double_t GetChisq(UInt_t idx);
|
||||
Double_t GetExpectedChisq() { return fExpectedChisq; }
|
||||
Double_t GetExpectedChisq(UInt_t idx);
|
||||
UInt_t GetNDF() { return fNDF; }
|
||||
UInt_t GetNDF(UInt_t idx);
|
||||
UInt_t GetNoRuns() { return fNoOfRuns; }
|
||||
|
||||
private:
|
||||
UInt_t fNoOfRuns; ///< number of runs presesent
|
||||
Double_t fLast; ///< requested time stamp
|
||||
Double_t fChisq; ///< chisq or maxLH for the sector
|
||||
Double_t fExpectedChisq; ///< keep the expected chisq or maxLH for the sector
|
||||
UInt_t fNDF; ///< NDF for the sector
|
||||
PDoubleVector fFirst; ///< time stamp for fgb for a given run
|
||||
PDoubleVector fChisqRun; ///< chisq or maxLH for the sector and run
|
||||
PDoubleVector fExpectedChisqRun; ///< expected chisq or maxLH for the sector and run
|
||||
PUIntVector fNDFRun; ///< NDF for the sector and run
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Interface class to minuit2.
|
||||
*/
|
||||
@ -108,6 +152,9 @@ class PFitter
|
||||
|
||||
PStringVector fElapsedTime;
|
||||
|
||||
Bool_t fSectorFlag; ///< sector command present flag
|
||||
std::vector<PSectorChisq> fSector; ///< stores all chisq/maxLH sector information
|
||||
|
||||
// commands
|
||||
Bool_t CheckCommands();
|
||||
Bool_t SetParameters();
|
||||
@ -126,6 +173,8 @@ class PFitter
|
||||
Bool_t ExecuteScan();
|
||||
Bool_t ExecuteSave(Bool_t first);
|
||||
Bool_t ExecuteSimplex();
|
||||
void PrepareSector(PDoubleVector ¶m, PDoubleVector &error);
|
||||
Bool_t ExecuteSector(std::ofstream &fout);
|
||||
|
||||
Double_t MilliTime();
|
||||
};
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -44,6 +44,7 @@
|
||||
|
||||
#include <TString.h>
|
||||
|
||||
#include "PMusr.h"
|
||||
#include "PFunctionGrammar.h"
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -79,7 +80,7 @@ typedef struct func_tree_node {
|
||||
Int_t fOperatorTag; ///< tag for '+', '-', '*', '/'
|
||||
Int_t fFunctionTag; ///< tag got "cos", "sin", ...
|
||||
Int_t fIvalue; ///< for parameter numbers and maps
|
||||
Bool_t fSign; ///< for sign, true means '-', false '+'
|
||||
Bool_t fSign; ///< for sign, true means '-', false '+'
|
||||
Double_t fDvalue; ///< for numbers
|
||||
std::vector<func_tree_node> children; ///< holding sub-tree
|
||||
} PFuncTreeNode;
|
||||
@ -96,7 +97,7 @@ class PFunction {
|
||||
virtual Bool_t IsValid() { return fValid; }
|
||||
virtual Int_t GetFuncNo() { return fFuncNo; }
|
||||
virtual Bool_t CheckMapAndParamRange(UInt_t mapSize, UInt_t paramSize);
|
||||
virtual Double_t Eval(std::vector<Double_t> param);
|
||||
virtual Double_t Eval(std::vector<Double_t> param, PMetaData metaData);
|
||||
virtual void SetMap(std::vector<Int_t> map) { fMap = map; }
|
||||
|
||||
virtual TString* GetFuncString() { return &fFuncString; }
|
||||
@ -124,6 +125,8 @@ class PFunction {
|
||||
virtual void EvalTreeForString(tree_parse_info<> info);
|
||||
virtual void EvalTreeForStringExpression(iter_t const& i);
|
||||
TString fFuncString; ///< clear text representation of the function
|
||||
|
||||
PMetaData fMetaData; ///< keeps meta data from data files (field, energy, temperature, ...)
|
||||
};
|
||||
|
||||
#endif // _PFUNCTION_H_
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -57,15 +57,18 @@ struct PFunctionGrammar : public grammar<PFunctionGrammar>
|
||||
static const int realID = 1;
|
||||
static const int constPiID = 2;
|
||||
static const int constGammaMuID = 3;
|
||||
static const int funLabelID = 4;
|
||||
static const int parameterID = 5;
|
||||
static const int mapID = 6;
|
||||
static const int functionID = 7;
|
||||
static const int powerID = 8;
|
||||
static const int factorID = 9;
|
||||
static const int termID = 10;
|
||||
static const int expressionID = 11;
|
||||
static const int assignmentID = 12;
|
||||
static const int constFieldID = 4;
|
||||
static const int constEnergyID = 5;
|
||||
static const int constTempID = 6;
|
||||
static const int funLabelID = 7;
|
||||
static const int parameterID = 8;
|
||||
static const int mapID = 9;
|
||||
static const int functionID = 10;
|
||||
static const int powerID = 11;
|
||||
static const int factorID = 12;
|
||||
static const int termID = 13;
|
||||
static const int expressionID = 14;
|
||||
static const int assignmentID = 15;
|
||||
|
||||
template <typename ScannerT>
|
||||
struct definition
|
||||
@ -79,6 +82,12 @@ struct PFunctionGrammar : public grammar<PFunctionGrammar>
|
||||
|
||||
const_gamma_mu = leaf_node_d[ str_p("GAMMA_MU") ];
|
||||
|
||||
const_field = leaf_node_d[ str_p("B") ];
|
||||
|
||||
const_energy = leaf_node_d[ str_p("EN") ];
|
||||
|
||||
const_temp = leaf_node_d[ ( lexeme_d[ "T" >> +digit_p ] ) ];
|
||||
|
||||
fun_label = leaf_node_d[ ( lexeme_d[ "FUN" >> +digit_p ] ) ];
|
||||
|
||||
parameter = leaf_node_d[ ( lexeme_d[ "PAR" >> +digit_p ] ) |
|
||||
@ -110,6 +119,9 @@ struct PFunctionGrammar : public grammar<PFunctionGrammar>
|
||||
factor = real
|
||||
| const_pi
|
||||
| const_gamma_mu
|
||||
| const_field
|
||||
| const_energy
|
||||
| const_temp
|
||||
| parameter
|
||||
| map
|
||||
| function
|
||||
@ -134,6 +146,9 @@ struct PFunctionGrammar : public grammar<PFunctionGrammar>
|
||||
BOOST_SPIRIT_DEBUG_RULE(real);
|
||||
BOOST_SPIRIT_DEBUG_RULE(const_pi);
|
||||
BOOST_SPIRIT_DEBUG_RULE(const_gamma_mu);
|
||||
BOOST_SPIRIT_DEBUG_RULE(const_field);
|
||||
BOOST_SPIRIT_DEBUG_RULE(const_energy);
|
||||
BOOST_SPIRIT_DEBUG_RULE(const_temp);
|
||||
BOOST_SPIRIT_DEBUG_RULE(fun_label);
|
||||
BOOST_SPIRIT_DEBUG_RULE(parameter);
|
||||
BOOST_SPIRIT_DEBUG_RULE(map);
|
||||
@ -154,6 +169,9 @@ struct PFunctionGrammar : public grammar<PFunctionGrammar>
|
||||
rule<ScannerT, parser_context<>, parser_tag<mapID> > map;
|
||||
rule<ScannerT, parser_context<>, parser_tag<parameterID> > parameter;
|
||||
rule<ScannerT, parser_context<>, parser_tag<funLabelID> > fun_label;
|
||||
rule<ScannerT, parser_context<>, parser_tag<constTempID> > const_temp;
|
||||
rule<ScannerT, parser_context<>, parser_tag<constEnergyID> > const_energy;
|
||||
rule<ScannerT, parser_context<>, parser_tag<constFieldID> > const_field;
|
||||
rule<ScannerT, parser_context<>, parser_tag<constGammaMuID> > const_gamma_mu;
|
||||
rule<ScannerT, parser_context<>, parser_tag<constPiID> > const_pi;
|
||||
rule<ScannerT, parser_context<>, parser_tag<realID> > real;
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -51,7 +51,7 @@ class PFunctionHandler
|
||||
virtual Bool_t IsValid() { return fValid; }
|
||||
virtual Bool_t DoParse();
|
||||
virtual Bool_t CheckMapAndParamRange(UInt_t mapSize, UInt_t paramSize);
|
||||
virtual double Eval(Int_t funNo, std::vector<Int_t> map, std::vector<double> param);
|
||||
virtual double Eval(Int_t funNo, std::vector<Int_t> map, std::vector<double> param, PMetaData metaData);
|
||||
virtual Int_t GetFuncNo(UInt_t idx);
|
||||
virtual Int_t GetFuncIndex(Int_t funcNo);
|
||||
virtual UInt_t GetNoOfFuncs() { return fFuncs.size(); }
|
||||
|
@ -8,7 +8,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007-2019 by Andreas Suter *
|
||||
* Copyright (C) 2007-2020 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@ -66,6 +66,8 @@ class PMsrHandler
|
||||
|
||||
virtual TString* GetMsrFileDirectoryPath() { return &fMsrFileDirectoryPath; }
|
||||
|
||||
virtual UInt_t GetNoOfRuns() { return fRuns.size(); }
|
||||
|
||||
virtual UInt_t GetNoOfParams() { return fParam.size(); }
|
||||
virtual const TString& GetFileName() const { return fFileName; }
|
||||
|
||||
@ -91,9 +93,8 @@ class PMsrHandler
|
||||
virtual UInt_t GetFuncIndex(Int_t funNo) { return fFuncHandler->GetFuncIndex(funNo); }
|
||||
virtual Bool_t CheckMapAndParamRange(UInt_t mapSize, UInt_t paramSize)
|
||||
{ return fFuncHandler->CheckMapAndParamRange(mapSize, paramSize); }
|
||||
virtual Double_t EvalFunc(UInt_t i, std::vector<Int_t> map, std::vector<Double_t> param)
|
||||
{ return fFuncHandler->Eval(i,map,param); }
|
||||
|
||||
virtual Double_t EvalFunc(UInt_t i, std::vector<Int_t> map, std::vector<Double_t> param, PMetaData metaData)
|
||||
{ return fFuncHandler->Eval(i, map, param, metaData); }
|
||||
virtual UInt_t GetNoOfFitParameters(UInt_t idx);
|
||||
virtual Int_t ParameterInUse(UInt_t paramNo);
|
||||
virtual Bool_t CheckRunBlockIntegrity();
|
||||
|