Added PerlQt3 musrfit GUI.

This commit is contained in:
salman 2009-08-25 13:15:08 +00:00
parent a14c307f45
commit f2b20f9456
4 changed files with 5161 additions and 0 deletions

785
src/external/MuSRFitGUI/MSR.pm vendored Executable file
View File

@ -0,0 +1,785 @@
#use strict;
package MSR;
my $EMPTY="";
my $SPACE=" ";
my %DATADIRS = (
"LEM", "/mnt/data/nemu/his",
"GPS", "/afs/psi.ch/project/bulkmusr/data/gps",
"LTF", "/afs/psi.ch/project/bulkmusr/data/ltf",
"Dolly", "/afs/psi.ch/project/bulkmusr/data/dolly",
"GPD", "/afs/psi.ch/project/bulkmusr/data/gpd"
);
my %BeamLines = ( "LEM", "MUE4", "GPS", "PIM3", "LTF", "PIM3", "Dolly", "PIE1", "GPD", "PIE1" );
my %Def_Format =
( "LEM", "ROOT-NPP", "GPS", "PSI-BIN", "LTF", "PSI-BIN", "Dolly", "PSI-BIN" , "GPD", "PSI-BIN");
# Additions to paremeters' names
my $erradd = "d";
my $minadd = "_min";
my $maxadd = "_max";
##########################################################################
# CreateMSR
#
# Input in %All
# Required:
# $All{"FitType1/2/3"} - Function types, 3 components
# $All{"LRBF"} - Histograms, comma separated
# $All{"Tis"}
# $All{"Tfs"}
# $All{"BINS"}
# $All{"FILENAME"}
# $All{"go"}
# $All{"TITLE"}
# $All{"RunNumbers"}
# $All{"FitAsyType"}
# $All{"BeamLine"}
# $All{"YEAR"}
#
# Optional:
# $All{"Sh_$Param"}
# $All{"ltc"}
# $All{"$Param"} value, error, min, and max
# $All{"logx/y"}
# $All{"Xi/f"}
#
# Output
# $Full_T_Block - Full theory block
# @Paramcomp - Space separated list of parameters for each component
# FILENAME.msr - MSR file saved
#
##########################################################################
sub CreateMSR {
my %All = %{$_[0]};
# "Smart" default value of the fit parameters.
my %Defaults = (
"Asy", "0.15", "dAsy", "0.01",
"Asy_min", "0", "Asy_max", "0",
"Alpha", "1.0", "dAlpha", "0.01",
"Alpha_min", "0", "Alpha_max", "0",
"N0", "300.0", "dN0", "0.01",
"N0_min", "0", "N0_max", "0",
"NBg", "30.0", "dNBg", "0.01",
"NBg_min", "0", "NBg_max", "0",
"Lam", "1.0", "dLam", "0.01",
"Lam_min", "0", "Lam_max", "0",
"Gam", "1.0", "dGam", "0.01",
"Gam_min", "0", "Gam_max", "0",
"Bet", "0.5", "dBet", "0.01",
"Bet_min", "0", "Bet_max", "0",
"Two", "2.0", "dTwo", "0.0",
"Two_min", "0", "Two_max", "0",
"Del", "0.1", "dDel", "0.01",
"Del_min", "0", "Del_max", "0",
"Sgm", "0.1", "dSgm", "0.01",
"Sgm_min", "0", "Sgm_max", "0",
"Aa", "0.1", "dAa", "0.01",
"Aa_min", "0", "Aa_max", "0",
"q", "0.1", "dq", "0.01",
"q_min", "0", "q_max", "0",
"Bg", "0.036", "dBg", "0.01",
"Bg_min", "0", "Bg_max", "0",
"bgrlx", "0.", "dbgrlx", "0.0",
"bgrlx_min", "0", "bgrlx_max", "0",
"Frq", "1.0", "dFrq", "1.",
"Frq_min", "0", "Frq_max", "0",
"Field", "100.0", "dField", "1.",
"Field_min", "0", "Field_max", "0",
"Energy", "14.1", "dEnergy", "0.",
"Energy_min", "0", "Energy_max", "0",
"DeadLayer", "10.", "dDeadLayer", "0.1",
"DeadLayer_min", "0", "DeadLayer_max", "0",
"Lambda", "128.1", "dLambda", "0.1",
"Lambda_min", "0", "Lambda_max", "0",
"Phi", "1.", "dPhi", "0.01",
"Phi_min", "0", "Phi_max", "0"
);
# Start with empty array
my @FitTypes = ();
foreach ($All{"FitType1"},$All{"FitType2"},$All{"FitType3"}) {
if ($_ ne "None") {
@FitTypes=(@FitTypes,$_);
}
}
my @Hists = split( /,/, $All{"LRBF"} );
my @TiVals = split( /,/, $All{"Tis"} );
my @TfVals = split( /,/, $All{"Tfs"} );
my @BINVals = split( /,/, $All{"BINS"} );
my $FILENAME = $All{"FILENAME"};
my $BeamLine = $All{"BeamLine"};
my $YEAR = $All{"YEAR"};
my $DATADIR = $DATADIRS{$BeamLine};
my $Step = $All{"go"};
if ( $Step eq "PLOT" ) {
$FITMINTYPE = $EMPTY;
}
elsif ( $Step eq "MIGRAD" ) {
$FITMINTYPE = "MINIMIZE\nMIGRAD\nHESSE";
}
elsif ( $Step eq "MINOS" ) {
$FITMINTYPE = "MIGRAD\nMINOS";
}
elsif ( $Step eq "SIMPLEX" ) {
$FITMINTYPE = "SCAN\nSIMPLEX";
}
# First create the THEORY Block
my ($Full_T_Block,$Paramcomp_ref)=MSR::CreateTheory(@FitTypes);
my @Paramcomp = @$Paramcomp_ref;
my $TitleLine = $All{"TITLE"}."\n# Run Numbers: ".$All{"RunNumbers"};
$TitleLine =~ s/,/:/g;
# Fit parameters block
my $FitParaBlk = "
###################################################################
FITPARAMETER
###################################################################
# No Name Value Err Min Max ";
# Counter for RUNS
my $iRun = 1;
# Counter of Params
my $j = 1;
my @RUNS=split( /,/, $All{"RunNumbers"});
# $shcount is a counter for shared parameters
if ( $#RUNS == 0 ) {
my $shcount = 1;
}
else {
if ( $All{"Sh_Alpha"} == 1 ) {
my $shcount = 1;
}
elsif ( $All{"Sh_N0"} == 1 ) {
my $shcount = 1;
}
elsif ( $All{"Sh_NBg"} == 1 ) {
my $shcount = 1;
}
else {
my $shcount = 0;
}
}
$shcount = 1;
my $RUN_Block = $EMPTY;
my $RUNS_Line = $EMPTY;
# range order
my $Range_Order = 1;
foreach my $RUN (@RUNS) {
#######################################################################
# Prepare the Parameters and initial values block
my $component = 0;
my $Single_RUN = $EMPTY;
# Prepare map line for each run
my $MAP_Line = "map ";
# How many non-shared parameter for this RUN?
my $nonsh = 0;
# Prepeare Alpha/N0/NBg line for the RUN block. Empty initially.
my $Alpha_Line = $EMPTY;
# Loop over all components in the fit
foreach my $FitType (@FitTypes) {
++$component;
my $Parameters = $Paramcomp[ $component - 1 ];
my @Params = split( /\s+/, $Parameters );
# For the first component we need Alpha for Asymmetry fits
if ( $component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) {
unshift( @Params, "Alpha" );
}
# For the first component we need No and NBg for SingleHist fits
elsif ( $component == 1 && $All{"FitAsyType"} eq "SingleHist" ) {
unshift( @Params, ( "N0", "NBg" ) );
}
foreach $Param (@Params) {
$Param_ORG = $Param;
if ( ($#FitTypes != 0) && ($Param ne "Alpha" && $Param ne "N0" && $Param ne "NBg" ) ) {
$Param = join( $EMPTY, $Param, "_", "$component" );
}
# If we have only one RUN then everything is shared
if ( $#RUNS == 0 ) {
$Shared = 1;
}
# Otherwise check input if it was marked as shared
else {
$Shared = $All{"Sh_$Param"};
}
# Alpha, N0 and NBg Lines
#
# If you encounter alpha in the parameters list make sure
# to fill this line for the RUN block.
if ( $Param_ORG eq "Alpha" ) {
if ($Shared) {
# If alpha is shared use always the same line
$Alpha_Line = "alpha 1\n";
}
else {
# Otherwise modify alpha line accordingly
$Alpha_Line = "alpha $j\n";
}
}
# If you encounter N0 in the parameters list make sure
# to fill this line for the RUN block.
elsif ( $Param_ORG eq "N0" ) {
if ($Shared) {
$Alpha_Line = "norm 1\n";
}
else {
$Alpha_Line = "norm $j\n";
}
# Optional - add lifetime correction for SingleHist fits
if ( $All{"ltc"} eq "y" ) {
$Alpha_Line = $Alpha_Line . "lifetimecorrection\n";
}
# If you encounter NBg in the parameters list make sure
# to fill this line for the RUN block.
}
elsif ( $Param_ORG eq "NBg" ) {
if ($Shared) {
$Alpha_Line = $Alpha_Line . "backgr.fit 2\n";
}
else {
$Alpha_Line = $Alpha_Line . "backgr.fit $j\n";
}
}
# End of Alpha, N0 and NBg Lines
####################################################################################################
####################################################################################################
# Extract initial values, error and max/min from input
$Name = $Param . "_" . $iRun;
$value = $All{"$Name"};
$error = $All{"$erradd$Name"};
$minvalue = $All{"$Name$minadd"};
$maxvalue = $All{"$Name$maxadd"};
# If these values are not in the input then take the defaulst
# I think that this can go at the end if we use a separate initialization routine
if ($value eq $EMPTY) {
$value = $Defaults{"$Param_ORG"};
$error = $Defaults{"$erradd$Param_ORG"};
$minvalue = $Defaults{"$Param_ORG$minadd"};
$maxvalue = $Defaults{"$Param_ORG$maxadd"};
}
if ( $minvalue == $maxvalue ) {
$minvalue = $EMPTY;
$maxvalue = $EMPTY;
}
####################################################################################################
# Start preparing the parameters block
if ($Shared) {
# Parameter is shared enough to keep order from first run
if ( $iRun == 1 ) {
$FitParaBlk = $FitParaBlk . "
$j $Name $value $error $error $minvalue $maxvalue";
$Full_T_Block =~ s/$Param_ORG/$j/;
++$shcount;
++$j;
}
} else {
# Parameter is not shared, use map unless it is a single RUN fit
$FitParaBlk = $FitParaBlk . "
$j $Name $value $error $error $minvalue $maxvalue";
# Skip adding to map line in these cases
if ( $Param ne "Alpha"
&& $Param ne "N0"
&& $Param ne "NBg"
&& $#RUNS != 0 )
{
++$nonsh;
$Full_T_Block =~ s/$Param_ORG/map$nonsh/;
$MAP_Line = join( ' ', $MAP_Line, $j );
}
++$j;
}
$NtotPar = $j;
}
}
# Finished preparing the FITPARAMETERS block
#######################################################################
# For each defined range we need a block in the RUN-Block
# Also for each histogram in Single Histograms fits
# Also for Imaginaryand and Real for RRF fits
$RUN = $RUNS[ $iRun - 1 ];
if ( $RUN < 10 ) { $RUN = "000" . $RUN; }
elsif ( $RUN < 100 ) { $RUN = "00" . $RUN; }
elsif ( $RUN < 1000 ) { $RUN = "0" . $RUN; }
# Get current year
( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
localtime( time() );
my $current_year = $year + 1900;
# $TC="$TC<br>Data dir:".$DATADIRS{$BeamLine}."<br>";
if ( $BeamLine eq "LEM" ) {
$RUN_File_Name = "lem" . substr( $YEAR, 2 ) . "_his_" . $RUN;
$RUNFILE = "$DATADIR/$YEAR/$RUN_File_Name";
$RUN_Line = join( $SPACE,
"RUN", $RUNFILE, $BeamLines{$BeamLine}, "PSI",
$Def_Format{$BeamLine} );
}
elsif ( $BeamLine eq "GPS" ) {
$RUN_File_Name = "deltat_pta_gps_" . $RUN;
if ( $YEAR == $current_year ) {
$RUNFILE = "$DATADIR/$RUN_File_Name";
}
else {
$RUNFILE = "$DATADIR/d$YEAR/pta/$RUN_File_Name";
}
$RUN_Line = join( $SPACE,
"RUN", $RUNFILE, $BeamLines{$BeamLine}, "PSI",
$Def_Format{$BeamLine} );
}
elsif ( $BeamLine eq "LTF" ) {
$RUN_File_Name = "deltat_pta_ltf_" . $RUN;
if ( $YEAR == $current_year ) {
$RUNFILE = "$DATADIR/$RUN_File_Name";
}
else {
$RUNFILE = "$DATADIR/d$YEAR/pta/$RUN_File_Name";
}
$RUN_Line = join( $SPACE,
"RUN", $RUNFILE, $BeamLines{$BeamLine}, "PSI",
$Def_Format{$BeamLine} );
}
elsif ( $BeamLine eq "Dolly" ) {
$RUN_File_Name = "deltat_pta_dolly_" . $RUN;
if ( $YEAR == $current_year ) {
$RUNFILE = "$DATADIR/$RUN_File_Name";
}
else {
$RUNFILE = "$DATADIR/d$YEAR/pta/$RUN_File_Name";
}
$RUN_Line = join( $SPACE,
"RUN", $RUNFILE, $BeamLines{$BeamLine}, "PSI",
$Def_Format{$BeamLine} );
}
elsif ( $BeamLine eq "GPD" ) {
$RUN_File_Name = "deltat_pta_gpd_" . $RUN;
if ( $YEAR == $current_year ) {
$RUNFILE = "$DATADIR/$RUN_File_Name";
}
else {
$RUNFILE = "$DATADIR/d$YEAR/pta/$RUN_File_Name";
}
$RUN_Line = join( $SPACE,
"RUN", $RUNFILE, $BeamLines{$BeamLine}, "PSI",
$Def_Format{$BeamLine} );
}
# What kind of fit? 0 - Single Histogram, 2 - Asymmetry, 4 - RRF
if ( $All{"FitAsyType"} eq "Asymmetry" ) {
$Type_Line = "fittype 2";
$PLT = 2;
$Hist_Lines =
"forward $Hists[0]\nbackward $Hists[1]";
$Bg_Line = "background 66000 66500 66000 66500";
$Data_Line = "data 3419 63000 3419 63000";
}
elsif ( $All{"FitAsyType"} eq "SingleHist" ) {
$Type_Line = "fittype 0";
$PLT = 0;
$Hist_Lines = "forward HIST";
$Bg_Line = $EMPTY;
$Data_Line = "data 3419 63000";
}
elsif ( $All{"FitAsyType"} eq "RotRF" ) {
$Type_Line = "fittype 4";
}
# Omit background and data lines for LTG,GPS and Dolly
if ( $BeamLine ne "LEM" ) {
$Bg_Line = "background 50 250 50 250";
$Data_Line =
"t0 287 284\ndata 297 8000 294 8000";
}
# $MAP_Line = "map 0 0 0 0 0 0 0 0 0 0";
$FRANGE_Line = "fit TINI TFIN";
$PAC_Line = "packing BINNING";
if ( $All{"FitAsyType"} eq "Asymmetry" ) {
$Single_RUN =
"$RUN_Line\n$Type_Line\n$Alpha_Line$Hist_Lines\n$Bg_Line\n$Data_Line\n$MAP_Line\n$FRANGE_Line\n$PAC_Line\n\n";
}
elsif ( $All{"FitAsyType"} eq "SingleHist" ) {
$Single_RUN = $EMPTY;
foreach my $Hist (@Hists) {
$Tmp_Hist_Line = $Hist_Lines;
$Tmp_Hist_Line =~ s/HIST/$Hist/g;
$Single_RUN = $Single_RUN
. "$RUN_Line\n$Type_Line\n$Alpha_Line$Tmp_Hist_Line\n$Data_Line\n$MAP_Line\n$FRANGE_Line\n$PAC_Line\n\n";
}
}
# Now add the appropriate values of fit range and packing
my $Range_Min = 8;
my $Range_Max = 0;
my $k = 0;
foreach my $Ti (@TiVals) {
my $Tf = $TfVals[$k];
my $BIN = $BINVals[$k];
$RUN_Block = $RUN_Block . $Single_RUN;
$RUN_Block =~ s/TINI/$Ti/g;
$RUN_Block =~ s/TFIN/$Tf/g;
$RUN_Block =~ s/BINNING/$BIN/g;
# For multiple ranges use this
if ( $Ti < $Range_Min ) { $Range_Min = $Ti; }
if ( $Tf > $Range_Max ) { $Range_Max = $Tf; }
if ( $All{"FitAsyType"} eq "Asymmetry" ) {
$RUNS_Line = "$RUNS_Line " . $Range_Order;
}
elsif ( $All{"FitAsyType"} eq "SingleHist" ) {
$RUNS_Line = "$RUNS_Line " . $Range_Order;
}
++$k;
++$Range_Order;
}
# if ($FitAsyType eq "Asymmetry") {$RUNS_Line="$RUNS_Line ".$iRun*$k;}
++$iRun;
}
# The number of runs is
$NRUNS = $iRun - 1;
$Full_T_Block = "
###################################################################
THEORY
###################################################################
$Full_T_Block
";
$RUN_Block =
"###################################################################
$RUN_Block";
$COMMANDS_Block =
"###################################################################
COMMANDS
FITMINTYPE
SAVE
";
$COMMANDS_Block =~ s/FITMINTYPE/$FITMINTYPE/g;
# Check if log x and log y are selected
my $logxy = $EMPTY;
if ( $All{"logx"} eq "y" ) { $logxy = $logxy . "logx\n"; }
if ( $All{"logy"} eq "y" ) { $logxy = $logxy . "logy\n"; }
# Check if a plot range is defined (i.e. different from fit)
$PRANGE_Line = "use_fit_ranges";
if ( $All{"Xi"} != $All{"Xf"} ) {
# if ($Yi != $Yf) {
$PRANGE_Line = "range ".$All{"Xi"}." ".$All{"Xf"}." ".$All{"Yi"}." ".$All{"Yf"};
# } else {
# $PRANGE_Line = "range $Xi $Xf";
# }
}
$PLOT_Block =
"###################################################################
PLOT $PLT
runs $RUNS_Line
$PRANGE_Line
$logxy";
# Don't know why but it is needed initially
$STAT_Block =
"###############################################################
STATISTIC --- 0000-00-00 00:00:00
*** FIT DID NOT CONVERGE ***";
# Empty line at the end of each block
my $FullMSRFile = "$TitleLine$FitParaBlk\n$Full_T_Block\n$RUN_Block\n$COMMANDS_Block\n$PLOT_Block\n$STAT_Block\n";
# Open output file FILENAME.msr
open( OUTF,q{>},"$FILENAME.msr" );
print OUTF ("$FullMSRFile");
close(OUTF);
return($Full_T_Block,\@Paramcomp);
}
########################
# Createheory
########################
sub CreateTheory {
# This subroutine requires:
# @FitTypes - the array of the types of components (summed)
# It will return:
# $Full_T_Block - the full theory block with names of parameters
# @Paramcomp - an array of space separated list of parameters
# each member of the array is one component
my (@FitTypes) = @_;
# Start from this theory line for the different fitting functions
my %THEORY = (
"asymmetry", "Asy",
"simplExpo", "Lam",
"generExpo", "Lam Bet",
"simpleGss", "Sgm",
"statGssKT", "Sgm",
"statGssKTLF", "Frq Sgm",
"dynGssKTLF", "Frq Sgm Lam",
"statExpKT", "Lam",
"statExpKTLF", "Frq Aa",
"dynExpKTLF", "Frq Aa Lam",
"combiLGKT", "Lam Sgm",
"spinGlass", "Lam gam q",
"rdAnisoHf", "Frq Lam",
"TFieldCos", "Phi Frq",
"internFld", "Alp Phi Frq LamT LamL",
"Bessel", "Phi Frq",
"internBsl", "Alp Phi Frq LamT LamL",
"abragam", "Sgm gam",
"Meissner", "Phi Energy Field DeadLayer Lambda",
"skewedGss", "Phi Frq Sgmm Sgmp"
);
#######################################################################
# Generate the full THEORY block
my $Full_T_Block = $EMPTY;
my $component = 0;
foreach my $FitType (@FitTypes) {
++$component;
# Add components
if ( $component > 1 ) {
$Full_T_Block = $Full_T_Block . "\n+\n";
}
# For each component there is a THEORY block starting with "asymmetry"
my $T_Block = "asymmetry " . $THEORY{'asymmetry'};
my $Parameters = $THEORY{'asymmetry'};
# Compose the THEORY block
# The duplicate names are changed for multiplied signals or just
# change names to match parameters list declared for the function
# Stretch exponential
if ( $FitType eq "Stretch" ) {
$T_Block = $T_Block . "\n" . "generExpo " . $THEORY{'generExpo'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'generExpo'} );
}
# Exponential
elsif ( $FitType eq "Exponential" ) {
$T_Block = $T_Block . "\n" . "simplExpo " . $THEORY{'simplExpo'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'simplExpo'} );
}
# Gaussian
elsif ( $FitType eq "Gaussian" ) {
$T_Block = $T_Block . "\n" . "simpleGss " . $THEORY{'simpleGss'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'simpleGss'} );
}
# Exponential with 0 relaxation
elsif ( $FitType eq "Background" ) {
# Do nothing
}
# Oscillationg exponential
elsif ( $FitType eq "ExponentialCos" ) {
$T_Block = $T_Block . "\n" . "simplExpo " . $THEORY{'simplExpo'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'simplExpo'} );
$T_Block = $T_Block . "\n" . "TFieldCos " . $THEORY{'TFieldCos'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'TFieldCos'} );
}
# Oscillationg gaussian
elsif ( $FitType eq "GaussianCos" ) {
$T_Block = $T_Block . "\n" . "simpleGss " . $THEORY{'simpleGss'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'simpleGss'} );
$T_Block = $T_Block . "\n" . "TFieldCos " . $THEORY{'TFieldCos'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'TFieldCos'} );
}
# Oscillationg stretch exponential
elsif ( $FitType eq "StretchCos" ) {
$T_Block = $T_Block . "\n" . "generExpo " . $THEORY{'generExpo'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'generExpo'} );
$T_Block = $T_Block . "\n" . "TFieldCos " . $THEORY{'TFieldCos'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'TFieldCos'} );
}
# Oscillationg Gaussian
elsif ( $FitType eq "GaussianCos" ) {
$T_Block = $T_Block . "\n" . "simpelGss " . $THEORY{'simpelGss'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'simpleGss'} );
$T_Block = $T_Block . "\n" . "TFieldCos " . $THEORY{'TFieldCos'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'TFieldCos'} );
}
# Static Lorentzian KT
elsif ( $FitType eq "SLKT" ) {
$T_Block = $T_Block . "\n" . "statExpKT " . $THEORY{'statExpKT'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'statExpKT'} );
}
# Static Lorentzian KT LF
elsif ( $FitType eq "SLKTLF" ) {
$T_Block =
$T_Block . "\n" . "statExpKTLF " . $THEORY{'statExpKTLF'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'statExpKTLF'} );
}
# Dynamic Lorentzian KT LF
elsif ( $FitType eq "LDKTLF" ) {
$T_Block = $T_Block . "\n" . "dynExpKTLF " . $THEORY{'dynExpKTLF'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'dynExpKTLF'} );
}
# Static Gaussian KT
elsif ( $FitType eq "SGKT" ) {
$T_Block = $T_Block . "\n" . "statGssKT " . $THEORY{'statGssKT'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'statGssKT'} );
}
# Static Gaussian KT LF
elsif ( $FitType eq "SGKTLF" ) {
$T_Block =
$T_Block . "\n" . "statGssKTLF " . $THEORY{'statGssKTLF'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'statGssKTLF'} );
}
# Dynamic Gaussian KT LF
elsif ( $FitType eq "GDKTLF" ) {
$T_Block = $T_Block . "\n" . "dynGssKTLF " . $THEORY{'dynGssKTLF'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'dynGssKTLF'} );
}
# Now some more combined functions (multiplication).
# Lorentzian KT LF multiplied by exponential
elsif ( $FitType eq "LLFExp" ) {
$T_Block = $T_Block . "\n" . "simplExpo " . $THEORY{'simplExpo'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'simplExpo'} );
$T_Block =
$T_Block . "\n" . "statExpKTLF " . $THEORY{'statExpKTLF'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'statExpKTLF'} );
}
# Lorentzian KT LF multiplied by stretched exponential
elsif ( $FitType eq "LLFSExp" ) {
$T_Block = $T_Block . "\n" . "generExpo " . $THEORY{'generExpo'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'generExpo'} );
$T_Block =
$T_Block . "\n" . "statExpKTLF " . $THEORY{'statExpKTLF'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'statExpKTLF'} );
}
# Gaussian KT LF multiplied by exponential
elsif ( $FitType eq "GLFExp" ) {
$T_Block = $T_Block . "\n" . "simplExpo " . $THEORY{'simplExpo'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'simplExpo'} );
$T_Block =
$T_Block . "\n" . "statGssKTLF " . $THEORY{'statGssKTLF'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'statGssKTLF'} );
}
# Gaussian KT LF multiplied by stretched exponential
elsif ( $FitType eq "GLFSExp" ) {
$T_Block = $T_Block . "\n" . "generExpo " . $THEORY{'generExpo'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'generExpo'} );
$T_Block =
$T_Block . "\n" . "statGssKTLF " . $THEORY{'statGssKTLF'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'statGssKTLF'} );
}
# Meissner state model
elsif ( $FitType eq "Meissner" ) {
$T_Block = $T_Block . "\n" . "simpleGss " . $THEORY{'simpleGss'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'simpleGss'} );
$T_Block =
$T_Block . "\n"
. "userFcn libTFitPofB.so TLondon1DHS "
. $THEORY{'Meissner'};
$Parameters = join( $SPACE, $Parameters, $THEORY{'Meissner'} );
}
$Paramcomp[ $component - 1 ] = $Parameters;
$Full_T_Block = $Full_T_Block . $T_Block;
# Finished preparing the THEORY block
#######################################################################
}
return($Full_T_Block,\@Paramcomp);
} # End CreateTheory
########################
# ExtractParamBlk
########################
sub ExtractParamBlk {
# This subroutine takes the MSR file as input and extracts the parameters
# with the corresponding values, errors etc...
# Take the msr file as input array of lines
my @file=@_;
my $NFITPARAMETERS=0;
my $NTHEORY=0;
my $NRUN=0;
# Remove comment lines
@file = grep {!/^\#/} @file;
# Remove empty lines
@file = grep {/\S/} @file;
# Identify different blocks
my $i=0;
my $line ="";
foreach $line (@file)
{
if (grep {/FITPARAMETER/} $line) {$NFITPARAMETERS=$i;}
if (grep {/THEORY/} $line) { $NTHEORY=$i;}
if ((grep {/RUN/} $line) & $NRUN==0) { $NRUN=$i;}
$i++;
}
my @FPBlock=@file[$NFITPARAMETERS+1..$NTHEORY-1];
my @TBlock=@file[$NTHEORY+1..$NRUN-1];
# Split parameter's line to extract values and errors
foreach $line (@FPBlock) {
my @Param=split(/\s+/,$line);
}
return(\@FPBlock)
}
1;

1764
src/external/MuSRFitGUI/MuSRFit.pl vendored Executable file

File diff suppressed because it is too large Load Diff

1996
src/external/MuSRFitGUI/MuSRFit.ui vendored Executable file

File diff suppressed because it is too large Load Diff

616
src/external/MuSRFitGUI/MuSRFit.ui.h vendored Executable file
View File

@ -0,0 +1,616 @@
/****************************************************************************
** ui.h extension file, included from the uic-generated form implementation.
**
** If you want to add, delete, or rename functions or slots, use
** Qt Designer to update this file, preserving your code.
**
** You should not define a constructor or destructor in this file.
** Instead, write your code in functions called init() and destroy().
** These will automatically be called by the form's constructor and
** destructor.
*****************************************************************************/
# This file is part of MuSRFitGUI.
#
# MuSRFitGUI 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 3 of the License, or
# (at your option) any later version.
#
# MuSRFitGUI 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 MuSRFitGUI. If not, see <http://www.gnu.org/licenses/>.
#
# Copyright 2009 by Zaher Salman and the LEM Group.
# <zaher.salman@psi.ch>
void Form1::fileNew()
{
}
void Form1::fileOpen()
{
my $file=Qt::FileDialog::getOpenFileName(
".",
"MSR Files (*.msr *.mlog)",
this,
"open file dialog",
"Choose a MSR file");
print "Selected file: $file\n";
}
void Form1::fileSave()
{
my $file=Qt::FileDialog::getSaveFileName(
"",
"MSR Files (*.msr *.mlog)",
this,
"save file dialog",
"Choose a filename to save under");
my %All=CreateAllInput();
my $FILENAME=$All{"FILENAME"}.".msr";
if (-e $FILENAME) {
# TODO: check if the extension is correct, or add it.
my $cmd="cp $FILENAME $file";
my $pid=system($cmd);
} else {
if ($file ne "") {
my $Warning = "Warning: No MSR file found yet!";
my $WarningWindow = Qt::MessageBox::information( this, "Warning",$Warning);
}
}
}
void Form1::filePrint()
{
}
void Form1::fileExit()
{
Qt::Application::exit( 0 );
}
void Form1::editUndo()
{
}
void Form1::editRedo()
{
}
void Form1::editCut()
{
}
void Form1::editCopy()
{
}
void Form1::editPaste()
{
}
void Form1::helpIndex()
{
}
void Form1::helpContents()
{
}
void Form1::helpAbout()
{
my $AboutText="
This is a GUI that uses the musrfit binary, developed by Andreas Suter,
to fit muSR spectra.
MuSRFitGUI 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 3 of the License, or
(at your option) any later version.
MuSRFitGUI 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 MuSRFitGUI. If not, see <http://www.gnu.org/licenses/>.
Copyright 2009 by Zaher Salman and the LEM Group.
<zaher.salman\@psi.ch>
";
my $AboutWindow = Qt::MessageBox::information( this, "About MuSRFit GUI",$AboutText);
}
void MuSRFitform::CreateAllInput()
{
# TODO: Need to deliver shared parameters also
my %All=();
$All{"TITLE"}= TITLE->text;
$All{"FILENAME"}= FILENAME->text;
$All{"RunNumbers"} = RunNumbers->text;
$All{"BeamLine"} = BeamLine->currentText;
$All{"YEAR"} =YEAR->currentText;
$All{"Tis"} = Tis->text;
$All{"Tfs"} = Tfs->text;
$All{"BINS"} = BINS->text;
$All{"FitAsyType"} = FitAsyType->currentText;
$All{"LRBF"} = LRBF->text;
$All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g;
my @RUNS = split( /,/, $All{"RunNumbers"} );
# Construct fittypes that can be understood by MSR.pm
my %FTs=(0,"Exponential",
1,"Gaussian",
2,"Stretch",
3,"ExponentialCos",
4,"GaussianCos",
5,"StretchCos",
6,"LDKTLF",
7,"GDKTLF",
8,"Background",
9,"LLFExp",
10,"GLFExp",
11,"LLFSExp",
12,"GLFSExp",
13,"Meissner",
14,"None"
);
my $FT1=FitType1->currentItem;
my $FT2=FitType2->currentItem;
my $FT3=FitType3->currentItem;
$All{"FitType1"} = $FTs{$FT1};
$All{"FitType2"} = $FTs{$FT2};
$All{"FitType3"} = $FTs{$FT3};
my @FitTypes =();
my $FitType="";
foreach $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) {
if ( $FitType ne "None" ) {
push( @FitTypes, $FitType );
}
}
# Also theory block and paramets list
my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateTheory(@FitTypes);
$All{"Full_T_Block"}=$Full_T_Block;
$All{"Paramcomp_ref"}=$Paramcomp_ref;
my @Paramcomp = @$Paramcomp_ref;
# TODO: Read initial values of paramets from tabel
my $erradd = "d";
my $minadd = "_min";
my $maxadd = "_max";
my $NRows = InitParamTable->numRows();
my $Header=InitParamTable->verticalHeader();
if ($NRows > 0) {
for (my $i=0;$i<$NRows;$i++) {
# Take label of row, i.e. name of parameter
my $Param=$Header->label($i);
# Then take the value, error, max and min (as numbers)
$All{"$Param"}=1.0*InitParamTable->text($i,0);
$All{"$erradd$Param"}=1.0*InitParamTable->text($i,1);
$All{"$Param$minadd"}=1.0*InitParamTable->text($i,2);
$All{"$Param$maxadd"}=1.0*InitParamTable->text($i,3);
}
}
# Shared settings are detected here
my $Shared = 0;
my $PCount =0;
my $Component=1;
foreach $FitType (@FitTypes) {
my $Parameters=$Paramcomp[$Component-1];
my @Params = split( /\s+/, $Parameters );
if ( $Component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) {
unshift( @Params, "Alpha" );
}
elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) {
unshift( @Params, ( "N0", "NBg" ) );
}
# This is the counter for parameters of this component
my $NP=1;
$Shared = 0;
# Change state/label of parameters
foreach my $Param (@Params) {
my $Param_ORG = $Param;
if ( $#FitTypes != 0 && ( $Param ne "Alpha" && $Param ne "N0" && $Param ne "NBg" ) ){
$Param = join( "", $Param, "_", $Component);
}
# Is there any point of sharing, multiple runs?
if ( $#RUNS == 0 ) {
$Shared = 1;
} else {
# Check if shared or not, construct name of checkbox, find its handle and then
# check if it is checked
my $ChkName="ShParam_".$Component."_".$NP;
my $ChkBx = child($ChkName);
$Shared = $ChkBx->isChecked();
}
$All{"Sh_$Param"}=$Shared;
$NP++;
}#Loop on parameters
$Component++;
}# Loop on components
# Done with shared parameters detecting
# Construct a default filename if empty
if ( $All{"FILENAME"} eq "") {
$All{"FILENAME"}=$RUNS[0]."_".$All{"BeamLine"}."_".$All{"YEAR"};
}
if ( $All{"go"} eq "" ) {
$All{"go"}="PLOT";
}
# Get minimization process
my $Min = Minimization->selectedId();
if ($Min==0) {
$All{"Minimization"}= "MINIMIZE";
$All{"go"}="MIGRAD";
}
elsif ($Min==1) {
$All{"Minimization"}= "MIGRAD";
$All{"go"}="MIGRAD";
}
elsif ($Min==2) {
$All{"Minimization"}= "SIMPLEX";
$All{"go"}="SIMPLAEX";
}
# Get Error calculation process
my $Err = ErrorCalc->selectedId();
if ($Err==0) {
$All{"ErrorCalc"}= "HESSE";
# $All{"go"}="MIGRAD";
}
elsif ($Err==1) {
$All{"ErrorCalc"}= "MINOS";
$All{"go"}="MINOS";
}
# Return Hash with all important values
return %All;
}
void MuSRFitform::CallMSRCreate()
{
use MSR;
my %All=CreateAllInput();
if ($All{"RunNumbers"} ne "") {
my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateMSR(\%All);
UpdateMSRFileInitTable();
}
}
void MuSRFitform::UpdateMSRFileInitTable()
{
my %All=CreateAllInput();
my $FILENAME=$All{"FILENAME"};
open (MSRF,q{<},"$FILENAME.msr" );
my @lines = <MSRF>;
close(IFILE);
textMSROutput->setText("");
foreach my $line (@lines) {
textMSROutput->append("$line");
}
my $FPBlock_ref=MSR::ExtractParamBlk(@lines);
my @FPBloc = @$FPBlock_ref;
my $PCount=0;
foreach my $line (@FPBloc) {
$PCount++;
# print "line $PCount: $line \n";
my @Param=split(/\s+/,$line);
# print "$Param[2]=$Param[3]+-$Param[4] from $Param[5] to $Param[6]\n";
InitParamTable->setText($PCount-1,0,1.0*$Param[3]);
InitParamTable->setText($PCount-1,1,1.0*$Param[4]);
InitParamTable->setText($PCount-1,2,1.0*$Param[5]);
InitParamTable->setText($PCount-1,3,1.0*$Param[6]);
}
return;
}
void MuSRFitform::ActivateShComp()
{
my %All=CreateAllInput();
my @RUNS = split( /,/, $All{"RunNumbers"} );
# Hide all sharing components
SharingComp1->setHidden(1);
SharingComp2->setHidden(1);
SharingComp3->setHidden(1);
SharingComp1->setEnabled(0);
SharingComp2->setEnabled(0);
SharingComp3->setEnabled(0);
my @FitTypes =();
foreach my $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) {
if ( $FitType ne "None" ) {
push( @FitTypes, $FitType );
}
}
# Get number of parameters to determine the size of the table
my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateTheory(@FitTypes);
# For now the line below does not work. Why?
# my $Paramcomp_ref=$All{"Paramcomp_ref"};
my @Paramcomp = @$Paramcomp_ref;
my $Full_T_Block= $All{"Full_T_Block"};
my $Component=1;
foreach my $FitType (@FitTypes) {
my $Parameters=$Paramcomp[$Component-1];
my @Params = split( /\s+/, $Parameters );
if ( $Component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) {
unshift( @Params, "Alpha" );
}
elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) {
unshift( @Params, ( "N0", "NBg" ) );
}
# Make the component appear first (only if we have multiple runs)
my $ShCompG="SharingComp".$Component;
my $ShCG = child($ShCompG);
if ($#RUNS>0) {
$ShCG->setHidden(0);
$ShCG->setEnabled(1);
}
my $CompShLabel = "Comp".$Component."ShLabel";
my $CompShL = child($CompShLabel);
$CompShL->setText($All{"FitType$Component"});
# Change state/label of parameters
for (my $i=1; $i<=5;$i++) {
my $ParamChkBx="ShParam_".$Component."_".$i;
my $ChkBx = child($ParamChkBx);
if ($Params[$i-1] ne "") {
$ChkBx->setHidden(0);
$ChkBx->setEnabled(1);
$ChkBx ->setText($Params[$i-1]);
} else {
$ChkBx->setHidden(1);
}
}
$Component++;
}
}
void MuSRFitform::InitializeTab()
{
# "Smart" default value of the fit parameters.
my %Defaults = (
"Asy", "0.15", "dAsy", "0.01",
"Asy_min", "0", "Asy_max", "0",
"Alpha", "1.0", "dAlpha", "0.01",
"Alpha_min", "0", "Alpha_max", "0",
"N0", "300.0", "dN0", "0.01",
"N0_min", "0", "N0_max", "0",
"NBg", "30.0", "dNBg", "0.01",
"NBg_min", "0", "NBg_max", "0",
"Lam", "1.0", "dLam", "0.01",
"Lam_min", "0", "Lam_max", "0",
"Gam", "1.0", "dGam", "0.01",
"Gam_min", "0", "Gam_max", "0",
"Bet", "0.5", "dBet", "0.01",
"Bet_min", "0", "Bet_max", "0",
"Two", "2.0", "dTwo", "0.0",
"Two_min", "0", "Two_max", "0",
"Del", "0.1", "dDel", "0.01",
"Del_min", "0", "Del_max", "0",
"Sgm", "0.1", "dSgm", "0.01",
"Sgm_min", "0", "Sgm_max", "0",
"Aa", "0.1", "dAa", "0.01",
"Aa_min", "0", "Aa_max", "0",
"q", "0.1", "dq", "0.01",
"q_min", "0", "q_max", "0",
"Bg", "0.036", "dBg", "0.01",
"Bg_min", "0", "Bg_max", "0",
"bgrlx", "0.", "dbgrlx", "0.0",
"bgrlx_min", "0", "bgrlx_max", "0",
"Frq", "1.0", "dFrq", "1.",
"Frq_min", "0", "Frq_max", "0",
"Field", "100.0", "dField", "1.",
"Field_min", "0", "Field_max", "0",
"Energy", "14.1", "dEnergy", "0.",
"Energy_min", "0", "Energy_max", "0",
"DeadLayer", "10.", "dDeadLayer", "0.1",
"DeadLayer_min", "0", "DeadLayer_max", "0",
"Lambda", "128.1", "dLambda", "0.1",
"Lambda_min", "0", "Lambda_max", "0",
"Phi", "1.", "dPhi", "0.01",
"Phi_min", "0", "Phi_max", "0"
);
my $erradd = "d";
my $minadd = "_min";
my $maxadd = "_max";
# First assume nothing is shared
my $Shared = 0;
my %All=CreateAllInput();
my @RUNS = split( /,/, $All{"RunNumbers"} );
my @FitTypes =();
foreach my $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) {
if ( $FitType ne "None" ) { push( @FitTypes, $FitType ); }
}
InitParamTable->setLeftMargin(100);
# Get theory block to determine the size of the table
my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateTheory(@FitTypes);
# For now the line below does not work. Why?
# my $Paramcomp_ref=$All{"Paramcomp_ref"};
my @Paramcomp = @$Paramcomp_ref;
my $Full_T_Block= $All{"Full_T_Block"};
my $NRows = InitParamTable->numRows();
# Remove any rows in table
if ($NRows > 0) {
for (my $i=0;$i<$NRows;$i++) {
# TODO: Better remove the row rather than hide it.
InitParamTable->hideRow($i);
}
}
my $PCount =0;
my $iRun =0;
my $value =0;
my $error = 0;
my $minvalue = 0;
my $maxvalue = 0;
foreach my $RUN (@RUNS) {
$iRun++;
my $Component=1;
foreach my $FitType (@FitTypes) {
my $Parameters=$Paramcomp[$Component-1];
my @Params = split( /\s+/, $Parameters );
if ( $Component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) {
unshift( @Params, "Alpha" );
}
elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) {
unshift( @Params, ( "N0", "NBg" ) );
}
# This is the counter for parameters of this component
my $NP=1;
$Shared = 0;
# Change state/label of parameters
foreach my $Param (@Params) {
my $Param_ORG = $Param;
if ( $#FitTypes != 0 && ( $Param ne "Alpha" && $Param ne "N0" && $Param ne "NBg" ) ){
$Param = join( "", $Param, "_", "$Component" );
}
$Shared = $All{"Sh_$Param"};
# It there are multiple runs index the parameters accordingly
$Param=$Param."_".$iRun;
# Check if this parameter has been initialized befor. If not take from defaults
# print "$Param=".$All{"$Param"}."\n";
$value = $All{"$Param"};
if ( $value ne "" ) {
$error = $All{"$erradd$Param"};
$minvalue = $All{"$Param$minadd"};
$maxvalue = $All{"$Param$maxadd"};
} else {
# I need this although it is already in the MSR.pm module, just for this table
# We can remove it from the MSR module later...
$value = $Defaults{$Param_ORG};
$error = $Defaults{ join( "", $erradd, $Param_ORG ) };
$minvalue = $Defaults{ join("", $Param_ORG, $minadd ) };
$maxvalue = $Defaults{ join("", $Param_ORG, $maxadd ) };
}
if ( $Shared!=1 || $iRun == 1 ) {
$PCount++;
# Add row in table, set its label and fill the values of parametr
if ($PCount>$NRows) {
InitParamTable->setNumRows($PCount);
}
InitParamTable->verticalHeader()->setLabel( $PCount-1,$Param);
InitParamTable->showRow($PCount-1);
InitParamTable->setText($PCount-1,0,$value);
InitParamTable->setText($PCount-1,1,$error);
InitParamTable->setText($PCount-1,2,$minvalue);
InitParamTable->setText($PCount-1,3,$maxvalue);
}
$NP++;
}#Loop on parameters
$Component++;
}# Loop on components
}# Loop on runs
}
void MuSRFitform::TabChanged()
{
# TODO: First check if there are some runs given, otherwise disbale
# TODO: Check if the MSR file exists and decide whether to use it or not
my %All=CreateAllInput();
my $SlectedTab = musrfit_tabs->currentPageIndex;
# Check if the option for checking for existing files is selected
my $FileExistCheck= FileExistCheck->isOn();
my $FILENAME=$All{"FILENAME"}.".msr";
if ($All{"RunNumbers"} ne "" && $SlectedTab==4 && $FileExistCheck==1) {
if (-e $FILENAME) {
# Warning: MSR file exists
my $Warning = "Warning: MSR file $FILENAME Already exists!\nChange name or backup file if you do not want to loose it.";
my $WarningWindow = Qt::MessageBox::information( this, "Warning",$Warning);
}
}
# First make sure we have sharing initialized
ActivateShComp();
InitializeTab();
UpdateMSRFileInitTable();
}
void MuSRFitform::GoFit()
{
my %All=CreateAllInput();
CallMSRCreate();
my $FILENAME=$All{"FILENAME"}.".msr";
if (-e $FILENAME) {
my $cmd="musrfit -t $FILENAME";
my $pid = open(FTO,"$cmd 2>&1 |");
while (<FTO>) {
FitTextOutput->append("$_");
# print "line= ".$_;
}
close(FTO);
$cmd="musrview $FILENAME &";
$pid = system($cmd);
} else {
FitTextOutput->append("Cannot find MSR file!");
}
FitTextOutput->append("-----------------------------------------------------------------------------------------------------------------------------");
# update MSR File tab and initialization table
UpdateMSRFileInitTable();
return;
}
void MuSRFitform::UpdeateTable()
{
}