From c02df731498e51b0c94d87e466bb2f0b1e5737a2 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 29 Jan 2018 15:23:13 +0100 Subject: [PATCH] Implemented run list following msr2data notations with hyphens and colons. Started implementation of global fits using msr2data. --- src/external/MuSRFitGUI/MSR.pm | 1665 +++++++++++----------- src/external/MuSRFitGUI/MuSRFit4.pm | 20 +- src/external/MuSRFitGUI/MuSRFit4.ui | 271 ++-- src/external/MuSRFitGUI/Ui_MuSRFit4.pm | 256 ++-- src/external/MuSRFitGUI/icos/MuSRFit.odg | Bin 13391 -> 14818 bytes src/external/MuSRFitGUI/icos/MuSRFit.png | Bin 31155 -> 46591 bytes 6 files changed, 1121 insertions(+), 1091 deletions(-) mode change 100755 => 100644 src/external/MuSRFitGUI/MSR.pm diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm old mode 100755 new mode 100644 index 713abcaf..51ff9913 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -22,9 +22,9 @@ my %Def_Format = # Additional information to extract run properties from database # For LEM use summary files -$SUMM_DIR="/afs/psi.ch/project/nemu/data/summ/"; +my $SUMM_DIR="/afs/psi.ch/project/nemu/data/summ/"; # For Bulok use list files -%DBDIR=("LEM","/afs/psi.ch/project/nemu/data/log/", +my %DBDIR=("LEM","/afs/psi.ch/project/nemu/data/log/", "GPS","/afs/psi.ch/project/bulkmusr/olddata/list/", "Dolly","/afs/psi.ch/project/bulkmusr/olddata/list/", "GPD","/afs/psi.ch/project/bulkmusr/olddata/list/", @@ -33,7 +33,7 @@ $SUMM_DIR="/afs/psi.ch/project/nemu/data/summ/"; "LTF","/afs/psi.ch/project/bulkmusr/olddata/list/"); # Information available since -%MinYears=("LEM","2001", +my %MinYears=("LEM","2001", "GPS","1993", "Dolly","1998", "GPD","1993", @@ -42,7 +42,7 @@ $SUMM_DIR="/afs/psi.ch/project/nemu/data/summ/"; "LTF","1995"); # And to deal with old names of bulk muons -%AltArea=("GPS","PIM3","LTF","PIM3","ALC","PIE3","Dolly","PIE1","GPD","MUE1"); +my %AltArea=("GPS","PIM3","LTF","PIM3","ALC","PIE3","Dolly","PIE1","GPD","MUE1"); # Additions to paremeters' names @@ -52,6 +52,7 @@ my $maxadd = "_max"; +sub CreateMSR { ########################################################################## # CreateMSR # @@ -83,9 +84,8 @@ my $maxadd = "_max"; # FILENAME.msr - MSR file saved # ########################################################################## -sub CreateMSR { my %All = %{$_[0]}; - + my $DEBUG = ""; # Start with empty array my @FitTypes = (); @@ -114,16 +114,12 @@ sub CreateMSR { # Works for CGI script my $Step = $All{"go"}; - if ( $Step eq "PLOT" ) { - $FITMINTYPE = $EMPTY; - } - elsif ( $Step eq "MIGRAD" ) { + my $FITMINTYPE = $EMPTY; + if ( $Step eq "MIGRAD" ) { $FITMINTYPE = "MINIMIZE\nMIGRAD\nHESSE"; - } - elsif ( $Step eq "MINOS" ) { + } elsif ( $Step eq "MINOS" ) { $FITMINTYPE = "MIGRAD\nMINOS"; - } - elsif ( $Step eq "SIMPLEX" ) { + } elsif ( $Step eq "SIMPLEX" ) { $FITMINTYPE = "SCAN\nSIMPLEX"; } @@ -132,21 +128,15 @@ sub CreateMSR { $FITMINTYPE = $All{"Minimization"}."\n".$All{"ErrorCalc"}; } - # First create the THEORY Block my ($Full_T_Block,$Paramcomp_ref)=MSR::CreateTheory(@FitTypes); my @Paramcomp = @$Paramcomp_ref; - # If we have a FUNCTIONS Block the Full_T_Block should be # replaced by Func_T_Block - $FUNCTIONS_Block = $EMPTY; + my $FUNCTIONS_Block = $EMPTY; if ($All{"FunctionsBlock"} ne $EMPTY) { - $FUNCTIONS_Block = " -############################################################### -FUNCTIONS -############################################################### -".$All{"FunctionsBlock"}."\n"; + $FUNCTIONS_Block = "FUNCTIONS\n###############################################################\n".$All{"FunctionsBlock"}."\n"; $Full_T_Block=$All{"Func_T_Block"}; # remove all _N to end (may fail with large number of parameters) $Full_T_Block =~ s/_\d\b//g; @@ -158,14 +148,21 @@ FUNCTIONS # Counter of Params my $PCount = 1; + my $PLT = 2; + # For SingleHist fit + if ($All{"FitAsyType"} eq "SingleHist") { $PLT = 0;} + # Need to select here RUNSAuto or RUNSManual # $RUNSType = 0 (Auto) or 1 (Manual) my $RUNSType = 0; my @RUNS=(); if ($All{"RunNumbers"} ne $EMPTY) { # Remove spaces and other illegal characters - $All{"RunNumbers"} =~ s/ //g; + $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; $All{"RunNumbers"} =~ s/[a-zA-Z]//g; + # Expand hyphens + $All{"RunNumbers"} = MSR::ExpandRunNumbers($All{"RunNumbers"}); + # Split commas @RUNS=split( /,/, $All{"RunNumbers"}); $RUNSType = 0; } @@ -219,13 +216,14 @@ FUNCTIONS unshift( @Params, "Alpha" ); } - foreach $Param (@Params) { - $Param_ORG = $Param; + foreach my $Param (@Params) { + my $Param_ORG = $Param; if ( ($#FitTypes != 0) && ($Param ne "Alpha") ) { $Param = join( $EMPTY, $Param, "_", "$component" ); } # If we have only one RUN then everything is shared + my $Shared = 0; if ( $#RUNS == 0 ) { $Shared = 1; } @@ -254,7 +252,6 @@ FUNCTIONS # Start preparing the parameters block if ($Shared) { - # Parameter is shared enough to keep order from first run if ( $iRun == 1 ) { $Full_T_Block =~ s/$Param_ORG/$PCount/; @@ -264,50 +261,41 @@ FUNCTIONS } else { # Parameter is not shared, use map unless it is a single RUN fit # Skip adding to map line in these cases - if ( $Param ne "Alpha" && $#RUNS != 0 ) - { + if ( ( $Param ne "Alpha" && $#RUNS != 0 ) || ( !( $Param_ORG =~ m/^(No|NBg)/ ) && $#RUNS != 0 )) { ++$nonsh; $Full_T_Block =~ s/$Param_ORG/map$nonsh/; $MAP_Line = join( ' ', $MAP_Line, $PCount ); } ++$PCount; } - $NtotPar = $PCount; + my $NtotPar = $PCount; } } # Finished preparing the FITPARAMETERS block ####################################################################### + # Start constructing RUN block here # 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 ]; - + my $RUN_Line = $EMPTY; if ($All{"RUNSType"}) { $RUN_Line = MSR::RUNFileNameAuto($RUN,"0000",$EMPTY); } else { $RUN_Line = MSR::RUNFileNameAuto($RUN,$YEAR,$BeamLine); } - $Type_Line = "fittype 2"; - $PLT = 2; - $Hist_Lines = + my $Type_Line = "fittype 2"; + my $Hist_Lines = "forward $Hists[0]\nbackward $Hists[1]"; - $Bg_Line = "background"; - $Data_Line = "data"; - $T0_Line = "t0"; - $NHist=1; - foreach $Hist (@Hists) { - foreach ("t0","Bg1","Bg2","Data1","Data2") { - $Name = "$_$NHist"; -# If empty fill with defaults -# if ($All{$Name} eq $EMPTY) { -# $All{$Name}=MSR::T0BgData($_,$Hist,$BeamLine); -# } - } + my $Bg_Line = "background"; + my $Data_Line = "data"; + my $T0_Line = "t0"; + my $NHist=1; + foreach my $Hist (@Hists) { # If empty skip lines if ($All{"Bg1$NHist"} ne $EMPTY && $All{"Bg2$NHist"} ne $EMPTY) { $Bg_Line = $Bg_Line." ".$All{"Bg1$NHist"}." ".$All{"Bg2$NHist"}; @@ -364,23 +352,15 @@ FUNCTIONS # The number of runs is $NRUNS = $iRun - 1; - -# Start constructing all blocks + # Start constructing all blocks my $TitleLine = $All{"TITLE"}."\n# Run Numbers: ".$All{"RunNumbers"}; -# if ($All{"RUNSType"}) { -# $TitleLine = $EMPTY; -# } -# $TitleLine =~ s/\n//g; # Get parameter block from MSR::PrepParamTable(\%All); - my $FitParaBlk = " -############################################################### -FITPARAMETER + my $FitParaBlk = "FITPARAMETER ############################################################### # No Name Value Err Min Max "; my %PTable=MSR::PrepParamTable(\%All); my $NParam=scalar keys( %PTable ); - # Fill the table with labels and values of parametr for (my $iP=0;$iP<$NParam;$iP++) { my ($Param,$value,$error,$minvalue,$maxvalue,$RUNtmp) = split(/,/,$PTable{$iP}); @@ -393,26 +373,14 @@ FITPARAMETER $PCount $Param $value $error $error $minvalue $maxvalue"; } - $Full_T_Block = " -############################################################### -THEORY -############################################################### -$Full_T_Block -"; + $Full_T_Block = "THEORY\n###############################################################\n$Full_T_Block\n"; - - $RUN_Block = - "############################################################### -$RUN_Block"; - - $COMMANDS_Block = - "############################################################### -COMMANDS -FITMINTYPE -SAVE -"; + # COMMAND Block + $COMMANDS_Block = "COMMANDS\nFITMINTYPE\nSAVE\n"; $COMMANDS_Block =~ s/FITMINTYPE/$FITMINTYPE/g; + # END- COMMAND Block + # PLOT Block # Check if log x and log y are selected my $logxy = $EMPTY; if ( $All{"logx"} eq "y" ) { $logxy = $logxy . "logx\n"; } @@ -431,63 +399,76 @@ SAVE $VIEWBIN_Line =""; if ( $All{"ViewBin"}!=0 ) { $VIEWBIN_Line = "view_packing ".$All{"ViewBin"};} - my $RRFBlock=MSR::CreateRRFBlock(\%All); - $PLOT_Block = - "############################################################### -PLOT $PLT -runs $RUNS_Line -$PRANGE_Line -$VIEWBIN_Line -$RRFBlock -$logxy"; + my $RRFBlock=MSR::CreateRRFBlk(\%All); + $PLOT_Block = "PLOT $PLT\nruns $RUNS_Line\n$PRANGE_Line\n$VIEWBIN_Line\n$RRFBlock\n$logxy"; + #END - PLOT Block - if ($All{"FUNITS"} eq $EMPTY) {$All{"FUNITS"}="MHz";} - if ($All{"FAPODIZATION"} eq $EMPTY) {$All{"FAPODIZATION"}="STRONG";} - if ($All{"FPLOT"} eq $EMPTY) {$All{"FPLOT"}="POWER";} - if ($All{"FPHASE"} eq $EMPTY) {$All{"FPHASE"}="8.5";} - my $FrqRange = "#range ".$All{"FRQMIN"}." ".$All{"FRQMAX"}; - if ($All{"FRQMAX"} ne $EMPTY && $All{"FRQMIN"} ne $EMPTY && $All{"FRQMAX"} ne $All{"FRQMIN"}) { - $FrqRange = "range ".$All{"FRQMIN"}." ".$All{"FRQMAX"}; - } - - $FOURIER_Block= - "############################################################### -FOURIER -units FUNITS # units either 'Gauss', 'MHz', or 'Mc/s' -fourier_power 12 -apodization FAPODIZATION # NONE, WEAK, MEDIUM, STRONG -plot FPLOT # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE -phase FPHASE -FRQRANGE"; - - $FOURIER_Block=~ s/FUNITS/$All{"FUNITS"}/g; - $FOURIER_Block=~ s/FAPODIZATION/$All{"FAPODIZATION"}/g; - $FOURIER_Block=~ s/FPLOT/$All{"FPLOT"}/g; - $FOURIER_Block=~ s/FPHASE/$All{"FPHASE"}/g; - $FOURIER_Block=~ s/FRQRANGE/$FrqRange/g; + # FFT Block + my $FOURIER_Block = MSR::CreateFFTBlk(\%All); + # END - FFT Block + # STATS Block # Don't know why but it is needed initially - $STAT_Block = - "############################################################### -STATISTIC --- 0000-00-00 00:00:00 -*** FIT DID NOT CONVERGE ***"; - + my $STAT_Block = "STATISTIC --- 0000-00-00 00:00:00\n*** FIT DID NOT CONVERGE ***"; + # END - STATS Block # Empty line at the end of each block - my $FullMSRFile = "$TitleLine$FitParaBlk\n$Full_T_Block\n$FUNCTIONS_Block\n$RUN_Block\n$COMMANDS_Block\n$PLOT_Block\n$FOURIER_Block\n$STAT_Block\n"; + my $FullMSRFile = "$TitleLine +############################################################### +$FitParaBlk +############################################################### +$Full_T_Block +############################################################### +$FUNCTIONS_Block +############################################################### +$RUN_Block +############################################################### +$COMMANDS_Block +############################################################### +$PLOT_Block +############################################################### +$FOURIER_Block +############################################################### +$STAT_Block\n"; # Return information and file return($Full_T_Block,\@Paramcomp,$FullMSRFile); } - - +sub CreateMSRSingleHist { ########################################################################## # CreateMSRSingleHist +# +# 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 CreateMSRSingleHist { my %All = %{$_[0]}; - + my $DEBUG = ""; # Start with empty array my @FitTypes = (); @@ -507,9 +488,8 @@ sub CreateMSRSingleHist { # Works for CGI script my $Step = $All{"go"}; - if ( $Step eq "PLOT" ) { - $FITMINTYPE = $EMPTY; - } elsif ( $Step eq "MIGRAD" ) { + my $FITMINTYPE = $EMPTY; + if ( $Step eq "MIGRAD" ) { $FITMINTYPE = "MINIMIZE\nMIGRAD\nHESSE"; } elsif ( $Step eq "MINOS" ) { $FITMINTYPE = "MIGRAD\nMINOS"; @@ -522,20 +502,15 @@ sub CreateMSRSingleHist { $FITMINTYPE = $All{"Minimization"}."\n".$All{"ErrorCalc"}; } - # First create the THEORY Block my ($Full_T_Block,$Paramcomp_ref)=MSR::CreateTheory(@FitTypes); my @Paramcomp = @$Paramcomp_ref; # If we have a FUNCTIONS Block the Full_T_Block should be # replaced by Func_T_Block - $FUNCTIONS_Block = $EMPTY; + my $FUNCTIONS_Block = $EMPTY; if ($All{"FunctionsBlock"} ne $EMPTY) { - $FUNCTIONS_Block = " -############################################################### -FUNCTIONS -############################################################### -".$All{"FunctionsBlock"}."\n"; + $FUNCTIONS_Block = "FUNCTIONS\n###############################################################\n".$All{"FunctionsBlock"}."\n"; $Full_T_Block=$All{"Func_T_Block"}; # remove all _N to end $Full_T_Block =~ s/_\d\b//g; @@ -547,11 +522,21 @@ FUNCTIONS # Counter of Params my $PCount = 1; + my $PLT = 2; + # For SingleHist fit + if ($All{"FitAsyType"} eq "SingleHist") { $PLT = 0;} + # Need to select here RUNSAuto or RUNSManual # $RUNSType = 0 (Auto) or 1 (Manual) my $RUNSType = 0; my @RUNS=(); if ($All{"RunNumbers"} ne $EMPTY) { + # Remove spaces and other illegal characters + $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; + $All{"RunNumbers"} =~ s/[a-zA-Z]//g; + # Expand hyphens + $All{"RunNumbers"} = MSR::ExpandRunNumbers($All{"RunNumbers"}); + # Split commas @RUNS=split( /,/, $All{"RunNumbers"}); $RUNSType = 0; } @@ -584,16 +569,15 @@ FUNCTIONS foreach my $RUN (@RUNS) { # Until here identical to sub CreateMSR -####################################################################### -# For a single histogram fit we basically need to repeat this for each hist -# However, "physical" parameters such as Asymmetry, relaxation etc. should -# be the same for all histograms -# We distinguich between sharing among different runs to common parameters -# for different histograms. The first is done in the usual "Sharing" schame, -# while the second has to be done in the functions block. This can be done -# in a consistent, non-confusing algorithm + ####################################################################### + # For a single histogram fit we basically need to repeat this for each hist + # However, "physical" parameters such as Asymmetry, relaxation etc. should + # be the same for all histograms! + # We distinguich between sharing among different runs to common parameters + # for different histograms. The first is done in the usual "Sharing" schame, + # while the second has to be done in the functions block. This can be done + # in a consistent, non-confusing algorithm foreach my $Hist (@Hists) { - # Prepare the Parameters and initial values block my $component = 0; my $Single_RUN = $EMPTY; @@ -614,27 +598,21 @@ FUNCTIONS my @Params = split( /\s+/, $Parameters ); # Only the first histiograms has new physical parameters # the others keep only Phi if they have it - if ($iHist != 0) { - # look for Phi -# if ( grep( /^Phi$/, @Params ) ) { - # if it is there keep only that -# @Params=("Phi"); -# } - } # For the first component we need No and NBg for SingleHist fits if ( $component == 1 ) { unshift( @Params, ( "No", "NBg" ) ); } - foreach $Param (@Params) { - $Param_ORG = $Param; + foreach my $Param (@Params) { + my $Param_ORG = $Param; $Param=$Param.$Hist; if ( ($#FitTypes != 0) && !( $Param_ORG =~ m/^(No|NBg)/ ) ) { $Param = join( $EMPTY, $Param, "_", "$component" ); } # If we have only one RUN with one Histogram then everything is shared + my $Shared = 0; if ( $#RUNS == 0 && $#Hists == 0 ) { $Shared = 1; } @@ -677,8 +655,6 @@ FUNCTIONS } #################################################################################################### - print $Full_T_Block."\n"; - # Start preparing the parameters block if ($Shared) { @@ -705,12 +681,14 @@ FUNCTIONS # Finished preparing the FITPARAMETERS block ####################################################################### + # Start constructing RUN block here # For each defined range we need a block in the RUN-Block # Also for each histogram in Single Histograms fits - # Also for Imaginary and and Real for RRF fits - + $RUN = $RUNS[ $iRun - 1 ]; + $DEBUG = $DEBUG.MSR::CreateRUNBlk($RUN, $YEAR, $BeamLine, $All{"FitAsyType"}, $All{"LRBF"}, $All{"Tis"}, $All{"Tfs"}, $All{"BINS"}); + if ($All{"RUNSType"}) { $RUN_Line = MSR::RUNFileNameAuto($RUN,"0000",$EMPTY); } else { @@ -725,7 +703,7 @@ FUNCTIONS foreach ("t0","Bg1","Bg2","Data1","Data2") { $Name = "$_$Hist"; -# If empty fill with defaults + # If empty fill with defaults if ($All{$Name} eq $EMPTY) { $All{$Name}=MSR::T0BgData($_,$Hist,$BeamLine); } @@ -746,6 +724,11 @@ FUNCTIONS $Single_RUN = $Single_RUN . "$RUN_Line\n$Type_Line\n$NoBg_Line$Tmp_Hist_Line\n$Data_Line\n$MAP_Line\n$FRANGE_Line\n$PAC_Line\n\n"; + # This is from CreateRUNBlk + $DEBUG =~s /T0LINE/$T0_Line/; + $DEBUG =~s /BGLINE/$Bg_Line/; + $DEBUG =~s /DATALINE/$Data_Line/; + # Now add the appropriate values of fit range and packing my $Range_Min = 8; my $Range_Max = 0; @@ -770,17 +753,14 @@ FUNCTIONS ++$iRun; } + # From here again identical to sub CreateMSR # The number of runs is $NRUNS = $iRun - 1; - -# Start constructing all block + # Start constructing all block my $TitleLine = $All{"TITLE"}."\n# Run Numbers: ".$All{"RunNumbers"}; -# $TitleLine =~ s/\n//g; # Get parameter block from MSR::PrepParamTable(\%All); - my $FitParaBlk = " -############################################################### -FITPARAMETER + my $FitParaBlk = "FITPARAMETER ############################################################### # No Name Value Err Min Max "; my %PTable=MSR::PrepParamTable(\%All); @@ -797,25 +777,14 @@ FITPARAMETER $PCount $Param $value $error $error $minvalue $maxvalue"; } - $Full_T_Block = " -############################################################### -THEORY -############################################################### -$Full_T_Block -"; + $Full_T_Block = "THEORY\n###############################################################\n$Full_T_Block\n"; - $RUN_Block = - "############################################################### -$RUN_Block"; - - $COMMANDS_Block = - "############################################################### -COMMANDS -FITMINTYPE -SAVE -"; + # COMMAND Block + $COMMANDS_Block = "COMMANDS\nFITMINTYPE\nSAVE\n"; $COMMANDS_Block =~ s/FITMINTYPE/$FITMINTYPE/g; + # END- COMMAND Block + # PLOT Block # Check if log x and log y are selected my $logxy = $EMPTY; if ( $All{"logx"} eq "y" ) { $logxy = $logxy . "logx\n"; } @@ -831,50 +800,600 @@ SAVE } } - my $RRFBlock=MSR::CreateRRFBlock(\%All); - $PLOT_Block = - "############################################################### -PLOT $PLT -runs $RUNS_Line -$PRANGE_Line -$RRFBlock -$logxy"; + $VIEWBIN_Line =""; + if ( $All{"ViewBin"}!=0 ) { $VIEWBIN_Line = "view_packing ".$All{"ViewBin"};} - if ($All{"FUNITS"} eq $EMPTY) {$All{"FUNITS"}="MHz";} - if ($All{"FAPODIZATION"} eq $EMPTY) {$All{"FAPODIZATION"}="STRONG";} - if ($All{"FPLOT"} eq $EMPTY) {$All{"FPLOT"}="POWER";} - if ($All{"FPHASE"} eq $EMPTY) {$All{"FPHASE"}="8.5";} + my $RRFBlock=MSR::CreateRRFBlk(\%All); + $PLOT_Block = "PLOT $PLT\nruns $RUNS_Line\n$PRANGE_Line\n$VIEWBIN_Line\n$RRFBlock\n$logxy"; + #END - PLOT Block + # FFT Block + my $FOURIER_Block = MSR::CreateFFTBlk(\%All); + # END - FFT Block - $FOURIER_Block= - "############################################################### -FOURIER -units FUNITS # units either 'Gauss', 'MHz', or 'Mc/s' -fourier_power 12 -apodization FAPODIZATION # NONE, WEAK, MEDIUM, STRONG -plot FPLOT # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE -phase FPHASE -#range FRQMIN FRQMAX"; - - $FOURIER_Block=~ s/FUNITS/$All{"FUNITS"}/g; - $FOURIER_Block=~ s/FAPODIZATION/$All{"FAPODIZATION"}/g; - $FOURIER_Block=~ s/FPLOT/$All{"FPLOT"}/g; - $FOURIER_Block=~ s/FPHASE/$All{"FPHASE"}/g; - + # STATS Block # Don't know why but it is needed initially - $STAT_Block = - "############################################################### -STATISTIC --- 0000-00-00 00:00:00 -*** FIT DID NOT CONVERGE ***"; + my $STAT_Block = "STATISTIC --- 0000-00-00 00:00:00\n*** FIT DID NOT CONVERGE ***"; + # END - STATS Block + # Empty line at the end of each blocks + my $FullMSRFile = "$TitleLine +############################################################### +$FitParaBlk +############################################################### +$Full_T_Block +############################################################### +$FUNCTIONS_Block +############################################################### +$RUN_Block +############################################################### +$COMMANDS_Block +############################################################### +$PLOT_Block +############################################################### +$FOURIER_Block +############################################################### +$STAT_Block\n"; + +# Return information and file +# return($Full_T_Block,\@Paramcomp,$FullMSRFile."\n\n#DEBUG MSG\n$DEBUG\n"); + return($Full_T_Block,\@Paramcomp,$FullMSRFile); +} + +sub CreateMSRUni { +########################################################################## +# CreateMSRUni +# +# 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 +# +########################################################################## + my %All = %{$_[0]}; + my $DEBUG = ""; + # Start with empty array + my @FitTypes = (); + + foreach ($All{"FitType1"},$All{"FitType2"},$All{"FitType3"}) { + if ($_ ne "None") { + @FitTypes=(@FitTypes,$_); + } + } + + my @Hists = split( /,/, $All{"LRBF"} ); + # TODO + # : to separate two sets of asymmetries with same parameters + # Check the number of histograms + # should be 2 or 4 histograms + # should be checked in GUI + # for 2 simple asymmetry fit + # for 4 two run blocks with different geometric parameters: + # Alpha, No, NBg, Phi, Asy + + 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"}; + + # Works for CGI script + my $Step = $All{"go"}; + my $FITMINTYPE = $EMPTY; + if ( $Step eq "MIGRAD" ) { + $FITMINTYPE = "MINIMIZE\nMIGRAD\nHESSE"; + } elsif ( $Step eq "MINOS" ) { + $FITMINTYPE = "MIGRAD\nMINOS"; + } elsif ( $Step eq "SIMPLEX" ) { + $FITMINTYPE = "SCAN\nSIMPLEX"; + } + + # Proper way + if ( $All{"Minimization"} ne $EMPTY && $All{"ErrorCalc"} ne $EMPTY && $Step ne "PLOT" ) { + $FITMINTYPE = $All{"Minimization"}."\n".$All{"ErrorCalc"}; + } + + # First create the THEORY Block + my ($Full_T_Block,$Paramcomp_ref)=MSR::CreateTheory(@FitTypes); + my @Paramcomp = @$Paramcomp_ref; + + # If we have a FUNCTIONS Block the Full_T_Block should be + # replaced by Func_T_Block + my $FUNCTIONS_Block = $EMPTY; + if ($All{"FunctionsBlock"} ne $EMPTY) { + $FUNCTIONS_Block = "FUNCTIONS\n###############################################################\n".$All{"FunctionsBlock"}."\n"; + $Full_T_Block=$All{"Func_T_Block"}; + # remove all _N to end (may fail with large number of parameters) + $Full_T_Block =~ s/_\d\b//g; + } + + # Counter for RUNS + my $iRun = 1; + + # Counter of Params + my $PCount = 1; + + my $PLT = 2; + # For SingleHist fit + if ($All{"FitAsyType"} eq "SingleHist") { $PLT = 0;} + + # Need to select here RUNSAuto or RUNSManual + # $RUNSType = 0 (Auto) or 1 (Manual) + my $RUNSType = 0; + my @RUNS=(); + if ($All{"RunNumbers"} ne $EMPTY) { + # Remove spaces and other illegal characters + $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; + $All{"RunNumbers"} =~ s/[a-zA-Z]//g; + # Expand hyphens + $All{"RunNumbers"} = MSR::ExpandRunNumbers($All{"RunNumbers"}); + # Split commas + @RUNS=split( /,/, $All{"RunNumbers"}); + $RUNSType = 0; + } + elsif ($All{"RunFiles"} ne $EMPTY) { + @RUNS=split( /,/, $All{"RunFiles"}); + $RUNSType = 1; + } + + # Initialise $shcount, a counter for shared parameters + my $shcount = 1; + my $RUN_Block = $EMPTY; + my $RUNS_Line = $EMPTY; + + # range order + my $Range_Order = 1; + my $iHist = 0; + foreach my $RUN (@RUNS) { + if ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsyGLB") { + # 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 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) { + unshift( @Params, "Alpha" ); + } + + foreach my $Param (@Params) { + my $Param_ORG = $Param; + if ( ($#FitTypes != 0) && ($Param ne "Alpha") ) { + $Param = join( $EMPTY, $Param, "_", "$component" ); + } + + # If we have only one RUN then everything is shared + my $Shared = 0; + if ( $#RUNS == 0 ) { + $Shared = 1; + } + # Otherwise check input if it was marked as shared + else { + $Shared = $All{"Sh_$Param"}; + } + + # Alpha Line + # + # 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 $PCount\n"; + } + } + + # End of Alpha Line + + # Start preparing the parameters block + if ($Shared) { + # Parameter is shared enough to keep order from first run + if ( $iRun == 1 ) { + $Full_T_Block =~ s/$Param_ORG/$PCount/; + ++$shcount; + ++$PCount; + } + } else { + # Parameter is not shared, use map unless it is a single RUN fit + # Skip adding to map line in these cases + if ( ( $Param ne "Alpha" && $#RUNS != 0 ) || ( !( $Param_ORG =~ m/^(No|NBg)/ ) && $#RUNS != 0 )) { + ++$nonsh; + $Full_T_Block =~ s/$Param_ORG/map$nonsh/; + $MAP_Line = join( ' ', $MAP_Line, $PCount ); + } + ++$PCount; + } + my $NtotPar = $PCount; + } + } + + # Finished preparing the FITPARAMETERS block + + # Start constructing RUN block here + # For each defined range we need a block in the RUN-Block + # Also for each histogram in Single Histograms fits + + $RUN = $RUNS[ $iRun - 1 ]; + + $DEBUG = $DEBUG.MSR::CreateRUNBlk($RUN, $YEAR, $BeamLine, $All{"FitAsyType"}, $All{"LRBF"}, $All{"Tis"}, $All{"Tfs"}, $All{"BINS"}); + + my $RUN_Line = $EMPTY; + if ($All{"RUNSType"}) { + $RUN_Line = MSR::RUNFileNameAuto($RUN,"0000",$EMPTY); + } else { + $RUN_Line = MSR::RUNFileNameAuto($RUN,$YEAR,$BeamLine); + } + + my $Type_Line = "fittype 2"; + my $Hist_Lines = + "forward $Hists[0]\nbackward $Hists[1]"; + + my $Bg_Line = "background"; + my $Data_Line = "data"; + my $T0_Line = "t0"; + my $NHist=1; + foreach my $Hist (@Hists) { + # If empty skip lines + if ($All{"Bg1$NHist"} ne $EMPTY && $All{"Bg2$NHist"} ne $EMPTY) { + $Bg_Line = $Bg_Line." ".$All{"Bg1$NHist"}." ".$All{"Bg2$NHist"}; + } + if ($All{"Data1$NHist"} ne $EMPTY && $All{"Data2$NHist"} ne $EMPTY) { + $Data_Line =$Data_Line." ".$All{"Data1$NHist"}." ".$All{"Data2$NHist"}; + } + if ($All{"t0$NHist"} ne $EMPTY) { + $T0_Line=$T0_Line." ".$All{"t0$NHist"}; + } + $NHist++; + } + + # Put T0_Line Bg_Line and Data_Line together if not empty + my $T0DataBg=$EMPTY; + if ($T0_Line ne "t0") { + $T0DataBg = $T0DataBg.$T0_Line."\n"; + } + if ($Bg_Line ne "background") { + $T0DataBg = $T0DataBg.$Bg_Line."\n"; + } + if ($Data_Line ne "data") { + $T0DataBg = $T0DataBg.$Data_Line."\n"; + } + + $FRANGE_Line = "fit TINI TFIN"; + $PAC_Line = "packing BINNING"; + + $Single_RUN = + "$RUN_Line\n$Type_Line\n$Alpha_Line$Hist_Lines\n$T0DataBg$MAP_Line\n$FRANGE_Line\n$PAC_Line\n\n"; + + # This is from CreateRUNBlk + $DEBUG =~s /T0LINE/$T0_Line/; + $DEBUG =~s /BGLINE/$Bg_Line/; + $DEBUG =~s /DATALINE/$Data_Line/; + + # 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; } + + $RUNS_Line = "$RUNS_Line " . $Range_Order; + ++$k; + ++$Range_Order; + } + } else { + ####################################################################### + # For a single histogram fit we basically need to repeat this for each hist + # However, "physical" parameters such as Asymmetry, relaxation etc. should + # be the same for all histograms! + # We distinguich between sharing among different runs to common parameters + # for different histograms. The first is done in the usual "Sharing" schame, + # while the second has to be done in the functions block. This can be done + # in a consistent, non-confusing algorithm + foreach my $Hist (@Hists) { + # 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 No/NBg line for the RUN block. Empty initially. + my $NoBg_Line = $EMPTY; + + # Loop over all components in the fit + foreach my $FitType (@FitTypes) { + ++$component; + my $Parameters = $Paramcomp[ $component - 1 ]; + my @Params = split( /\s+/, $Parameters ); + # Only the first histiograms has new physical parameters + # the others keep only Phi if they have it + + # For the first component we need No and NBg for SingleHist fits + if ( $component == 1 ) { + unshift( @Params, ( "No", "NBg" ) ); + } + + foreach my $Param (@Params) { + my $Param_ORG = $Param; + $Param=$Param.$Hist; + if ( ($#FitTypes != 0) && !( $Param_ORG =~ m/^(No|NBg)/ ) ) { + $Param = join( $EMPTY, $Param, "_", "$component" ); + } + + # If we have only one RUN with one Histogram then everything is shared + my $Shared = 0; + if ( $#RUNS == 0 && $#Hists == 0 ) { + $Shared = 1; + } else { + # Otherwise check input if it was marked as shared + $Shared = $All{"Sh_$Param"}; + } + + # No and NBg Lines + # + # If you encounter No in the parameters list make sure + # to fill this line for the RUN block. + if ( $Param_ORG eq "No" ) { + if ($Shared) { + $NoBg_Line = "norm 1\n"; + } + else { + $NoBg_Line = "norm $PCount\n"; + } + + # Optional - add lifetime correction for SingleHist fits + if ( $All{"ltc"} eq "y" ) { + $NoBg_Line = $NoBg_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) { + $NoBg_Line = $NoBg_Line . "backgr.fit 2\n"; + } else { + $NoBg_Line = $NoBg_Line . "backgr.fit $PCount\n"; + } + } + + # End of No and NBg Lines + + # Start preparing the parameters block + if ($Shared) { + # Parameter is shared enough to keep order from first run + if ( $iRun == 1 ) { + $Full_T_Block =~ s/$Param_ORG/$PCount/; + ++$shcount; + ++$PCount; + } + } else { + # Parameter is not shared, use map unless it is a single RUN fit + # Skip adding to map line in these cases + if ( !( $Param_ORG =~ m/^(No|NBg)/ ) && ($#RUNS != 0 || $#Hist != 0)) { + ++$nonsh; + $Full_T_Block =~ s/$Param_ORG/map$nonsh/; + $MAP_Line = join( ' ', $MAP_Line, $PCount ); + } + ++$PCount; + } + $NtotPar = $PCount; + } + } + + # Finished preparing the FITPARAMETERS block + + # Start constructing RUN block here + # For each defined range we need a block in the RUN-Block + # Also for each histogram in Single Histograms fits + + $RUN = $RUNS[ $iRun - 1 ]; + + $DEBUG = $DEBUG.MSR::CreateRUNBlk($RUN, $YEAR, $BeamLine, $All{"FitAsyType"}, $All{"LRBF"}, $All{"Tis"}, $All{"Tfs"}, $All{"BINS"}); + + if ($All{"RUNSType"}) { + $RUN_Line = MSR::RUNFileNameAuto($RUN,"0000",$EMPTY); + } else { + $RUN_Line = MSR::RUNFileNameAuto($RUN,$YEAR,$BeamLine); + } + + $Type_Line = "fittype 0"; + $PLT = 0; + $Hist_Lines = "forward HIST"; + $Bg_Line = $EMPTY; + $Data_Line = "data"; + + foreach ("t0","Bg1","Bg2","Data1","Data2") { + $Name = "$_$Hist"; + # If empty fill with defaults + if ($All{$Name} eq $EMPTY) { + $All{$Name}=MSR::T0BgData($_,$Hist,$BeamLine); + } + } + $Bg_Line = $Bg_Line." ".$All{"Bg1$Hist"}." ".$All{"Bg2$Hist"}; + $Data_Line =$Data_Line." ".$All{"Data1$Hist"}." ".$All{"Data2$Hist"}; + if ($All{"t0$Hist"} ne $EMPTY) { + $Data_Line=$Data_Line."\nt0 ".$All{"t0$Hist"}; + } + + $FRANGE_Line = "fit TINI TFIN"; + $PAC_Line = "packing BINNING"; + + $Single_RUN = $EMPTY; + $Tmp_Hist_Line = $Hist_Lines; + $Tmp_Hist_Line =~ s/HIST/$Hist/g; + $Single_RUN = $Single_RUN + . "$RUN_Line\n$Type_Line\n$NoBg_Line$Tmp_Hist_Line\n$Data_Line\n$MAP_Line\n$FRANGE_Line\n$PAC_Line\n\n"; + + # This is from CreateRUNBlk + $DEBUG =~s /T0LINE/$T0_Line/; + $DEBUG =~s /BGLINE/$Bg_Line/; + $DEBUG =~s /DATALINE/$Data_Line/; + + # 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; } + $RUNS_Line = "$RUNS_Line " . $Range_Order; + ++$k; + ++$Range_Order; + } + ++$iHist; + } + } + ++$iRun; + } + + # The number of runs is + $NRUNS = $iRun - 1; + # Start constructing all blocks + my $TitleLine = $All{"TITLE"}."\n# Run Numbers: ".$All{"RunNumbers"}; + + # Get parameter block from MSR::PrepParamTable(\%All); + my $FitParaBlk = "FITPARAMETER +############################################################### +# No Name Value Err Min Max "; + my %PTable=MSR::PrepParamTable(\%All); + my $NParam=scalar keys( %PTable ); +# Fill the table with labels and values of parametr + for (my $iP=0;$iP<$NParam;$iP++) { + my ($Param,$value,$error,$minvalue,$maxvalue,$RUNtmp) = split(/,/,$PTable{$iP}); + if ( $minvalue == $maxvalue ) { + $minvalue = $EMPTY; + $maxvalue = $EMPTY; + } + $PCount=$iP+1; + $FitParaBlk = $FitParaBlk." + $PCount $Param $value $error $error $minvalue $maxvalue"; + } + + $Full_T_Block = "THEORY\n###############################################################\n$Full_T_Block\n"; + + # COMMAND Block + $COMMANDS_Block = "COMMANDS\nFITMINTYPE\nSAVE\n"; + $COMMANDS_Block =~ s/FITMINTYPE/$FITMINTYPE/g; + # END- COMMAND Block + + # PLOT Block + # 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 ($All{"Yi"} != $All{"Yf"}) { + $PRANGE_Line = "range ".$All{"Xi"}." ".$All{"Xf"}." ".$All{"Yi"}." ".$All{"Yf"}; + } else { + $PRANGE_Line = "range ".$All{"Xi"}." ".$All{"Xf"}; + } + } + + $VIEWBIN_Line =""; + if ( $All{"ViewBin"}!=0 ) { $VIEWBIN_Line = "view_packing ".$All{"ViewBin"};} + + my $RRFBlock=MSR::CreateRRFBlk(\%All); + $PLOT_Block = "PLOT $PLT\nruns $RUNS_Line\n$PRANGE_Line\n$VIEWBIN_Line\n$RRFBlock\n$logxy"; + #END - PLOT Block + + # FFT Block + my $FOURIER_Block = MSR::CreateFFTBlk(\%All); + # END - FFT Block + + # STATS Block + # Don't know why but it is needed initially + my $STAT_Block = "STATISTIC --- 0000-00-00 00:00:00\n*** FIT DID NOT CONVERGE ***"; + # END - STATS Block # Empty line at the end of each block - my $FullMSRFile = "$TitleLine$FitParaBlk\n$Full_T_Block\n$FUNCTIONS_Block\n$RUN_Block\n$COMMANDS_Block\n$PLOT_Block\n$FOURIER_Block\n$STAT_Block\n"; + my $FullMSRFile = "$TitleLine +############################################################### +$FitParaBlk +############################################################### +$Full_T_Block +############################################################### +$FUNCTIONS_Block +############################################################### +$RUN_Block +############################################################### +$COMMANDS_Block +############################################################### +$PLOT_Block +############################################################### +$FOURIER_Block +############################################################### +$STAT_Block\n"; # Return information and file return($Full_T_Block,\@Paramcomp,$FullMSRFile); } + +sub CreateMSRGLB { ########################################################################## # CreateMSRGLB # @@ -888,33 +1407,32 @@ STATISTIC --- 0000-00-00 00:00:00 # FILENAME.msr - MSR file saved # ########################################################################## -sub CreateMSRGLB { my %All = %{$_[0]}; my @RUNS = (); if ($All{"RUNSType"}) { # Make sure this globalization is disabled if RunFiles are used @RUNS = split( /,/, $All{"RunFiles"} ); +# Make example from first run + $All{"RunFiles"}=$RUNS[0]; } else { - @RUNS = split( /,/, $All{"RunNumbers"} ); + @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); +# Make example from first run + $All{"RunNumbers"}=$RUNS[0]; } -# Make example from first run - $All{"RunNumbers"}=$RUNS[0]; - my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateMSR(\%All); - -# TODO: create global file from example file - + my ($Full_T_Block,$Paramcomp_ref,$MSRTemplate)= MSR::CreateMSRUni(\%All); # Return as usual my @Paramcomp = @$Paramcomp_ref; - return($Full_T_Block,\@Paramcomp); + + return($Full_T_Block,\@Paramcomp,$MSRTemplate); } -######################## -# Createheory -######################## sub CreateTheory { +######################## +# CreateTheory +######################## # This subroutine requires: # @FitTypes - the array of the types of components (summed) @@ -1178,12 +1696,12 @@ sub CreateTheory { ####################################################################### } return($Full_T_Block,\@Paramcomp); -} # End CreateTheory +} +sub ExtractBlks { ######################## # ExtractBlks ######################## -sub ExtractBlks { # This subroutine takes the MSR file as input and extracts the parameters # with the corresponding values, errors etc... @@ -1221,6 +1739,7 @@ sub ExtractBlks { } +sub T0BgData { ######################## # T0BgData # Function return the defaul value of t0, Bg and Data bin @@ -1229,7 +1748,6 @@ sub ExtractBlks { # $Hist is the histogram number # $BeamLine in the name of beamline ######################## -sub T0BgData { # Take this information as input arguments (my $Name, my $Hist, my $BeamLine) = @_; @@ -1239,7 +1757,13 @@ sub T0BgData { my %LEM=("1",",66000,66500,3419,63000", "2",",66000,66500,3419,63000", "3",",66000,66500,3419,63000", - "4",",66000,66500,3419,63000"); + "4",",66000,66500,3419,63000", + "5",",66000,66500,3419,63000", + "6",",66000,66500,3419,63000", + "7",",66000,66500,3419,63000", + "8",",66000,66500,3419,63000", + "9",",66000,66500,3419,63000", + "10",",66000,66500,3419,63000"); # my %GPS=("1",",40,120,135,8000", # "2",",40,120,135,8000", @@ -1272,17 +1796,17 @@ sub T0BgData { } +sub PrepParamTable { ######################## # PrepParamTable # Function return a Hash with a table of parameters for the fit # input should be # %All ######################## -sub PrepParamTable { # Take this information as input arguments # "Smart" default value of the fit parameters. my %Defaults = ( - "Asy", "0.15", "dAsy", "0.01", + "Asy", "0.20", "dAsy", "0.01", "Asy_min", "0", "Asy_max", "0", "Alpha", "1.0", "dAlpha", "0.01", "Alpha_min", "0", "Alpha_max", "0", @@ -1368,7 +1892,7 @@ sub PrepParamTable { foreach my $RUN (@RUNS) { $iRun++; $Component=1; - if ($All{"FitAsyType"} eq "Asymmetry") { + if ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsyGLB") { foreach my $FitType (@FitTypes) { my $Parameters=$Paramcomp[$Component-1]; my @Params = split( /\s+/, $Parameters ); @@ -1423,7 +1947,7 @@ sub PrepParamTable { $Component++; } } - elsif ($All{"FitAsyType"} eq "SingleHist") { + elsif ($All{"FitAsyType"} eq "SingleHist" || $All{"FitAsyType"} eq "SingHistGLB") { # For a single histogram fit we basically need to repeat this for each hist foreach my $Hist (@Hists) { $Component=1; @@ -1482,14 +2006,13 @@ sub PrepParamTable { return %ParTable; } - +sub ExportParams { ######################## # ExportParams # Function return a tab separated table of parameters for the fit # input should be # %All ######################## -sub ExportParams { my $erradd = "d"; my $minadd = "_min"; my $maxadd = "_max"; @@ -1521,14 +2044,6 @@ sub ExportParams { my @Paramcomp = @$Paramcomp_ref; my $Full_T_Block= $All{"Full_T_Block"}; -# Extract parameter block form the MSR file -# my $FILENAME=$All{"FILENAME"}; -# open (MSRF,q{<},"$FILENAME.msr" ); -# my @lines = ; -# close(IFILE); -# my $FPBlock_ref=MSR::ExtractBlks(@lines); -# my @FPBloc = @$FPBlock_ref; - # Then loop over expected parameters and extract their values and error bar my $PCount =0; my $iRun =0; @@ -1588,7 +2103,7 @@ sub ExportParams { $Component++; } } - elsif ($All{"FitAsyType"} eq "SingleHist") { + elsif ($All{"FitAsyType"} eq "SingleHist" ) { # For a single histogram fit we basically need to repeat this for each hist foreach my $Hist (@Hists) { $Component=1; @@ -1640,13 +2155,13 @@ sub ExportParams { return $TABLE; } +sub MSR2Dat { ######################## # MSR2Dat # Function return a tab separated table of parameters from an MSR file # input should be # @msrfile ######################## -sub MSR2Dat { # Take the msr file as input array of lines my @file=@_; @@ -1731,7 +2246,7 @@ sub MSR2Dat { return $DatFile; } - +sub RUNFileNameAuto { ######################## # RUNFileNameAuto # Function return the RUN_Line for a given RUN @@ -1740,7 +2255,6 @@ sub MSR2Dat { # $YEAR is the year # $BeamLine in the name of beamline ######################## -sub RUNFileNameAuto { # Take this information as input arguments (my $RUN, my $YEAR, my $BeamLine) = @_; @@ -1827,11 +2341,11 @@ sub RUNFileNameAuto { return $RUN_Line; } +sub CreateRRFBlk { ######################## -# CreateRRFBlock +# CreateRRFBlk ######################## # This creates the RRF related lines, these are the same always -sub CreateRRFBlock { my %All = %{$_[0]}; @@ -1846,13 +2360,12 @@ sub CreateRRFBlock { return $RRFBlock; } - +sub ExtractInfo { ######################## # ExtractInfo ######################## # Used to extract information from data file header. The header (using # "dump_header" is sent to this function from musrfit.cgi or MuSRFit -sub ExtractInfo { my ($header,$Arg) = @_; my @lines = split(/\n/,$header); @@ -1863,7 +2376,7 @@ sub ExtractInfo { } elsif ( $Arg eq "Temp" ) { foreach my $line (@lines) { - if ( $line =~ /Mean Sample_CF1/ ) { + if ( $line =~ /Temp/ ) { ( my $tmp, my $T ) = split( /=/, $line ); ( $T, $tmp ) = split( /\(/, $T ); $RTRN_Val = $T; @@ -1894,12 +2407,11 @@ sub ExtractInfo { return $RTRN_Val; } - +sub ExtractInfoLEM { ######################## # ExtractInfoLEM ######################## # Uset to extract information from summary files -sub ExtractInfoLEM { my ($RUN,$YEAR,$Arg) = @_; # Use file header my $Summ_File_Name = "lem" . substr( $YEAR, 2 ) . "_" . $RUN . ".summ"; @@ -1946,8 +2458,8 @@ sub ExtractInfoLEM { return $RTRN_Val; } -# Uset to extract information from log files sub ExtractInfoBulk { +# Uset to extract information from log files my ($RUN,$AREA,$YEAR,$Arg) = @_; my $RUNtmp=sprintf("%04d",$RUN); $RUN=$RUNtmp; @@ -1978,638 +2490,113 @@ sub ExtractInfoBulk { return $RTRN_Val; } -# Subroutine to create a clean run block (Not finished yet) sub CreateRUNBlk { +# Subroutine to create a clean run block (Not finished or used yet) # Take this information as input arguments - (my $RUN, my $YEAR, my $BeamLine, my $Fit_Type, my $LRBF, my $Ti, my $Tf, my $BIN) = @_; + my ($RUN,$YEAR,$BeamLine,$FitAsyType,$LRBF,$Ti,$Tf,$BIN) = @_; +# $RUN is the run number +# $YEAR is the corresponding year +# $BeamLine is the corresponding beam line +# $FitAsyType is SH or Asy +# $LRBF are the histogram numbers +# $Ti, $Tf and $BIN are the corresponding initial/final time range and binning factor respectively my $RUN_Block = -"RUN_LINE -fittype FIT_TYPE -ALPHA_LINE -forward FHIST -backward BHIST -MAP_LINE -fit TIVAL TFVAL -packing BINNING +"#RUN_LINE +#fittype FIT_TYPE +#ALPHA_LINE +#HISTOLINES +#MAP_LINE +#T0LINE +#BGLINE +#DATALINE +#fit TIVAL TFVAL +#packing BINNING "; + # HISTOLINES is the only thing that significantly changes between SH and Asy + + # Prepare the RUN_LINE my $RUN_Line = MSR::RUNFileNameAuto($RUN,$YEAR,$BeamLine); + # Split the histograms my @Hists = split( /,/, $LRBF ); + $Fit_Type = 0; + if ($FitAsyType eq "Asymmetry" || $FitAsyType eq "AsyGLB") { + $Fit_Type = 2; + } $RUN_Block =~ s/RUN_LINE/$RUN_Line/; $RUN_Block =~ s/FIT_TYPE/$Fit_Type/; - $RUN_Block =~ s/FHIST/$Hists[0]/; - $RUN_Block =~ s/BHIST/$Hists[1]/; $RUN_Block =~ s/TIVAL TFVAL/$Ti $Tf/; $RUN_Block =~ s/BINNING/$BIN/; + my $HistLines = $EMPTY; + my $Run_Block_ORG = $RUN_Block; + $RUN_Block = $EMPTY; + if ($Fit_Type == 2) { + # Asymmetry fit + $HistLines = "forward $Hists[0]\n#backward $Hists[1]"; + $RUN_Block = $RUN_Block.$Run_Block_ORG."\n\n"; + $RUN_Block =~ s/HISTOLINES/$HistLines/; + } else { + # Single histogram fit + foreach my $Hist (@Hists) { + $HistLines = "forward $Hist"; + # Create multiple blocks with the same lines except for the histogram line + $RUN_Block = $RUN_Block.$Run_Block_ORG."\n\n"; + $RUN_Block =~ s/HISTOLINES/$HistLines/; + } + } + return $RUN_Block; } - -########################################################################## -# CreateMSRSh - to generate template file for msr2data global fit -# -# 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 CreateMSRSh { +sub CreateFFTBlk { my %All = %{$_[0]}; - - # Start with empty array - my @FitTypes = (); - - foreach ($All{"FitType1"},$All{"FitType2"},$All{"FitType3"}) { - if ($_ ne "None") { - @FitTypes=(@FitTypes,$_); - } - } - - my @Hists = split( /,/, $All{"LRBF"} ); - # TODO - # : to separate two sets of asymmetries with same parameters - # Check the number of histograms - # should be 2 or 4 histograms - # should be checked in GUI - # for 2 simple asymmetry fit - # for 4 two run blocks with different geometric parameters: - # Alpha, No, NBg, Phi, Asy - - 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 $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"; - } - - # Proper way - if ( $All{"Minimization"} ne $EMPTY && $All{"ErrorCalc"} ne $EMPTY && $Step ne "PLOT" ) { - $FITMINTYPE = $All{"Minimization"}."\n".$All{"ErrorCalc"}; - } - - - # First create the THEORY Block - my ($Full_T_Block,$Paramcomp_ref)=MSR::CreateTheory(@FitTypes); - my @Paramcomp = @$Paramcomp_ref; - - - # If we have a FUNCTIONS Block the Full_T_Block should be - # replaced by Func_T_Block - $FUNCTIONS_Block = $EMPTY; - if ($All{"FunctionsBlock"} ne $EMPTY) { - $FUNCTIONS_Block = " -############################################################### -FUNCTIONS -############################################################### -".$All{"FunctionsBlock"}."\n"; - $Full_T_Block=$All{"Func_T_Block"}; - # remove all _N to end (may fail with large number of parameters) - $Full_T_Block =~ s/_\d\b//g; - } - - # Counter of Params - my $PCount = 1; - - # Need to select here RUNSAuto or RUNSManual - # $RUNSType = 0 (Auto) or 1 (Manual) - my $RUNSType = 0; - my @RUNS=(); - if ($All{"RunNumbers"} ne $EMPTY) { - @RUNS=split( /,/, $All{"RunNumbers"}); - $RUNSType = 0; - } - elsif ($All{"RunFiles"} ne $EMPTY) { - @RUNS=split( /,/, $All{"RunFiles"}); - $RUNSType = 1; - } - - # $shcount is a counter for shared parameters - # msr2data \[1363 1365 1366\] _Dolly_2010 msr-1363 global - if ( $#RUNS == 0 ) { - my $shcount = 1; - } else { - if ( $All{"Sh_Alpha"} == 1 ) { - my $shcount = 1; - } else { - my $shcount = 0; - } - } - - $shcount = 1; - my $RUN_Block = $EMPTY; - my $RUNS_Line = $EMPTY; - - # range order - my $Range_Order = 1; - - # Create template from the first run - # 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 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) { - unshift( @Params, "Alpha" ); - } - - foreach $Param (@Params) { - $Param_ORG = $Param; - if ( ($#FitTypes != 0) && ($Param ne "Alpha") ) { - $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 Line - # - # 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 $PCount\n"; - } - } - - # End of Alpha Line -#################################################################################################### - - # Start preparing the parameters block - if ($Shared) { - - # Parameter is shared enough to keep order from first run - $Full_T_Block =~ s/$Param_ORG/$PCount/; - ++$shcount; - ++$PCount; - } else { - # Parameter is not shared, use map unless it is a single RUN fit - # Skip adding to map line in these cases - if ( $Param ne "Alpha" && $#RUNS != 0 ) - { - ++$nonsh; - $Full_T_Block =~ s/$Param_ORG/map$nonsh/; - $MAP_Line = join( ' ', $MAP_Line, $PCount ); - } - ++$PCount; - } - $NtotPar = $PCount; - } - } - - # 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[0]; - - if ($All{"RUNSType"}) { - $RUN_Line = MSR::RUNFileNameAuto($RUN,"0000",$EMPTY); - } else { - $RUN_Line = MSR::RUNFileNameAuto($RUN,$YEAR,$BeamLine); - } - - $Type_Line = "fittype 2"; - $PLT = 2; - $Hist_Lines = - "forward $Hists[0]\nbackward $Hists[1]"; - - $Bg_Line = "background"; - $Data_Line = "data"; - $T0_Line = "t0"; - $NHist=1; - foreach $Hist (@Hists) { - foreach ("t0","Bg1","Bg2","Data1","Data2") { - $Name = "$_$NHist"; -# If empty fill with defaults -# if ($All{$Name} eq $EMPTY) { -# $All{$Name}=MSR::T0BgData($_,$Hist,$BeamLine); -# } - } -# If empty skip lines - if ($All{"Bg1$NHist"} ne $EMPTY && $All{"Bg2$NHist"} ne $EMPTY) { - $Bg_Line = $Bg_Line." ".$All{"Bg1$NHist"}." ".$All{"Bg2$NHist"}; - } - if ($All{"Data1$NHist"} ne $EMPTY && $All{"Data2$NHist"} ne $EMPTY) { - $Data_Line =$Data_Line." ".$All{"Data1$NHist"}." ".$All{"Data2$NHist"}; - } - if ($All{"t0$NHist"} ne $EMPTY) { - $T0_Line=$T0_Line." ".$All{"t0$NHist"}; - } - $NHist++; - } - -# Put T0_Line Bg_Line and Data_Line together if not empty - my $T0DataBg=$EMPTY; - if ($T0_Line ne "t0") { - $T0DataBg = $T0DataBg.$T0_Line."\n"; - } - if ($Bg_Line ne "background") { - $T0DataBg = $T0DataBg.$Bg_Line."\n"; - } - if ($Data_Line ne "data") { - $T0DataBg = $T0DataBg.$Data_Line."\n"; - } - - $FRANGE_Line = "fit TINI TFIN"; - $PAC_Line = "packing BINNING"; - - $Single_RUN = - "$RUN_Line\n$Type_Line\n$Alpha_Line$Hist_Lines\n$T0DataBg$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; } - - $RUNS_Line = "$RUNS_Line " . $Range_Order; - ++$k; - ++$Range_Order; - } - -# For the plotting command of multiple runs - foreach $RUN (@RUNS) { - foreach $Ti (@TiVals) { - $RUNS_Line = "$RUNS_Line " . $Range_Order; - ++$Range_Order; - } - } - -# Start constructing all blocks - my $TitleLine = $All{"TITLE"}."\n# Run Numbers: ".$All{"RunNumbers"}; -# $TitleLine =~ s/\n//g; - - # Get parameter block from MSR::PrepParamTable(\%All); - my $FitParaBlk = -"############################################################### -FITPARAMETER -############################################################### -# No Name Value Err Min Max "; - my %PTable=MSR::PrepParamTable(\%All); - my $NParam=scalar keys( %PTable ); -# Fill the table with labels and values of parametr - for (my $iP=0;$iP<$NParam;$iP++) { - my ($Param,$value,$error,$minvalue,$maxvalue,$RUNtmp) = split(/,/,$PTable{$iP}); - if ( $minvalue == $maxvalue ) { - $minvalue = $EMPTY; - $maxvalue = $EMPTY; - } - $PCount=$iP+1; - $FitParaBlk = $FitParaBlk." - $PCount $Param $value $error $error $minvalue $maxvalue"; - } - - $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 ($All{"Yi"} != $All{"Yf"}) { - $PRANGE_Line = "range ".$All{"Xi"}." ".$All{"Xf"}." ".$All{"Yi"}." ".$All{"Yf"}; - } else { - $PRANGE_Line = "range ".$All{"Xi"}." ".$All{"Xf"}; - } - } - - $VIEWBIN_Line =""; - if ( $All{"ViewBin"}!=0 ) { $VIEWBIN_Line = "view_packing ".$All{"ViewBin"};} - - my $RRFBlock=MSR::CreateRRFBlock(\%All); - $PLOT_Block = - "############################################################### -PLOT $PLT -runs $RUNS_Line -$PRANGE_Line -$VIEWBIN_Line -$RRFBlock -$logxy"; - if ($All{"FUNITS"} eq $EMPTY) {$All{"FUNITS"}="MHz";} if ($All{"FAPODIZATION"} eq $EMPTY) {$All{"FAPODIZATION"}="STRONG";} if ($All{"FPLOT"} eq $EMPTY) {$All{"FPLOT"}="POWER";} if ($All{"FPHASE"} eq $EMPTY) {$All{"FPHASE"}="8.5";} + my $FrqRange = $EMPTY; + if ($All{"FRQMAX"} ne $EMPTY && $All{"FRQMIN"} ne $EMPTY && $All{"FRQMAX"} ne $All{"FRQMIN"}) { + $FrqRange = "range ".$All{"FRQMIN"}." ".$All{"FRQMAX"}; + } - - $FOURIER_Block= - "############################################################### -FOURIER + my $FOURIER_Block="FOURIER units FUNITS # units either 'Gauss', 'MHz', or 'Mc/s' fourier_power 12 apodization FAPODIZATION # NONE, WEAK, MEDIUM, STRONG plot FPLOT # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE phase FPHASE -#range FRQMIN FRQMAX"; +FRQRANGE"; $FOURIER_Block=~ s/FUNITS/$All{"FUNITS"}/g; $FOURIER_Block=~ s/FAPODIZATION/$All{"FAPODIZATION"}/g; $FOURIER_Block=~ s/FPLOT/$All{"FPLOT"}/g; $FOURIER_Block=~ s/FPHASE/$All{"FPHASE"}/g; + $FOURIER_Block=~ s/FRQRANGE/$FrqRange/g; - # 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$FUNCTIONS_Block\n$RUN_Block\n$COMMANDS_Block\n$PLOT_Block\n$FOURIER_Block\n$STAT_Block\n"; - -# Return information and file - return($Full_T_Block,\@Paramcomp,$FullMSRFile); + return $FOURIER_Block; } -######################## -# PrepParamTableSh - Prepare fir parameters block for global fit using msr2data -# Function return a Hash with a table of parameters for the fit -# input should be -# %All -######################## -sub PrepParamTableSh { -# Take this information as input arguments -# "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", - "No", "300.0", "dNo", "0.01", - "No_min", "0", "No_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", "60.", "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; - -# Reset output Hash - %ParTable = (); - - my %All = %{$_[0]}; - my @RUNS = (); - if ($All{"RUNSType"}) { - @RUNS = split( /,/, $All{"RunFiles"} ); - } else { - @RUNS = split( /,/, $All{"RunNumbers"} ); +sub ExpandRunNumbers { +# Subroutine to conver hyphens in the RunNumbers into a series of comma separated runs + my ($RunNumbers) = @_; + # Split by commas + @RUNS=split( /,/, $RunNumbers); + # Find array members that include a hyphen (-) + my @RUNseries = grep { /\-/ } @RUNS; + foreach my $tmp (@RUNseries) { + # Each item that includes a hyphen is expanded as from-to array + my ($Begin,$End)=split('-',$tmp); + my @Series = ($Begin..$End); + # Join the expanded series using commas + my $RunJoined = join(',',@Series); + # Replace the original hyphens by the expanded series + $RunNumbers =~ s/$tmp/$RunJoined/; } - my @Hists = split( /,/, $All{"LRBF"} ); - - my @FitTypes =(); - foreach my $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) { - if ( $FitType ne "None" ) { push( @FitTypes, $FitType ); } - } -# 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 $PCount =0; - my $value =0; - my $error = 0; - my $minvalue = 0; - my $maxvalue = 0; - my $Component=1; - - $Component=1; - if ($All{"FitAsyType"} eq "Asymmetry") { - foreach my $FitType (@FitTypes) { - my $Parameters=$Paramcomp[$Component-1]; - my @Params = split( /\s+/, $Parameters ); - if ( $Component == 1 ) { - unshift( @Params, "Alpha" ); - } - -# 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 = join( $EMPTY, $Param, "_", "$Component" ); - } - - $Shared = $All{"Sh_$Param"}; -# It there are multiple runs index the parameters accordingly - my $RUNtmp=sprintf("%04d",$RUN); - if ($Shared!=1) { - $Param=$Param."_".$RUNtmp; - } -# Check if this parameter has been initialized befor. If not take from defaults - $value = $All{"$Param"}; - if ( $value ne $EMPTY ) { - $error = $All{"$erradd$Param"}; - $minvalue = $All{"$Param$minadd"}; - $maxvalue = $All{"$Param$maxadd"}; - } else { -# We have two options here, either take default values or take values of previous -# run if available - $value = $Defaults{$Param_ORG}; - $error = $Defaults{ join( $EMPTY, $erradd, $Param_ORG ) }; - $minvalue = $Defaults{ join($EMPTY, $Param_ORG, $minadd ) }; - $maxvalue = $Defaults{ join($EMPTY, $Param_ORG, $maxadd ) }; - } - $values=join(",",$Param,$value,$error,$minvalue,$maxvalue,$RUN); - $ParTable{$PCount}=$values; - $PCount++; - } - $NP++; - } - $Component++; - } - elsif ($All{"FitAsyType"} eq "SingleHist") { -# For a single histogram fit we basically need to repeat this for each hist - foreach my $Hist (@Hists) { - $Component=1; - foreach my $FitType (@FitTypes) { - my $Parameters=$Paramcomp[$Component-1]; - my @Params = split( /\s+/, $Parameters ); - if ( $Component == 1 ) { - unshift( @Params, ( "No", "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 multiple histograms (sum or difference) take the first histogram only - ($Hist,$tmp) = split(/ /,$Hist); - $Param=$Param.$Hist; - if ( $#FitTypes != 0 && ( $Param_ORG ne "No" && $Param_ORG ne "NBg" ) ){ - $Param = join( $EMPTY, $Param, "_", "$Component" ); - } - - $Shared = $All{"Sh_$Param"}; -# It there are multiple runs index the parameters accordingly - my $RUNtmp=sprintf("%04d",$RUN); - if ($Shared!=1) {$Param=$Param."_".$RUNtmp;} -# Check if this parameter has been initialized befor. If not take from defaults - $value = $All{"$Param"}; - if ( $value ne $EMPTY ) { - $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... -# Or keep in the MSR as function ?? - $value = $Defaults{$Param_ORG}; - $error = $Defaults{ join( $EMPTY, $erradd, $Param_ORG ) }; - $minvalue = $Defaults{ join($EMPTY, $Param_ORG, $minadd ) }; - $maxvalue = $Defaults{ join($EMPTY, $Param_ORG, $maxadd ) }; - } - $values=join(",",$Param,$value,$error,$minvalue,$maxvalue,$RUN); - $ParTable{$PCount}=$values; - $PCount++; - } - $NP++; - } - $Component++; - } - } - return %ParTable; + return $RunNumbers; } 1; diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm index 2bb46742..a589f149 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.pm +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -278,14 +278,17 @@ sub CreateAllInput() $All{"Tfs"} = this->{ui}->tfs->text; $All{"BINS"} = this->{ui}->bins->text; $All{"FitAsyType"} = this->{ui}->fitAsyType->currentText; + $All{"FitAsyType"} =~ s/ //g; $All{"LRBF"} = this->{ui}->histsLRBF->text; my @Hists = split(/,/, $All{"LRBF"} ); # Lifetime corrections in enabled/visible only for SingleHis fits if ( $All{"FitAsyType"} eq "Asymmetry" ) { this->{ui}->ltc->setHidden(1); + $All{"fittype"}=2; } elsif ( $All{"FitAsyType"} eq "SingleHist" ) { this->{ui}->ltc->setHidden(0); + $All{"fittype"}=0; } # From Fitting Tab @@ -313,13 +316,16 @@ sub CreateAllInput() $All{"ErrorCalc"} = this->{ui}->errorCalc->currentText(); $All{"go"}=$All{"ErrorCalc"}; +# Commands block + $All{"CommandsBlock"}= $All{"Minimization"}."\n".$All{"ErrorCalc"}; + RunSelectionToggle(); my @RUNS = (); if ($All{"RUNSType"} ) { @RUNS = split( /,/, $All{"RunFiles"}); } else { $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; - @RUNS = split( /,/, $All{"RunNumbers"} ); + @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); } # From MSR File Tab @@ -534,13 +540,11 @@ sub CallMSRCreate() print OUTF ("$FullMSRFile"); close(OUTF); } else { -# my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSRSh(\%All); my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSR(\%All); # Open output file FILENAME.msr open( OUTF,q{>},"$FILENAME" ); print OUTF ("$FullMSRFile"); close(OUTF); - # if it is multiple runs then the produced file is a template my $FILENAME=$All{"FILENAME"}.".msr"; my $Extension = "_".$All{"BeamLine"}."_".$All{"YEAR"}; @@ -674,7 +678,7 @@ sub ActivateT0Hists() sub ActivateShComp() { my %All=CreateAllInput(); - my @RUNS = split( /,/, $All{"RunNumbers"} ); + my @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); # Hide all sharing components this->{ui}->sharingComp1->setHidden(1); @@ -906,9 +910,9 @@ sub t0Update() foreach ("t0","Bg1","Bg2","Data1","Data2") { my $Name = "$_$NHist"; my $tmp=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); - if (defined(child("Qt::Widget",$Name))) { - child("Qt::Widget",$Name)->setText($tmp); - } +# if (defined(child("Qt::Widget",$Name))) { +# child("Qt::Widget",$Name)->setText($tmp); +# } } $NHist++ } @@ -986,7 +990,7 @@ sub AppendToFunctions() sub InitializeFunctions() { my %All=CreateAllInput(); - my @RUNS = split( /,/, $All{"RunNumbers"} ); + my @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); my @FitTypes =(); foreach my $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) { diff --git a/src/external/MuSRFitGUI/MuSRFit4.ui b/src/external/MuSRFitGUI/MuSRFit4.ui index d6b8805e..a8ce1a1e 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.ui +++ b/src/external/MuSRFitGUI/MuSRFit4.ui @@ -6,8 +6,8 @@ 0 0 - 600 - 505 + 674 + 541 @@ -236,7 +236,17 @@ - SingleHist + Single Hist + + + + + Asymmetry GLB + + + + + Single Hist GLB @@ -303,7 +313,7 @@ - + 1 1 @@ -311,7 +321,7 @@ 0 - 80 + 100 @@ -323,6 +333,15 @@ + + QLayout::SetDefaultConstraint + + + 0 + + + 0 + 0 @@ -360,119 +379,6 @@ - - - - - 0 - 0 - - - - - 0 - 20 - - - - Year - - - false - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 30 - - - - On beam line - - - false - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 25 - - - - - LEM - - - - - GPS - - - - - Dolly - - - - - LTF - - - - - LEM (PPC) - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 181 - 21 - - - - @@ -507,6 +413,129 @@ + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 181 + 21 + + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + 16777215 + 25 + + + + + LEM + + + + + GPD + + + + + HAL + + + + + GPS + + + + + Dolly + + + + + LTF + + + + + LEM (PPC) + + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + Year + + + false + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + On beam line + + + false + + + @@ -3488,7 +3517,7 @@ 10 18 265 - 100 + 107 @@ -5412,8 +5441,8 @@ 0 0 - 600 - 20 + 674 + 27 diff --git a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm index 8a0fe95f..4ac83c51 100644 --- a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm +++ b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm @@ -5,8 +5,8 @@ ################################################################################# ## Form generated from reading UI file 'MuSRFit4.ui' ## -## Created: Thu Mar 23 16:58:52 2017 -## by: Qt User Interface Compiler version 4.8.6 +## Created: Mon Jan 29 14:11:03 2018 +## by: Qt User Interface Compiler version 4.8.7 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -162,24 +162,24 @@ sub year { return shift->{year}; } -sub yearLabel { - return shift->{yearLabel}; -} - -sub beamLineLabel { - return shift->{beamLineLabel}; -} - -sub beamLine { - return shift->{beamLine}; +sub runNumbers { + return shift->{runNumbers}; } sub spacer2 { return shift->{spacer2}; } -sub runNumbers { - return shift->{runNumbers}; +sub beamLine { + return shift->{beamLine}; +} + +sub yearLabel { + return shift->{yearLabel}; +} + +sub beamLineLabel { + return shift->{beamLineLabel}; } sub groupBox { @@ -993,7 +993,7 @@ sub setupUi { if ( !defined $muSRFit4->objectName() ) { $muSRFit4->setObjectName( "muSRFit4" ); } - $muSRFit4->resize( 600, 505 ); + $muSRFit4->resize( 674, 541 ); my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); $self->{$sizePolicy} = $sizePolicy; $sizePolicy->setHorizontalStretch( 1 ); @@ -1219,9 +1219,13 @@ sub setupUi { my $runsAuto = Qt::GroupBox( $runsPage ); $self->{runsAuto} = $runsAuto; $runsAuto->setObjectName( "runsAuto" ); - $sizePolicy->setHeightForWidth( $runsAuto->sizePolicy()->hasHeightForWidth() ); - $runsAuto->setSizePolicy( $sizePolicy ); - $runsAuto->setMinimumSize( Qt::Size(0, 80) ); + my $sizePolicy4 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Maximum() ); + $self->{$sizePolicy4} = $sizePolicy4; + $sizePolicy4->setHorizontalStretch( 1 ); + $sizePolicy4->setVerticalStretch( 1 ); + $sizePolicy4->setHeightForWidth( $runsAuto->sizePolicy()->hasHeightForWidth() ); + $runsAuto->setSizePolicy( $sizePolicy4 ); + $runsAuto->setMinimumSize( Qt::Size(0, 100) ); $runsAuto->setAlignment( Qt::AlignHCenter()|Qt::AlignTop() ); my $gridLayout_3 = Qt::GridLayout( $runsAuto ); $self->{gridLayout_3} = $gridLayout_3; @@ -1232,6 +1236,8 @@ sub setupUi { $self->{runNumbers_2} = $runNumbers_2; $runNumbers_2->setSpacing( 0 ); $runNumbers_2->setObjectName( "runNumbers_2" ); + $runNumbers_2->setSizeConstraint( Qt::Layout::SetDefaultConstraint() ); + $runNumbers_2->setContentsMargins(-1, 0, -1, 0 ); my $year = Qt::ComboBox( $runsAuto ); $self->{year} = $year; $year->setObjectName( "year" ); @@ -1246,45 +1252,6 @@ sub setupUi { $runNumbers_2->addWidget( $year, 1, 4, 1, 1 ); - my $yearLabel = Qt::Label( $runsAuto ); - $self->{yearLabel} = $yearLabel; - $yearLabel->setObjectName( "yearLabel" ); - my $sizePolicy4 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Preferred() ); - $self->{$sizePolicy4} = $sizePolicy4; - $sizePolicy4->setHorizontalStretch( 0 ); - $sizePolicy4->setVerticalStretch( 0 ); - $sizePolicy4->setHeightForWidth( $yearLabel->sizePolicy()->hasHeightForWidth() ); - $yearLabel->setSizePolicy( $sizePolicy4 ); - $yearLabel->setMinimumSize( Qt::Size(0, 20) ); - $yearLabel->setWordWrap( 0 ); - - $runNumbers_2->addWidget( $yearLabel, 1, 3, 1, 1 ); - - my $beamLineLabel = Qt::Label( $runsAuto ); - $self->{beamLineLabel} = $beamLineLabel; - $beamLineLabel->setObjectName( "beamLineLabel" ); - $sizePolicy4->setHeightForWidth( $beamLineLabel->sizePolicy()->hasHeightForWidth() ); - $beamLineLabel->setSizePolicy( $sizePolicy4 ); - $beamLineLabel->setMinimumSize( Qt::Size(0, 20) ); - $beamLineLabel->setMaximumSize( Qt::Size(16777215, 30) ); - $beamLineLabel->setWordWrap( 0 ); - - $runNumbers_2->addWidget( $beamLineLabel, 1, 1, 1, 1 ); - - my $beamLine = Qt::ComboBox( $runsAuto ); - $self->{beamLine} = $beamLine; - $beamLine->setObjectName( "beamLine" ); - $sizePolicy2->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); - $beamLine->setSizePolicy( $sizePolicy2 ); - $beamLine->setMinimumSize( Qt::Size(0, 20) ); - $beamLine->setMaximumSize( Qt::Size(16777215, 25) ); - - $runNumbers_2->addWidget( $beamLine, 1, 2, 1, 1 ); - - my $spacer2 = Qt::SpacerItem( 181, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); - - $runNumbers_2->addItem( $spacer2, 1, 0, 1, 1 ); - my $runNumbers = Qt::LineEdit( $runsAuto ); $self->{runNumbers} = $runNumbers; $runNumbers->setObjectName( "runNumbers" ); @@ -1296,6 +1263,45 @@ sub setupUi { $runNumbers_2->addWidget( $runNumbers, 0, 0, 1, 5 ); + my $spacer2 = Qt::SpacerItem( 181, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); + + $runNumbers_2->addItem( $spacer2, 1, 0, 1, 1 ); + + my $beamLine = Qt::ComboBox( $runsAuto ); + $self->{beamLine} = $beamLine; + $beamLine->setObjectName( "beamLine" ); + $sizePolicy2->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); + $beamLine->setSizePolicy( $sizePolicy2 ); + $beamLine->setMinimumSize( Qt::Size(0, 20) ); + $beamLine->setMaximumSize( Qt::Size(16777215, 25) ); + + $runNumbers_2->addWidget( $beamLine, 1, 2, 1, 1 ); + + my $yearLabel = Qt::Label( $runsAuto ); + $self->{yearLabel} = $yearLabel; + $yearLabel->setObjectName( "yearLabel" ); + my $sizePolicy5 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy5} = $sizePolicy5; + $sizePolicy5->setHorizontalStretch( 0 ); + $sizePolicy5->setVerticalStretch( 0 ); + $sizePolicy5->setHeightForWidth( $yearLabel->sizePolicy()->hasHeightForWidth() ); + $yearLabel->setSizePolicy( $sizePolicy5 ); + $yearLabel->setMinimumSize( Qt::Size(0, 20) ); + $yearLabel->setWordWrap( 0 ); + + $runNumbers_2->addWidget( $yearLabel, 1, 3, 1, 1 ); + + my $beamLineLabel = Qt::Label( $runsAuto ); + $self->{beamLineLabel} = $beamLineLabel; + $beamLineLabel->setObjectName( "beamLineLabel" ); + $sizePolicy5->setHeightForWidth( $beamLineLabel->sizePolicy()->hasHeightForWidth() ); + $beamLineLabel->setSizePolicy( $sizePolicy5 ); + $beamLineLabel->setMinimumSize( Qt::Size(0, 30) ); + $beamLineLabel->setMaximumSize( Qt::Size(16777215, 30) ); + $beamLineLabel->setWordWrap( 0 ); + + $runNumbers_2->addWidget( $beamLineLabel, 1, 1, 1, 1 ); + $gridLayout_3->addLayout( $runNumbers_2, 0, 0, 1, 1 ); @@ -1305,12 +1311,12 @@ sub setupUi { my $groupBox = Qt::GroupBox( $runsPage ); $self->{groupBox} = $groupBox; $groupBox->setObjectName( "groupBox" ); - my $sizePolicy5 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); - $self->{$sizePolicy5} = $sizePolicy5; - $sizePolicy5->setHorizontalStretch( 0 ); - $sizePolicy5->setVerticalStretch( 0 ); - $sizePolicy5->setHeightForWidth( $groupBox->sizePolicy()->hasHeightForWidth() ); - $groupBox->setSizePolicy( $sizePolicy5 ); + my $sizePolicy6 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); + $self->{$sizePolicy6} = $sizePolicy6; + $sizePolicy6->setHorizontalStretch( 0 ); + $sizePolicy6->setVerticalStretch( 0 ); + $sizePolicy6->setHeightForWidth( $groupBox->sizePolicy()->hasHeightForWidth() ); + $groupBox->setSizePolicy( $sizePolicy6 ); $groupBox->setMinimumSize( Qt::Size(0, 220) ); $groupBox->setBaseSize( Qt::Size(0, 0) ); my $gridLayout_8 = Qt::GridLayout( $groupBox ); @@ -1761,8 +1767,8 @@ sub setupUi { my $buttonGroupSharing = Qt::GroupBox( $sharingPage ); $self->{buttonGroupSharing} = $buttonGroupSharing; $buttonGroupSharing->setObjectName( "buttonGroupSharing" ); - $sizePolicy5->setHeightForWidth( $buttonGroupSharing->sizePolicy()->hasHeightForWidth() ); - $buttonGroupSharing->setSizePolicy( $sizePolicy5 ); + $sizePolicy6->setHeightForWidth( $buttonGroupSharing->sizePolicy()->hasHeightForWidth() ); + $buttonGroupSharing->setSizePolicy( $sizePolicy6 ); $buttonGroupSharing->setAlignment( Qt::AlignLeading() ); $buttonGroupSharing->setCheckable( 1 ); $buttonGroupSharing->setChecked( 0 ); @@ -1779,12 +1785,12 @@ sub setupUi { $self->{sharingComp1} = $sharingComp1; $sharingComp1->setObjectName( "sharingComp1" ); $sharingComp1->setEnabled( 0 ); - my $sizePolicy6 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); - $self->{$sizePolicy6} = $sizePolicy6; - $sizePolicy6->setHorizontalStretch( 0 ); - $sizePolicy6->setVerticalStretch( 0 ); - $sizePolicy6->setHeightForWidth( $sharingComp1->sizePolicy()->hasHeightForWidth() ); - $sharingComp1->setSizePolicy( $sizePolicy6 ); + my $sizePolicy7 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); + $self->{$sizePolicy7} = $sizePolicy7; + $sizePolicy7->setHorizontalStretch( 0 ); + $sizePolicy7->setVerticalStretch( 0 ); + $sizePolicy7->setHeightForWidth( $sharingComp1->sizePolicy()->hasHeightForWidth() ); + $sharingComp1->setSizePolicy( $sizePolicy7 ); $sharingComp1->setAlignment( Qt::AlignLeading() ); my $layout14 = Qt::Widget( $sharingComp1 ); $self->{layout14} = $layout14; @@ -1872,8 +1878,8 @@ sub setupUi { $self->{sharingComp2} = $sharingComp2; $sharingComp2->setObjectName( "sharingComp2" ); $sharingComp2->setEnabled( 0 ); - $sizePolicy6->setHeightForWidth( $sharingComp2->sizePolicy()->hasHeightForWidth() ); - $sharingComp2->setSizePolicy( $sizePolicy6 ); + $sizePolicy7->setHeightForWidth( $sharingComp2->sizePolicy()->hasHeightForWidth() ); + $sharingComp2->setSizePolicy( $sizePolicy7 ); my $comp2ShLabel = Qt::Label( $sharingComp2 ); $self->{comp2ShLabel} = $comp2ShLabel; $comp2ShLabel->setObjectName( "comp2ShLabel" ); @@ -1958,8 +1964,8 @@ sub setupUi { $self->{sharingComp3} = $sharingComp3; $sharingComp3->setObjectName( "sharingComp3" ); $sharingComp3->setEnabled( 0 ); - $sizePolicy6->setHeightForWidth( $sharingComp3->sizePolicy()->hasHeightForWidth() ); - $sharingComp3->setSizePolicy( $sizePolicy6 ); + $sizePolicy7->setHeightForWidth( $sharingComp3->sizePolicy()->hasHeightForWidth() ); + $sharingComp3->setSizePolicy( $sizePolicy7 ); $sharingComp3->setAlignment( Qt::AlignJustify()|Qt::AlignVCenter() ); my $comp3ShLabel = Qt::Label( $sharingComp3 ); $self->{comp3ShLabel} = $comp3ShLabel; @@ -2095,8 +2101,8 @@ sub setupUi { my $titleLabel = Qt::Label( $groupTitle ); $self->{titleLabel} = $titleLabel; $titleLabel->setObjectName( "titleLabel" ); - $sizePolicy4->setHeightForWidth( $titleLabel->sizePolicy()->hasHeightForWidth() ); - $titleLabel->setSizePolicy( $sizePolicy4 ); + $sizePolicy5->setHeightForWidth( $titleLabel->sizePolicy()->hasHeightForWidth() ); + $titleLabel->setSizePolicy( $sizePolicy5 ); $titleLabel->setWordWrap( 0 ); $vboxLayout1->addWidget( $titleLabel ); @@ -2104,12 +2110,12 @@ sub setupUi { my $title = Qt::LineEdit( $groupTitle ); $self->{title} = $title; $title->setObjectName( "title" ); - my $sizePolicy7 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy7} = $sizePolicy7; - $sizePolicy7->setHorizontalStretch( 1 ); - $sizePolicy7->setVerticalStretch( 1 ); - $sizePolicy7->setHeightForWidth( $title->sizePolicy()->hasHeightForWidth() ); - $title->setSizePolicy( $sizePolicy7 ); + my $sizePolicy8 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy8} = $sizePolicy8; + $sizePolicy8->setHorizontalStretch( 1 ); + $sizePolicy8->setVerticalStretch( 1 ); + $sizePolicy8->setHeightForWidth( $title->sizePolicy()->hasHeightForWidth() ); + $title->setSizePolicy( $sizePolicy8 ); $vboxLayout1->addWidget( $title ); @@ -2163,8 +2169,8 @@ sub setupUi { my $fourierBox = Qt::GroupBox( $fourierPage ); $self->{fourierBox} = $fourierBox; $fourierBox->setObjectName( "fourierBox" ); - $sizePolicy5->setHeightForWidth( $fourierBox->sizePolicy()->hasHeightForWidth() ); - $fourierBox->setSizePolicy( $sizePolicy5 ); + $sizePolicy6->setHeightForWidth( $fourierBox->sizePolicy()->hasHeightForWidth() ); + $fourierBox->setSizePolicy( $sizePolicy6 ); my $layout34 = Qt::Widget( $fourierBox ); $self->{layout34} = $layout34; $layout34->setObjectName( "layout34" ); @@ -2178,28 +2184,28 @@ sub setupUi { my $frqMax = Qt::LineEdit( $layout34 ); $self->{frqMax} = $frqMax; $frqMax->setObjectName( "frqMax" ); - $sizePolicy4->setHeightForWidth( $frqMax->sizePolicy()->hasHeightForWidth() ); - $frqMax->setSizePolicy( $sizePolicy4 ); + $sizePolicy5->setHeightForWidth( $frqMax->sizePolicy()->hasHeightForWidth() ); + $frqMax->setSizePolicy( $sizePolicy5 ); $gridLayout7->addWidget( $frqMax, 0, 6, 1, 1 ); my $funits = Qt::ComboBox( $layout34 ); $self->{funits} = $funits; $funits->setObjectName( "funits" ); - my $sizePolicy8 = Qt::SizePolicy( Qt::SizePolicy::Ignored(), Qt::SizePolicy::Preferred() ); - $self->{$sizePolicy8} = $sizePolicy8; - $sizePolicy8->setHorizontalStretch( 0 ); - $sizePolicy8->setVerticalStretch( 0 ); - $sizePolicy8->setHeightForWidth( $funits->sizePolicy()->hasHeightForWidth() ); - $funits->setSizePolicy( $sizePolicy8 ); + my $sizePolicy9 = Qt::SizePolicy( Qt::SizePolicy::Ignored(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy9} = $sizePolicy9; + $sizePolicy9->setHorizontalStretch( 0 ); + $sizePolicy9->setVerticalStretch( 0 ); + $sizePolicy9->setHeightForWidth( $funits->sizePolicy()->hasHeightForWidth() ); + $funits->setSizePolicy( $sizePolicy9 ); $gridLayout7->addWidget( $funits, 0, 2, 1, 1 ); my $fplot = Qt::ComboBox( $layout34 ); $self->{fplot} = $fplot; $fplot->setObjectName( "fplot" ); - $sizePolicy4->setHeightForWidth( $fplot->sizePolicy()->hasHeightForWidth() ); - $fplot->setSizePolicy( $sizePolicy4 ); + $sizePolicy5->setHeightForWidth( $fplot->sizePolicy()->hasHeightForWidth() ); + $fplot->setSizePolicy( $sizePolicy5 ); $gridLayout7->addWidget( $fplot, 2, 2, 1, 1 ); @@ -2234,8 +2240,8 @@ sub setupUi { my $fapodization = Qt::ComboBox( $layout34 ); $self->{fapodization} = $fapodization; $fapodization->setObjectName( "fapodization" ); - $sizePolicy4->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); - $fapodization->setSizePolicy( $sizePolicy4 ); + $sizePolicy5->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); + $fapodization->setSizePolicy( $sizePolicy5 ); $gridLayout7->addWidget( $fapodization, 1, 2, 1, 1 ); @@ -2270,8 +2276,8 @@ sub setupUi { my $fphase = Qt::LineEdit( $layout34 ); $self->{fphase} = $fphase; $fphase->setObjectName( "fphase" ); - $sizePolicy4->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); - $fphase->setSizePolicy( $sizePolicy4 ); + $sizePolicy5->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); + $fphase->setSizePolicy( $sizePolicy5 ); $gridLayout7->addWidget( $fphase, 1, 4, 1, 1 ); @@ -2292,8 +2298,8 @@ sub setupUi { my $frqMin = Qt::LineEdit( $layout34 ); $self->{frqMin} = $frqMin; $frqMin->setObjectName( "frqMin" ); - $sizePolicy4->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); - $frqMin->setSizePolicy( $sizePolicy4 ); + $sizePolicy5->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); + $frqMin->setSizePolicy( $sizePolicy5 ); $gridLayout7->addWidget( $frqMin, 0, 4, 1, 1 ); @@ -2316,12 +2322,12 @@ sub setupUi { my $rrfBox = Qt::GroupBox( $fourierPage ); $self->{rrfBox} = $rrfBox; $rrfBox->setObjectName( "rrfBox" ); - $sizePolicy5->setHeightForWidth( $rrfBox->sizePolicy()->hasHeightForWidth() ); - $rrfBox->setSizePolicy( $sizePolicy5 ); + $sizePolicy6->setHeightForWidth( $rrfBox->sizePolicy()->hasHeightForWidth() ); + $rrfBox->setSizePolicy( $sizePolicy6 ); my $layout35 = Qt::Widget( $rrfBox ); $self->{layout35} = $layout35; $layout35->setObjectName( "layout35" ); - $layout35->setGeometry( Qt::Rect(10, 18, 265, 100) ); + $layout35->setGeometry( Qt::Rect(10, 18, 265, 107) ); my $gridLayout8 = Qt::GridLayout( $layout35 ); $self->{gridLayout8} = $gridLayout8; $gridLayout8->setSpacing( 5 ); @@ -2668,12 +2674,12 @@ sub setupUi { $self->{t0Update} = $t0Update; $t0Update->setObjectName( "t0Update" ); $t0Update->setEnabled( 0 ); - my $sizePolicy9 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy9} = $sizePolicy9; - $sizePolicy9->setHorizontalStretch( 0 ); - $sizePolicy9->setVerticalStretch( 0 ); - $sizePolicy9->setHeightForWidth( $t0Update->sizePolicy()->hasHeightForWidth() ); - $t0Update->setSizePolicy( $sizePolicy9 ); + my $sizePolicy10 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy10} = $sizePolicy10; + $sizePolicy10->setHorizontalStretch( 0 ); + $sizePolicy10->setVerticalStretch( 0 ); + $sizePolicy10->setHeightForWidth( $t0Update->sizePolicy()->hasHeightForWidth() ); + $t0Update->setSizePolicy( $sizePolicy10 ); $hboxLayout2->addWidget( $t0Update ); @@ -2835,16 +2841,16 @@ sub setupUi { my $cParamsCombo = Qt::ComboBox( $tabPage ); $self->{cParamsCombo} = $cParamsCombo; $cParamsCombo->setObjectName( "cParamsCombo" ); - $sizePolicy9->setHeightForWidth( $cParamsCombo->sizePolicy()->hasHeightForWidth() ); - $cParamsCombo->setSizePolicy( $sizePolicy9 ); + $sizePolicy10->setHeightForWidth( $cParamsCombo->sizePolicy()->hasHeightForWidth() ); + $cParamsCombo->setSizePolicy( $sizePolicy10 ); $hboxLayout3->addWidget( $cParamsCombo ); my $textLabel1_4_6 = Qt::Label( $tabPage ); $self->{textLabel1_4_6} = $textLabel1_4_6; $textLabel1_4_6->setObjectName( "textLabel1_4_6" ); - $sizePolicy9->setHeightForWidth( $textLabel1_4_6->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4_6->setSizePolicy( $sizePolicy9 ); + $sizePolicy10->setHeightForWidth( $textLabel1_4_6->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_6->setSizePolicy( $sizePolicy10 ); $textLabel1_4_6->setWordWrap( 0 ); $hboxLayout3->addWidget( $textLabel1_4_6 ); @@ -2861,8 +2867,8 @@ sub setupUi { my $addConstraint = Qt::PushButton( $tabPage ); $self->{addConstraint} = $addConstraint; $addConstraint->setObjectName( "addConstraint" ); - $sizePolicy9->setHeightForWidth( $addConstraint->sizePolicy()->hasHeightForWidth() ); - $addConstraint->setSizePolicy( $sizePolicy9 ); + $sizePolicy10->setHeightForWidth( $addConstraint->sizePolicy()->hasHeightForWidth() ); + $addConstraint->setSizePolicy( $sizePolicy10 ); $hboxLayout3->addWidget( $addConstraint ); @@ -2965,7 +2971,7 @@ sub setupUi { $self->{menuBar} = $menuBar; $menuBar->setObjectName( "menuBar" ); $menuBar->setEnabled( 1 ); - $menuBar->setGeometry( Qt::Rect(0, 0, 600, 20) ); + $menuBar->setGeometry( Qt::Rect(0, 0, 674, 27) ); my $fileMenu = Qt::Menu( $menuBar ); $self->{fileMenu} = $fileMenu; $fileMenu->setObjectName( "fileMenu" ); @@ -3194,20 +3200,24 @@ sub retranslateUi { $self->{browse}->setText( Qt::Application::translate( 'MuSRFit4', "Browse", undef, Qt::Application::UnicodeUTF8() ) ); $self->{fitAsyTypeLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Fit type", undef, Qt::Application::UnicodeUTF8() ) ); $self->{fitAsyType}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Asymmetry", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "SingleHist", undef, Qt::Application::UnicodeUTF8() )]); + Qt::Application::translate( 'MuSRFit4', "Single Hist", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Asymmetry GLB", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Single Hist GLB", undef, Qt::Application::UnicodeUTF8() )]); $self->{histsLRBFLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Histograms list", undef, Qt::Application::UnicodeUTF8() ) ); $self->{histsLRBF}->setText( Qt::Application::translate( 'MuSRFit4', "1 5,3 7", undef, Qt::Application::UnicodeUTF8() ) ); $self->{runsAuto}->setTitle( Qt::Application::translate( 'MuSRFit4', "RUN Numbers", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{yearLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Year", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{beamLineLabel}->setText( Qt::Application::translate( 'MuSRFit4', "On beam line", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runNumbers}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Numbers of RUNs to fit. Multiple runs are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runNumbers}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Numbers of RUNs to fit. Multiple runs are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runNumbers}->setText( '' ); $self->{beamLine}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "LEM", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "GPD", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "HAL", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "GPS", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Dolly", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "LTF", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "LEM (PPC)", undef, Qt::Application::UnicodeUTF8() )]); - $self->{runNumbers}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Numbers of RUNs to fit. Multiple runs are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{runNumbers}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Numbers of RUNs to fit. Multiple runs are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{runNumbers}->setText( '' ); + $self->{yearLabel}->setText( Qt::Application::translate( 'MuSRFit4', " Year ", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{beamLineLabel}->setText( Qt::Application::translate( 'MuSRFit4', "On beam line ", undef, Qt::Application::UnicodeUTF8() ) ); $self->{groupBox}->setTitle( Qt::Application::translate( 'MuSRFit4', "Theory Function", undef, Qt::Application::UnicodeUTF8() ) ); $self->{comp1Label}->setText( Qt::Application::translate( 'MuSRFit4', "First Component", undef, Qt::Application::UnicodeUTF8() ) ); $self->{comp2Label}->setText( Qt::Application::translate( 'MuSRFit4', "Second Component", undef, Qt::Application::UnicodeUTF8() ) ); diff --git a/src/external/MuSRFitGUI/icos/MuSRFit.odg b/src/external/MuSRFitGUI/icos/MuSRFit.odg index a3365d8b957bff449e8a3820446dcb8066c56aec..69673762e310610ecf5c1b8c7ffaf2326864b23b 100644 GIT binary patch literal 14818 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 bdH&7Rs-}d1_`4bQ{f+M)tEb)97y literal 13391 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 diff --git a/src/external/MuSRFitGUI/icos/MuSRFit.png b/src/external/MuSRFitGUI/icos/MuSRFit.png index 9c0a7898cc9c8f40bc4cae84b645f6778cf46366..42cdceae89c726823981787f65f016a6641f4320 100644 GIT binary patch literal 46591 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

C&s)Ahi9(Xve!FDbRT`!A5Q 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 b33u$IGx literal 31155 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