Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
mantid
Manage
Activity
Members
Labels
Plan
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Deploy
Releases
Model registry
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Code review analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
mantidproject
mantid
Commits
d084ba1c
Commit
d084ba1c
authored
11 years ago
by
Samuel Jackson
Browse files
Options
Downloads
Patches
Plain Diff
Refs #8739 Fix Function creation.
Ties are still not working.
parent
64d6c371
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ConvFit.h
+1
-0
1 addition, 0 deletions
...t/CustomInterfaces/inc/MantidQtCustomInterfaces/ConvFit.h
Code/Mantid/MantidQt/CustomInterfaces/src/ConvFit.cpp
+72
-83
72 additions, 83 deletions
Code/Mantid/MantidQt/CustomInterfaces/src/ConvFit.cpp
with
73 additions
and
83 deletions
Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ConvFit.h
+
1
−
0
View file @
d084ba1c
...
...
@@ -49,6 +49,7 @@ namespace IDA
private
:
boost
::
shared_ptr
<
Mantid
::
API
::
CompositeFunction
>
createFunction
(
bool
tieCentres
=
false
);
QtProperty
*
createLorentzian
(
const
QString
&
);
Mantid
::
API
::
IFunction_sptr
createTemperatureCorrection
();
void
populateFunction
(
Mantid
::
API
::
IFunction_sptr
func
,
Mantid
::
API
::
IFunction_sptr
comp
,
QtProperty
*
group
,
const
std
::
string
&
pref
,
bool
tie
);
QString
fitTypeString
()
const
;
QString
backgroundString
()
const
;
...
...
This diff is collapsed.
Click to expand it.
Code/Mantid/MantidQt/CustomInterfaces/src/ConvFit.cpp
+
72
−
83
View file @
d084ba1c
...
...
@@ -388,7 +388,7 @@ namespace IDA
// --- Composite / Linear Background ---
// -------------------------------------
func
=
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"LinearBackground"
);
index
=
comp
->
addFunction
(
func
);
comp
->
addFunction
(
func
);
const
int
bgType
=
uiForm
().
confit_cbBackground
->
currentIndex
();
// 0 = Fixed Flat, 1 = Fit Flat, 2 = Fit all
...
...
@@ -418,7 +418,7 @@ namespace IDA
// --- Composite / Convolution / Resolution ---
// --------------------------------------------
func
=
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"Resolution"
);
index
=
conv
->
addFunction
(
func
);
conv
->
addFunction
(
func
);
std
::
string
resfilename
=
uiForm
().
confit_resInput
->
getFirstFilename
().
toStdString
();
Mantid
::
API
::
IFunction
::
Attribute
attr
(
resfilename
);
func
->
setAttribute
(
"FileName"
,
attr
);
...
...
@@ -426,21 +426,26 @@ namespace IDA
// --------------------------------------------------------
// --- Composite / Convolution / Model / Delta Function ---
// --------------------------------------------------------
Mantid
::
API
::
CompositeFunction_sptr
model
(
new
Mantid
::
API
::
CompositeFunction
);
bool
useDeltaFunc
=
m_cfBlnMng
->
value
(
m_cfProp
[
"UseDeltaFunc"
]);
size_t
subIndex
=
0
;
if
(
m_cfBlnMng
->
value
(
m_cfProp
[
"U
seDeltaFunc
"
])
)
if
(
u
seDeltaFunc
)
{
func
=
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"DeltaFunction"
);
index
=
conv
->
addFunction
(
func
);
index
=
model
->
addFunction
(
func
);
if
(
/*tie ||*/
!
m_cfProp
[
"DeltaHeight"
]
->
subProperties
().
isEmpty
()
)
if
(
!
m_cfProp
[
"DeltaHeight"
]
->
subProperties
().
isEmpty
()
)
{
std
::
string
parName
=
createParName
(
index
,
"Height"
);
conv
->
tie
(
parName
,
m_cfProp
[
"DeltaHeight"
]
->
valueText
().
toStdString
()
);
model
->
tie
(
parName
,
m_cfProp
[
"DeltaHeight"
]
->
valueText
().
toStdString
()
);
}
else
{
func
->
setParameter
(
"Height"
,
m_cfProp
[
"DeltaHeight"
]
->
valueText
().
toDouble
());
}
else
{
func
->
setParameter
(
"Height"
,
m_cfProp
[
"DeltaHeight"
]
->
valueText
().
toDouble
());
}
subIndex
++
;
}
// ------------------------------------------------------------
...
...
@@ -451,18 +456,6 @@ namespace IDA
Mantid
::
API
::
IFunction_sptr
tempFunc
;
QString
temperature
=
uiForm
().
confit_leTempCorrection
->
text
();
bool
useTempCorrection
=
(
!
temperature
.
isEmpty
()
&&
uiForm
().
confit_ckTempCorrection
->
isChecked
());
if
(
useTempCorrection
)
{
//create user function for the exponential correction
// (x*temp) / 1-exp(-(x*temp))
tempFunc
=
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"UserFunction"
);
//11.606 is the conversion factor from meV to K
std
::
string
formula
=
"((x*11.606)/temp) / (1 - exp(-((x*11.606)/temp)))"
;
Mantid
::
API
::
IFunction
::
Attribute
att
(
formula
);
tempFunc
->
setAttribute
(
"Formula"
,
att
);
tempFunc
->
setParameter
(
"temp"
,
temperature
.
toDouble
());
}
// -----------------------------------------------------
// --- Composite / Convolution / Model / Lorentzians ---
...
...
@@ -470,89 +463,85 @@ namespace IDA
std
::
string
prefix1
;
std
::
string
prefix2
;
//create product function for temp * lorentzian
//if temperature not included then product is lorentzian * 1
auto
product
=
boost
::
dynamic_pointer_cast
<
Mantid
::
API
::
CompositeFunction
>
(
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"ProductFunction"
));
index
=
conv
->
addFunction
(
product
);
int
fitTypeIndex
=
uiForm
().
confit_cbFitType
->
currentIndex
();
switch
(
uiForm
().
confit_cbFitType
->
currentIndex
()
)
// Add 1st Lorentzian
if
(
fitTypeIndex
>
0
)
{
case
0
:
// No Lorentzians
break
;
case
1
:
// 1 Lorentzian
if
(
tempFunc
)
//if temperature not included then product is lorentzian * 1
//create product function for temp * lorentzian
auto
product
=
boost
::
dynamic_pointer_cast
<
Mantid
::
API
::
CompositeFunction
>
(
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"ProductFunction"
));
if
(
useTempCorrection
)
{
product
->
addFunction
(
tempFunc
);
product
->
addFunction
(
createTemperatureCorrection
()
);
}
func
=
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"Lorentzian"
);
index
=
product
->
addFunction
(
func
);
// If it's the first "sub" function of model, then it wont be nested inside Convolution ...
if
(
subIndex
==
0
)
{
prefix1
=
createParName
(
index
);
}
// ... else it's part of a composite function inside Convolution.
else
{
prefix1
=
createParName
(
index
,
subIndex
);
}
subIndex
=
product
->
addFunction
(
func
);
index
=
model
->
addFunction
(
product
);
prefix1
=
createParName
(
index
,
subIndex
);
populateFunction
(
func
,
product
,
m_cfProp
[
"Lorentzian1"
],
prefix1
,
false
);
subIndex
++
;
break
;
case
2
:
// 2 Lorentzians
//Lorentzian #1
if
(
tempFunc
)
{
product
->
addFunction
(
tempFunc
);
}
func
=
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"Lorentzian"
);
index
=
product
->
addFunction
(
func
);
// If it's the first "sub" function of model, then it wont be nested inside Convolution ...
if
(
subIndex
==
0
)
{
prefix1
=
createParName
(
index
);
}
// ... else it's part of a composite function inside Convolution.
else
{
prefix1
=
createParName
(
index
,
subIndex
);
}
populateFunction
(
func
,
product
,
m_cfProp
[
"Lorentzian1"
],
prefix1
,
false
);
subIndex
++
;
}
//Lorentzian #2
product
=
boost
::
dynamic_pointer_cast
<
Mantid
::
API
::
CompositeFunction
>
(
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"ProductFunction"
));
index
=
conv
->
addFunction
(
product
);
// Add 2nd Lorentzian
if
(
fitTypeIndex
==
2
)
{
//if temperature not included then product is lorentzian * 1
//create product function for temp * lorentzian
auto
product
=
boost
::
dynamic_pointer_cast
<
Mantid
::
API
::
CompositeFunction
>
(
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"ProductFunction"
));
if
(
tempFunc
)
if
(
useTempCorrection
)
{
product
->
addFunction
(
tempFunc
);
product
->
addFunction
(
createTemperatureCorrection
()
);
}
func
=
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"Lorentzian"
);
index
=
product
->
addFunction
(
func
);
prefix2
=
createParName
(
index
,
subIndex
);
// (Part of a composite.)
subIndex
=
product
->
addFunction
(
func
);
index
=
model
->
addFunction
(
product
);
prefix2
=
createParName
(
index
,
subIndex
);
populateFunction
(
func
,
product
,
m_cfProp
[
"Lorentzian2"
],
prefix2
,
false
);
}
// Now prefix1 should be changed to reflect the fact that it is now part of a composite function inside Convolution.
prefix1
=
createParName
(
index
,
subIndex
-
1
);
conv
->
addFunction
(
model
);
comp
->
addFunction
(
conv
);
// Tie PeakCentres together
if
(
tieCentres
)
{
QString
tieL
=
QString
::
fromStdString
(
prefix1
+
"PeakCentre"
);
QString
tieR
=
QString
::
fromStdString
(
prefix2
+
"PeakCentre"
);
product
->
tie
(
tieL
.
toStdString
(),
tieR
.
toStdString
());
}
break
;
// Tie PeakCentres together
if
(
tieCentres
)
{
std
::
string
tieL
=
prefix1
+
"PeakCentre"
;
std
::
string
tieR
=
prefix2
+
"PeakCentre"
;
model
->
tie
(
tieL
,
tieR
);
}
comp
->
addFunction
(
conv
);
comp
->
applyTies
();
return
comp
;
}
Mantid
::
API
::
IFunction_sptr
ConvFit
::
createTemperatureCorrection
()
{
//create temperature correction function to multiply with the lorentzians
Mantid
::
API
::
IFunction_sptr
tempFunc
;
QString
temperature
=
uiForm
().
confit_leTempCorrection
->
text
();
bool
useTempCorrection
=
(
!
temperature
.
isEmpty
()
&&
uiForm
().
confit_ckTempCorrection
->
isChecked
());
if
(
useTempCorrection
)
{
//create user function for the exponential correction
// (x*temp) / 1-exp(-(x*temp))
tempFunc
=
Mantid
::
API
::
FunctionFactory
::
Instance
().
createFunction
(
"UserFunction"
);
//11.606 is the conversion factor from meV to K
std
::
string
formula
=
"((x*11.606)/Temp) / (1 - exp(-((x*11.606)/Temp)))"
;
Mantid
::
API
::
IFunction
::
Attribute
att
(
formula
);
tempFunc
->
setAttribute
(
"Formula"
,
att
);
tempFunc
->
setParameter
(
"Temp"
,
temperature
.
toDouble
());
}
return
tempFunc
;
}
QtProperty
*
ConvFit
::
createLorentzian
(
const
QString
&
name
)
{
QtProperty
*
lorentzGroup
=
m_cfGrpMng
->
addProperty
(
name
);
...
...
@@ -581,7 +570,7 @@ namespace IDA
{
std
::
string
name
=
pref
+
props
[
i
]
->
propertyName
().
toStdString
();
std
::
string
value
=
props
[
i
]
->
valueText
().
toStdString
();
comp
->
tie
(
name
,
value
);
comp
->
tie
(
name
,
value
);
}
else
{
...
...
@@ -992,7 +981,7 @@ namespace IDA
return
;
// Create the menu
QMenu
*
menu
=
new
QMenu
(
"
Fury
Fit"
,
m_cfTree
);
QMenu
*
menu
=
new
QMenu
(
"
Conv
Fit"
,
m_cfTree
);
QAction
*
action
;
if
(
!
fixed
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment