115 Commits
dks6 ... v1.7.1

Author SHA1 Message Date
cac1415c3e update of the docu. 2021-04-09 15:41:52 +02:00
692e7e44db propagate ROOT_GRTEQ_24 properly to the compile options. 2021-04-09 11:08:35 +02:00
911c31fb1e applies already for 6.24-rc which is 6.23.99, hence the odd adaptation. 2021-04-09 11:07:14 +02:00
c06f510aff changes needed since upcoming ROOT6.24 (minuit2) will break the backward compatibility. 2021-04-09 10:03:34 +02:00
38b289b99f add ROOT version information for better diagnostics. 2021-04-09 09:33:08 +02:00
7089e4b3d6 switched libPhotoMeissner to the new centralized PRgeHandler. 2021-04-01 20:41:00 +02:00
7de55705d2 slightly more modern c++ init style. 2021-04-01 20:38:32 +02:00
56f094dad0 slightly improved the rge handler. 2021-04-01 20:37:08 +02:00
cab8703f85 fix an error number of theory points for the view data. 2021-04-01 20:30:53 +02:00
72c085a0a8 make PRgeHandler to a shared libs. Adopted Nonlocal and PMagProximity accordingly. 2021-04-01 14:26:26 +02:00
113996aa4e changed the user function for nonlocal fitting to the new rge-handler. This breaks the backwards compatibility! 2021-03-30 15:48:51 +02:00
cb0e8d2e65 update of the ChangeLog. 2021-03-30 15:43:26 +02:00
0dc1c4d975 add some boost component checks. Increase the musrfit version number. 2021-03-30 15:41:38 +02:00
21213a45eb add a central rge-handler which can be used by all user function classes. 2021-03-30 15:39:45 +02:00
e6e951e8f4 update the copyright info. 2021-03-29 08:22:38 +02:00
551fa4e4a6 refresh of the setup docu. 2021-03-01 15:40:10 +01:00
6d61cfd4d9 modernized the msr input file. 2021-02-26 15:18:12 +01:00
cc8ac60713 by changing the behaviour of the global parts of the class PUserFcnBase from pure virtual default NeedGlobalPart=false, the code can be simplified in many places. 2021-02-26 15:17:41 +01:00
1372a8b782 xml schema more flexible about the order of 'histos' and 'RunHeader' 2021-02-18 14:59:35 +01:00
27607a2fa1 fix of a typo. 2021-02-18 11:56:39 +01:00
88b4e7600d fixed wrong casting originating from a copy/paste error. 2021-02-18 11:55:34 +01:00
01ce90e97e better version for icons under macosx. 2021-02-16 20:46:52 +01:00
457adc7e7e add macOS BigSur icon to musredit. 2021-02-14 22:13:40 +01:00
90fb81f16a add new method GetTypeOfPath to TMusrRunHeader. It allows deduce the type of a given path-name. 2021-02-06 19:05:40 +01:00
bfd7229252 Merge branch 'root6' of https://git.psi.ch/nemu/musrfit into root6 2021-01-26 10:33:13 +01:00
f9581ae9d5 fix typo. Increase minimal root version from rpm. 2021-01-26 10:21:06 +01:00
cd785b8e5d update of the docu. 2021-01-23 15:58:04 +01:00
9cc9792054 some bug fixing in the cmake chain concerning the new Qt6 stuff. 2021-01-23 10:21:55 +01:00
ad9cf0abf9 remove comment. 2021-01-22 22:25:43 +01:00
5dcc962351 add first Qt6 version of musredit, mupp, etc. 2021-01-22 22:04:11 +01:00
386217b1fe add proper p-wave (line,point) superfluid density calculation. 2020-12-28 15:13:45 +01:00
12c2e5f7a4 fix minor '=' vs '==' bug. 2020-12-26 11:59:52 +01:00
daef50e35a adjust to Qt 5.14.x; remove compiler warnings. 2020-12-22 22:36:07 +01:00
04fff97704 The musredit help system is using now the system default web-browser. This simplifies things, especially the qtwebengine package is not needed anymore. 2020-12-22 17:31:42 +01:00
20d9794db2 replaced 3D description. The previous was just wrong! 2020-11-19 10:42:12 +01:00
ba7665c85f increment libGapIntegrals version number 2020-11-04 15:10:02 +01:00
32cf3221d9 BMWlibs: add two p-wave gap funtions which can be used to evaluate the superfluid density. 2020-11-04 15:03:58 +01:00
6ef53c6b6a remove redundant check from musredit/fileSaveAs 2020-09-10 15:23:27 +02:00
18424fe149 musredit: if save cannot write file, popup an error message dialog. 2020-09-10 15:04:19 +02:00
6747e5c1ca added a missing check in Fourier difference handling. 2020-09-01 15:06:33 +02:00
66f3b48e2a musrview gets the new feature: calculate theory points only at data points. 2020-08-29 11:15:02 +02:00
33fe4ee5fb moved fTriggerColor toggle state to the proper position. 2020-07-28 08:50:59 +02:00
0e2d880249 A single asymmetry plot allows to toggle the color of the theory function line by the key 't'. 2020-07-27 18:36:27 +02:00
be8689853b musredit: check if system variables ROOTSYS and MUSRFITPATH are set, and if not popup a warning. 2020-07-12 11:24:57 +02:00
a81515cb95 add another startup check which makes sure that musrfit is found by musredit. 2020-07-11 19:55:11 +02:00
a09d6878f2 make more function available to mupp (sinh, .., asin, .., and sqrt) 2020-06-20 09:44:14 +02:00
5ec1228ea6 replaced obsolete QXmlDefaultHandler by QXmlStreamReader in musrWiz. 2020-06-18 22:35:29 +02:00
8ecac5fd57 replaced obsolete QXmlDefaultHandler by QXmlStreamReader in PChangeDefaultPathsDialog. 2020-06-18 20:44:08 +02:00
35760525bb replaced obsolete QXmlDefaultHandler by QXmlStreamReader in mupp 2020-06-18 20:24:31 +02:00
c42bbd16f3 replaced obsolete QXmlDefaultHandler by QXmlStreamReader in musredit. 2020-06-18 18:46:03 +02:00
4661dee936 update of the docu - describe meta info access in functions. 2020-06-17 20:22:42 +02:00
7b6180a688 Functions can now not only operate on parameters and maps but also on meta information
obtained from the data files. Currently the following meta information can be accessed
if available:
field in (G): B or b
energy in (keV): En or en
temperature in (K): since some data files contain a vector of temperature, they have
                    to be accessed with an index, like T0 or t0, etc.
2020-06-17 19:31:31 +02:00
602a5a4e6c add field, temperature values from meta-data of the data-files to the runs. This will be needed if functions want to access this information (not yet implemented). 2020-06-13 16:13:44 +02:00
f03b918840 add minimum size to musredit help. 2020-06-08 18:35:19 +02:00
07a3de1ed4 fixed double newline with alpha and beta, accidentally introduced. 2020-05-26 16:06:46 +02:00
58461bf013 updated the docu and adopted the ChangLog 2020-05-25 16:27:18 +02:00
c930298972 allow alpha, beta in the RUN block being expressed via a function. 2020-05-25 16:21:16 +02:00
9af6b1fb8e make some cmake/boost/compiler combinations happy. 2020-05-19 15:44:37 +02:00
815ca7162f fixed some doxygen bugs in the technical docu. 2020-05-19 15:33:21 +02:00
5ee3b17953 updated the technical documentation. 2020-05-19 14:17:18 +02:00
f2a598f512 mupp add var: check if a variable for a given collection already exists, and if yes, replace it, otherwise add the new variable. 2020-05-17 16:07:52 +02:00
48d531f90f update of the docu. 2020-05-15 21:46:12 +02:00
cf0ab74ba7 release new version 1.6.0 2020-05-15 21:19:26 +02:00
eac9a8adc9 update of the docu for version 1.6.0 2020-05-15 21:17:32 +02:00
a200c184cb add more comments to the mupp script. 2020-05-14 20:34:05 +02:00
48a2ff632e fixed a typo. 2020-05-14 20:33:11 +02:00
29428ec1bf removed obsolete debug information/comments. 2020-05-14 15:50:50 +02:00
68ce56c7db add FindHDF4.cmake to musrfit since in more modern linux systems it is not available anymore. 2020-05-14 15:49:18 +02:00
5779a24b3e add missing varEdit icons. 2020-05-14 11:20:18 +02:00
651e24721f made the PmuppGui class ready for interactive variable handling. 2020-05-14 11:10:36 +02:00
df88345c55 fixed a signal emit error. Automatically select the first collection at startup. This way at least one collection is already selected. 2020-05-14 11:09:29 +02:00
1a2853e548 mupp: worked on the doxygen docu. 2020-05-11 20:20:23 +02:00
f19a94651b work an interactive variable definition in mupp. Up to checking it is already working. Add variable still missing. 2020-05-11 16:09:13 +02:00
867246874b make the version information more coherent. 2020-05-02 17:05:04 +02:00
a91002f807 remove accidental left-over debug info. 2020-05-02 14:47:13 +02:00
884e0270a1 lift the mupp version to 1.0 2020-05-02 14:29:37 +02:00
40fcc228fa add a dark_theme flag to the mupp_startup.xml. This is can help if mupp at runtime cannot decide on the used theme. 2020-05-02 14:29:04 +02:00
6d0666f285 add empty constructor. 2020-04-30 17:37:52 +02:00
5755331273 add missing files. 2020-04-30 17:20:38 +02:00
d81a10e450 first full mupp version allowing variables on scripting level, interactively still missing. 2020-04-30 17:11:57 +02:00
f4ac06cb20 add another mupp example. 2020-04-29 17:11:49 +02:00
74cfa3ecbf more work on var handling. Inject collection variables. 2020-04-29 17:10:24 +02:00
29064c44be add skeleton for variable handling. 2020-04-29 14:13:23 +02:00
10271dab9a update of the copyright info. 2020-04-29 09:05:40 +02:00
41b4b61f1b update of the copyright info. 2020-04-29 08:51:03 +02:00
cce7a6bcd0 improved syntax messages. 2020-04-28 16:25:48 +02:00
a4eb96a4a9 changed to explicit std namespace. 2020-04-28 12:08:21 +02:00
572e0f96a5 changed to explicit std namespace. 2020-04-28 12:07:10 +02:00
4ebb5bb377 allow to remove x/y entries from the command line. 2020-04-28 10:17:38 +02:00
32ed8d4df2 work on the scripting part of mupp. Preparing for the step of parameter transformation. 2020-04-23 16:35:55 +02:00
83c4bff123 improved error messages for NeXus file reading. Especially for the case of HDF4/HDF5 <-> NeXus version issues. 2020-04-11 21:21:33 +02:00
90db9144fe fixes issue #24 reported on bitbucket. 2020-04-10 11:30:34 +02:00
e705ba5d9a remove unused variable. 2020-04-10 11:27:42 +02:00
38ffcb3104 allow to plot normalize data in mupp 2020-04-05 08:28:35 +02:00
54fee067df little extension which allows to normalize plots. Only dialogs added so far, no functionality yet. 2020-04-04 20:26:29 +02:00
2035ae5ede Merge branch 'root6' of https://git.psi.ch/nemu/musrfit into root6 2020-02-16 17:20:23 +01:00
520ff84941 vortex film GL test: starting point. 2020-02-16 17:18:42 +01:00
de04b3f036 eventHandler test cleanup. Furthermore move make -> cmake. 2020-02-15 16:31:41 +01:00
785b32e945 proper cleanup. 2020-02-10 08:57:35 +01:00
5232349ad1 updated to the new musrfit and doxygen version. 2020-02-05 15:03:47 +01:00
c3e3af0311 update of the docu including the SECTOR cmd. 2020-02-04 19:37:31 +01:00
e9247ed3d5 increment version. 2020-02-03 21:03:45 +01:00
fe7a1b7920 first full implementation of the sector command. 2020-02-03 20:54:23 +01:00
1fb1753d82 more work on the SECTOR command. CalcNoOfFitBins() needed to be changed from protected to public. 2020-02-02 17:12:08 +01:00
ed0bfd516b started to implement a chisq/maxLH sector command. Currently only the skeleton is in place. 2020-01-31 16:39:52 +01:00
513144997e updated docu 2020-01-31 07:50:50 +01:00
55b681acc1 replaced decrepitated OS system check under Qt. The new version works for Qt >= 5.4 which should cover everything still alive. 2019-11-22 18:15:09 +01:00
c71fc92cf0 fixed some minor typos in the docu. 2019-11-11 12:57:06 +01:00
af5a6e37d1 slightly improved call-up of mupp from musredit. If cancelling the db-dialog mupp will quit, but only at startup. 2019-11-09 09:27:42 +01:00
ca5bbbe1e0 Added explicitly CMP0075 policy in order to get rid of an unnessary warning. 2019-11-08 20:25:49 +01:00
921b8bbab4 fixed a bug in the global+ option of msr2data if a global section is present. 2019-11-08 12:23:27 +01:00
503336e685 also allow to add an offset. 2019-10-24 13:02:34 +02:00
2650c7d12b allow to change the power N for 2^N elements. 2019-10-24 12:39:11 +02:00
b3d9345def Merge https://gitlab.psi.ch/nemu/musrfit into root6 2019-10-24 07:49:13 +02:00
b29d85dd4c fix for the case that a global section is present. 2019-09-23 13:53:19 +02:00
666 changed files with 80875 additions and 16429 deletions

View File

@ -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.7.1 LANGUAGES C CXX)
#--- musrfit specific options -------------------------------------------------
option(nexus "build optional NeXus support. Needed for ISIS" OFF)
@ -78,8 +82,22 @@ if (ROOT_mathmore_FOUND)
include(${ROOT_USE_FILE})
endif (ROOT_mathmore_FOUND)
#--- the next check is need to set a flag, since root 6.24 (minuit2) breaks
#--- the backwards compatibility. ---------------------------------------------
if (ROOT_VERSION VERSION_LESS "6.23")
set(ROOT_GRTEQ_24 0)
else ()
set(ROOT_GRTEQ_24 1)
endif ()
set(ROOT_GRTEQ_24 ${ROOT_GRTEQ_24} CACHE INTERNAL "ROOT Version check")
#--- check for boost ----------------------------------------------------------
find_package(Boost REQUIRED)
find_package(Boost REQUIRED
COMPONENTS
system
filesystem
)
message(STATUS "Boost libs: ${Boost_LIBRARIES}")
#--- check for gsl ------------------------------------------------------------
find_package(GSL REQUIRED)
@ -109,49 +127,60 @@ endif (try_OpenMP AND NOT APPLE)
if (qt_based_tools)
# check for any Qt, i.e. AUTO
if (qt_version STREQUAL AUTO)
# first try Qt5
# Find the QtCore library
find_package(Qt5Core)
if (Qt5Core_FOUND)
# Find the QtWidgets library
find_package(Qt5Widgets CONFIG REQUIRED)
# Find the QtXml library
find_package(Qt5Xml CONFIG REQUIRED)
# Find the QtNetwork library
find_package(Qt5Network CONFIG REQUIRED)
# Find the QtSvg library
find_package(Qt5Svg CONFIG REQUIRED)
# Fing the QtPrintSupport
find_package(Qt5PrintSupport CONFIG REQUIRED)
endif (Qt5Core_FOUND)
# try Qt6
find_package(Qt6Core QUIET)
if (Qt6Core_FOUND)
find_package(Qt6Widgets CONFIG REQUIRED)
find_package(Qt6Xml CONFIG REQUIRED)
find_package(Qt6Network CONFIG REQUIRED)
find_package(Qt6Svg CONFIG REQUIRED)
find_package(Qt6PrintSupport CONFIG REQUIRED)
endif (Qt6Core_FOUND)
# try Qt5
if (NOT Qt6Core_FOUND)
find_package(Qt5Core QUIET)
if (Qt5Core_FOUND)
find_package(Qt5Widgets CONFIG REQUIRED)
find_package(Qt5Xml CONFIG REQUIRED)
find_package(Qt5Network CONFIG REQUIRED)
find_package(Qt5Svg CONFIG REQUIRED)
find_package(Qt5PrintSupport CONFIG REQUIRED)
endif (Qt5Core_FOUND)
endif (NOT Qt6Core_FOUND)
# if Qt5 is not found, try Qt4
if (NOT Qt5Core_FOUND)
# if Qt6 and Qt5 is not found, try Qt4
if (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND)
find_package(Qt4 COMPONENTS QtGui QtWebKit QtXml)
endif (NOT Qt5Core_FOUND)
endif (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND)
# if Qt5 and Qt4 is not found try Qt3. Hopefully you never reach this point
if (NOT Qt5Core_FOUND)
if (NOT Qt4_FOUND)
find_package(Qt3)
endif (NOT Qt4_FOUND)
endif (NOT Qt5Core_FOUND)
# if Qt6, Qt5 and Qt4 is not found try Qt3. Hopefully you never reach this point
if (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND AND Qt4_FOUND)
find_package(Qt3)
endif (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND AND Qt4_FOUND)
endif (qt_version STREQUAL AUTO)
# check specifically for Qt5
# check specifically for Qt6
if (qt_version STREQUAL 6)
find_package(Qt6Core)
if (Qt6Core_FOUND)
find_package(Qt6Widgets CONFIG REQUIRED)
find_package(Qt6Xml CONFIG REQUIRED)
find_package(Qt6Network CONFIG REQUIRED)
find_package(Qt6Svg CONFIG REQUIRED)
find_package(Qt6PrintSupport CONFIG REQUIRED)
else (Qt6Core_FOUND)
message(FATAL_ERROR "Couldn't find the specifically requested Qt6 version.")
endif (Qt6Core_FOUND)
endif (qt_version STREQUAL 6)
# check specifically for Qt5
if (qt_version STREQUAL 5)
# Find the QtCore library
find_package(Qt5Core)
if (Qt5Core_FOUND)
# Find the QtWidgets library
find_package(Qt5Widgets CONFIG REQUIRED)
# Find the QtXml library
find_package(Qt5Xml CONFIG REQUIRED)
# Find the QtNetwork library
find_package(Qt5Network CONFIG REQUIRED)
# Find the QtSvg library
find_package(Qt5Svg CONFIG REQUIRED)
# Fing the QtPrintSupport
find_package(Qt5PrintSupport CONFIG REQUIRED)
else (Qt5Core_FOUND)
message(FATAL_ERROR "Couldn't find the specifically requested Qt5 version.")
@ -178,8 +207,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,24 +254,28 @@ 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)
message("")
if (qt_based_tools)
if (Qt5Core_FOUND)
message(" Qt found in ${Qt5Core_INCLUDE_DIRS} (Version: ${Qt5Core_VERSION})")
else (Qt5Core_FOUND)
if (Qt4_FOUND)
message(" Qt found (Version: ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH})")
else (Qt4_FOUND)
if (QT_FOUND)
message(" Qt found (Version: ${QT_VERSION})")
endif (QT_FOUND)
endif (Qt4_FOUND)
endif (Qt5Core_FOUND)
if (Qt6Core_FOUND)
message(" Qt found in ${Qt6Core_INCLUDE_DIRS} (Version: ${Qt6Core_VERSION})")
else (Qt6Core_FOUND)
if (Qt5Core_FOUND)
message(" Qt found in ${Qt5Core_INCLUDE_DIRS} (Version: ${Qt5Core_VERSION})")
else (Qt5Core_FOUND)
if (Qt4_FOUND)
message(" Qt found (Version: ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH})")
else (Qt4_FOUND)
if (QT_FOUND)
message(" Qt found (Version: ${QT_VERSION})")
endif (QT_FOUND)
endif (Qt4_FOUND)
endif (Qt5Core_FOUND)
endif (Qt6Core_FOUND)
endif (qt_based_tools)
message("")
message(" Features:")
@ -281,25 +313,27 @@ else (BNMRlibs)
endif (BNMRlibs)
if (qt_based_tools)
if (Qt5Core_FOUND)
if (Qt6Core_FOUND)
message("")
message(" Qt6 based tools:")
message(" musredit, musrStep, musrWiz, mupp : yes")
elseif (Qt5Core_FOUND)
message("")
message(" Qt5 based tools:")
message(" musredit, musrStep, musrWiz, mupp : yes")
endif (Qt5Core_FOUND)
if (Qt4_FOUND)
elseif (Qt4_FOUND)
message("")
message(" Qt4 based tools (deprecated):")
message(" musredit : yes")
endif (Qt4_FOUND)
if (QT_FOUND)
else ()
message("")
message(" Qt3 based tools (outdated):")
message(" musrgui : yes")
endif (QT_FOUND)
if (NOT Qt5Core_FOUND AND NOT Qt4_FOUND AND NOT QT_FOUND)
endif ()
if (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND AND NOT Qt4_FOUND AND NOT QT_FOUND)
message("")
message(" NO Qt based tools will be installed since Qt is not found or not installed on the system")
endif (NOT Qt5Core_FOUND AND NOT Qt4_FOUND AND NOT QT_FOUND)
endif (NOT Qt6Core_FOUND AND NOT Qt5Core_FOUND AND NOT Qt4_FOUND AND NOT QT_FOUND)
else (qt_based_tools)
message("")
message(" Qt based tools (musredit, musrStep, musrWiz, mupp) have been disabled")

View File

@ -12,6 +12,53 @@ or
https://bitbucket.org/muonspin/musrfit/commits/all
Release of V1.7.0, 2021/03/30
=============================
Centralize the rge-handling for user functions.
Release of V1.6.5, 2021/01/22
=============================
Add Qt6 version of musredit, mupp, etc.
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
=============================

View File

@ -24,12 +24,12 @@ set (CPACK_SET_DESTDIR "OFF")
set (CPACK_PACKAGE_RELOCATABLE "true")
if (${CPACK_GENERATOR} STREQUAL "RPM")
set (CPACK_RPM_PACKAGE_REQUIRES "root >= 6.16.00")
set (CPACK_RPM_PACKAGE_REQUIRES "root >= 6.22.00")
set (CPACK_INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@")
set (CPACK_PACKAGING_INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@")
set (CPACK_RPM_FILE_NAME "RPM-DEFAULT")
set (CPACK_RPM_PACKAGE_RELEASE "1")
# next variable for RHEL, CentOS, Fedfora
# next variable for RHEL, CentOS, Fedora
set (CPACK_RPM_PACKAGE_RELEASE_DIST "")
set (CPACK_RPM_PACKAGE_LICENSE "GPLv2")
set (CPACK_RPM_PACKAGE_VENDOR "Paul Scherrer Institute - LMU - LEM")

97
cmake/FindHDF4.cmake Normal file
View 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})

View File

@ -1,6 +1,10 @@
// config.h
#define PACKAGE_VERSION "@PROJECT_VERSION@"
#define ROOT_VERSION_USED "@ROOT_VERSION@"
// define to 1 if minor ROOT6 version is >= 24
#define ROOT_GRTEQ_24 @ROOT_GRTEQ_24@
// define to 1 if you have <alloca.h> and it should be used
#cmakedefine HAVE_ALLOCA_H 1

View File

@ -1,13 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<nonlocal xmlns="http://nemu.web.psi.ch/musrfit/nonlocal">
<comment>
$Id: nonlocal_startup.xml 4047 2009-07-02 13:36:18Z nemu $
nonlocal_startup.xml
</comment>
<nonlocal_par>
<fourier_points>262144</fourier_points>
</nonlocal_par>
<trim_sp_part>
<data_path>profiles/Sn_E</data_path>
<trim_sp>
<data_path>./profiles/</data_path>
<rge_fln_pre>Sn_E</rge_fln_pre>
<energy_list>
<energy>1000</energy>
<energy>2000</energy>
@ -22,5 +23,5 @@
<energy>25000</energy>
<energy>27300</energy>
</energy_list>
</trim_sp_part>
</trim_sp>
</nonlocal>

View File

@ -4,21 +4,21 @@ FITPARAMETER
# Nr. Name Value Step Pos_Error Boundaries
1 one 1 0 none
2 zero 0 0 none
3 Asy 0.2235 -0.0066 0.0072 0 0.33
4 energy 22 0 none
3 Asy 0.2235 -0.0065 0.0072 0 0.33
4 energy 22000 0 none
5 redTemp 0.8683 0 none
6 thickness 5000 0 none
7 ell 12000 0 none
8 xi 94 0 none
9 lambdaL 52.5 -1.4 1.2
9 lambdaL 52.5 -1.3 1.2
10 Bext 47.11 0 none
11 deadLayer 0.00052 -0.00052 6.89563 0 none
11 deadLayer 0.0004 0.0037 none 0 none
12 RateSmear 0.418 -0.015 0.015
13 N0_L 301.61 0.62 none
14 Bkg_L 24.442 0.076 none
13 N0_L 301.6 -1.1 1.2
14 Bkg_L 24.441 -0.092 0.092
15 Phase_L 42.0 -2.2 2.2
16 Alpha_LR 1.0614 -0.0066 0.0064
17 Bkg_R 27.646 -0.090 0.090
16 Alpha_LR 1.0613 -0.0066 0.0064
17 Bkg_R 27.646 -0.089 0.090
18 RelPhase_R 154.4 -1.1 1.1
###############################################################
@ -37,7 +37,6 @@ RUN data/lem10_his_0825 MUE4 PSI ROOT-NPP (name beamline institute data-file-f
fittype 0 (single histogram fit)
norm 13
backgr.fit 14
lifetimecorrection
map 1 2 0 0 0 0 0 0 0 0
forward 1
data 3289 65000
@ -49,7 +48,6 @@ RUN data/lem10_his_0825 MUE4 PSI ROOT-NPP (name beamline institute data-file-f
fittype 0 (single histogram fit)
norm fun1
backgr.fit 17
lifetimecorrection
map 16 18 0 0 0 0 0 0 0 0
forward 3
data 3289 65000
@ -69,23 +67,27 @@ SAVE
###############################################################
PLOT 0 (single histo plot)
lifetimecorrection
runs 1 2
range 0 9 -0.3 0.3
view_packing 500
###############################################################
FOURIER
units Gauss # units either 'Gauss', 'MHz', or 'Mc/s'
units Gauss # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s'
fourier_power 10
apodization STRONG # NONE, WEAK, MEDIUM, STRONG
plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE
plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL
phase 8.5
#range_for_phase_correction 50.0 70.0
range 0.0 200.0
range 0 200
###############################################################
STATISTIC --- 2014-11-05 12:34:54
maxLH = 415.6, NDF = 358, maxLH/NDF = 1.160933
STATISTIC --- 2021-03-30 15:04:30
maxLH = 415.6, NDF = 358, maxLH/NDF = 1.160942
expected maxLH = 418.1, NDF = 358, expected maxLH/NDF = 1.168011
run block 1: (NDF/red.maxLH/red.maxLH_e) = (177/1.072511/1.087460)
run block 2: (NDF/red.maxLH/red.maxLH_e) = (175/1.290186/1.289528)

View File

@ -2,23 +2,23 @@ LSCO x=0.195 single
###############################################################
FITPARAMETER
# No Name Value Step Pos_Error Boundaries
1 phase 8.09 0.30 none
2 field 107.08786 0.00052 none
3 lambda 195.5703 0.0029 none 1 none
1 phase 10.34 0.21 none
2 field 112.82363 0.00033 none
3 lambda 170.4570 0.0022 none 1 none
4 xi 4 0 none 0 10
5 asym1 0.1980 0.0011 none 0 0.3
6 rate1 0.7697 0.0063 none
5 asym1 0.19219 -0.00079 0.00079 0 0.3
6 rate1 0.7955 0.0043 none
7 asymBg 0 0 none 0 0.3
8 rateBg 0 0 none 0 none
9 N01 3311.3 1.7 none 0 none
10 bg1 68.70 0.30 none 0 none
11 N02 3577.8 1.7 none 0 none
12 bg2 69.62 0.31 none 0 none
13 relphase 181.63 0.41 none 150 210
9 N01 3313.6 1.2 none 0 none
10 bg1 68.54 0.21 none 0 none
11 N02 3575.9 1.2 none 0 none
12 bg2 69.82 0.22 none 0 none
13 relphase 181.46 0.29 none 150 210
14 zero 0 0 none
15 relasy 1.0325 0.0075 none
15 relasy 1.0365 0.0051 none
16 one 1 0 none
###############################################################
@ -39,52 +39,51 @@ fun3 = par5 * map2
fun4 = par7 * map2
###############################################################
RUN data/deltat_pta_gps_3093 PIM3 PSI PSI-BIN (name beamline institute data-file-format)
GLOBAL
fittype 0 (single histogram fit)
fit 0 8
packing 30
###############################################################
RUN data/deltat_pta_gps_3093 PIM3 PSI PSI-BIN (name beamline institute data-file-format)
map 14 16 0 0 0 0 0 0 0 0
forward 3
norm 9
lifetimecorrection
backgr.fit 10
t0 125.0
data 128 8001
fit 0 8
packing 30
RUN data/deltat_pta_gps_3093 PIM3 PSI PSI-BIN (name beamline institute data-file-format)
fittype 0 (single histogram fit)
map 13 15 0 0 0 0 0 0 0 0
forward 4
norm 11
lifetimecorrection
backgr.fit 12
t0 124.0
data 127 8000
fit 0 8
packing 30
###############################################################
COMMANDS
MAX_LIKELIHOOD
MINIMIZE
#MIGRAD
HESSE
#MINOS
MINOS
SAVE
###############################################################
FOURIER
units Gauss # units either 'Gauss', 'MHz', or 'Mc/s'
units Gauss # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s'
fourier_power 9
apodization NONE # NONE, WEAK, MEDIUM, STRONG
plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE
plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL
phase par1
range 0 500
###############################################################
PLOT 0 (single histo plot)
lifetimecorrection
runs 1 2
range 0 4 -0.25 0.25
###############################################################
STATISTIC --- 2013-05-03 09:08:20
chisq = 1200.8, NDF = 415, chisq/NDF = 2.893391
STATISTIC --- 2021-02-26 14:54:47
maxLH = 1497.5, NDF = 415, maxLH/NDF = 3.608471

View File

@ -4,19 +4,19 @@ FITPARAMETER
# No Name Value Step Pos_Error Boundaries
1 field 94.717 0 none
2 deadlayer 10.5 0 none
3 lambda 115.96 -0.92 0.88
3 lambda 115.98 -0.65 0.63
# E = 22keV
4 phase22 25.4956 0 none
5 asym22 0.1047 -0.0029 0.0030 0 0.3
6 rate22 0.559 -0.032 0.033
7 NormL22 753.00 -0.86 0.87
8 BGL22 51.08 -0.13 0.13
9 NormR22 545.93 -0.77 0.76
10 BGR22 38.60 -0.11 0.12
11 relasyR22 1.068 -0.038 0.039 0.2 2
12 relphaR22 162.8 -1.5 1.5 110 210
5 asym22 0.1047 -0.0021 0.0021 0 0.3
6 rate22 0.558 -0.023 0.023
7 NormL22 752.98 -0.61 0.61
8 BGL22 51.114 -0.094 0.094
9 NormR22 545.95 -0.54 0.54
10 BGR22 38.634 -0.082 0.082
11 relasyR22 1.068 -0.027 0.027 0.2 2
12 relphaR22 162.8 -1.1 1.1 110 210
13 energy22 22 0 none
14 one 1 0 none
@ -35,53 +35,48 @@ fun2 = map1 + map5
fun3 = par1 * gamma_mu
###############################################################
RUN data/lem09_his_0916 MUE4 PSI ROOT-NPP (name beamline institute data-file-format)
GLOBAL
fittype 0 (single histogram fit)
norm 7
backgr.fit 8
lifetimecorrection
map 4 5 6 14 15 13 0 0 0 0
forward 1
background 65000 66500
data 3419 63000
t0 3419.0
fit 0.15 10
packing 150
RUN data/lem09_his_0916 MUE4 PSI ROOT-NPP (name beamline institute data-file-format)
fittype 0 (single histogram fit)
norm 9
backgr.fit 10
lifetimecorrection
map 4 5 6 11 12 13 0 0 0 0
forward 3
background 65000 66500
data 3419 63000
t0 3419.0
fit 0.15 10
packing 150
###############################################################
RUN data/lem09_his_0916 MUE4 PSI ROOT-NPP (name beamline institute data-file-format)
norm 7
backgr.fit 8
map 4 5 6 14 15 13 0 0 0 0
forward 1
RUN data/lem09_his_0916 MUE4 PSI ROOT-NPP (name beamline institute data-file-format)
norm 9
backgr.fit 10
map 4 5 6 11 12 13 0 0 0 0
forward 3
###############################################################
COMMANDS
#MAX_LIKELIHOOD
MAX_LIKELIHOOD
MINIMIZE
MINOS
SAVE
###############################################################
FOURIER
units Gauss # units either 'Gauss', 'MHz', or 'Mc/s'
units Gauss # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s'
fourier_power 10
apodization WEAK # NONE, WEAK, MEDIUM, STRONG
plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE
plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL
phase par4
range 0 200
###############################################################
PLOT 0 (single histo plot)
runs 1 2
lifetimecorrection
runs 1 2
range 0 4 -0.25 0.25
###############################################################
STATISTIC --- 2013-11-12 10:25:11
chisq = 696.9, NDF = 663, chisq/NDF = 1.051076
STATISTIC --- 2021-02-26 14:50:08
maxLH = 695.5, NDF = 663, maxLH/NDF = 1.049008

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2016 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2016 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -1,4 +0,0 @@
# 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
tags: 645f666f9bcd5a90fca523b33c5a78b7

View 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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
ZDJZcuTIYb18+bLm5eWl5ciRQytRooQ2evToFIOQX9ihJkIIIYQQQvybSPAWQgghhBAiA0jwFkII
IYQQIgNI8BZCCCGEECIDSPAWQgghhBAiA0jwFkIIIYQQIgNI8BZCCCGEECIDSPAWQgghhBAiA0jw
FkIIIYQQIgNI8BZCCCGEECID6J0LXgiemfDsNgf0Ls41QgghhBBCpEkzJxAzoyvERzpX/eNeyODt
2W02D36ZRNyxLc5VQgghhBBCpMn9f/XJ3HMOMRPfd676x72YQ030rhK6hRBCCCHEU4s9sgXF8GKO
mngxg7cQQgghhBD/MhK8hRBCCCGEyAASvIUQQgghhMgAEryFEEIIIYTIABK8hRBCCCGEyAASvJ9S
j+7d+PKLsc7F4l8iIKACCxfMcy5O09Ili2jSuJFzcbo97faet7S2X6pkSVq2aOFc/EQBARXYuvlX
5+J/FaPRyNrVv5A/Xz7nqn+Ut7c3G9atwdvb27nqX+Xr8eNo3Mjxd+7dd1oxcsRwh7J/wouyH0KI
F9cLeR3vf1L+/Pnp9UlPypQug4eHOyEhoRw/cZxRoz8HYM/evXh6eDotlbEqV6pE584dKeTnB8Ct
27dZv2Ejy5Ytt7cpUbw4HTt8RJkypXF3dyc4OJjde/aw9PsfePAg3N7OmYuLC2NGjaRo0aLkyePL
vPkLmDtvvkMbb29vPhs0kCpVKmMymdj46yamTvsWi8Xi0O5l1K9PH6ZMneZc/LfJ6O05e9rtu7u7
8XGPHtSoUZ2sWbMSHh7B+QvnGf/1BIKD73D16jWmz5jpvNg/qmeP7lSrWpV8+fISGRnF3r17mTZ9
BtHR0c5N7YoVK8rggQMpUqQI9+6FsmDhItauWweAyWTih2XL6dXrYz4dMMhpyX9Ol04d2bR5C+Hh
j36/H/c4UtOjezeqVn2dgq++ysmTp+jSrbtDfb16dXm3VSsKFy6Mu7sb5QMqOdQ7K1nSnw7t21Oy
pD9ubm5cuXKFufMWsG//fuemdk86vsyZO4+Z06exddtWTCYzAKtWr2HtmlUUKVKECxcuJF/dYz3t
8zNwwKe80+pth7Kp075l6fc/AM++H0KI/47/bI+3Xp/6Z46pkycRGxPLh23aUrN2Hfr268+ff160
158+fYaDhw4lWyJj5cmTh0kTJ7Bt2280atKMNxs25quvxhP+4IG9TcWKAcyfN5e7d+/SpWt33qhb
n36fDsRisVKlcpVka0tJ0zROnDzJmLFj+fPPP52rAfh8zCi8vLxo1rwFnTp3pSTKYfcAACAASURB
VGaN6nTp3Mm52UsnoEIFPDw8OBQY6Fz1t8jo7TlLbfu+uXMz7qsvGDN6FJ06duD7JYt5u+Wjnu/+
/fpSpkwZevftR41atfmoYyd27NiJggJASEgI69ZvsLd/EWTNmoVJU6bQtHkL+n86gLLlyjJ40ADn
ZnYeHh5MmzqFw0eOULf+m0z4ZhKDBn5KQEAFe5tNm7dQuVIlfH19ky35z/Hw8KBx48asWfsoNKbn
cTi7efMms2bNYf2Gjc5VAERFRvHjTz8x7dtvnatS5evryx+HD9Ote0+avdWSXbv38M2E8RQsWNC5
qd2Tji+XLl3izp271K1T115mNpvZvHkz7737jr3sSZ7l+QFYs3YdVapWt08/JOvweJb9EEL8t7w0
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
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
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
kyZP0ZYtW+Tz+WJvUsmWLVuU6cuMLZYkZfp82rpj5rNhw4aaMunLaN2dd98jK2zpT39qofvufyBa
XlFxcbGk8lnMirxeb7ROkrZu3VqhViorK1Na2s6QtXnzlui6aUnyl/orrTv3+0tlGIbS0tLk9Xp3
eZwzZsyUJE2ZOk0vvPhStC4yqxvP7+mj8ePUsmX5LPwH4z/UY/9+XJK0Zs0aXb/jAM2IirPFlmWp
oKBABQUFemnMy/r80wlav36DvptVvoRl+/btldY3b9pUoPr168ntdikzM1PPPP2knhv9vMZ/+JFS
U1N1800j9MLzz2ngoKuis/F/OeYYZWR41X/gIJWVlUX31axZM1137WANGjggWuZJS9OKFeVLOCTp
4wkTdEW/y/X6G2+qd6+eWrN2rRYtXrzb13vD+g2SpCFDhmrb9u1KSUnRKSefpKee/I8GDLpKv/32
W7T9nkyrsLb7999/V+PGmerZo4fGfTA+7vdM/qadr79lWSorK1N+XoX3RKlf6Wlp0Z+rUtXrWtGU
qdPUsGFD3XTjCLVs+Wf9uGCBnn12tFatXq1mzZpq7dq1u+2bknR53z7q1rWrGjSor3DYUt26dbVu
XeX/rFR8/5eWlSk9ffePOzMzU4FAoNJ7P/IhO6Jly5YaOuQ6HXXUUXK7XZKk1NRUeTwe+f3lHwYA
AEikgyp4701hUVH0bA+5ubmaP/97de3SRZMmT9HsOXN03733qnnz5rv8sTcMQ7Zta87cebr3nrvV
rGlTrd9QHqyk8mUE3bp20Zw5cyRJBQUFu5zV4Z677tRhrVpp2pTyta4ul0sej0czpk3R/SMf1Jw5
c7Vhw0a1a9tWixcvkSS1aNFc6enp+nXFioq7qjG7e5wRfr9/t7P78fyeLrqk8hk+IsLh8G73WRXT
NPSnP7WI/ly/fn2lp6dHQ2WLP7XYsVY6qCMOP0KGYeidd9+TbdsqKyvTe++P0ztj31L9+vW1efNm
SdKcuXO1fHm2Xnj+OQ0fcWP0DCMbNm7Uiy+N0dSp06L3F2vixEkaMewGnXD88erdq5c+GF9+UOXu
fo+RJRKbt2yJhsUPxn+oQYMG6vTTTtNbY8dWbB63YDAo01H+j6iioqKEvmeqel0rsixLb7/zrt5+
5115vV6NGD5MD468XwMGXaX16zeoRfPmMk1zl/B96imnaOCA/rp+6LDoDPljj/xLhmFUahevvLw8
ud1ueb1eFRYWSpIaxZxG8J8PjdL8+d9r5KjyJSmHH364xr33jiJ3GfsYAQCobQfVUpO9MQ1DDodD
brdbRx/dXn87tnP0j/zkKVO1eMliPfv0kzrt1FNUv349eb1enXbaqfrPvx/b0WaKlmcv11NPPaFO
nToqLc2j1ocdpsce/Zfq1aunF14cU/HuKnl29PO68OJL1bdff/Xt119PPf2MSktL1bdff/344wJJ
5WcS6Xd5Xx3WqpW8Xq9uHDFcS5Ys1apVq2L2ljzx/J6qZBhyu92VNqez/LPdRRdeqKOPbq86Xq+a
NW2qW2+5WQ0aNNAPP/xYaRc333Sj3G63Mn0+XXP1Vfriy/KZ5p9+/lnhcFh9LrtULpdLGRkZuuyS
S5Sbm6stO5aTRHz40cd66uln9Pxzz+qYYzpIkt4f94Guv+46ZbVrJ9M0lZKSok6dOqpFi+bR2xUV
FWnqtOm6+647lJnp0xd7OKgywjRNORwOpaWlqct556lRw4ZaveM9J0lut0tut1uGYcjpdMrtdsvh
cEiSmjVtqr+ffroaNWqkOnXq6PTTT1P/K/pVOsPJgfae6dSpo446qo1M01RJSYkKCwsV2vEfmG+/
+1a2beumEcOVnp4uh8OhYzp0UFqaR946XhUWFkWXYbU58kideOLuPxRW5cwzz9DFF10oSdqwYaMW
LlykgQP6Syp/Hfr3v6Jic9XxerVq9WqVlpbK4XDoin6XV6rftGmTWrQo/6AAAEAiHFIz3v96+P8k
lc+8btq0SdNnzIwup7AsSzfedIv6X9FPw4cPU/NmzVVcXKwVK1ZEzzwRDoc1fMRNuvqqKzXy/vvU
uHFjFRYWae7cuRow6Koqz64gla+7jcy8SdK27dtl23alGeC3xr6tOnW8ennMi0pNTdX3P/yoO+/e
9wMha0M8v6eqtD7sMM2Z9W2lskmTp+j+B0aqXr26+uc//qHMzEz5/SVasXKlbrrl1ujZOiQpNzdP
v/32mz795GO53S7NmDFTL75U/mEnNzdXt9x6u4Zcd62uH3KdQuGwcnJydOPNt+z2oM+JEyep1O/X
U08+obvuvkfjx3+oQFmZHrj/PjVt2kSBQFA5OTl64qmnK90ucmaSiZMma/v2vR8kOXVyeTgPBAJa
t369Hn/iyejSGUn6aPz46AGc7dtn6aorB+njjz/Rw488KqfLpUEDB+iww1rJ6XRq/YYNeu31Nyr9
ng+090yjhg111513qEnjxgoGg/rll1/10EPl/a6kxK8hQ2/QzTfeqE8/+UhOp1MrVq7ULbfermnT
puv44/6mce+9oy1btur333/X7B3/QYrXCccdp1atWunDjz6WJN1z3/2679679c7Yt7Rt2zZNnzlT
55x9VrT9w488qltvvkmXXHyRgsGgpkyZpp49dh6AOXnKVJ115pmaPm2KTMNQ1+49WYICAKhVxo6t
kpEjRxo5OTlGfn6+UVhYaLRu3drIz8833W63o7i42LQsy5WWluYKBoNuSammaabbtu21bbt+YWn4
09j9Vddf/3KMvv3m69hiHMIip0rs2fv82CoAAIBqOe30v2vxkqWxxdXmTXX0Ngxji2EYhZZlFUsq
dblcgZKSkqBpmsH09HQrEAiEfT6ftWrVKtvr9do+n8/OysqyR40atcvMIP9jBQAAABKA4A0AAAAk
wCG1xhsHr+9mzaq0NhoAAOBQw4w3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQgeAMAAAAJQPAG
AAAAEoDgDQAAACQAwRsAAABIAII3AAAAkAAEbwAAACABCN4AAABAAhC8AQAAgAQ4IIO3ZVlq0rhJ
bDEAAACwR02aNpVlhWOLDwjO2IIDQc5PP6tdu7Zq07ZtbBUAAABQJcsKK+enX2KLDwgHZPAOhUJa
tmx5bDEAAABw0Dogl5oAAAAAhxqCNwAAAJAABG8AAAAgAQjeAAAAQAIQvAEAAIAEIHgDAAAACUDw
BgAAABKA4A0AAAAkAMEbAAAASACCNwAAAJAABG8AAAAgAQjeAAAAQAIQvAEAAIAEcMYWJJLT6VRW
u3bKyEiPrQIASCoqLNbS5UslGbFVlTCeAsCexTue1qakBu/2We20YeNG5S3bFFsFAJCUmelTh6M7
aMnSJTJNR2x1FOMpAOxZvONpbUpq8E5PT1NeXn5sMQBgh7y8PB1x+GEKh2yZ7tjanRhPAWDP4h1P
a1Ny13jbsQUAgF3YkmHsZcDcSzUAQPGNp7UoqcE7eU8bAA4e8YyV8bQBgD+6ZI+VSQ3eAAAAwB8F
wRsAAABIAII3AAAAkAAEbwAAACABkhy8k73EHQAOBvGMlfG0AYA/uuSOlckN3sl97kgij8ejmVMn
qknjxrFVAGLFM1bG0wZIIofDoZlTJ+rPf/pTbBWQOEkeK5MbvHFIu+iC3nrj1Zc0+YsJmvDh+3r6
iX/r2M6dYpvVKqfTqQ/ff0c9unWNrVJKSoo+/2S8zvz76bFVcZn42cf68tOPVL9+vWiZ2+3WzKkT
ldWubYWWAHBwe/ihBzVi2NDYYj3z5OO6atCA2GIAVUhq8E7yhw7UonPOOlMD+1+h0S+MUe+LLtWg
a4bo/XHjFQqFYpvWqlAopMlTp6l7ty6xVTrj76cpFArr21mzY6v2yOncecHXYDCoKwf2r1AL1Lx4
xsp42gDAH12yx8qkXjIeh652bY9Sdk6OfvhxgSSprCygufO/j2klHd0+S//8x0g1b9ZUP/38ix55
7D/Kyy+/7HW9unU19Ppr1bljR0nSjwsWavSLY7R9+3adfNIJGnrdteo38CpJ0sD+/TSwfz8NuPIa
rV23Xm2OPEJPPv6oel90mb6cOFl9L7tERx5xuFas/G/0vnt066rJU6eqbp06uv3Wm9SmzZFyu1z6
32+/6/mXXlZOzk+SpBOPP04jhg3VlGnTdfJJJygQCOqGETdLkt5+d5wGXz1IH3/ymf7322/RfUc0
bNAgrn2P/+gTXd7nUqV6UvXZ519q3PgPddvNN+nYzh21MTdPjz3+hH76+RdJkmEY6tG9qy7s3Us+
XyOtW79eL455VYsWL6l41wCQcE0aN9bQIYN1dPsshS1Ls2bP0Usvv6bS0tLYpjrx+ON04/AbNH3m
Vzqmw9HKyEjXkqXL9MJLrygQCMQ2Bw4JSZ3xxqFr4eIl6typowb276cOR7dXmscT20SS1LXLubr3
gQd10WX9VFpaqsFXXxmtu++eO5WelqZBV1+rQddcp7p16+i+u++QJC1avFSZmT41bdpEktSp41+1
dt16de5UvpSlc6eOWrpsuUKhkDZs3KgFCxepe9eds96HtWqpdm2P0pcTJ8s0TX05aYou73+lzr+4
j+bMnaeHRt6vlJSUaPvGjTMVDAY1eMiwaOiWpN/X/K5Jk6dqyLXXRMsqimffjRo1VGamT/2vvEY3
3XK7LujdS48+/E999MkE9b7oMs2ZO0+33nxjtH2vHt3V59KL9X+PPKaeF1yiN958Ww+NekCNG2dG
2wBAoqWkpOiJxx/R72vWqm//K3XV4OvVrGlTDRl8dWzTqMxMn4pLSjTi5tt07fXD1aJ5cw0acEVs
M+CQkfzgbdtsh+A2a9Zs3XPfSLVq+Wfdf89dmvDROD380INq2qTxznaS3nhzrHI35qqkuFgTJ01W
27ZtJNtWps+nTh3/queef1GFhYUq3L5do194Scd27qTMRo1UUlysX35doc4d/ypPaqoOb32Y3n33
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/
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
Ij3678cVCoUkSc2bNdPwYUN1TIcOcrtTtGrVKt16p//O4gAAEOZJREFU+x0qLCpS06ZNdOPw4frL
MR0Utix98823em708/KXlkYfD2oX/ezAcdOIGzRtxkw9M/qFaNmatWv1ymtvyDB2/sOxYcMGevTh
h3RMhw7amJurp555TkuWLpMkGYahHt276sLeveTzNdK69ev14phXtWjxkkr1F/TuqczMTBUVFemd
98bp8y8mRvcf0bfPpere5Tzdfd9IrVm7NrYa+MPq3q2L1qxdq8+/mKh+l/fRa2+8Ff2bJ0ldzztX
V1zeR3XqeDVv/g8KBoMKhoLR+rZHHaWbRtygFi2aa/Xq/2nuvPnROvyxJXmNt8pTAVutbCedeKIW
L1mqdWvX7VJnW7Zkl8+Kf/rZF7rgokvUpVtPfffdbD36r/9TakpqtG2TJk1U6i/VlVcN1uX9Biir
XTt179pVsiVPqkejn31aeXn5urTP5Tqva3c9O/p5hUJhpaak6vlnn9Vvv/2mCy66VJf3G6DmzZtr
+A037Hws2vVxs9XwhgNCixbN1bxZM02ZOj22SpJk2ztfrJ49uunNse+o90WXasbMr3TPXbdHg3mv
Ht3V59KL9X+PPKaeF1yiN958Ww+NekCNG2dKks7v3VP9L++r/zz5jHqef7GGDB2hX1esjO5bKj++
4tabRujUk0/UsJtuJXQDFTgcDnU971xNnjJN02Z8pYz0dJ1y8onR+mM6HK3hNwzRY/95Ur0uvFRz
583X2WedEa3PyEjXow//Q9NmzFSvCy7R08+O1gW9e0br8ceW/OCNWlO/Xj3l5+fHFleSl5evr7/+
Rn5/qYLBoN58a6ycTqdatz4s2sbv92vcB+MlSWVlZfr++x/UPitLknTaqafI4XDoqaefVVFRscLh
sJYtWy6/369TTzlZkvTCi2NUWlqq7du368WXxqhLl3Oj+8YBxLbZanGrV6eOJGlT/qZd6iptsvXF
l5OUk/OTAmVlmvDpZ/I1aqSGDepLtq0Lz++lsWPf1cqV/5VtWZo7b76WLFmq0045WbJtXdC7p8a+
866ys3NkW5a2bt2qX37+Jbrv9LQ0/eufo1S3bl3dfOsd2rply66Pga3mt3jF3o4t4dtJJxyvunXr
aOq06dq+bZtmz5mrnt27Reu7nHeOZnz1tZYsWSrbsjTzq6+VnfOTyic7bJ184gnaXliojz76RFY4
rJUr/6svJk6O1rMleUuypC41Qe3asnWrfD5fbHElHo9HQ6+/Tsf97Vh5PGmyrLDS09NVv169aJtt
27ap4mxcWVmZfL5GkqSmTZto7br1siwrWh/RrFkz1a9fT+PefydaZhqmgsGgMjLS5fez3OTAYTM5
Xsu27DhwsmGjhlq/cWNMbWX5+Zuir0fJjn7i8aTJVoGaNm2iQQOvUN8+l0bbezwerVq9WrbK16au
WbuuytezfVY7ZWRk6LqhI1RaFoitRq2p6hWpiH54IOjZo5vm//CjCjZvkSR9OWmKHn34ITVv3lxr
162Tr1EjLVi4qNJrtW5d+cGXtqRGjRpp3br1VdYj2ZL7KhC8D2Fz5szVvffcpebNmu1yRLZhGLJt
W4OvuUqtWrXSddcP09atWyVJkyd+UWm96Z5s2LBRzZs1k2mau4TvjRs3KjcvT5f16VepPMLhcMQW
IVmSOw79Iaxdu07r1q/XueecrWXLs2Oro31ybzbm5ur1N8dq5lffxFZJKq9v3rxZdM13rO9/WKCf
fv5ZT/z7X7rj7vu0YuV/Y5ugNuz9pY2vDWpV0yZN1LlTR5WWlurjD96VVN43DcNQ925d9NLLryp/
0yY1aNCg0u0aNKiv/PxNklRlPQ4QSe5nSV5qkuRnf4ibOm26Fi9ZqiefeFynnHKy6tWrJ29Ghk49
9RQ99sjDkiSv16uNGzdGQ3evnj1Ur17dirvZo2+/myXbtjV82A1KT0+Xw+FQh6OPlsfj0bffzZLb
5daQawcrPT1dhmGoceNMnbJjCQoShX52oHjqmdE675yzdMP116nln/+klJQUtWjRXNdcNUjnnH1m
bPPd+viTz3TVoAE6qs2RMgxDKSlu/eWYDmrWrKkkacKnX6h/v77KatdWhmGoXt26OqrNkZX28enn
X+qFl17R448+rPbty5eNASg/qDIvL1/9B12ja4bcoGuG3KCrrxuq198cqy7nnSOn06kpU6fr7LPO
UOaO/ygfeeQROrZzp+g+5syZp8aNM3Xc346VVP53tke3rtF6/LEld8abPFCrLMvSLbfern79+mrY
0OvVvHn5ebxXrFip98d9IEl67fU39MD99+mtN19TSUmJ5s2bv8vs+J74/X7dMPxG3Tj8Bn00fpyc
TqdW/nelbr/9LhUWFWnosOG64fohGvf+O/Kkpio/f5MmTpqsWbPKz6qCBIijn8XRBDXgxwULNfym
W9W/X189+9R/lJqaqo0bczV77jx9//2Psc13a8JnnysQCOiO225Rk8aZCgSD+uWXXzX6xfKLc3w8
4VPZtqU7b79FvkaNVFhYqLffG6dffl1RaT9Tp8+Qv7RU//rnKI166GEtWLioUj1qVjx9LJ42qD2R
gyrf/2C8CjZvrlT30Sef6rJLLtZpp56smV99o1defUOPPvyQtm3frrz8fH31zbfRtoVFRbr73gc0
bOgQDbjichUVFWv6zK901hl/37lDJE2y+1nseoLozyNHjjRycnKM/Px8Iy8vz2zZsqWRl5fnSE1N
dRiG4bQsy+V2u92WZXkcDkeabdtey7IaFJaGP624wz3peMzRnEsaqGUnn3SifliwSE6XK7Yq6vjj
/qZ587+PLQZQQ044/jjNnj2HfggkWTx9sSJvqqO3aZqbDcMoDIfDJaZp+gOBQMA0zaBt26HS0tJw
ZmZm+LfffrMzMzMtn89nZ2Vl2aNGjaqY8aPf1+hSE8MwqvVBolqNAewT+hkAAAeG5C41EaEAAAAA
fww1EryDwaAMw7BNc18m0IneQPLRD4HaFU8fi6cNgP1TvX5W3dUce7MvSRkAAABANe138DZNM/pJ
oPqfCqrZHMA+iKOfxdEEwH6Ip4/F0wbA/tmHfhYOh+1gMFgp8+6r/Q7eAAAAAPZun4O3w+HYZaY7
FArtbBCP/f7cAGCv4uhncTQBsB/i6WPxtAGwf6rbz3a3mqNiBq6uGjm4EsChYJ/HEQA1hn4IHMqq
FbzdbrftcrlsSXY4HJZUvsbbsixb5aOFXZ1Bo6i4RJmZPuXl5cdWAagBjX2ZKvaXyLZjr5VVWXFx
sXyNfMrPpy8CNc3n86m4qJh+CCRZvH2xolAoJMMwImfvsy3LkiQ5nU47GAzGtN67agXvmrZy1Sod
eXhrHXH4EbFVAGpAcUmJfvl1tRzOPQ8y2Tk5at+unVq3bhVbBWA/FRcXa9nyn+iHQJLF2xcr2t1S
k/0RV/D2eDx2RkaGtm7dGi1zOBy2aZp2aWmp3G63bdt2ZNa7Ggz9smKlwiFbNfy8AEiybUMOpyHT
dMRWxTC0LDubvgjUAvohcGCIvy/utCN425Ls0tJSpaamRvOuy+WKrPqIW1zBO1778qnANB0y3bGl
ABKNvggkH/0QOLBEgve+ZNzdqdZZTVJSUmy32x2947KyMjtyTsOaekAAAADAgSKScU3TtMvKynbJ
uxkZGbbH49mlfHeqFbx3xzRN2zAMOxQK2VZkxTkAAABwkLMsywqFQnbk4MrY+uqqMniPGjXKzsrK
siXJ6/Xa2dnZ0Tqn02lH1nibpmlXeEAEbwAAABwSTNO0IhPMkdzrcDhsp9Npu91uOyUlpVIYz8rK
skeNGlVlQN+nNd6FhYW2aZp2SkpKJP1bkqxwOEzwBgAAwCHBsizL4XBY1T2IsipVznhH+Hw+Wyo/
s4nH47ELCgpsp9NpS+VnNikrK7ODwaBtWVbY4XCUn9wbAAAAOMg5HI6wZVnhcDhsBYNBy+12WyUl
JXZhYWE0iGdnZ8vr9dqRzLwnew3eVXE4HLbf77ddLlfkk4AlqZrXjAcAAAAOTLZthyOz3i6Xy/L7
/dGlJgUFBXEfVBkRG7ztHZukneu8fT6f7fV67YyMDDty9coda1uscPklLEMulyskgjcAAAAOEYZh
BCMZNzLj7XQ6bZfLZbvdbrviGU12s767Uq6Wdg3ee5SdnR09pWAwGAyXlZVZkfAdDAaDlmWVxd4G
AAAAOBiFw+FAIBAIhcPhcGpqarisrMwKBoPhyIGV1VlmIlUdvKMJveLZTTwej+3z+axAIBBOT0+3
0tPTw5JCpmkGnU5nwLZtgjcAAAAOFaUul6vMNM1gOBwOp6SkWC6Xyy4sLLR8Pp9VxWz3LjPdEXu7
WH20fuTIkcY333xjFhYWGpmZmebWrVvNlJQUh8rPjOIMh8MuwzBSHQ5HWigUSnE4HG7btl2GYTjC
4bDDNE3TsizTNE3Ttm0jskmS01l+cpXIz5GvAAAAwL6IXPgm8jUUKl8RbRiGXXGzygOqZdt2WFLI
MIxgKBQKulyu0nA4XBIOh8tcLldA5UuqQ2VlZeF69epZeXl5ltfrtU8//XRrN0tMdivegGtIlcN3
69atjfz8fNPtdjsCgYBLkjMYDLodDkeKaZopkpyGYThCoZDD4XCY4XDYtG3bcDqdhmVZZsVw7XA4
dvs4COAAAACojkjQjhUOh6PlFYN3OBy2TNO0w+Gw5XQ6w9oRsC3LKqsqdP/22292Zmam5fP57PHj
x0dOp73b+60o3mAbbXfJJZeY+fn5xp5mvi3Lctm27XI6naZpmg7LsoxI6LZt24j8HAnWLpcrsvtK
CN4AAACojqqCdzAYlLQzdO+4Fo2MHRfI2XGWvnAoFLIMwwiq/OQh8YZuqTaCt7T3mW+Hw+EoLS11
OBwORzgcNlwul2lZlhHZUlNTJUmWZRkVvwIAAAC1IRK0I19LS0tl7rgapWmadjAYtHacKtCyLCs6
8634QrcUR/DepytXSjsvrLNq1SplZmbaW7dutVJSUkKSVFJSYqWkpIQDgYDp8XiMQCBgWpZlpKSk
7DZom2b5MZ6x5QAAAMD+iATtCMsqz8upqam2JJWVldm2bdsul8t2OBx2IBCwQqFQOCUlxVIVoTty
4pHqqm7QjbYfOXKkkZOTY0SWnVSc+d62bZvD4/GYoVDICIfDRkpKSqWzp4TDYaPi1wiPx1PdxwMA
AABUye/3VwrJDofDrvi1YnlJSYmdkpJi+f1+y+PxWFWF7ngPpoxV3aC7y5KTiuE7subb6/WagUDA
CAaDRiSAV7xd7M+xARwAAACoSbFB2+l07vKz3++3JCk9Pd0qLCy04gjdUi0G74i9znyXlZUZXq/X
lKRAIGBIUjAY3Nf7AwAAAGqcy+WyJcntdtuSVFBQYHu9Xsvj8dh7Cd1xB+6IfQ3Ce5z5bt26tVFU
VGT4/X5DksrKygxpZwBv2LDhvt4vAAAAsN8KCgoqBe6UlBRbKr9gZEZGhp2dna09hG4pgcE7osqZ
b7/fb7Rv316SVFRUVOl+IoEcAAAASIbIVScjMjIybEnKzs6Wx+OxI5eC303ornbgjtjfAFzlzLck
FRYWGtKuQTsSyAEAAIBkyM7OrvRzJIh7vV5bKj+D325Ct5TE4B2xy8y3JEUCeKxIIAcAAACSIRKw
Y0VOmb2b0L3b9tVRUwF4l5lvSYoE8FhVBXIAAAAgESIBO1bkHN01OdMdUdMBeLcBvCpVBXMAAACg
Nuzt4je1Ebgjajr4xrW/vQVyAAAAoDbtJmBXJd52e1VbAbi29gsAAAAkQo0F7ohKl3IHAAAAUDsS
NTOdqPsBAAAA9kWNz3DHYsYbAAAASACCNwAAAJAA/w+G7xlFpLFipgAAAABJRU5ErkJggg==
"
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

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -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``!

View File

@ -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>`.

View File

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

View File

@ -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>`_

View File

@ -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`

View File

@ -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>`.

View File

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

View File

@ -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

View File

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

View File

@ -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>`.

File diff suppressed because it is too large Load Diff

View File

@ -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 19).
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.

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Acknowledgements &mdash; musrfit 1.5.1 documentation</title>
<title>Acknowledgements &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>any2many - a Universal μSR-file-format converter &mdash; musrfit 1.5.1 documentation</title>
<title>any2many - a Universal μSR-file-format converter &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Bugtracking &mdash; musrfit 1.5.1 documentation</title>
<title>Bugtracking &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>How to Cite musrfit? &mdash; musrfit 1.5.1 documentation</title>
<title>How to Cite musrfit? &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -7,7 +7,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index &mdash; musrfit 1.5.1 documentation</title>
<title>Index &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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>
@ -779,6 +795,10 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="user-manual.html#index-78">rge-handler</a>
</dt>
<dt><a href="setup-standard.html#index-32">root-build-fink</a>
</dt>
@ -786,12 +806,12 @@
<dt><a href="setup-standard.html#index-16">root-build-linux</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="setup-standard.html#index-29">root-build-macports</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="setup-standard.html#index-23">root-build-windows</a>
</dt>
@ -815,13 +835,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 +859,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-79">technical-musrfit</a>
</dt>
@ -879,15 +899,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 +955,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 +994,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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome to the musrfit documentation! &mdash; musrfit 1.5.1 documentation</title>
<title>Welcome to the musrfit documentation! &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="#">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="#">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -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 &mdash; musrfit 1.5.1 documentation</title>
<title>msr2data - A Program for Automatically Processing Multiple musrfit msr Files &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>mupp - μSR Parameter Plotter &mdash; musrfit 1.5.1 documentation</title>
<title>mupp - μSR Parameter Plotter &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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 &lt;nn&gt;</strong></dt>
<dd>selects collection <tt class="docutils literal"><span class="pre">&lt;nn&gt;</span></tt>, where <tt class="docutils literal"><span class="pre">&lt;nn&gt;</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 &lt;label&gt;</strong></dt>
<dt><strong>x &lt;label&gt;</strong></dt>
<dd>add <tt class="docutils literal"><span class="pre">&lt;label&gt;</span></tt> as a <em>x</em>-variable. Only <em>one</em> is allowed.</dd>
<dt><strong>addY &lt;label(s)&gt;</strong></dt>
<dt><strong>y &lt;label(s)&gt;</strong></dt>
<dd>add <tt class="docutils literal"><span class="pre">&lt;label(s)&gt;</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 &lt;dir&gt;</strong></dt>
<dd>set the save path to <tt class="docutils literal"><span class="pre">&lt;dir&gt;</span></tt>. The place where the macros, and/or the plot output will be saved.</dd>
<dt><strong>plot &lt;fln&gt;</strong></dt>
<dd>where <tt class="docutils literal"><span class="pre">&lt;fln&gt;</span></tt> is the file name with extension under which the plot should be saved.</dd>
<dt><strong>macro &lt;fln&gt;</strong></dt>
<dd>where <tt class="docutils literal"><span class="pre">&lt;fln&gt;</span></tt> is the file name under which the root macro should be saved.</dd>
<dt><strong>var &lt;var_name&gt; = &lt;expr&gt;</strong></dt>
<dd><p class="first">defines a variable.
&lt;expr&gt; is a mathematical expression where collection variables are addressed
via the &#8216;$&#8217;, 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">&lt;var_name&gt;</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 &lt;nn&gt; : &lt;var_name&gt;</strong></dt>
<dd>links &lt;var_name&gt; to the collection &lt;nn&gt;, where &lt;nn&gt; 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&gt;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&gt;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&#39;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:
&lt;fit-param-file-names&gt;: list of file name(s) to be loaded.
allowed formats are: db, dat, msr
SCRIPT COMMANDS:
Lines starting with &#39;#&#39;, &#39;%&#39;, or &#39;//&#39; 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 &lt;dir&gt; : set the load path to &lt;dir&gt;. Bash variables like
$HOME are accepted.
load &lt;coll&gt; : will load a collection &lt;coll&gt;. 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 &lt;nn&gt; : selects collection &lt;nn&gt;, where &lt;nn&gt; is either the number
of the collections, or its name, e.g.
select YBCO-40nm-T5K-FC150mT-Escan.db
addX &lt;label&gt; : add &lt;label&gt; as a x-variable. Only one is allowed.
addY &lt;label(s)&gt;: add &lt;label(s)&gt; as y-variable. Multiple labls are possible.
savePath &lt;dir&gt; : set the save path to &lt;dir&gt;. The place where the macros,
and/or the plot output will be saved.
plot &lt;fln&gt; : where &lt;fln&gt; is the file name with extension under which
the plot should be saved.
macro &lt;fln&gt; : where &lt;fln&gt; is the file name under which the root macro
should be saved.
SCRIPT COMMANDS:
Lines starting with &#39;#&#39;, &#39;%&#39;, or &#39;//&#39; 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 &lt;coll&gt; : load a collection. &lt;coll&gt; is the filename of the
collection (*.db, *.dat)
loadPath &lt;path&gt; : set the load path to &lt;path&gt;; accepting bash variables
like $HOME, etc.
x &lt;var-name&gt; : set a x-axis variable. &lt;var-name&gt; is a data tag of
the db/dat-file.
y &lt;var-name&gt; : set a y-axis variable. &lt;var-name&gt; is a data tag of
the db/dat-file.
select &lt;nn&gt; : select collection &lt;nn&gt;, where &lt;nn&gt; is the row-number
or the name of the collection to be selected.
selectAll : i.e. already set &#39;x&#39;, &#39;y&#39; will apply to ALL collections
present.
savePath &lt;path&gt; : sets the save path to &lt;path&gt;; accepting bash variables
like $HOME, etc.
plot &lt;fln&gt; : where &lt;fln&gt; is the file name with extension under which
the plot should be saved.
macro &lt;fln&gt; : where &lt;fln&gt; is the file name under which the root macro
should be saved.
var &lt;var_name&gt; = &lt;expr&gt; : defines a variable.
&lt;expr&gt; is a mathematical expression where
collection variables are addressed via the &#39;$&#39;,
e.g. dataT is addressed by $dataT, etc.
col &lt;nn&gt; : &lt;var_name&gt; : links &lt;var_name&gt; to the collection &lt;nn&gt;, where
&lt;nn&gt; 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -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 &mdash; musrfit 1.5.1 documentation</title>
<title>MusrRoot - an Extensible Open File Format for μSR &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>musredit: the GUI Based Interface to musrfit &mdash; musrfit 1.5.1 documentation</title>
<title>musredit: the GUI Based Interface to musrfit &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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 GPUs" 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 GPUs"
accesskey="P">previous</a> |</li>
<li><a href="index.html">musrfit 1.5.1 documentation</a> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
@ -55,8 +55,8 @@
<div class="section" id="introduction">
<h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h2>
<p><tt class="docutils literal"><span class="pre">musredit</span></tt> is an editor which also provide a graphical user interface to the programs contained in the <tt class="docutils literal"><span class="pre">musrfit</span></tt> suite and are intended
to help the user handle <tt class="docutils literal"><span class="pre">musrfit</span></tt> msr files. It is implemented in <tt class="docutils literal"><span class="pre">C++</span></tt> and use the <a class="reference external" href="https://qt.io">Qt</a> framework. <tt class="docutils literal"><span class="pre">musredit</span></tt> is based on Qt 4.6 or Qt 5.6 (or above).
The Qt 5.6 version of <tt class="docutils literal"><span class="pre">musredit</span></tt> will be actively developed, whereas the Qt 4.x version will only get bug fixing and eventually will be dropped.
to help the user handle <tt class="docutils literal"><span class="pre">musrfit</span></tt> msr files. It is implemented in <tt class="docutils literal"><span class="pre">C++</span></tt> and use the <a class="reference external" href="https://qt.io">Qt</a> framework. <tt class="docutils literal"><span class="pre">musredit</span></tt> is based on Qt 4.6, Qt 5.6 (or above), or Qt6.x.
The Qt 5.6 and Qt 6.x version of <tt class="docutils literal"><span class="pre">musredit</span></tt> 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 <tt class="docutils literal"><span class="pre">musrfit</span></tt> are described — the basic editor functions which should be self-explanatory are <em>not</em>.
<tt class="docutils literal"><span class="pre">musrgui</span></tt> is an outdated early version of <tt class="docutils literal"><span class="pre">musredit</span></tt> and will not described anymore. If still in use, the user is urged to switch to <tt class="docutils literal"><span class="pre">musredit</span></tt>.</p>
<div class="admonition note">
@ -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 GPUs"
>previous</a> |</li>
<li><a href="index.html">musrfit 1.5.1 documentation</a> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

Binary file not shown.

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &mdash; musrfit 1.5.1 documentation</title>
<title>Search &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

File diff suppressed because one or more lines are too long

View File

@ -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 GPUs &mdash; musrfit 1.5.1 documentation</title>
<title>Setting up musrfit / DKS: High Speed Fitting with GPUs &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Setting up musrfit on Different Platforms &mdash; musrfit 1.5.1 documentation</title>
<title>Setting up musrfit on Different Platforms &mdash; musrfit 1.7.1 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.7.1',
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.7.1 documentation" href="index.html" />
<link rel="next" title="Setting up musrfit / DKS: High Speed Fitting with GPUs" 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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 &#8220;outdated&#8221; 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 &#8220;outdated&#8221; 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>
@ -106,7 +106,7 @@ Currently the <tt class="docutils literal"><span class="pre">MXML</span></tt> su
<p>If <em>optionally</em> the editor and graphical user interface <tt class="docutils literal"><span class="pre">musrgui</span></tt> / <tt class="docutils literal"><span class="pre">musredit</span></tt> is going to be installed there is one further requirement:</p>
<dl class="docutils" id="index-11">
<dt><strong>Qt</strong></dt>
<dd>A cross-platform application and user interface framework. <em>Required version ≥ 4.6</em> (musredit) (see <a class="reference external" href="http://qt.io/">Qt</a>).</dd>
<dd>A cross-platform application and user interface framework. <em>Required version ≥ 4.6</em> (musredit) (see <a class="reference external" href="http://qt.io/">Qt</a>). Currently the <strong>Qt5</strong> is the main development part. Qt6 just kicked in, but is not widely available yet.</dd>
</dl>
<p>Each of the following sections focusing on the installation of <tt class="docutils literal"><span class="pre">musrfit</span></tt> on the different operating systems will also give a brief introduction on the installation of the requirements before the actual musrfit installation is described.</p>
</div>
@ -150,7 +150,7 @@ from the shell will do the trick (never type the &#8216;$&#8217; it is the shell
<p>For <strong>Qt5</strong>:</p>
<blockquote>
<div><div class="highlight-bash"><div class="highlight"><pre><span></span>$ yum install epel-release
$ yum install git cmake boost-devel gsl-devel fftw-devel libxml2-devel qt5-qtbase-devel qt5-qtsvg-devel qt5-qtwebkit-devel
$ yum install git cmake boost-devel gsl-devel fftw-devel libxml2-devel qt5-qtbase-devel qt5-qtsvg-devel
</pre></div>
</div>
</div></blockquote>
@ -165,7 +165,7 @@ the installation would look like:</p>
</div></blockquote>
<p>For <strong>Qt5</strong>:</p>
<blockquote>
<div><div class="highlight-bash"><div class="highlight"><pre><span></span>$ apt-get install git cmake libboost-dev libgsl-dev libfftw3-dev libxml2-dev qt5-default qtbase5-dev libqt5svg5-dev libqt5webkit5-dev
<div><div class="highlight-bash"><div class="highlight"><pre><span></span>$ apt-get install git cmake libboost-dev libgsl-dev libfftw3-dev libxml2-dev qt5-default qtbase5-dev libqt5svg5-dev
</pre></div>
</div>
</div></blockquote>
@ -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&#8217;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
@ -241,9 +241,9 @@ $ <span class="nb">cd</span> Apps
$ git clone http://github.com/root-project/root.git
$ <span class="nb">cd</span> root
$ git tag -l
$ <span class="c1"># git tag -l will list all available tags. In the next command choose the tag v6-16-00</span>
$ <span class="c1"># git tag -l will list all available tags. In the next command choose the tag v6-22-06</span>
$ <span class="c1"># or the latest official release number</span>
$ git checkout -b v6-16-00 v6-16-00
$ git checkout -b v6-22-06 v6-22-06
$ <span class="c1"># now ROOT is ready to be configured. Below you will find the minimal ROOT configuration needed.</span>
$ <span class="c1"># since we are using cmake build now, first we will need to create the build directory.</span>
$ mkdir root_build
@ -339,7 +339,7 @@ switch is not provided is <tt class="docutils literal"><span class="pre">BMWlibs
<dd>Will try to get <tt class="docutils literal"><span class="pre">musredit</span></tt>, <tt class="docutils literal"><span class="pre">musrWiz</span></tt>, <tt class="docutils literal"><span class="pre">musrStep</span></tt>, and <tt class="docutils literal"><span class="pre">mupp</span></tt> installed, if <tt class="docutils literal"><span class="pre">Qt</span></tt> is found.
By default this is enabled. Again &lt;value&gt;=0 means disabled, &lt;value&gt;=1 enabled.</dd>
<dt><strong>-Dqt_version=&lt;value&gt;</strong></dt>
<dd>Allows to specify which <tt class="docutils literal"><span class="pre">Qt</span></tt> version shall be tried. &lt;value&gt; can take the values: <tt class="docutils literal"><span class="pre">AUTO,</span> <span class="pre">3,</span> <span class="pre">4,</span> <span class="pre">5</span></tt>.
<dd>Allows to specify which <tt class="docutils literal"><span class="pre">Qt</span></tt> version shall be tried. &lt;value&gt; can take the values: <tt class="docutils literal"><span class="pre">AUTO,</span> <span class="pre">3,</span> <span class="pre">4,</span> <span class="pre">5,</span> <span class="pre">6</span></tt>.
If the value is set to <tt class="docutils literal"><span class="pre">AUTO</span></tt>, this highest installed version is chosen, otherwise the specified version is used.</dd>
<dt><strong>-Dtry_OpenMP=&lt;value&gt;</strong></dt>
<dd>Will check if <tt class="docutils literal"><span class="pre">OpenMP</span></tt> support is possible, and if yes use it. The default is enabled</dd>
@ -380,23 +380,10 @@ detailed information on this XML file refer to the <a class="reference internal"
<div class="section" id="musredit">
<span id="index-20"></span><h3>musredit<a class="headerlink" href="#musredit" title="Permalink to this headline"></a></h3>
<p>In the latest version of <tt class="docutils literal"><span class="pre">musrfit</span></tt> the configure script tries to determine automatically the highest available <tt class="docutils literal"><span class="pre">Qt</span></tt> version.
In case this is found, the editor <tt class="docutils literal"><span class="pre">musredit</span></tt> is built already together with <tt class="docutils literal"><span class="pre">musrfit</span></tt>.
To install this editor separately, <em>i.e.</em> by &#8220;hand&#8221; do</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ <span class="nb">cd</span> <span class="nv">$HOME</span>/Apps/musrfit/src/musredit_qt5
$ <span class="c1"># for some distributions you will need qmake-qt5 for the next command</span>
$ qmake musredit.pro
</pre></div>
In case this is found, the editor <tt class="docutils literal"><span class="pre">musredit</span></tt> is built already together with <tt class="docutils literal"><span class="pre">musrfit</span></tt>.</p>
</div>
<p>If everything went fine, <tt class="docutils literal"><span class="pre">musredit</span></tt> can be compiled and installed:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ make
$ make install
</pre></div>
</div>
<p>In case one does not like the executable <tt class="docutils literal"><span class="pre">musredit</span></tt> to be copied to the default installation directory <tt class="docutils literal"><span class="pre">$ROOTSYS/bin</span></tt>
the last <em>make install</em> can be skipped and the executable can be copied somewhere else instead.</p>
</div>
<div class="section" id="musrgui-obsolate">
<h3>musrgui (obsolate)<a class="headerlink" href="#musrgui-obsolate" title="Permalink to this headline"></a></h3>
<div class="section" id="musrgui-depreciated">
<h3>musrgui (depreciated)<a class="headerlink" href="#musrgui-depreciated" title="Permalink to this headline"></a></h3>
<p>If <tt class="docutils literal"><span class="pre">Qt4.6</span></tt> or higher is not available but <tt class="docutils literal"><span class="pre">Qt3</span></tt> is set up <tt class="docutils literal"><span class="pre">musrgui</span></tt> can be installed. For this please
follow the instructions for the <tt class="docutils literal"><span class="pre">musredit</span></tt> installation where simply every <tt class="docutils literal"><span class="pre">musredit</span></tt> occurrence has to
be replaced by <tt class="docutils literal"><span class="pre">musrgui</span></tt>. If there are problems during the <tt class="docutils literal"><span class="pre">qmake</span></tt> step, <em>e.g.</em>
@ -513,7 +500,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>
@ -603,7 +590,7 @@ The default setting, <em>i.e.</em> the switch is not provided is <tt class="docu
<dd>Will try to get <tt class="docutils literal"><span class="pre">musredit</span></tt>, <tt class="docutils literal"><span class="pre">musrWiz</span></tt>, <tt class="docutils literal"><span class="pre">musrStep</span></tt>, and <tt class="docutils literal"><span class="pre">mupp</span></tt> installed, if <tt class="docutils literal"><span class="pre">Qt</span></tt> is found.
By default this is <em>enabled</em>. Again &lt;value&gt;=0 means disabled, &lt;value&gt;=1 enabled.</dd>
<dt><strong>-Dqt_version=&lt;value&gt;</strong></dt>
<dd>Allows to specify which <tt class="docutils literal"><span class="pre">Qt</span></tt> version shall be tried. &lt;value&gt; can take the values: <tt class="docutils literal"><span class="pre">AUTO,</span> <span class="pre">3,</span> <span class="pre">4,</span> <span class="pre">5</span></tt>.
<dd>Allows to specify which <tt class="docutils literal"><span class="pre">Qt</span></tt> version shall be tried. &lt;value&gt; can take the values: <tt class="docutils literal"><span class="pre">AUTO,</span> <span class="pre">3,</span> <span class="pre">4,</span> <span class="pre">5,</span> <span class="pre">6</span></tt>.
If the value is set to <tt class="docutils literal"><span class="pre">AUTO</span></tt>, this highest installed version is chosen, otherwise the specified version is used.</dd>
<dt><strong>-Dtry_OpenMP=&lt;value&gt;</strong></dt>
<dd>Will check if <tt class="docutils literal"><span class="pre">OpenMP</span></tt> support is possible, and if yes use it. The default is <em>enabled</em>.</dd>
@ -652,7 +639,7 @@ musredit <span class="p">&amp;</span>
</div>
</div>
<div class="section" id="id12">
<h3>musrgui (obsolate)<a class="headerlink" href="#id12" title="Permalink to this headline"></a></h3>
<h3>musrgui (depreciated)<a class="headerlink" href="#id12" title="Permalink to this headline"></a></h3>
<p>If <tt class="docutils literal"><span class="pre">Qt4.5</span></tt> or higher is not available but <tt class="docutils literal"><span class="pre">Qt3</span></tt> is set up <tt class="docutils literal"><span class="pre">musrgui</span></tt> can be installed. For this
please follow the instructions for the <tt class="docutils literal"><span class="pre">musredit</span></tt> installation where simply every <tt class="docutils literal"><span class="pre">musredit</span></tt> occurrence
has to be replaced by <tt class="docutils literal"><span class="pre">musrgui</span></tt>, and <tt class="docutils literal"><span class="pre">qt4</span></tt> is replaced by <tt class="docutils literal"><span class="pre">qt3</span></tt>.</p>
@ -684,11 +671,27 @@ 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 11 alias <strong>Big Sur</strong>: <tt class="docutils literal"><span class="pre">musrfit</span></tt> is ready for <strong>Big Sur</strong> on Intel based macs. The <tt class="docutils literal"><span class="pre">DKS</span></tt> version of
<tt class="docutils literal"><span class="pre">musrfit</span></tt> for macOS <strong>Big Sur</strong> is ready as well.</p>
</div>
<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
@ -742,7 +745,7 @@ add a new line pointing to your local copy, <em>e.g.</em></p>
</ol>
<p>Then the MacPorts system should be set up and can be used to install additional software.</p>
<p>The installation of the software mentioned above is then done in the terminal:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ sudo port -v install pkgconfig autoconf automake libtool cmake fftw-3 fftw-3-single gsl boost libxml2 qt5 qt5-qtsvg qt5-qtwebengine
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ sudo port -v install pkgconfig autoconf automake libtool cmake fftw-3 fftw-3-single gsl boost libxml2 qt5 qt5-qtsvg
</pre></div>
</div>
<p>With <tt class="docutils literal"><span class="pre">Qt5</span></tt>, <tt class="docutils literal"><span class="pre">musredit</span></tt> will be installed. If it happens that you used <tt class="docutils literal"><span class="pre">musrgui</span></tt> in the past,
@ -750,7 +753,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 +766,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>
@ -781,9 +784,9 @@ it is at the time of writting <tt class="docutils literal"><span class="pre">roo
<tt class="docutils literal"><span class="pre">ROOT</span></tt> will be installed under <tt class="docutils literal"><span class="pre">/Application</span></tt> as owner root. In order to ease your life for the
steps to follow and assuming you are the only guy working on your Mac, you could change the owner and group of the <tt class="docutils literal"><span class="pre">ROOT</span></tt> directory:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ <span class="nb">cd</span> /Applications
$ sudo chown -R &lt;username&gt; root_v6.16.00
$ sudo chgrp -R staff root_v6.16.00
$ sudo ln -s root_v6.16.00 root
$ sudo chown -R &lt;username&gt; root_v6.22.00
$ sudo chgrp -R staff root_v6.22.00
$ sudo ln -s root_v6.22.00 root
</pre></div>
</div>
</div>
@ -800,14 +803,14 @@ comments will be added starting with a &#8216;#&#8217; which can be omitted. The
$ git clone http://github.com/root-project/root.git
$ <span class="nb">cd</span> root
$ git tag -l
$ <span class="c1"># git tag -l will list all available tags. In the next command choose the tag v6-10-xx</span>
$ <span class="c1"># where xx is the highest listed number, e.g. v6-16-00</span>
$ git checkout -b v6-16-00 v6-16-00
$ <span class="c1"># git tag -l will list all available tags. In the next command choose the tag v6-xx-yy</span>
$ <span class="c1"># where xx is the highest listed number, e.g. v6-22-06</span>
$ git checkout -b v6-22-06 v6-22-06
$ <span class="c1"># now ROOT is ready to be configured. Below you will find the minimal ROOT configuration needed.</span>
$ <span class="c1"># We will use the cmake out-of-source approach here.</span>
$ mkdir root_build
$ <span class="nb">cd</span> root_build
$ cmake ../ -Dgminimal<span class="o">=</span>ON -Dasimage<span class="o">=</span>ON -Dmathmore<span class="o">=</span>ON -Dminuit2<span class="o">=</span>ON -Dxml<span class="o">=</span>ON -DCMAKE_INSTALL_PREFIX<span class="o">=</span><span class="nv">$HOME</span>/Applications/root/root_exec
$ cmake ../ -Dgminimal<span class="o">=</span><span class="m">1</span> -Dasimage<span class="o">=</span><span class="m">1</span> -Dmathmore<span class="o">=</span><span class="m">1</span> -Dminuit2<span class="o">=</span><span class="m">1</span> -Dxml<span class="o">=</span><span class="m">1</span> -Dopengl<span class="o">=</span><span class="m">1</span> -Dbuiltin_glew<span class="o">=</span><span class="m">1</span> -DCMAKE_INSTALL_PREFIX<span class="o">=</span><span class="nv">$HOME</span>/Applications/root/root_exec
$ <span class="c1"># next will be the make. If running on a multicore CPU you can speed up tremendously by calling</span>
$ <span class="c1"># make with the option -j &lt;number&gt;, where &lt;number&gt; is the number of threads which you want to give,</span>
$ <span class="c1"># e.g. make -j8</span>
@ -861,6 +864,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>
@ -897,8 +919,7 @@ is necessary to compile a few packages from source since no binary packages are
automatically by the FinkCommander after you have chosen the software packages for installation:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span>autoconf automake cmake boost1.63-nopython boost1.63.nopython-shlibs fftw3 fftw3-shlibs gsl gsl-shlibs
libtool2 libtool2-shlibs libxml2 libxml2-bin libxml2-shlibs pkgconfig qt5-mac-qtbase qt5-mac-qtbase-dev-tools
qt5-mac-qtsvg qt5-mac-qtsvg-shlibs qt5-mac-qtwebengine qt5-mac-qtwebengine-shlibs qt5-mac-qtwebenginecore-shlibs
qt5-mac-qtwebenginewidgets-shlibs
qt5-mac-qtsvg qt5-mac-qtsvg-shlibs
</pre></div>
</div>
<p>Under OS X 10.6 Snow Leopard it will <em>not</em> be possible to install <tt class="docutils literal"><span class="pre">qt3mac</span></tt> since the system is by default a 64-bit
@ -938,7 +959,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>
@ -975,14 +996,14 @@ comments will be added starting with a &#8216;#&#8217; which can be omitted. The
$ git clone http://github.com/root-project/root.git
$ <span class="nb">cd</span> root
$ git tag -l
$ <span class="c1"># git tag -l will list all available tags. In the next command choose the tag v6-10-xx</span>
$ <span class="c1"># where xx is the highest listed number, e.g. v6-16-00</span>
$ git checkout -b v6-16-00 v6-16-00
$ <span class="c1"># git tag -l will list all available tags. In the next command choose the tag v6-xx-yy</span>
$ <span class="c1"># where xx is the highest listed number, e.g. v6-22-06</span>
$ git checkout -b v6-22-06 v6-22-06
$ <span class="c1"># now ROOT is ready to be configured. Below you will find the minimal ROOT configuration needed.</span>
$ <span class="c1"># We will use the cmake out-of-source approach here.</span>
$ mkdir root_build
$ <span class="nb">cd</span> root_build
$ cmake ../ -Dgminimal<span class="o">=</span>ON -Dasimage<span class="o">=</span>ON -Dmathmore<span class="o">=</span>ON -Dminuit2<span class="o">=</span>ON -Dxml<span class="o">=</span>ON -DCMAKE_INSTALL_PREFIX<span class="o">=</span><span class="nv">$HOME</span>/Applications/root/root_exec
$ cmake ../ -Dgminimal<span class="o">=</span><span class="m">1</span> -Dasimage<span class="o">=</span><span class="m">1</span> -Dmathmore<span class="o">=</span><span class="m">1</span> -Dminuit2<span class="o">=</span><span class="m">1</span> -Dxml<span class="o">=</span><span class="m">1</span> -Dopengl<span class="o">=</span><span class="m">1</span> -Dbuiltin_glew<span class="o">=</span><span class="m">1</span> -DCMAKE_INSTALL_PREFIX<span class="o">=</span><span class="nv">$HOME</span>/Applications/root/root_exec
$ <span class="c1"># next will be the make. If running on a multicore CPU you can speed up tremendously by calling</span>
$ <span class="c1"># make with the option -j &lt;number&gt;, where &lt;number&gt; is the number of threads which you want to give,</span>
$ <span class="c1"># e.g. make -j8</span>
@ -1082,7 +1103,7 @@ switch is not provided is <tt class="docutils literal"><span class="pre">BMWlibs
<dd>Will try to get <tt class="docutils literal"><span class="pre">musredit</span></tt>, <tt class="docutils literal"><span class="pre">musrWiz</span></tt>, <tt class="docutils literal"><span class="pre">musrStep</span></tt>, and <tt class="docutils literal"><span class="pre">mupp</span></tt> installed, if <tt class="docutils literal"><span class="pre">Qt</span></tt> is found.
By default this is enabled. Again &lt;value&gt;=0 means disabled, &lt;value&gt;=1 enabled.</dd>
<dt><strong>-Dqt_version=&lt;value&gt;</strong></dt>
<dd>Allows to specify which <tt class="docutils literal"><span class="pre">Qt</span></tt> version shall be tried. &lt;value&gt; can take the values: <tt class="docutils literal"><span class="pre">AUTO,</span> <span class="pre">3,</span> <span class="pre">4,</span> <span class="pre">5</span></tt>.
<dd>Allows to specify which <tt class="docutils literal"><span class="pre">Qt</span></tt> version shall be tried. &lt;value&gt; can take the values: <tt class="docutils literal"><span class="pre">AUTO,</span> <span class="pre">3,</span> <span class="pre">4,</span> <span class="pre">5,</span> <span class="pre">6</span></tt>.
If the value is set to <tt class="docutils literal"><span class="pre">AUTO</span></tt>, this highest installed version is chosen, otherwise the specified version is used.</dd>
<dt><strong>-Dtry_OpenMP=&lt;value&gt;</strong></dt>
<dd>Will check if <tt class="docutils literal"><span class="pre">OpenMP</span></tt> support is possible, and if yes use it. The default is enabled</dd>
@ -1193,7 +1214,7 @@ $ musrview test-histo-ROOT-NPP.msr
</ul>
</li>
<li><a class="reference internal" href="#musredit">musredit</a></li>
<li><a class="reference internal" href="#musrgui-obsolate">musrgui (obsolate)</a></li>
<li><a class="reference internal" href="#musrgui-depreciated">musrgui (depreciated)</a></li>
<li><a class="reference internal" href="#check-the-installation">Check the installation</a></li>
</ul>
</li>
@ -1210,7 +1231,7 @@ $ musrview test-histo-ROOT-NPP.msr
</ul>
</li>
<li><a class="reference internal" href="#index-26">musredit</a></li>
<li><a class="reference internal" href="#id12">musrgui (obsolate)</a></li>
<li><a class="reference internal" href="#id12">musrgui (depreciated)</a></li>
<li><a class="reference internal" href="#id13">Check the installation</a></li>
<li><a class="reference internal" href="#potential-problems">Potential Problems</a></li>
</ul>
@ -1219,6 +1240,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 +1302,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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Tutorial for musrfit &mdash; musrfit 1.5.1 documentation</title>
<title>Tutorial for musrfit &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documentation of user libs (user functions) &mdash; musrfit 1.5.1 documentation</title>
<title>Documentation of user libs (user functions) &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</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)&amp;=\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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

View File

@ -6,7 +6,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>User manual &mdash; musrfit 1.5.1 documentation</title>
<title>User manual &mdash; musrfit 1.7.1 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.7.1',
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.7.1 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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
@ -109,6 +109,8 @@
<dd>will directly present the Fourier transform of the &lt;msr_file&gt; with Fourier options as defined in the &lt;msr_file&gt;.</dd>
<dt><strong>-a, - -avg</strong></dt>
<dd>will directly present the averaged data/Fourier of the &lt;msr_file&gt;.</dd>
<dt><strong>-1, - -one_to_one</strong></dt>
<dd>calculate the theory points <em>only</em> at the data points.</dd>
<dt><strong>- -&lt;graphic_format_extension&gt;</strong></dt>
<dd>will produce a graphics output file without starting a ROOT session. The filename is based on the name of the &lt;msr_file&gt;, <em>e.g.</em> 8472.msr will result in 8472_0.png.
Supported values for <tt class="docutils literal"><span class="pre">&lt;graphic_format_extension&gt;</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">&lt;graphic_
<dd>reset the plotting range to the area given in the msr file (&#8220;un-zoom&#8221;).</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>&nbsp;</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 &#8216;X&#8217; 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 &#8216;Y&#8217; 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>&nbsp;</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 &#8216;X&#8217; 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 &lt;run_file_name&gt; &lt;beamline&gt; &lt;facility&gt; &lt;file_format&gt;</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&#8217;s are given in the data files, the ADDRUN statement is all what is needed, otherwise just add the t0&#8217;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>&#8216;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>&#8216;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&#8217;s needs to be equal to
the total number of <a class="reference internal" href="#msr-addrun"><em>ADDRUN</em></a>&#8216;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&#8217;s needs to be equal to the total number of <a class="reference internal" href="#msr-addrun"><em>ADDRUN</em></a>&#8216;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>&nbsp;</td>
</tr>
<tr class="row-odd"><td><strong>SET BATCH</strong></td>
<td>Obsolate. Only present for
backward compatibilty.</td>
<td>&nbsp;</td>
</tr>
<tr class="row-even"><td><strong>END RETURN</strong></td>
<td>Obsolete. Only present for
backward compatibility.</td>
<td>&nbsp;</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>&nbsp;</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 &#8220;debug&#8221; purposes it is possible to force MINUIT2 to print out additional information. The COMMAND block command is <strong>PRINT_LEVEL &lt;n&gt;</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 &lt;list-of-sector-times&gt;</strong>, where <tt class="docutils literal"><span class="pre">&lt;list-of-sector-times&gt;</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&lt;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 &#8216;units&#8217; tag, or the tag &#8216;all&#8217; in which case the range given under &#8216;range&#8217; 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 &#8220;frequency&#8221; 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 &#8216;X&#8217; 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&#8217;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 &lt; 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 &lt;musrfit&gt;/doc/memo/rrf/rrf-notes.pdf or <a class="reference external" href="http://dx.doi.org/10.7566/JPSCP.21.011051">MusrfitReal 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
@ -1974,11 +2242,6 @@ In this abstract base class a function operator is defined that takes two argume
<span class="n">TMyFunction</span><span class="p">(){}</span>
<span class="o">~</span><span class="n">TMyFunction</span><span class="p">(){}</span>
<span class="c1">// global user-function-access functions, here without any functionality</span>
<span class="n">Bool_t</span> <span class="n">NeedGlobalPart</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span> <span class="p">}</span>
<span class="kt">void</span> <span class="n">SetGlobalPart</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">*&gt;</span> <span class="o">&amp;</span><span class="n">globalPart</span><span class="p">,</span> <span class="n">UInt_t</span> <span class="n">idx</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
<span class="n">Bool_t</span> <span class="n">GlobalPartIsValid</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span> <span class="p">}</span>
<span class="c1">// function operator</span>
<span class="n">Double_t</span> <span class="k">operator</span><span class="p">()(</span><span class="n">Double_t</span><span class="p">,</span> <span class="k">const</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">Double_t</span><span class="o">&gt;&amp;</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
@ -2049,7 +2312,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
@ -2187,9 +2450,152 @@ parallelized and the operator() is expected to evaluate to reasonable values for
In case this cannot be ensured, the parallelization can be disabled by <em>&#8211;disable-omp</em> on the configure level of the program installation.</p>
</div>
</div>
<div class="section" id="rge-file-handler-for-low-energy-mgrsr">
<span id="rge-handler"></span><span id="index-78"></span><h3>rge-file handler for Low-Energy μSR<a class="headerlink" href="#rge-file-handler-for-low-energy-mgrsr" title="Permalink to this headline"></a></h3>
<p>In the case of LE-μSR, the muon stopping distribution might have a profound impact on the muon polarization function <span class="math">\(P(t)\)</span>. In case of transverse field μSR measurements it can be written as</p>
<div class="math">
\[P(t) = \int_0^\infty n(z) \cos(\gamma_\mu B(z) t + \varphi) \, dz\]</div>
<p>where <span class="math">\(n(z)\)</span> is the normaized muon stopping distribution obtained from the Monte-Carlo code <tt class="docutils literal"><span class="pre">TRIM.SP</span></tt>. Normalized means</p>
<div class="math">
\[\int_0^\infty n(z) \, dz = 1.\]</div>
<p><span class="math">\(\gamma_\mu = 2 \pi \times 135.54\)</span> MHz/T is the gyromagnetic ratio of the muon and <span class="math">\(\varphi\)</span>
is the initial phase of the muon spins with respect to the positron detector. Typically <span class="math">\(B(z)\)</span> is the function which needs to be dealt with in a specific user function. A simple example would be the Meissner screening of a superconductor, for which</p>
<div class="math">
\[B(z) = B_0\, \exp(-z/\lambda),\]</div>
<p>with <span class="math">\(B_0\)</span> being the applied magnetic field, and <span class="math">\(\lambda\)</span> is the magnetic penetration depth.</p>
<p>This means that one needs to deal with the <span class="math">\(n(z)\)</span> objects in all these user functions. <span class="math">\(n(z)\)</span> does not only depend on the depth, but also on the implantation energy <span class="math">\(E_{\rm impl}\)</span>. For a real experiment this means that one is calculating a collection (various energies) of muon stopping distribution profiles with <tt class="docutils literal"><span class="pre">TRIM.SP</span></tt>. In the language of <tt class="docutils literal"><span class="pre">TRIM.SP</span></tt>, these files are called rge-files.</p>
<p>Since this is often needed in a detailed analysis of LE-μSR spectra, there is a special rge-file handler class implemented which deals with the loading, normalization and interpolation of these <span class="math">\(n(z, E_{\rm impl})\)</span> objects. The essential user-interface of this class with the name <tt class="docutils literal"><span class="pre">PRgeHandler</span></tt> is given
here:</p>
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">PRgeHandler</span> <span class="o">:</span> <span class="k">public</span> <span class="n">TObject</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="n">PRgeHandler</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">fln</span><span class="o">=</span><span class="s">&quot;&quot;</span><span class="p">);</span>
<span class="k">virtual</span> <span class="o">~</span><span class="n">PRgeHandler</span><span class="p">()</span> <span class="p">{}</span>
<span class="k">virtual</span> <span class="kt">bool</span> <span class="n">IsValid</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">fValid</span><span class="p">;</span> <span class="p">}</span>
<span class="k">virtual</span> <span class="n">PRgeDataList</span> <span class="n">GetRgeData</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">fData</span><span class="p">;</span> <span class="p">}</span>
<span class="k">virtual</span> <span class="n">Double_t</span> <span class="n">GetZmax</span><span class="p">(</span><span class="k">const</span> <span class="n">Double_t</span> <span class="n">energy</span><span class="p">);</span>
<span class="k">virtual</span> <span class="n">Double_t</span> <span class="nf">GetZmax</span><span class="p">(</span><span class="k">const</span> <span class="n">Int_t</span> <span class="n">idx</span><span class="p">);</span>
<span class="k">virtual</span> <span class="n">Double_t</span> <span class="nf">Get_n</span><span class="p">(</span><span class="k">const</span> <span class="n">Double_t</span> <span class="n">energy</span><span class="p">,</span> <span class="k">const</span> <span class="n">Double_t</span> <span class="n">z</span><span class="p">);</span>
<span class="k">virtual</span> <span class="n">Double_t</span> <span class="nf">Get_n</span><span class="p">(</span><span class="k">const</span> <span class="n">Int_t</span> <span class="n">idx</span><span class="p">,</span> <span class="k">const</span> <span class="n">Double_t</span> <span class="n">z</span><span class="p">);</span>
<span class="k">virtual</span> <span class="n">Int_t</span> <span class="nf">GetEnergyIndex</span><span class="p">(</span><span class="k">const</span> <span class="n">Double_t</span> <span class="n">energy</span><span class="p">);</span>
<span class="k">private</span><span class="o">:</span>
<span class="kt">bool</span> <span class="n">fValid</span><span class="p">{</span><span class="nb">false</span><span class="p">};</span>
<span class="n">PRgeDataList</span> <span class="n">fData</span><span class="p">;</span>
<span class="k">virtual</span> <span class="kt">bool</span> <span class="nf">ReadRgeFile</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">fln</span><span class="p">,</span> <span class="n">PRgeData</span> <span class="o">&amp;</span><span class="n">data</span><span class="p">);</span>
<span class="p">};</span>
</pre></div>
</div>
<p>The rge-file objects are loaded internally (see below) and can easily be accessed via this interface. The <span class="math">\(n(z, E_{\rm impl})\)</span> data can either be accessed via <tt class="docutils literal"><span class="pre">Get_n(const</span> <span class="pre">Double_t</span> <span class="pre">energy,</span> <span class="pre">const</span> <span class="pre">Double_t</span> <span class="pre">z)</span></tt>, i.e. via the implantation energy (given in eV), or via <tt class="docutils literal"><span class="pre">Get_n(const</span> <span class="pre">Int_t</span> <span class="pre">idx,</span> <span class="pre">const</span> <span class="pre">Double_t</span> <span class="pre">z)</span></tt> with the index <tt class="docutils literal"><span class="pre">idx</span></tt> which is the energy index of the collection. Both this routines deliver <span class="math">\(n(z, E_{\rm impl})\)</span> in normalized form. The on via the energy index is slightly more efficient. The routine <tt class="docutils literal"><span class="pre">GetEnergyIndex(const</span> <span class="pre">Double_t</span> <span class="pre">energy)</span></tt> allows the get the proper energy index of the collection.</p>
<p>In order that class can find the rge-files at runtime, a xml-file is needed when calling the constructor. Very often, specific user-function need some additional input which is not delivered via the msr-files, but via a startup xml-file. In this case the rge-file will be just a part of the startup xml-file. For instance in the case of the Nonlocal Meissner screening user-function class, this looks like this</p>
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
<span class="nt">&lt;nonlocal</span> <span class="na">xmlns=</span><span class="s">&quot;http://nemu.web.psi.ch/musrfit/nonlocal&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;comment&gt;</span>
Fourier and TrimSp information
<span class="nt">&lt;/comment&gt;</span>
<span class="nt">&lt;nonlocal_par&gt;</span>
<span class="nt">&lt;fourier_points&gt;</span>262144<span class="nt">&lt;/fourier_points&gt;</span>
<span class="nt">&lt;/nonlocal_par&gt;</span>
<span class="nt">&lt;trim_sp&gt;</span>
<span class="nt">&lt;data_path&gt;</span>./profiles/<span class="nt">&lt;/data_path&gt;</span>
<span class="nt">&lt;rge_fln_pre&gt;</span>Sn_E<span class="nt">&lt;/rge_fln_pre&gt;</span>
<span class="nt">&lt;energy_list&gt;</span>
<span class="nt">&lt;energy&gt;</span>1000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>2000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>4000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>6000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>8000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>10000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>12000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>14100<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>18000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>22000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>25000<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;energy&gt;</span>27300<span class="nt">&lt;/energy&gt;</span>
<span class="nt">&lt;/energy_list&gt;</span>
<span class="nt">&lt;/trim_sp&gt;</span>
<span class="nt">&lt;/nonlocal&gt;</span>
</pre></div>
</div>
<p>The relevant portion for the rge-file handler class is starting with the xml tag <tt class="docutils literal"><span class="pre">&lt;trim_sp&gt;</span></tt> and contains four further tags:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">&lt;data_path&gt;</span></tt>: Here the path where to find the rge-files needs to be given</li>
<li><tt class="docutils literal"><span class="pre">&lt;rge_fln_pre&gt;</span></tt>: Start portion of the rge-file name.</li>
<li><tt class="docutils literal"><span class="pre">&lt;energy_list&gt;</span></tt>: This will embrace all the implantation energies available.</li>
<li><tt class="docutils literal"><span class="pre">&lt;energy&gt;</span></tt>: A single energy (in eV)</li>
</ul>
<p>In the given example the files are searched for in the sub-directory call <tt class="docutils literal"><span class="pre">profiles</span></tt> of the current directory. The rge-files have file names like
<tt class="docutils literal"><span class="pre">Sn_E1000.rge</span></tt>, <tt class="docutils literal"><span class="pre">Sn_E2000.rge</span></tt>, etc.</p>
<p>In the aforementioned Nonlocal Meissner screening class, in the constructor you will find the following invocation of the rge-handler object:</p>
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">PNL_PippardFitterGlobal</span><span class="o">::</span><span class="n">PNL_PippardFitterGlobal</span><span class="p">()</span>
<span class="p">{</span>
<span class="p">...</span>
<span class="c1">// load all the TRIM.SP rge-files</span>
<span class="n">fRgeHandler</span> <span class="o">=</span> <span class="k">new</span> <span class="n">PRgeHandler</span><span class="p">(</span><span class="s">&quot;./nonlocal_startup.xml&quot;</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">fRgeHandler</span><span class="o">-&gt;</span><span class="n">IsValid</span><span class="p">())</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;&gt;&gt; PNL_PippardFitterGlobal::PNL_PippardFitterGlobal **PANIC ERROR**&quot;</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;&gt;&gt; rge data handler too unhappy. Will terminate unfriendly, sorry.&quot;</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="n">fValid</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">...</span>
<span class="p">}</span>
</pre></div>
</div>
<p>And in the <tt class="docutils literal"><span class="pre">operator()</span></tt> function call which calculates the muon spin polarization, it will look like this</p>
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">Double_t</span> <span class="n">PNL_PippardFitter</span><span class="o">::</span><span class="k">operator</span><span class="p">()(</span><span class="n">Double_t</span> <span class="n">t</span><span class="p">,</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Double_t</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">param</span><span class="p">)</span> <span class="k">const</span>
<span class="p">{</span>
<span class="p">...</span>
<span class="c1">// calculate field if parameter have changed</span>
<span class="n">fPippardFitterGlobal</span><span class="o">-&gt;</span><span class="n">CalculateField</span><span class="p">(</span><span class="n">param</span><span class="p">);</span>
<span class="n">Int_t</span> <span class="n">energyIndex</span> <span class="o">=</span> <span class="n">fPippardFitterGlobal</span><span class="o">-&gt;</span><span class="n">GetEnergyIndex</span><span class="p">(</span><span class="n">param</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">energyIndex</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// energy not found</span>
<span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;&gt;&gt; PNL_PippardFitter::operator() energy &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">param</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; not found. Will terminate.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="n">assert</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">...</span>
<span class="c1">// calcualte polarization</span>
<span class="n">Bool_t</span> <span class="n">done</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
<span class="n">Double_t</span> <span class="n">pol</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">,</span> <span class="n">dPol</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>
<span class="n">Double_t</span> <span class="n">z</span><span class="o">=</span><span class="mf">0.0</span><span class="p">;</span>
<span class="n">Int_t</span> <span class="n">terminate</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="n">Double_t</span> <span class="n">dz</span> <span class="o">=</span> <span class="mf">1.0</span><span class="p">;</span>
<span class="k">do</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">z</span> <span class="o">&lt;</span> <span class="n">param</span><span class="p">[</span><span class="mi">8</span><span class="p">])</span> <span class="p">{</span> <span class="c1">// z &lt; dead-layer</span>
<span class="n">dPol</span> <span class="o">=</span> <span class="n">fPippardFitterGlobal</span><span class="o">-&gt;</span><span class="n">GetMuonStoppingDensity</span><span class="p">(</span><span class="n">energyIndex</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span> <span class="o">*</span> <span class="n">cos</span><span class="p">(</span><span class="n">GAMMA_MU</span> <span class="o">*</span> <span class="n">param</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="o">*</span> <span class="n">t</span> <span class="o">+</span> <span class="n">param</span><span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="o">*</span> <span class="n">DEGREE2RAD</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">dPol</span> <span class="o">=</span> <span class="n">fPippardFitterGlobal</span><span class="o">-&gt;</span><span class="n">GetMuonStoppingDensity</span><span class="p">(</span><span class="n">energyIndex</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span> <span class="o">*</span> <span class="n">cos</span><span class="p">(</span><span class="n">GAMMA_MU</span> <span class="o">*</span> <span class="n">param</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="o">*</span> <span class="n">fPippardFitterGlobal</span><span class="o">-&gt;</span><span class="n">GetMagneticField</span><span class="p">(</span><span class="n">z</span><span class="o">-</span><span class="n">param</span><span class="p">[</span><span class="mi">8</span><span class="p">])</span> <span class="o">*</span> <span class="n">t</span> <span class="o">+</span> <span class="n">param</span><span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="o">*</span> <span class="n">DEGREE2RAD</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">z</span> <span class="o">+=</span> <span class="n">dz</span><span class="p">;</span>
<span class="n">pol</span> <span class="o">+=</span> <span class="n">dPol</span><span class="p">;</span>
<span class="c1">// change in polarization is very small hence start termination counting</span>
<span class="k">if</span> <span class="p">(</span><span class="n">fabs</span><span class="p">(</span><span class="n">dPol</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">1.0e-9</span><span class="p">)</span> <span class="p">{</span>
<span class="n">terminate</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">terminate</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">terminate</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">)</span> <span class="c1">// polarization died out hence one can stop</span>
<span class="n">done</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">done</span><span class="p">);</span>
<span class="k">return</span> <span class="n">pol</span><span class="o">*</span><span class="n">dz</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</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-79"></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,9 +2645,10 @@ In case this cannot be ensured, the parallelization can be disabled by <em>&#821
<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>
<li><a class="reference internal" href="#rge-file-handler-for-low-energy-mgrsr">rge-file handler for Low-Energy μSR</a></li>
</ul>
</li>
<li><a class="reference internal" href="#technical-description-of-the-musrfit-framework">Technical Description of the musrfit framework</a></li>
@ -2289,12 +2696,12 @@ In case this cannot be ensured, the parallelization can be disabled by <em>&#821
<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> &raquo;</li>
<li><a href="index.html">musrfit 1.7.1 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2019, Andreas Suter.
Last updated on Jul 24, 2019.
&copy; Copyright 2021, Andreas Suter.
Last updated on Apr 09, 2021.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
</div>
</body>

2282
doc/mupp_dox.cfg Normal file

File diff suppressed because it is too large Load Diff

2280
doc/musredit_dox.cfg Normal file

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,15 @@
#--- add further sub-directories ----------------------------------------------
add_subdirectory(classes)
add_subdirectory(external)
if (Qt5Core_FOUND)
if (Qt6Core_FOUND)
add_subdirectory(musredit_qt6)
elseif (Qt5Core_FOUND)
add_subdirectory(musredit_qt5)
elseif (Qt4_FOUND)
add_subdirectory(musredit)
elseif (QT_FOUND)
add_subdirectory(musrgui)
endif (Qt5Core_FOUND)
endif ()
#--- define the musrfit libs --------------------------------------------------
set(MUSRFIT_LIBS ${MUSRFIT_LIBS} mud)

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *
@ -197,7 +197,7 @@ int main(int argc, char *argv[])
any2many_syntax();
else if (strstr(argv[1], "--v")) {
#ifdef HAVE_CONFIG_H
std::cout << std::endl << "any2many version: " << PACKAGE_VERSION << ", git-branch: " << GIT_BRANCH << ", git-rev: " << GIT_CURRENT_SHA1 << std::endl << std::endl;
std::cout << std::endl << "any2many version: " << PACKAGE_VERSION << ", git-branch: " << GIT_BRANCH << ", git-rev: " << GIT_CURRENT_SHA1 << ", ROOT version: " << ROOT_VERSION_USED << std::endl << std::endl;
#else
std::cout << std::endl << "any2many git-branch: " << GIT_BRANCH << ", git-rev: " << GIT_CURRENT_SHA1 << std::endl << std::endl;
#endif

View File

@ -1,4 +1,4 @@
#--- build the PMusr and PUserFcnBase libs ------------------------------------
#--- build the PMusr, PUserFcnBase, and PRgeHandler libs ----------------------
#--- generate necessary dictionaries ------------------------------------------
set(MUSRFIT_INC ${CMAKE_SOURCE_DIR}/src/include)
@ -53,6 +53,18 @@ root_generate_dictionary(
-I${FFTW3_INCLUDE_DIR} -I${MUSRFIT_INC}
MODULE PUserFcnBase
)
root_generate_dictionary(
PRgeHandlerDict
PRgeHandler.h
OPTIONS
-I${NONLOCAL_INC}
-I${MUSRFIT_INC}
-I${CMAKE_CURRENT_SOURCE_DIR}
-inlineInputHeader
LINKDEF ${MUSRFIT_INC}/PRgeHandlerLinkDef.h
MODULE PRgeHandler
)
#--- create pkg-config info ---------------------------------------------------
set(prefix "${CMAKE_INSTALL_PREFIX}")
@ -64,6 +76,8 @@ set(MUSR_LIBRARY_NAME "PMusr")
configure_file("PMusr.pc.in" "PMusr.pc" @ONLY)
set(USERFCN_LIBRARY_NAME "PUserFcnBase")
configure_file("PUserFcnBase.pc.in" "PUserFcnBase.pc" @ONLY)
set(PRGEHANDLER_LIBRARY_NAME "PRgeHandler")
configure_file("PRgeHandler.pc.in" "PRgeHandler.pc" @ONLY)
#--- lib creation -------------------------------------------------------------
add_library(PMusr SHARED
@ -117,6 +131,11 @@ add_library(PUserFcnBase SHARED
PUserFcnBaseDict.cxx
)
add_library(PRgeHandler SHARED
PRgeHandler.cpp
PRgeHandlerDict.cxx
)
#--- set target properties, e.g. version --------------------------------------
set_target_properties(PMusr
PROPERTIES
@ -126,11 +145,25 @@ set_target_properties(PUserFcnBase
PROPERTIES
VERSION ${MUSR_VERSION}
)
set_target_properties(PRgeHandler
PROPERTIES
VERSION ${MUSR_VERSION}
)
#--- make sure that the include directory is found ----------------------------
target_include_directories(
PUserFcnBase BEFORE PRIVATE $<BUILD_INTERFACE:${MUSRFIT_INC}>
)
target_include_directories(
PRgeHandler BEFORE PRIVATE $<BUILD_INTERFACE:${MUSRFIT_INC}>
)
#--- add ROOT Version >= 6.24 compile options if needed -----------------------
if (ROOT_GRTEQ_24)
target_compile_options(PMusr BEFORE PRIVATE "-DROOT_GRTEQ_24")
endif(ROOT_GRTEQ_24)
#--- add OpenMP compile options if needed -------------------------------------
if (OpenMP_FOUND)
target_compile_options(PMusr PUBLIC ${OpenMP_CXX_FLAGS})
@ -157,11 +190,15 @@ if (OpenMP_FOUND)
endif (OpenMP_FOUND)
target_link_libraries(PUserFcnBase ${ROOT_LIBRARIES})
target_link_libraries(PRgeHandler ${Boost_LIBRARIES} ${ROOT_LIBRARIES})
target_link_libraries(PMusr ${DependOnLibs})
#--- install PUserFcnBase solib -----------------------------------------------
install(TARGETS PUserFcnBase DESTINATION lib)
#--- install PRgeHandler solib -----------------------------------------------
install(TARGETS PRgeHandler DESTINATION lib)
#--- install PMusr solib ------------------------------------------------------
install(TARGETS PMusr DESTINATION lib)
@ -173,6 +210,8 @@ install(
${CMAKE_CURRENT_BINARY_DIR}/libPMusrCanvas.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPMusrT0_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPMusrT0.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPRgeHandler_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPRgeHandler.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPStartupHandler_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/libPStartupHandler.rootmap
${CMAKE_CURRENT_BINARY_DIR}/libPUserFcnBase_rdict.pcm
@ -195,6 +234,7 @@ install(
${MUSRFIT_INC}/PMusr.h
${MUSRFIT_INC}/PMusrT0.h
${MUSRFIT_INC}/PPrepFourier.h
${MUSRFIT_INC}/PRgeHandler.h
${MUSRFIT_INC}/PRunAsymmetry.h
${MUSRFIT_INC}/PRunAsymmetryBNMR.h
${MUSRFIT_INC}/PRunAsymmetryRRF.h
@ -214,6 +254,7 @@ install(
#--- install pkg-config info --------------------------------------------------
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/PUserFcnBase.pc
${CMAKE_CURRENT_BINARY_DIR}/PRgeHandler.pc
${CMAKE_CURRENT_BINARY_DIR}/PMusr.pc
DESTINATION lib/pkgconfig
)

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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;
}

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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);

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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);
}
//-------------------------------------------------------------

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2009-2019 by Bastian M. Wojek / Andreas Suter *
* Copyright (C) 2009-2021 by Bastian M. Wojek / Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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());
@ -3650,6 +3675,7 @@ void PMusrCanvas::HandleFourierDifference()
fData[i].diffFourierRe = new TH1F(name, name, fData[i].dataFourierRe->GetNbinsX(),
fData[i].dataFourierRe->GetXaxis()->GetXmin(),
fData[i].dataFourierRe->GetXaxis()->GetXmax());
// imaginary part
name = TString(fData[i].dataFourierIm->GetTitle()) + "_diff";
fData[i].diffFourierIm = new TH1F(name, name, fData[i].dataFourierIm->GetNbinsX(),
@ -3667,10 +3693,12 @@ void PMusrCanvas::HandleFourierDifference()
fData[i].dataFourierPhase->GetXaxis()->GetXmax());
// phase optimized real part
name = TString(fData[i].dataFourierPhaseOptReal->GetTitle()) + "_diff";
fData[i].diffFourierPhaseOptReal = new TH1F(name, name, fData[i].dataFourierPhaseOptReal->GetNbinsX(),
fData[i].dataFourierPhaseOptReal->GetXaxis()->GetXmin(),
fData[i].dataFourierPhaseOptReal->GetXaxis()->GetXmax());
if (fData[i].dataFourierPhaseOptReal != nullptr) {
name = TString(fData[i].dataFourierPhaseOptReal->GetTitle()) + "_diff";
fData[i].diffFourierPhaseOptReal = new TH1F(name, name, fData[i].dataFourierPhaseOptReal->GetNbinsX(),
fData[i].dataFourierPhaseOptReal->GetXaxis()->GetXmin(),
fData[i].dataFourierPhaseOptReal->GetXaxis()->GetXmax());
}
// calculate difference
for (UInt_t j=1; j<fData[i].dataFourierRe->GetEntries(); j++) {
@ -3690,10 +3718,12 @@ void PMusrCanvas::HandleFourierDifference()
theoBin = fData[i].theoryFourierPhase->FindBin(dvalx); // get the theory x-axis bin
dval = fData[i].dataFourierPhase->GetBinContent(j) - fData[i].theoryFourierPhase->GetBinContent(theoBin);
fData[i].diffFourierPhase->SetBinContent(j, dval);
dvalx = fData[i].dataFourierPhaseOptReal->GetXaxis()->GetBinCenter(j); // get x-axis value of bin j
theoBin = fData[i].theoryFourierPhaseOptReal->FindBin(dvalx); // get the theory x-axis bin
dval = fData[i].dataFourierPhaseOptReal->GetBinContent(j) - fData[i].theoryFourierPhaseOptReal->GetBinContent(theoBin);
fData[i].diffFourierPhaseOptReal->SetBinContent(j, dval);
if (fData[i].dataFourierPhaseOptReal != nullptr) {
dvalx = fData[i].dataFourierPhaseOptReal->GetXaxis()->GetBinCenter(j); // get x-axis value of bin j
theoBin = fData[i].theoryFourierPhaseOptReal->FindBin(dvalx); // get the theory x-axis bin
dval = fData[i].dataFourierPhaseOptReal->GetBinContent(j) - fData[i].theoryFourierPhaseOptReal->GetBinContent(theoBin);
fData[i].diffFourierPhaseOptReal->SetBinContent(j, dval);
}
}
}
@ -3707,21 +3737,27 @@ void PMusrCanvas::HandleFourierDifference()
fData[i].diffFourierPwr->SetLineColor(fData[i].dataFourierPwr->GetLineColor());
fData[i].diffFourierPhase->SetMarkerColor(fData[i].dataFourierPhase->GetMarkerColor());
fData[i].diffFourierPhase->SetLineColor(fData[i].dataFourierPhase->GetLineColor());
fData[i].diffFourierPhaseOptReal->SetMarkerColor(fData[i].dataFourierPhaseOptReal->GetMarkerColor());
fData[i].diffFourierPhaseOptReal->SetLineColor(fData[i].dataFourierPhaseOptReal->GetLineColor());
if (fData[i].dataFourierPhaseOptReal != nullptr) {
fData[i].diffFourierPhaseOptReal->SetMarkerColor(fData[i].dataFourierPhaseOptReal->GetMarkerColor());
fData[i].diffFourierPhaseOptReal->SetLineColor(fData[i].dataFourierPhaseOptReal->GetLineColor());
}
// set marker size
fData[i].diffFourierRe->SetMarkerSize(1);
fData[i].diffFourierIm->SetMarkerSize(1);
fData[i].diffFourierPwr->SetMarkerSize(1);
fData[i].diffFourierPhase->SetMarkerSize(1);
fData[i].diffFourierPhaseOptReal->SetMarkerSize(1);
if (fData[i].dataFourierPhaseOptReal != nullptr) {
fData[i].diffFourierPhaseOptReal->SetMarkerSize(1);
}
// set marker type
fData[i].diffFourierRe->SetMarkerStyle(fData[i].dataFourierRe->GetMarkerStyle());
fData[i].diffFourierIm->SetMarkerStyle(fData[i].dataFourierIm->GetMarkerStyle());
fData[i].diffFourierPwr->SetMarkerStyle(fData[i].dataFourierPwr->GetMarkerStyle());
fData[i].diffFourierPhase->SetMarkerStyle(fData[i].dataFourierPhase->GetMarkerStyle());
fData[i].diffFourierPhaseOptReal->SetMarkerStyle(fData[i].dataFourierPhaseOptReal->GetMarkerStyle());
if (fData[i].dataFourierPhaseOptReal != nullptr) {
fData[i].diffFourierPhaseOptReal->SetMarkerStyle(fData[i].dataFourierPhaseOptReal->GetMarkerStyle());
}
// set diffFourierTag
fData[i].diffFourierTag = 2; // f-d

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

603
src/classes/PRgeHandler.cpp Normal file
View File

@ -0,0 +1,603 @@
/***************************************************************************
PRgeHandler.cpp
Author: Andreas Suter
e-mail: andreas.suter@psi.ch
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
#include "PRgeHandler.h"
ClassImpQ(PXmlRgeHandler)
//--------------------------------------------------------------------------
// OnStartDocument
//--------------------------------------------------------------------------
/**
* <p>Called on start of the XML file reading. Initializes all necessary variables.
*/
void PXmlRgeHandler::OnStartDocument()
{
fKey = eEmpty;
}
//--------------------------------------------------------------------------
// OnEndDocument
//--------------------------------------------------------------------------
/**
* <p>Called on end of XML file reading.
*/
void PXmlRgeHandler::OnEndDocument()
{
if (!fIsValid)
return;
// check if anything was set
if (fTrimSpDataPath.empty()) {
std::string err = "<data_path> content is missing!";
fIsValid = false;
OnError(err.c_str());
}
if (fTrimSpFlnPre.empty()) {
std::string err = "<rge_fln_pre> content is missing!";
fIsValid = false;
OnError(err.c_str());
}
if (fTrimSpDataEnergyList.size()==0) {
std::string err = "no implantation energies present!";
fIsValid = false;
OnError(err.c_str());
}
}
//--------------------------------------------------------------------------
// OnStartElement
//--------------------------------------------------------------------------
/**
* <p>Called when a XML start element is found. Filters out the needed elements
* and sets a proper key.
*
* \param str XML element name
* \param attributes not used
*/
void PXmlRgeHandler::OnStartElement(const Char_t *str, const TList *attributes)
{
if (!strcmp(str, "trim_sp")) {
isTrimSp=true;
} else if (!strcmp(str, "data_path") && isTrimSp) {
fKey = eDataPath;
} else if (!strcmp(str, "rge_fln_pre") && isTrimSp) {
fKey = eFlnPre;
} else if (!strcmp(str, "energy") && isTrimSp) {
fKey = eEnergy;
}
}
//--------------------------------------------------------------------------
// OnEndElement
//--------------------------------------------------------------------------
/**
* <p>Called when a XML end element is found. Resets the handler key.
*
* \param str not used
*/
void PXmlRgeHandler::OnEndElement(const Char_t *str)
{
if (!strcmp(str, "trim_sp")) {
isTrimSp=false;
}
fKey = eEmpty;
}
//--------------------------------------------------------------------------
// OnCharacters
//--------------------------------------------------------------------------
/**
* <p>Content of a given XML element. Filters out the data and feeds them to
* the internal variables.
*
* \param str XML element string
*/
void PXmlRgeHandler::OnCharacters(const Char_t *str)
{
int ival;
std::string msg(""), sstr(str);
size_t pos;
switch(fKey) {
case eDataPath:
fTrimSpDataPath=str;
break;
case eFlnPre:
fTrimSpFlnPre=str;
break;
case eEnergy:
try {
ival = std::stoi(str, &pos);
} catch(std::invalid_argument& e) {
fIsValid = false;
msg = "The found energy '" + sstr + "' which is not a number";
OnError(msg.c_str());
} catch(std::out_of_range& e) {
fIsValid = false;
msg = "The found energy '" + sstr + "' which is out-of-range.";
OnError(msg.c_str());
} catch(...) {
fIsValid = false;
msg = "The found energy '" + sstr + "' which generates an error.";
OnError(msg.c_str());
}
if (pos != sstr.length()) {
fIsValid = false;
msg = "The found energy '" + sstr + "' which is not an integer";
OnError(msg.c_str());
}
fTrimSpDataEnergyList.push_back(ival);
break;
default:
break;
}
}
//--------------------------------------------------------------------------
// OnComment
//--------------------------------------------------------------------------
/**
* <p>Called when a XML comment is found. Not used.
*
* \param str not used.
*/
void PXmlRgeHandler::OnComment(const Char_t *str)
{
// nothing to be done for now
}
//--------------------------------------------------------------------------
// OnWarning
//--------------------------------------------------------------------------
/**
* <p>Called when the XML parser emits a warning.
*
* \param str warning string
*/
void PXmlRgeHandler::OnWarning(const Char_t *str)
{
std::cerr << std::endl << "PXmlRgeHandler **WARNING** " << str;
std::cerr << std::endl;
}
//--------------------------------------------------------------------------
// OnError
//--------------------------------------------------------------------------
/**
* <p>Called when the XML parser emits an error.
*
* \param str error string
*/
void PXmlRgeHandler::OnError(const Char_t *str)
{
std::cerr << std::endl << "PXmlRgeHandler **ERROR** " << str;
std::cerr << std::endl;
}
//--------------------------------------------------------------------------
// OnFatalError
//--------------------------------------------------------------------------
/**
* <p>Called when the XML parser emits a fatal error.
*
* \param str fatal error string
*/
void PXmlRgeHandler::OnFatalError(const Char_t *str)
{
std::cerr << std::endl << "PXmlRgeHandler **FATAL ERROR** " << str;
std::cerr << std::endl;
}
//--------------------------------------------------------------------------
// OnCdataBlock
//--------------------------------------------------------------------------
/**
* <p>Not used.
*
* \param str not used
* \param len not used
*/
void PXmlRgeHandler::OnCdataBlock(const Char_t *str, Int_t len)
{
// nothing to be done for now
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ClassImp(PRgeHandler)
//--------------------------------------------------------------------------
// Ctor
//--------------------------------------------------------------------------
/**
* @brief PRgeHandler::PRgeHandler
* @param fln
*/
PRgeHandler::PRgeHandler(const std::string fln)
{
// make sure there is an xml-startup file name
if (fln.empty()) { // fln not given
std::cerr << std::endl;
std::cerr << "**ERROR** NO xml file name provided." << std::endl;
std::cerr << std::endl;
fValid=false;
return;
}
// read the startup xml-file to extract the necessary rge infos.
if (!boost::filesystem::exists(fln)) {
std::cerr << std::endl;
std::cerr << "**ERROR** xml file named: " << fln << " does not exist." << std::endl;
std::cerr << std::endl;
fValid=false;
return;
}
// create the rge xml handler
PXmlRgeHandler *xmlRge = new PXmlRgeHandler();
if (xmlRge == nullptr) {
std::cerr << std::endl;
std::cerr << "**ERROR** couldn't invoke PXmlRgeHandler." << std::endl;
std::cerr << std::endl;
fValid=false;
return;
}
// create the SAX parser
TSAXParser *saxParser = new TSAXParser();
if (saxParser == nullptr) {
std::cerr << std::endl;
std::cerr << "**ERROR** couldn't invoke TSAXParser." << std::endl;
std::cerr << std::endl;
fValid=false;
return;
}
saxParser->SetStopOnError();
// connect SAX parser and rge handler
saxParser->ConnectToHandler("PXmlRgeHandler", xmlRge);
int status = saxParser->ParseFile(fln.c_str());
if (status != 0) {
std::cerr << std::endl;
std::cerr << "**ERROR** parsing the xml-file: " << fln << "." << std::endl;
std::cerr << std::endl;
fValid=false;
return;
}
if (xmlRge->IsValid())
fValid = true;
else
fValid = false;
// read the rge-file(s) content if everything went fine so far
std::string rgeFln;
PRgeData dataSet;
if (fValid) {
const PIntVector energy = xmlRge->GetTrimSpDataVectorList();
for (int i=0; i<energy.size(); i++) {
// construct the file name
rgeFln = xmlRge->GetTrimSpDataPath();
if (rgeFln[rgeFln.size()-1] != '/')
rgeFln += "/";
rgeFln += xmlRge->GetTrimSpFlnPre();
rgeFln += std::to_string(energy[i]);
rgeFln += ".rge";
if (!boost::filesystem::exists(rgeFln)) {
fValid = false;
std::cerr << std::endl;
std::cerr << "**ERROR** rge-file: " << rgeFln << " not found." << std::endl;
std::cerr << std::endl;
break;
}
// init data set
dataSet.energy = energy[i];
dataSet.depth.clear();
dataSet.amplitude.clear();
if (!ReadRgeFile(rgeFln, dataSet)) {
fValid = false;
std::cerr << std::endl;
std::cerr << "**ERROR** read error in rge-file: " << rgeFln << " not found." << std::endl;
std::cerr << std::endl;
break;
}
// get the total number of particles
double tot=0.0;
for (int j=0; j<dataSet.amplitude.size(); j++)
tot += dataSet.amplitude[j];
dataSet.noOfParticles = tot;
// sum_j nn dzz == 1, (dzz_j = depth[j]-depth[j-1])
dataSet.nn.resize(dataSet.amplitude.size());
tot = 0.0;
double zz=0.0; // "previous" zz (since depth[j]-depth[j-1] != const) it needs to be done this way.
for (int j=0; j<dataSet.nn.size(); j++) {
tot += dataSet.amplitude[j] * (dataSet.depth[j] - zz);
zz = dataSet.depth[j];
}
for (int j=0; j<dataSet.nn.size(); j++) {
dataSet.nn[j] = dataSet.amplitude[j] / tot;
}
fData.push_back(dataSet);
}
}
delete saxParser;
delete xmlRge;
}
//--------------------------------------------------------------------------
// ReadRgeFile
//--------------------------------------------------------------------------
/**
* <p>Read the content of a rge-file.
*
* @param fln file name of the rge-file
* @return true on success.
*/
bool PRgeHandler::ReadRgeFile(const std::string fln, PRgeData &data)
{
std::ifstream fin(fln);
if (!fin.is_open())
return false;
std::string line, msg;
std::vector<std::string> tok;
Double_t zz, nn;
size_t pos;
int lineNo=0;
while (fin.good() && fValid) {
std::getline(fin, line);
lineNo++;
boost::algorithm::trim(line);
if (line.empty())
continue;
if (!std::isdigit(line[0]))
continue;
tok.clear();
boost::algorithm::split(tok, line, boost::algorithm::is_any_of(" \t"), boost::algorithm::token_compress_on);
if (tok.size() != 2) {
std::cerr << std::endl;
std::cerr << "**ERROR** in rge-file: " << fln << ", unexpected number of tokens (" << tok.size() << ")." << std::endl;
std::cerr << std::endl;
fin.close();
return false;
}
// check distance
try {
zz = std::stod(tok[0], &pos);
} catch(std::invalid_argument& e) {
fValid = false;
msg = "The found depth '" + tok[0] + "' which is not a number";
std::cerr << std::endl;
std::cerr << "**ERROR** in rge-file: " << fln << ": lineNo: " << lineNo << std::endl;
std::cerr << " " << msg << std::endl;
std::cerr << std::endl;
} catch(std::out_of_range& e) {
fValid = false;
msg = "The found depth '" + tok[0] + "' which is out-of-range.";
std::cerr << std::endl;
std::cerr << "**ERROR** in rge-file: " << fln << ": lineNo: " << lineNo << std::endl;
std::cerr << " " << msg << std::endl;
std::cerr << std::endl;
} catch(...) {
fValid = false;
msg = "The found depth '" + tok[0] + "' which generates an error.";
std::cerr << std::endl;
std::cerr << "**ERROR** in rge-file: " << fln << ": lineNo: " << lineNo << std::endl;
std::cerr << " " << msg << std::endl;
std::cerr << std::endl;
}
if (pos != tok[0].length()) {
fValid = false;
msg = "The found depth '" + tok[0] + "' which is not an number.";
std::cerr << std::endl;
std::cerr << "**ERROR** in rge-file: " << fln << ": lineNo: " << lineNo << std::endl;
std::cerr << " " << msg << std::endl;
std::cerr << std::endl;
}
// check number of implanted particles
try {
nn = std::stod(tok[1], &pos);
} catch(std::invalid_argument& e) {
fValid = false;
msg = "The found #particles '" + tok[1] + "' which is not a number";
std::cerr << std::endl;
std::cerr << "**ERROR** in rge-file: " << fln << ": lineNo: " << lineNo << std::endl;
std::cerr << " " << msg << std::endl;
std::cerr << std::endl;
} catch(std::out_of_range& e) {
fValid = false;
msg = "The found #particles '" + tok[1] + "' which is out-of-range.";
std::cerr << std::endl;
std::cerr << "**ERROR** in rge-file: " << fln << ": lineNo: " << lineNo << std::endl;
std::cerr << " " << msg << std::endl;
std::cerr << std::endl;
} catch(...) {
fValid = false;
msg = "The found #particles '" + tok[1] + "' which generates an error.";
std::cerr << std::endl;
std::cerr << "**ERROR** in rge-file: " << fln << ": lineNo: " << lineNo << std::endl;
std::cerr << " " << msg << std::endl;
std::cerr << std::endl;
}
if (pos != tok[1].length()) {
fValid = false;
msg = "The found #particles '" + tok[1] + "' which is not an integer.";
std::cerr << std::endl;
std::cerr << "**ERROR** in rge-file: " << fln << ": lineNo: " << lineNo << std::endl;
std::cerr << " " << msg << std::endl;
std::cerr << std::endl;
}
data.depth.push_back(zz/10.0); // distance in nm
data.amplitude.push_back(nn);
}
fin.close();
return true;
}
//--------------------------------------------------------------------------
// GetZmax via energy
//--------------------------------------------------------------------------
/**
* <p>Get maximal depth for a given energy.
*
* @param energy energy in (eV)
* @return zMax if energy is found, -1 otherwise.
*/
Double_t PRgeHandler::GetZmax(const Double_t energy)
{
int idx=-1;
for (int i=0; i<fData.size(); i++) {
if (fabs(fData[i].energy-energy) < 1.0) {
idx = i;
break;
}
}
if (idx != -1)
return GetZmax(idx);
return -1.0;
}
//--------------------------------------------------------------------------
// GetZmax via index
//--------------------------------------------------------------------------
/**
* <p>Get maximal depth for a given index.
*
* @param idx index for which zMax is requested.
* @return zMax if idx is in range, -1 otherwise.
*/
Double_t PRgeHandler::GetZmax(const Int_t idx)
{
if ((idx < 0) || (idx >= fData.size()))
return -1.0;
return fData[idx].depth[fData[idx].depth.size()-1];
}
//--------------------------------------------------------------------------
// Get_n via energy
//--------------------------------------------------------------------------
/**
* <p>Get the normalized n(E,z) value.
*
* @param energy (eV)
* @param z (nm)
* @return n(E,z) if energy and z are in proper range, -1.0 otherwise.
*/
Double_t PRgeHandler::Get_n(const Double_t energy, const Double_t z)
{
int idx=-1;
for (int i=0; i<fData.size(); i++) {
if (fabs(fData[i].energy-energy) < 1.0) {
idx = i;
break;
}
}
if (idx == -1)
return 0.0;
return Get_n(idx, z);
}
//--------------------------------------------------------------------------
// Get_n via index
//--------------------------------------------------------------------------
/**
* <p>Get the normalized n(idx,z) value.
*
* @param idx index of the rge-dataset
* @param z (nm)
* @return n(idx,z) if idx and z are in proper range, -1.0 otherwise.
*/
Double_t PRgeHandler::Get_n(const Int_t idx, const Double_t z)
{
if ((idx < 0) || (idx >= fData.size()))
return 0.0;
if ((z < 0.0) || (z > GetZmax(idx)))
return 0.0;
int pos=0;
for (int i=0; i<fData[idx].depth.size(); i++) {
if (z <= fData[idx].depth[i]) {
pos = i-1;
break;
}
}
Double_t nn=0.0;
if (pos < 0) {
nn = fData[idx].nn[0] * z/(fData[idx].depth[1]-fData[idx].depth[0]);
} else { // linear interpolation
nn = fData[idx].nn[pos] +
(fData[idx].nn[pos+1] - fData[idx].nn[pos]) *
(z-fData[idx].depth[pos])/(fData[idx].depth[pos+1]-fData[idx].depth[pos]);
}
return nn;
}
//--------------------------------------------------------------------------
// GetEnergyIndex
//--------------------------------------------------------------------------
/**
* <p>Get the energy index by providing an energy in (eV).
*
* @param energy in (eV).
* @return energy index if energy was found, -1 otherwise.
*/
Int_t PRgeHandler::GetEnergyIndex(const Double_t energy)
{
int idx=-1;
for (int i=0; i<fData.size(); i++) {
if (fabs(fData[i].energy-energy) < 1.0) {
idx = i;
break;
}
}
return idx;
}

View File

@ -0,0 +1,10 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: PRgeHandler
Description: C++ shared library providing the support for handling of TrimSP rge-files
Version: @MUSR_VERSION@
Libs: -L${libdir} -l@PRGEHANDLER_LIBRARY_NAME@
Cflags: -I${includedir}

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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);
}
UInt_t size = runData->GetDataBin(histoNo[0])->size()/packing;
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;

View File

@ -9,7 +9,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2018-2019 by Zaher Salman *
* Copyright (C) 2018-2021 by Zaher Salman *
* zaher.salman@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *
@ -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;

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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;

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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);

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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);

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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;
UInt_t size = fForward.size()/packing;
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());

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 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);

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *
@ -34,26 +34,6 @@
ClassImp(PUserFcnBase)
//--------------------------------------------------------------------------
// Constructor
//--------------------------------------------------------------------------
/**
* <p>Constructor
*/
PUserFcnBase::PUserFcnBase()
{
}
//--------------------------------------------------------------------------
// Destructor
//--------------------------------------------------------------------------
/**
* <p>Destructor
*/
PUserFcnBase::~PUserFcnBase()
{
}
//--------------------------------------------------------------------------
// This function is a replacement for the ParseFile method of TSAXParser.
// It is needed because in certain environments ParseFile does not work but ParseBuffer does.

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *
@ -776,7 +776,7 @@ int main(int argc, char *argv[])
return 0;
} else if (!strcmp(argv[i], "--version") || !strcmp(argv[i], "-v")) {
#ifdef HAVE_CONFIG_H
std::cout << std::endl << "dump_header version: " << PACKAGE_VERSION << ", git-branch: " << GIT_BRANCH << ", git-rev: " << GIT_CURRENT_SHA1 << std::endl << std::endl;
std::cout << std::endl << "dump_header version: " << PACKAGE_VERSION << ", git-branch: " << GIT_BRANCH << ", git-rev: " << GIT_CURRENT_SHA1 << ", ROOT version: " << ROOT_VERSION_USED << std::endl << std::endl;
#else
std::cout << std::endl << "dump_header git-branch: " << GIT_BRANCH << ", git-rev: " << GIT_CURRENT_SHA1 << std::endl << std::endl;
#endif

View File

@ -35,8 +35,186 @@
#define SEED 0
#define STATEFILE NULL
//-----------------------------------------------------------------------------
std::vector<double> TPointPWaveGapIntegralCuhre::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Cuhre interface
*
* <p><b>return:</b>
* - value of the integral
*/
double TPointPWaveGapIntegralCuhre::IntegrateFunc(int tag)
{
const unsigned int NCOMP(1);
const unsigned int NVEC(1);
const double EPSREL (1e-4);
const double EPSABS (1e-6);
const unsigned int VERBOSE (0);
const unsigned int LAST (4);
const unsigned int MINEVAL (0);
const unsigned int MAXEVAL (50000);
const unsigned int KEY (13);
int nregions, neval, fail;
double integral[NCOMP], error[NCOMP], prob[NCOMP];
if (tag == 0)
Cuhre(fNDim, NCOMP, Integrand_aa, USERDATA, NVEC,
EPSREL, EPSABS, VERBOSE | LAST, MINEVAL, MAXEVAL,
KEY, STATEFILE, SPIN,
&nregions, &neval, &fail, integral, error, prob);
else
Cuhre(fNDim, NCOMP, Integrand_cc, USERDATA, NVEC,
EPSREL, EPSABS, VERBOSE | LAST, MINEVAL, MAXEVAL,
KEY, STATEFILE, SPIN,
&nregions, &neval, &fail, integral, error, prob);
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
* for p-wave point, aa==bb component
*
* <p><b>return:</b>
* - 0
*
* \param ndim number of dimensions of the integral (2 here)
* \param x point where the function should be evaluated
* \param ncomp number of components of the integrand (1 here)
* \param f function value
* \param userdata additional user parameters (required by the interface, NULL here)
*/
int TPointPWaveGapIntegralCuhre::Integrand_aa(const int *ndim, const double x[],
const int *ncomp, double f[], void *userdata) // x = {E, z}, fPar = {twokBT, Delta(T), Ec, zc}
{
double z = x[1]*fPar[3];
double deltasq(pow(sqrt(1.0-z*z)*fPar[1],2.0));
f[0] = (1.0-z*z)/TMath::Power(TMath::CosH(TMath::Sqrt(x[0]*x[0]*fPar[2]*fPar[2]+deltasq)/fPar[0]),2.0);
return 0;
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
* for p-wave point, cc component
*
* <p><b>return:</b>
* - 0
*
* \param ndim number of dimensions of the integral (2 here)
* \param x point where the function should be evaluated
* \param ncomp number of components of the integrand (1 here)
* \param f function value
* \param userdata additional user parameters (required by the interface, NULL here)
*/
int TPointPWaveGapIntegralCuhre::Integrand_cc(const int *ndim, const double x[],
const int *ncomp, double f[], void *userdata) // x = {E, z}, fPar = {twokBT, Delta(T), Ec, zc}
{
double z = x[1]*fPar[3];
double deltasq(pow(sqrt(1.0-z*z)*fPar[1],2.0));
f[0] = (z*z)/TMath::Power(TMath::CosH(TMath::Sqrt(x[0]*x[0]*fPar[2]*fPar[2]+deltasq)/fPar[0]),2.0);
return 0;
}
//-----------------------------------------------------------------------------
std::vector<double> TLinePWaveGapIntegralCuhre::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Cuhre interface
*
* <p><b>return:</b>
* - value of the integral
*/
double TLinePWaveGapIntegralCuhre::IntegrateFunc(int tag)
{
const unsigned int NCOMP(1);
const unsigned int NVEC(1);
const double EPSREL (1e-4);
const double EPSABS (1e-6);
const unsigned int VERBOSE (0);
const unsigned int LAST (4);
const unsigned int MINEVAL (0);
const unsigned int MAXEVAL (50000);
const unsigned int KEY (13);
int nregions, neval, fail;
double integral[NCOMP], error[NCOMP], prob[NCOMP];
if (tag == 0)
Cuhre(fNDim, NCOMP, Integrand_aa, USERDATA, NVEC,
EPSREL, EPSABS, VERBOSE | LAST, MINEVAL, MAXEVAL,
KEY, STATEFILE, SPIN,
&nregions, &neval, &fail, integral, error, prob);
else
Cuhre(fNDim, NCOMP, Integrand_cc, USERDATA, NVEC,
EPSREL, EPSABS, VERBOSE | LAST, MINEVAL, MAXEVAL,
KEY, STATEFILE, SPIN,
&nregions, &neval, &fail, integral, error, prob);
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
* for p-wave line, aa==bb component
*
* <p><b>return:</b>
* - 0
*
* \param ndim number of dimensions of the integral (2 here)
* \param x point where the function should be evaluated
* \param ncomp number of components of the integrand (1 here)
* \param f function value
* \param userdata additional user parameters (required by the interface, NULL here)
*/
int TLinePWaveGapIntegralCuhre::Integrand_aa(const int *ndim, const double x[],
const int *ncomp, double f[], void *userdata) // x = {E, z}, fPar = {twokBT, Delta(T), Ec, zc}
{
double z = x[1]*fPar[3];
double deltasq(pow(z*fPar[1],2.0));
f[0] = (1.0-z*z)/TMath::Power(TMath::CosH(TMath::Sqrt(x[0]*x[0]*fPar[2]*fPar[2]+deltasq)/fPar[0]),2.0);
return 0;
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
* for p-wave line, cc component
*
* <p><b>return:</b>
* - 0
*
* \param ndim number of dimensions of the integral (2 here)
* \param x point where the function should be evaluated
* \param ncomp number of components of the integrand (1 here)
* \param f function value
* \param userdata additional user parameters (required by the interface, NULL here)
*/
int TLinePWaveGapIntegralCuhre::Integrand_cc(const int *ndim, const double x[],
const int *ncomp, double f[], void *userdata) // x = {E, z}, fPar = {twokBT, Delta(T), Ec, zc}
{
double z = x[1]*fPar[3];
double deltasq(pow(z*fPar[1],2.0));
f[0] = (z*z)/TMath::Power(TMath::CosH(TMath::Sqrt(x[0]*x[0]*fPar[2]*fPar[2]+deltasq)/fPar[0]),2.0);
return 0;
}
//-----------------------------------------------------------------------------
std::vector<double> TDWaveGapIntegralCuhre::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Cuhre interface
*
@ -67,6 +245,7 @@ double TDWaveGapIntegralCuhre::IntegrateFunc()
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
*
@ -87,8 +266,11 @@ int TDWaveGapIntegralCuhre::Integrand(const int *ndim, const double x[],
return 0;
}
//-----------------------------------------------------------------------------
std::vector<double> TCosSqDWaveGapIntegralCuhre::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Cuhre interface
*
@ -119,6 +301,7 @@ double TCosSqDWaveGapIntegralCuhre::IntegrateFunc()
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
*
@ -139,8 +322,11 @@ int TCosSqDWaveGapIntegralCuhre::Integrand(const int *ndim, const double x[],
return 0;
}
//-----------------------------------------------------------------------------
std::vector<double> TSinSqDWaveGapIntegralCuhre::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Cuhre interface
*
@ -171,6 +357,7 @@ double TSinSqDWaveGapIntegralCuhre::IntegrateFunc()
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
*
@ -191,8 +378,11 @@ int TSinSqDWaveGapIntegralCuhre::Integrand(const int *ndim, const double x[],
return 0;
}
//-----------------------------------------------------------------------------
std::vector<double> TAnSWaveGapIntegralCuhre::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Cuhre interface
*
@ -223,6 +413,7 @@ double TAnSWaveGapIntegralCuhre::IntegrateFunc()
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
*
@ -243,8 +434,11 @@ int TAnSWaveGapIntegralCuhre::Integrand(const int *ndim, const double x[],
return 0;
}
//-----------------------------------------------------------------------------
std::vector<double> TAnSWaveGapIntegralDivonne::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Divonne interface
*
@ -283,6 +477,7 @@ double TAnSWaveGapIntegralDivonne::IntegrateFunc()
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Divonne---actual implementation of the function
*
@ -303,8 +498,11 @@ int TAnSWaveGapIntegralDivonne::Integrand(const int *ndim, const double x[],
return 0;
}
//-----------------------------------------------------------------------------
std::vector<double> TAnSWaveGapIntegralSuave::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Suave interface
*
@ -337,6 +535,7 @@ double TAnSWaveGapIntegralSuave::IntegrateFunc()
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Suave---actual implementation of the function
*
@ -357,8 +556,11 @@ int TAnSWaveGapIntegralSuave::Integrand(const int *ndim, const double x[],
return 0;
}
//-----------------------------------------------------------------------------
std::vector<double> TNonMonDWave1GapIntegralCuhre::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Cuhre interface
*
@ -389,6 +591,7 @@ double TNonMonDWave1GapIntegralCuhre::IntegrateFunc()
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
*
@ -409,8 +612,11 @@ int TNonMonDWave1GapIntegralCuhre::Integrand(const int *ndim, const double x[],
return 0;
}
//-----------------------------------------------------------------------------
std::vector<double> TNonMonDWave2GapIntegralCuhre::fPar;
//-----------------------------------------------------------------------------
/**
* <p>Integrate the function using the Cuhre interface
*
@ -441,6 +647,7 @@ double TNonMonDWave2GapIntegralCuhre::IntegrateFunc()
return integral[0];
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value for the use with Cuhre---actual implementation of the function
*

View File

@ -36,6 +36,7 @@
#include <cmath>
#include <vector>
//-----------------------------------------------------------------------------
/**
* <p>Alternative base class for 1D integrations using the GNU Scientific Library integrator.
* The difference to the other class is that here the integration parameters have to be supplied directly to the IntegrateFunc method.
@ -54,6 +55,7 @@ class T2Integrator {
static double FuncAtXgsl(double, void *);
};
//-----------------------------------------------------------------------------
/**
* <p>Method for passing the integrand function value to the integrator.
*
@ -69,6 +71,7 @@ inline double T2Integrator::FuncAtXgsl(double x, void *ptrPair)
return pairOfPointers->first->FuncAtX(x, *(pairOfPointers->second));
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the integral of the function between the given boundaries
*
@ -93,20 +96,7 @@ inline double T2Integrator::IntegrateFunc(double x1, double x2, const std::vecto
return value;
}
//-----------------------------------------------------------------------------
/**
* <p>Base class for 1D integrations using the GNU Scientific Library integrator.
* The function which should be integrated has to be implemented in a derived class.
@ -129,6 +119,7 @@ class TIntegrator {
mutable double (*fFunc)(double, void *); ///< pointer to the integrand function
};
//-----------------------------------------------------------------------------
/**
* <p>Constructor of the base class for 1D integrations
* Allocation of memory for an integration using the adaptive 31 point Gauss-Kronrod rule
@ -137,6 +128,7 @@ inline TIntegrator::TIntegrator() : fFunc(0) {
fIntegrator = new ROOT::Math::GSLIntegrator(ROOT::Math::Integration::kADAPTIVE,ROOT::Math::Integration::kGAUSS31);
}
//-----------------------------------------------------------------------------
/**
* <p>Destructor of the base class for 1D integrations
* Clean up.
@ -148,6 +140,7 @@ inline TIntegrator::~TIntegrator(){
fFunc=0;
}
//-----------------------------------------------------------------------------
/**
* <p>Method for passing the integrand function value to the integrator.
*
@ -162,6 +155,7 @@ inline double TIntegrator::FuncAtXgsl(double x, void *obj)
return ((TIntegrator*)obj)->FuncAtX(x);
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the integral of the function between the given boundaries
*
@ -177,6 +171,7 @@ inline double TIntegrator::IntegrateFunc(double x1, double x2)
return fIntegrator->Integral(fFunc, (this), x1, x2);
}
//-----------------------------------------------------------------------------
/**
* <p>Base class for multidimensional Monte-Carlo integrations using the GNU Scientific Library integrator.
* The function which should be integrated has to be implemented in a derived class.
@ -199,6 +194,7 @@ class TMCIntegrator {
mutable double (*fFunc)(double *, size_t, void *); ///< pointer to the integrand function
};
//-----------------------------------------------------------------------------
/**
* <p>Constructor of the base class for multidimensional Monte-Carlo integrations
* Allocation of memory for an integration using the MISER algorithm of Press and Farrar
@ -207,6 +203,7 @@ inline TMCIntegrator::TMCIntegrator() : fFunc(0) {
fMCIntegrator = new ROOT::Math::GSLMCIntegrator(ROOT::Math::MCIntegration::kMISER, 1.E-6, 1.E-4, 500000);
}
//-----------------------------------------------------------------------------
/**
* <p>Destructor of the base class for 1D integrations
* Clean up.
@ -218,6 +215,7 @@ inline TMCIntegrator::~TMCIntegrator(){
fFunc=0;
}
//-----------------------------------------------------------------------------
/**
* <p>Method for passing the integrand function value to the integrator.
*
@ -233,6 +231,7 @@ inline double TMCIntegrator::FuncAtXgsl(double *x, size_t dim, void *obj)
return ((TMCIntegrator*)obj)->FuncAtX(x);
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the integral of the function between the given boundaries
*
@ -249,6 +248,47 @@ inline double TMCIntegrator::IntegrateFunc(size_t dim, double *x1, double *x2)
return fMCIntegrator->Integral(fFunc, dim, x1, x2, (this));
}
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and a point p symmetry of the superconducting order parameter.
* The integration uses the Cuhre algorithm of the Cuba library.
*/
class TPointPWaveGapIntegralCuhre {
public:
TPointPWaveGapIntegralCuhre() : fNDim(2) {}
~TPointPWaveGapIntegralCuhre() { fPar.clear(); }
void SetParameters(const std::vector<double> &par) { fPar=par; }
static int Integrand_aa(const int*, const double[], const int*, double[], void*);
static int Integrand_cc(const int*, const double[], const int*, double[], void*);
double IntegrateFunc(int tag);
protected:
static std::vector<double> fPar; ///< parameters of the integrand
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and a line p symmetry of the superconducting order parameter.
* The integration uses the Cuhre algorithm of the Cuba library.
*/
class TLinePWaveGapIntegralCuhre {
public:
TLinePWaveGapIntegralCuhre() : fNDim(2) {}
~TLinePWaveGapIntegralCuhre() { fPar.clear(); }
void SetParameters(const std::vector<double> &par) { fPar=par; }
static int Integrand_aa(const int*, const double[], const int*, double[], void*);
static int Integrand_cc(const int*, const double[], const int*, double[], void*);
double IntegrateFunc(int tag);
protected:
static std::vector<double> fPar; ///< parameters of the integrand
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and a d_{x^2-y^2} symmetry of the superconducting order parameter.
@ -267,6 +307,7 @@ class TDWaveGapIntegralCuhre {
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density along the a-axis
* within the semi-classical model assuming a cylindrical Fermi surface and a mixed d_{x^2-y^2} + s symmetry of the
@ -286,6 +327,7 @@ class TCosSqDWaveGapIntegralCuhre {
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density along the b-axis
* within the semi-classical model assuming a cylindrical Fermi surface and a mixed d_{x^2-y^2} + s symmetry of the
@ -305,6 +347,7 @@ class TSinSqDWaveGapIntegralCuhre {
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and an "anisotropic s-wave" symmetry of the superconducting order parameter.
@ -323,6 +366,7 @@ class TAnSWaveGapIntegralCuhre {
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and an "anisotropic s-wave" symmetry of the superconducting order parameter.
@ -341,6 +385,7 @@ class TAnSWaveGapIntegralDivonne {
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and an "anisotropic s-wave" symmetry of the superconducting order parameter.
@ -359,6 +404,7 @@ class TAnSWaveGapIntegralSuave {
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and an "non-monotonic d-wave" symmetry of the superconducting order parameter.
@ -377,6 +423,7 @@ class TNonMonDWave1GapIntegralCuhre {
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Two-dimensional integrator class for the efficient calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and an "non-monotonic d-wave" symmetry of the superconducting order parameter.
@ -395,6 +442,7 @@ class TNonMonDWave2GapIntegralCuhre {
unsigned int fNDim; ///< dimension of the integral
};
//-----------------------------------------------------------------------------
/**
* <p>Test class for the 2D MC integration
* Integral: x*y dx dy
@ -406,6 +454,7 @@ class T2DTest : public TMCIntegrator {
double FuncAtX(double *) const;
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the function x*y
*
@ -419,6 +468,65 @@ inline double T2DTest::FuncAtX(double *x) const
return x[0]*x[1];
}
//-----------------------------------------------------------------------------
/**
* <p>Class for the 2D Monte-Carlo integration for the calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and a point p symmetry of the superconducting order parameter.
* The integration uses the GSL integration routines.
*/
class TPointPWaveGapIntegral : public TMCIntegrator {
public:
TPointPWaveGapIntegral() {}
~TPointPWaveGapIntegral() {}
double FuncAtX(double *) const;
};
//-----------------------------------------------------------------------------
/**
* <p>Class for the 2D Monte-Carlo integration for the calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and a line p symmetry of the superconducting order parameter.
* The integration uses the GSL integration routines.
*/
class TLinePWaveGapIntegral : public TMCIntegrator {
public:
TLinePWaveGapIntegral() {}
~TLinePWaveGapIntegral() {}
double FuncAtX(double *) const;
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the function
*
* <p><b>return:</b>
* - function value
*
* \param x point where the function should be evaluated
*/
inline double TPointPWaveGapIntegral::FuncAtX(double *x) const // x = {E, theta}, fPar = {T, Delta(T)}
{
double twokt(2.0*0.08617384436*fPar[0]); // kB in meV/K
double deltasq(TMath::Power(fPar[1]*TMath::Sin(x[1]),2.0));
return -TMath::Sin(x[1])/(4.0*twokt*TMath::CosH(TMath::Sqrt(x[0]*x[0]+deltasq)/twokt)*TMath::CosH(TMath::Sqrt(x[0]*x[0]+deltasq)/twokt));
}
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the function
*
* <p><b>return:</b>
* - function value
*
* \param x point where the function should be evaluated
*/
inline double TLinePWaveGapIntegral::FuncAtX(double *x) const // x = {E, theta}, fPar = {T, Delta(T)}
{
double twokt(2.0*0.08617384436*fPar[0]); // kB in meV/K
double deltasq(TMath::Power(fPar[1]*TMath::Cos(x[1]),2.0));
return -TMath::Sin(x[1])/(4.0*twokt*TMath::CosH(TMath::Sqrt(x[0]*x[0]+deltasq)/twokt)*TMath::CosH(TMath::Sqrt(x[0]*x[0]+deltasq)/twokt));
}
//-----------------------------------------------------------------------------
/**
* <p>Class for the 2D Monte-Carlo integration for the calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and a d_{x^2-y^2} symmetry of the superconducting order parameter.
@ -431,6 +539,7 @@ class TDWaveGapIntegral : public TMCIntegrator {
double FuncAtX(double *) const;
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the function
*
@ -446,6 +555,7 @@ inline double TDWaveGapIntegral::FuncAtX(double *x) const // x = {E, phi}, fPar
return -1.0/(2.0*twokt*TMath::CosH(TMath::Sqrt(x[0]*x[0]+deltasq)/twokt)*TMath::CosH(TMath::Sqrt(x[0]*x[0]+deltasq)/twokt));
}
//-----------------------------------------------------------------------------
/**
* <p>Class for the 2D Monte-Carlo integration for the calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and an "anisotropic s-wave" symmetry of the superconducting order parameter.
@ -458,6 +568,7 @@ class TAnSWaveGapIntegral : public TMCIntegrator {
double FuncAtX(double *) const;
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the function
*
@ -473,6 +584,7 @@ inline double TAnSWaveGapIntegral::FuncAtX(double *x) const // x = {E, phi}, fPa
return -1.0/(2.0*twokt*TMath::CosH(TMath::Sqrt(x[0]*x[0]+deltasq)/twokt)*TMath::CosH(TMath::Sqrt(x[0]*x[0]+deltasq)/twokt));
}
//-----------------------------------------------------------------------------
/**
* <p>Class for the 1D integration of j0(a*x)*exp(-b*x)
* The integration uses the GSL integration routines.
@ -486,6 +598,7 @@ class TIntBesselJ0Exp : public T2Integrator {
double FuncAtX(double, const std::vector<double>&) const;
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the function j0(a*x)*exp(-b*x)
*
@ -506,6 +619,7 @@ inline double TIntBesselJ0Exp::FuncAtX(double x, const std::vector<double> &par)
return j0 * TMath::Exp(-par[1]*x);
}
//-----------------------------------------------------------------------------
/**
* <p>Class for the 1D integration of sin(a*x)*exp(-b*x*x)
* The integration uses the GSL integration routines.
@ -519,6 +633,7 @@ class TIntSinGss : public T2Integrator {
double FuncAtX(double, const std::vector<double>&) const;
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the function sin(a*x)*exp(-b*x*x)
*
@ -532,6 +647,7 @@ inline double TIntSinGss::FuncAtX(double x, const std::vector<double> &par) cons
return TMath::Sin(TMath::TwoPi()*par[0]*x) * TMath::Exp(-0.5*par[1]*par[1]*x*x);
}
//-----------------------------------------------------------------------------
/**
* <p>Class for the 1D integration of the "DeRenzi Spin Glass Interpolation Integrand"
* See Eq. (5) of R. De Renzi and S. Fanesi, Physica B 289-290, 209-212 (2000).
@ -547,6 +663,7 @@ class TIntSGInterpolation : public T2Integrator {
double FuncAtX(double, const std::vector<double>&) const;
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the function
*
@ -563,6 +680,7 @@ inline double TIntSGInterpolation::FuncAtX(double x, const std::vector<double> &
return (wt*TMath::Cos(wt)-TMath::Sin(wt))/(wt*wt)*TMath::Exp(-TMath::Power(expo,par[3]))/TMath::Power(expo,(1.0-par[3]));
}
//-----------------------------------------------------------------------------
/**
* <p>Class for the 1D integration for the calculation of the superfluid density within the semi-classical model
* assuming a cylindrical Fermi surface and an isotropic s-wave symmetry of the superconducting order parameter.
@ -575,6 +693,7 @@ class TGapIntegral : public TIntegrator {
double FuncAtX(double) const; // variable: E
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the function df/dE * E / sqrt(E^2 - Delta^2)
*
@ -588,6 +707,7 @@ inline double TGapIntegral::FuncAtX(double e) const
return 1.0/(TMath::Power(TMath::CosH(TMath::Sqrt(e*e+fPar[1]*fPar[1])/fPar[0]),2.0));
}
//-----------------------------------------------------------------------------
/**
* <p>Class for the 1D integration for the calculation of the uniaxial static Gauss-Kubo-Toyabe function
* The integration uses the GSL integration routines.
@ -601,6 +721,7 @@ class TFirstUniaxialGssKTIntegral : public T2Integrator {
virtual double FuncAtX(double, const std::vector<double>&) const; // variable: x
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the integrand in Eq. (7) of Solt's article
*
@ -618,6 +739,7 @@ inline double TFirstUniaxialGssKTIntegral::FuncAtX(double x, const std::vector<d
return (1.0 - x*x)*(p - SsqTsq)/TMath::Power(p, 2.5)*TMath::Exp(-0.5*SsqTsq/p);
}
//-----------------------------------------------------------------------------
/**
* <p>Class for the 1D integration for the calculation of the uniaxial static Gauss-Kubo-Toyabe function
* The integration uses the GSL integration routines.
@ -631,6 +753,7 @@ class TSecondUniaxialGssKTIntegral : public T2Integrator {
virtual double FuncAtX(double, const std::vector<double>&) const; // variable: x
};
//-----------------------------------------------------------------------------
/**
* <p>Calculate the function value---actual implementation of the integrand in Eq. (7) of Solt's article
*

View File

@ -11,7 +11,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2014 by Andreas Suter, Bastian M. Wojek *
* Copyright (C) 2007-2021 by Andreas Suter, Bastian M. Wojek *
* *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -11,7 +11,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter, Bastian M. Wojek *
* Copyright (C) 2007-2021 by Andreas Suter, Bastian M. Wojek *
* *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -38,7 +38,6 @@ configure_file("PMagProximityFitter.pc.in" "PMagProximityFitter.pc" @ONLY)
add_library(PMagProximityFitter SHARED
PMagProximityFitter.cpp
PMagProximityFitterDict.cxx
PMPRgeHandler.cpp
PMPStartupHandler.cpp
PMPStartupHandlerDict.cxx
)
@ -57,7 +56,7 @@ set_target_properties(PMagProximityFitter
)
#--- add library dependencies -------------------------------------------------
target_link_libraries(PMagProximityFitter ${FFTW3_LIBRARY} ${ROOT_LIBRARIES} PUserFcnBase)
target_link_libraries(PMagProximityFitter ${FFTW3_LIBRARY} ${ROOT_LIBRARIES} PRgeHandler PUserFcnBase)
#--- install PMagProximityFitter solib ----------------------------------------
install(TARGETS PMagProximityFitter DESTINATION lib)
@ -76,7 +75,6 @@ install(
FILES
PMagProximity.h
PMagProximityFitter.h
PMPRgeHandler.h
PMPStartupHandler.h
DESTINATION
include

View File

@ -1,212 +0,0 @@
/***************************************************************************
PMPRgeHandler.cpp
Author: Andreas Suter
e-mail: andreas.suter@psi.ch
***************************************************************************/
/***************************************************************************
* Copyright (C) 2011-2019 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <cassert>
#include <iostream>
#include <fstream>
#include "PMPRgeHandler.h"
//--------------------------------------------------------------------------
// Constructor
//--------------------------------------------------------------------------
/**
*
*/
PMPRgeHandler::PMPRgeHandler(const PStringVector &rgeDataPathList, const PDoubleVector &rgeDataEnergyList)
{
fIsValid = false;
fIsValid = LoadRgeData(rgeDataPathList, rgeDataEnergyList);
}
//--------------------------------------------------------------------------
// Destructor
//--------------------------------------------------------------------------
/**
*
*/
PMPRgeHandler::~PMPRgeHandler()
{
fRgeDataList.clear();
}
//--------------------------------------------------------------------------
// GetRgeEnergyIndex
//--------------------------------------------------------------------------
/**
*
* \param energy in (keV)
*/
Int_t PMPRgeHandler::GetRgeEnergyIndex(const Double_t energy)
{
Int_t idx = -1;
for (UInt_t i=0; i<fRgeDataList.size(); i++) {
if (energy == fRgeDataList[i].energy) {
idx = i;
break;
}
}
return idx;
}
//--------------------------------------------------------------------------
// GetRgeValue
//--------------------------------------------------------------------------
/**
*
* \param energy in (keV)
* \param dist in (nm)
*/
Double_t PMPRgeHandler::GetRgeValue(const Int_t index, const Double_t dist)
{
Double_t rgeVal = 0.0;
UInt_t distIdx = static_cast<UInt_t>(dist/(fRgeDataList[index].stoppingDistance[1]-fRgeDataList[index].stoppingDistance[0]));
if (distIdx >= fRgeDataList[index].stoppingDistance.size()) {
rgeVal = 0.0;
} else {
rgeVal = fRgeDataList[index].stoppingAmplitude[distIdx] +
(fRgeDataList[index].stoppingAmplitude[distIdx+1] - fRgeDataList[index].stoppingAmplitude[distIdx]) *
(dist-fRgeDataList[index].stoppingDistance[distIdx])/(fRgeDataList[index].stoppingDistance[distIdx+1]-fRgeDataList[index].stoppingDistance[distIdx]);
}
return rgeVal;
}
//--------------------------------------------------------------------------
// GetRgeValue
//--------------------------------------------------------------------------
/**
*
* \param energy in (keV)
* \param dist in (nm)
*/
Double_t PMPRgeHandler::GetRgeValue(const Double_t energy, const Double_t dist)
{
// check if energy is present in rge data list
Int_t idx = -1;
for (UInt_t i=0; i<fRgeDataList.size(); i++) {
if (energy == fRgeDataList[i].energy) {
idx = i;
break;
}
}
// energy not found
if (idx == -1)
return -1.0;
return GetRgeValue(idx, dist);
}
//--------------------------------------------------------------------------
// LoadRgeData
//--------------------------------------------------------------------------
/**
*
*/
Bool_t PMPRgeHandler::LoadRgeData(const PStringVector &rgeDataPathList, const PDoubleVector &rgeDataEnergyList)
{
std::ifstream fin;
PMPRgeData data;
Int_t idx=0;
TString dataName, tstr;
char line[512];
int result;
double dist, val;
for (UInt_t i=0; i<rgeDataPathList.size(); i++) {
// open rge-file for reading
fin.open(rgeDataPathList[i].Data(), std::iostream::in);
if (!fin.is_open()) {
std::cout << std::endl << "PMPRgeHandler::LoadRgeData **ERROR**";
std::cout << std::endl << " Could not open file " << rgeDataPathList[i].Data();
std::cout << std::endl;
return false;
}
// keep energy (in keV)
data.energy = rgeDataEnergyList[i]/1000.0;
// read msr-file
idx = 0;
while (!fin.eof()) {
// read a line
fin.getline(line, sizeof(line));
idx++;
// ignore first line
if (idx <= 1)
continue;
// ignore empty lines
tstr = line;
if (tstr.IsWhitespace())
continue;
// get values
result = sscanf(line, "%lf %lf", &dist, &val);
// check if data are valid
if (result != 2) {
fin.close();
return false;
}
// feed fRgeDataList
data.stoppingDistance.push_back(dist/10.0); // keep distancies in (nm)
data.stoppingAmplitude.push_back(val);
}
// normalize stopping distribution
Double_t norm = 0.0;
for (UInt_t j=0; j<data.stoppingAmplitude.size(); j++)
norm += data.stoppingAmplitude[j];
norm *= (data.stoppingDistance[1] - data.stoppingDistance[0]);
for (UInt_t j=0; j<data.stoppingAmplitude.size(); j++)
data.stoppingAmplitude[j] /= norm;
// keep data
fRgeDataList.push_back(data);
// clean up
data.stoppingAmplitude.clear();
data.stoppingDistance.clear();
fin.close();
}
return true;
}

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2011-2019 by Andreas Suter *
* Copyright (C) 2011-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2011-2019 by Andreas Suter *
* Copyright (C) 2011-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2011-2019 by Andreas Suter *
* Copyright (C) 2011-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2011-2019 by Andreas Suter *
* Copyright (C) 2011-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -10,7 +10,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2011-2019 by Andreas Suter *
* Copyright (C) 2011-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *
@ -89,7 +89,7 @@ PMagProximityFitterGlobal::PMagProximityFitterGlobal()
}
// load all the TRIM.SP rge-files
fRgeHandler = new PMPRgeHandler(fStartupHandler->GetTrimSpDataPathList(), fStartupHandler->GetTrimSpDataVectorList());
fRgeHandler = new PRgeHandler();
if (!fRgeHandler->IsValid()) {
std::cout << std::endl << ">> PMagProximityFitterGlobal::PMagProximityFitterGlobal **PANIC ERROR**";
std::cout << std::endl << ">> rge data handler too unhappy. Will terminate unfriendly, sorry.";

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2009-2019 by Andreas Suter *
* Copyright (C) 2009-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *
@ -32,7 +32,7 @@
#include "PUserFcnBase.h"
#include "PMPStartupHandler.h"
#include "PMPRgeHandler.h"
#include "PRgeHandler.h"
class PMagProximityFitterGlobal
{
@ -42,15 +42,15 @@ class PMagProximityFitterGlobal
Bool_t IsValid() { return fValid; }
virtual void CalculateField(const std::vector<Double_t> &param) const;
virtual Int_t GetEnergyIndex(const Double_t energy) { return fRgeHandler->GetRgeEnergyIndex(energy); }
virtual Double_t GetMuonStoppingDensity(const Int_t energyIndex, const Double_t z) const { return fRgeHandler->GetRgeValue(energyIndex, z); }
virtual Int_t GetEnergyIndex(const Double_t energy) { return fRgeHandler->GetEnergyIndex(energy); }
virtual Double_t GetMuonStoppingDensity(const Int_t energyIndex, const Double_t z) const { return fRgeHandler->Get_n(energyIndex, z); }
virtual Double_t GetMagneticField(const Double_t z) const;
private:
Bool_t fValid;
PMPStartupHandler *fStartupHandler;
PMPRgeHandler *fRgeHandler;
PRgeHandler *fRgeHandler;
mutable std::vector<Double_t> fPreviousParam;

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2011-2019 by Andreas Suter *
* Copyright (C) 2011-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *

View File

@ -3,13 +3,14 @@
<comment>
contains meta file infromation of the needed trim.sp files.
</comment>
<trim_sp_part>
<data_path>/mnt/home/nemu/analysis/2010/EuS-Co/trimsp2/EuS-Co_E</data_path>
<trim_sp>
<data_path>/afs/psi.ch/project/nemu/analysis/2010/EuS-Co/trimsp2</data_path>
<rge_fln_pre>EuS-Co_E</rge_fln_pre>
<energy_list>
<energy>5030</energy>
<energy>6330</energy>
<energy>7530</energy>
<energy>8730</energy>
</energy_list>
</trim_sp_part>
</trim_sp>
</mag_proximity>

View File

@ -15,8 +15,10 @@
<xs:complexType name="musrRoot">
<xs:sequence>
<xs:element ref="histos"/>
<xs:element name="RunHeader" type="runHeaderFolder"/>
<xs:choice>
<xs:element ref="histos"/>
<xs:element name="RunHeader" type="runHeaderFolder"/>
</xs:choice>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/> <!-- here can go any additional stuff you like -->
</xs:sequence>
</xs:complexType>
@ -100,8 +102,8 @@
<xs:element name="Generic_Validator_URL" type="TString"/>
<xs:element name="Specific_Validator_URL" type="TString"/>
<xs:element name="Generator" type="TString"/>
<xs:element name="Proposal Number" type="Int_t" minOccurs="0" maxOccurs="1"/>
<xs:element name="Main Proposer" type="TString" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Proposal_Number" type="Int_t" minOccurs="0" maxOccurs="1"/>
<xs:element name="Main_Proposer" type="TString" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="File_Name" type="TString"/>
<xs:element name="Run_Title" type="TString"/>
<xs:element name="Run_Number" type="Int_t"/>

View File

@ -14,8 +14,10 @@
<xs:complexType name="musrRoot">
<xs:sequence>
<xs:element ref="histos"/>
<xs:element name="RunHeader" type="runHeaderFolder"/>
<xs:choice>
<xs:element ref="histos"/>
<xs:element name="RunHeader" type="runHeaderFolder"/>
</xs:choice>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/> <!-- here can go any additional stuff you like -->
</xs:sequence>
</xs:complexType>
@ -101,8 +103,8 @@
<xs:element name="Generic_Validator_URL" type="TString"/>
<xs:element name="Specific_Validator_URL" type="TString"/>
<xs:element name="Generator" type="TString"/>
<xs:element name="Proposal Number" type="Int_t" minOccurs="0" maxOccurs="1"/>
<xs:element name="Main Proposer" type="TString" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Proposal_Number" type="Int_t" minOccurs="0" maxOccurs="1"/>
<xs:element name="Main_Proposer" type="TString" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="File_Name" type="TString"/>
<xs:element name="Run_Title" type="TString"/>
<xs:element name="Run_Number" type="Int_t"/>

View File

@ -8,7 +8,7 @@
***************************************************************************/
/***************************************************************************
* Copyright (C) 2007-2019 by Andreas Suter *
* Copyright (C) 2007-2021 by Andreas Suter *
* andreas.suter@psi.ch *
* *
* This program is free software; you can redistribute it and/or modify *
@ -394,6 +394,68 @@ Bool_t TMusrRunHeader::FillFolder(TFolder *folder)
return true;
}
//--------------------------------------------------------------------------
// GetTypeOfPath (public)
//--------------------------------------------------------------------------
/**
* <p>Get type of path-name, e.g. RunInfo/Sample Name.
*
* @param pathName path-name for which the type is requested
*
* @return the type, or 'undef' if path-name is not found.
*/
TString TMusrRunHeader::GetTypeOfPath(TString pathName)
{
TString type("undef");
// find pathName
for (Int_t i=0; i<fStringObj.size(); i++) {
if (fStringObj[i].GetPathName() == pathName) {
type = fStringObj[i].GetType();
return type;
}
}
for (Int_t i=0; i<fIntObj.size(); i++) {
if (fIntObj[i].GetPathName() == pathName) {
type = fIntObj[i].GetType();
return type;
}
}
for (Int_t i=0; i<fDoubleObj.size(); i++) {
if (fDoubleObj[i].GetPathName() == pathName) {
type = fDoubleObj[i].GetType();
return type;
}
}
for (Int_t i=0; i<fMusrRunPhysQuantityObj.size(); i++) {
if (fMusrRunPhysQuantityObj[i].GetPathName() == pathName) {
type = fMusrRunPhysQuantityObj[i].GetType();
return type;
}
}
for (Int_t i=0; i<fStringVectorObj.size(); i++) {
if (fStringVectorObj[i].GetPathName() == pathName) {
type = fStringVectorObj[i].GetType();
return type;
}
}
for (Int_t i=0; i<fIntVectorObj.size(); i++) {
if (fIntVectorObj[i].GetPathName() == pathName) {
type = fIntVectorObj[i].GetType();
return type;
}
}
for (Int_t i=0; i<fDoubleVectorObj.size(); i++) {
if (fDoubleVectorObj[i].GetPathName() == pathName) {
type = fDoubleVectorObj[i].GetType();
return type;
}
}
return type;
}
//--------------------------------------------------------------------------
// Get (public)
//--------------------------------------------------------------------------

Some files were not shown because too many files have changed in this diff Show More