added skewed Gaussian to PTheory, and other minor stuff
This commit is contained in:
parent
629c658608
commit
5ab34c0ab1
@ -1,18 +0,0 @@
|
|||||||
[Breakpoint 0]
|
|
||||||
Enabled=true
|
|
||||||
File=musrfit.cpp
|
|
||||||
Line=464
|
|
||||||
Temporary=false
|
|
||||||
|
|
||||||
[General]
|
|
||||||
DebuggerCmdStr=
|
|
||||||
DriverName=GDB
|
|
||||||
FileVersion=1
|
|
||||||
OptionsSelected=
|
|
||||||
ProgramArgs=
|
|
||||||
TTYLevel=7
|
|
||||||
WorkingDirectory=
|
|
||||||
|
|
||||||
[Memory]
|
|
||||||
ColumnWidths=80,0
|
|
||||||
NumExprs=0
|
|
@ -37,7 +37,8 @@ CXX = g++
|
|||||||
CXXFLAGS = -g -Wall -fPIC
|
CXXFLAGS = -g -Wall -fPIC
|
||||||
PMUSRPATH = ./include
|
PMUSRPATH = ./include
|
||||||
MNPATH = $(ROOTSYS)/include
|
MNPATH = $(ROOTSYS)/include
|
||||||
INCLUDES = -I $(PMUSRPATH) -I $(MNPATH)
|
GSLPATH = /usr/include/gsl
|
||||||
|
INCLUDES = -I $(PMUSRPATH) -I $(MNPATH) -I $(GSLPATH)
|
||||||
LD = g++
|
LD = g++
|
||||||
LDFLAGS = -g
|
LDFLAGS = -g
|
||||||
endif
|
endif
|
||||||
@ -63,6 +64,8 @@ GLIBS = $(ROOTGLIBS) -lXMLParser
|
|||||||
PSILIBS = -lTLemRunHeader -lPMusr
|
PSILIBS = -lTLemRunHeader -lPMusr
|
||||||
# Minuit2 lib
|
# Minuit2 lib
|
||||||
MNLIB = -L$(ROOTSYS)/lib -lMinuit2
|
MNLIB = -L$(ROOTSYS)/lib -lMinuit2
|
||||||
|
# GSL lib
|
||||||
|
GSLLIB = -lgslcblas -lgsl
|
||||||
|
|
||||||
|
|
||||||
EXEC = musrfit
|
EXEC = musrfit
|
||||||
@ -78,7 +81,7 @@ all: $(EXEC)
|
|||||||
$(EXEC): $(OBJS)
|
$(EXEC): $(OBJS)
|
||||||
@echo "---> Building $(EXEC) ..."
|
@echo "---> Building $(EXEC) ..."
|
||||||
/bin/rm -f $(SHLIB)
|
/bin/rm -f $(SHLIB)
|
||||||
$(LD) $(OBJS) -o $(EXEC) $(GLIBS) $(PSILIBS) $(MNLIB)
|
$(LD) $(OBJS) -o $(EXEC) $(GLIBS) $(PSILIBS) $(MNLIB) $(GSLLIB)
|
||||||
@echo "done"
|
@echo "done"
|
||||||
|
|
||||||
# clean up: remove all object file (and core files)
|
# clean up: remove all object file (and core files)
|
||||||
|
@ -43,7 +43,8 @@ CXX = g++
|
|||||||
CXXFLAGS = -g -Wall -fPIC
|
CXXFLAGS = -g -Wall -fPIC
|
||||||
PMUSRPATH = ../include
|
PMUSRPATH = ../include
|
||||||
MNPATH = $(ROOTSYS)/include
|
MNPATH = $(ROOTSYS)/include
|
||||||
INCLUDES = -I $(PMUSRPATH) -I $(MNPATH)
|
GSLPATH = /usr/include/gsl
|
||||||
|
INCLUDES = -I $(PMUSRPATH) -I $(MNPATH) -I $(GSLPATH)
|
||||||
LD = g++
|
LD = g++
|
||||||
LDFLAGS = -g
|
LDFLAGS = -g
|
||||||
SOFLAGS = -O -shared
|
SOFLAGS = -O -shared
|
||||||
@ -71,6 +72,8 @@ GLIBS = $(ROOTGLIBS) -lXMLParser
|
|||||||
PSILIBS = -lTLemRunHeader
|
PSILIBS = -lTLemRunHeader
|
||||||
# Minuit2 lib
|
# Minuit2 lib
|
||||||
MNLIB = -L$(ROOTSYS)/lib -lMinuit2
|
MNLIB = -L$(ROOTSYS)/lib -lMinuit2
|
||||||
|
# GSL lib
|
||||||
|
GSLLIB = -lgslcblas -lgsl
|
||||||
|
|
||||||
|
|
||||||
# some definitions: headers, sources, objects,...
|
# some definitions: headers, sources, objects,...
|
||||||
@ -116,7 +119,7 @@ all: $(SHLIB)
|
|||||||
$(SHLIB): $(OBJS)
|
$(SHLIB): $(OBJS)
|
||||||
@echo "---> Building shared library $(SHLIB) ..."
|
@echo "---> Building shared library $(SHLIB) ..."
|
||||||
/bin/rm -f $(SHLIB)
|
/bin/rm -f $(SHLIB)
|
||||||
$(LD) $(OBJS) $(SOFLAGS) -o $(SHLIB) $(GLIBS) $(PSILIBS) $(MNLIB)
|
$(LD) $(OBJS) $(SOFLAGS) -o $(SHLIB) $(GLIBS) $(PSILIBS) $(MNLIB) $(GSLLIB)
|
||||||
@echo "done"
|
@echo "done"
|
||||||
|
|
||||||
# clean up: remove all object file (and core files)
|
# clean up: remove all object file (and core files)
|
||||||
|
@ -117,7 +117,7 @@ PTheory::PTheory(PMsrHandler *msrInfo, unsigned int runNo, const bool hasParent)
|
|||||||
TObjArray *tokens;
|
TObjArray *tokens;
|
||||||
TObjString *ostr;
|
TObjString *ostr;
|
||||||
|
|
||||||
tokens = str.Tokenize(" ");
|
tokens = str.Tokenize(" \t");
|
||||||
if (!tokens) {
|
if (!tokens) {
|
||||||
cout << endl << "**SEVERE ERROR**: PTheory(): Couldn't tokenize theory block line " << line->fLineNo << ".";
|
cout << endl << "**SEVERE ERROR**: PTheory(): Couldn't tokenize theory block line " << line->fLineNo << ".";
|
||||||
cout << endl << " line content: " << line->fLine.Data();
|
cout << endl << " line content: " << line->fLine.Data();
|
||||||
@ -288,6 +288,7 @@ bool PTheory::IsValid()
|
|||||||
*/
|
*/
|
||||||
double PTheory::Func(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const
|
double PTheory::Func(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const
|
||||||
{
|
{
|
||||||
|
|
||||||
if (fMul) {
|
if (fMul) {
|
||||||
if (fAdd) { // fMul != 0 && fAdd != 0
|
if (fAdd) { // fMul != 0 && fAdd != 0
|
||||||
switch (fType) {
|
switch (fType) {
|
||||||
@ -351,6 +352,10 @@ double PTheory::Func(register double t, const vector<double>& paramValues, const
|
|||||||
return InternalBessel(t, paramValues, funcValues) * fMul->Func(t, paramValues, funcValues) +
|
return InternalBessel(t, paramValues, funcValues) * fMul->Func(t, paramValues, funcValues) +
|
||||||
fAdd->Func(t, paramValues, funcValues);
|
fAdd->Func(t, paramValues, funcValues);
|
||||||
break;
|
break;
|
||||||
|
case THEORY_SKEWED_GAUSS:
|
||||||
|
return SkewedGauss(t, paramValues, funcValues) * fMul->Func(t, paramValues, funcValues) +
|
||||||
|
fAdd->Func(t, paramValues, funcValues);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
cout << endl << "**PANIC ERROR**: PTheory::Func: You never should have reached this line?!?! (" << fType << ")";
|
cout << endl << "**PANIC ERROR**: PTheory::Func: You never should have reached this line?!?! (" << fType << ")";
|
||||||
cout << endl;
|
cout << endl;
|
||||||
@ -403,6 +408,9 @@ double PTheory::Func(register double t, const vector<double>& paramValues, const
|
|||||||
case THEORY_INTERNAL_BESSEL:
|
case THEORY_INTERNAL_BESSEL:
|
||||||
return InternalBessel(t, paramValues, funcValues) * fMul->Func(t, paramValues, funcValues);
|
return InternalBessel(t, paramValues, funcValues) * fMul->Func(t, paramValues, funcValues);
|
||||||
break;
|
break;
|
||||||
|
case THEORY_SKEWED_GAUSS:
|
||||||
|
return SkewedGauss(t, paramValues, funcValues) * fMul->Func(t, paramValues, funcValues);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
cout << endl << "**PANIC ERROR**: PTheory::Func: You never should have reached this line?!?! (" << fType << ")";
|
cout << endl << "**PANIC ERROR**: PTheory::Func: You never should have reached this line?!?! (" << fType << ")";
|
||||||
cout << endl;
|
cout << endl;
|
||||||
@ -457,6 +465,9 @@ double PTheory::Func(register double t, const vector<double>& paramValues, const
|
|||||||
case THEORY_INTERNAL_BESSEL:
|
case THEORY_INTERNAL_BESSEL:
|
||||||
return InternalBessel(t, paramValues, funcValues) + fAdd->Func(t, paramValues, funcValues);
|
return InternalBessel(t, paramValues, funcValues) + fAdd->Func(t, paramValues, funcValues);
|
||||||
break;
|
break;
|
||||||
|
case THEORY_SKEWED_GAUSS:
|
||||||
|
return SkewedGauss(t, paramValues, funcValues) + fAdd->Func(t, paramValues, funcValues);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
cout << endl << "**PANIC ERROR**: PTheory::Func: You never should have reached this line?!?! (" << fType << ")";
|
cout << endl << "**PANIC ERROR**: PTheory::Func: You never should have reached this line?!?! (" << fType << ")";
|
||||||
cout << endl;
|
cout << endl;
|
||||||
@ -509,6 +520,9 @@ double PTheory::Func(register double t, const vector<double>& paramValues, const
|
|||||||
case THEORY_INTERNAL_BESSEL:
|
case THEORY_INTERNAL_BESSEL:
|
||||||
return InternalBessel(t, paramValues, funcValues);
|
return InternalBessel(t, paramValues, funcValues);
|
||||||
break;
|
break;
|
||||||
|
case THEORY_SKEWED_GAUSS:
|
||||||
|
return SkewedGauss(t, paramValues, funcValues);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
cout << endl << "**PANIC ERROR**: PTheory::Func: You never should have reached this line?!?! (" << fType << ")";
|
cout << endl << "**PANIC ERROR**: PTheory::Func: You never should have reached this line?!?! (" << fType << ")";
|
||||||
cout << endl;
|
cout << endl;
|
||||||
@ -565,7 +579,7 @@ void PTheory::MakeCleanAndTidyTheoryBlock(PMsrLines *fullTheoryBlock)
|
|||||||
// copy line content to str in order to remove comments
|
// copy line content to str in order to remove comments
|
||||||
str = line->fLine.Copy();
|
str = line->fLine.Copy();
|
||||||
// tokenize line
|
// tokenize line
|
||||||
tokens = str.Tokenize(" ");
|
tokens = str.Tokenize(" \t");
|
||||||
// make a handable string out of the asymmetry token
|
// make a handable string out of the asymmetry token
|
||||||
ostr = dynamic_cast<TObjString*>(tokens->At(0));
|
ostr = dynamic_cast<TObjString*>(tokens->At(0));
|
||||||
str = ostr->GetString();
|
str = ostr->GetString();
|
||||||
@ -968,3 +982,43 @@ double PTheory::InternalBessel(register double t, const vector<double>& paramVal
|
|||||||
0.333333333333333*TMath::Exp(-val[3]*t);
|
0.333333333333333*TMath::Exp(-val[3]*t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* \param t time in \f$(\mu\mathrm{s})\f$
|
||||||
|
* \param paramValues
|
||||||
|
*/
|
||||||
|
double PTheory::SkewedGauss(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const
|
||||||
|
{
|
||||||
|
double val[4];
|
||||||
|
double skg;
|
||||||
|
|
||||||
|
// check if FUNCTIONS are used
|
||||||
|
for (unsigned int i=0; i<4; i++) {
|
||||||
|
if (fParamNo[i] < MSR_PARAM_FUN_OFFSET) { // parameter or resolved map
|
||||||
|
val[i] = paramValues[fParamNo[i]];
|
||||||
|
} else { // function
|
||||||
|
val[i] = funcValues[fParamNo[i]-MSR_PARAM_FUN_OFFSET];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// val[2] = sigma-, val[3] = sigma+
|
||||||
|
double z1 = val[3]*t/TMath::Sqrt(2.0); // sigma+
|
||||||
|
double z2 = val[2]*t/TMath::Sqrt(2.0); // sigma-
|
||||||
|
double g1 = TMath::Exp(-0.5*TMath::Power(t*val[3], 2.0)); // gauss sigma+
|
||||||
|
double g2 = TMath::Exp(-0.5*TMath::Power(t*val[2], 2.0)); // gauss sigma-
|
||||||
|
|
||||||
|
if ((z1 >= 25.0) || (z2 >= 25.0)) // needed to prevent crash of 1F1
|
||||||
|
skg = 2.0e300;
|
||||||
|
else
|
||||||
|
skg = 0.5*TMath::Cos(DEG_TO_RAD*val[0]+TWO_PI*val[1]*t) * ( g1 + g2 ) -
|
||||||
|
0.5*TMath::Sin(DEG_TO_RAD*val[0]+TWO_PI*val[1]*t) *
|
||||||
|
(
|
||||||
|
g1*2.0*z1/TMath::Sqrt(TMath::Pi())*gsl_sf_hyperg_1F1(0.5,1.5,z1*z1) -
|
||||||
|
g2*2.0*z2/TMath::Sqrt(TMath::Pi())*gsl_sf_hyperg_1F1(0.5,1.5,z2*z2)
|
||||||
|
);
|
||||||
|
|
||||||
|
return skg;
|
||||||
|
}
|
||||||
|
@ -38,6 +38,12 @@
|
|||||||
|
|
||||||
#include "PMsrHandler.h"
|
#include "PMsrHandler.h"
|
||||||
|
|
||||||
|
#include <gsl_sf_hyperg.h>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
double gsl_sf_hyperg_1F1(double a, double b, double x);
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
// function handling tags
|
// function handling tags
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
@ -59,7 +65,8 @@
|
|||||||
#define THEORY_TF_COS 12
|
#define THEORY_TF_COS 12
|
||||||
#define THEORY_BESSEL 13
|
#define THEORY_BESSEL 13
|
||||||
#define THEORY_INTERNAL_BESSEL 14
|
#define THEORY_INTERNAL_BESSEL 14
|
||||||
#define THEORY_USER 15
|
#define THEORY_SKEWED_GAUSS 15
|
||||||
|
#define THEORY_USER 16
|
||||||
|
|
||||||
// function parameter tags, i.e. how many parameters has a specific function
|
// function parameter tags, i.e. how many parameters has a specific function
|
||||||
#define THEORY_PARAM_ASYMMETRY 1 // asymetry
|
#define THEORY_PARAM_ASYMMETRY 1 // asymetry
|
||||||
@ -77,9 +84,10 @@
|
|||||||
#define THEORY_PARAM_TF_COS 2 // phase, frequency
|
#define THEORY_PARAM_TF_COS 2 // phase, frequency
|
||||||
#define THEORY_PARAM_BESSEL 2 // phase, frequency
|
#define THEORY_PARAM_BESSEL 2 // phase, frequency
|
||||||
#define THEORY_PARAM_INTERNAL_BESSEL 5 // fraction, phase, frequency, TF damping, damping
|
#define THEORY_PARAM_INTERNAL_BESSEL 5 // fraction, phase, frequency, TF damping, damping
|
||||||
|
#define THEORY_PARAM_SKEWED_GAUSS 4 // phase, frequency, rate minus, rate plus
|
||||||
|
|
||||||
// number of available user functions
|
// number of available user functions
|
||||||
#define THEORY_MAX 15
|
#define THEORY_MAX 16
|
||||||
|
|
||||||
// deg -> rad factor
|
// deg -> rad factor
|
||||||
#define DEG_TO_RAD 0.0174532925199432955
|
#define DEG_TO_RAD 0.0174532925199432955
|
||||||
@ -150,7 +158,10 @@ static PTheoDataBase fgTheoDataBase[THEORY_MAX] = {
|
|||||||
"bessel", "b", "(phase frequency)"},
|
"bessel", "b", "(phase frequency)"},
|
||||||
|
|
||||||
{THEORY_INTERNAL_BESSEL, THEORY_PARAM_INTERNAL_BESSEL, false,
|
{THEORY_INTERNAL_BESSEL, THEORY_PARAM_INTERNAL_BESSEL, false,
|
||||||
"internBsl", "ib", "(phase frequency Trate Lrate)"}};
|
"internBsl", "ib", "(phase frequency Trate Lrate)"},
|
||||||
|
|
||||||
|
{THEORY_SKEWED_GAUSS, THEORY_PARAM_SKEWED_GAUSS, false,
|
||||||
|
"skewedGss", "skg", "(phase frequency rate_minus rate_plus)"}};
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
@ -184,6 +195,7 @@ class PTheory
|
|||||||
virtual double TFCos(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const;
|
virtual double TFCos(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const;
|
||||||
virtual double Bessel(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const;
|
virtual double Bessel(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const;
|
||||||
virtual double InternalBessel(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const;
|
virtual double InternalBessel(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const;
|
||||||
|
virtual double SkewedGauss(register double t, const vector<double>& paramValues, const vector<double>& funcValues) const;
|
||||||
|
|
||||||
// variables
|
// variables
|
||||||
bool fValid;
|
bool fValid;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user