From 4e0da5f4e9b1b64d77cea4ebb4d744be2cdc5682 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 1 Apr 2015 12:09:45 +0200 Subject: [PATCH 01/87] Updated example msr files for libBNMR. --- src/external/libBNMR/ExpRlx-MUD.msr | 8 ++++---- src/external/libBNMR/ExpRlx.msr | 2 +- src/external/libBNMR/SExpRlx.msr | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/external/libBNMR/ExpRlx-MUD.msr b/src/external/libBNMR/ExpRlx-MUD.msr index ccbf0bb4..623786c2 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx-MUD.msr @@ -4,10 +4,10 @@ FITPARAMETER ############################################################### # No Name Value Err Min Max - 1 Alphap 1.11662 0.00020 none - 2 Asyp 0 0.00038 none + 1 Alphap 1.11662 0.001 none + 2 Asyp 0.025 0.001 none 3 T 1e6 0 none - 4 Rlx 0.969e6 0.020 none + 4 Rlx 1e-6 0.020 none 5 Pos 1 0 none 6 Neg -1 0 none @@ -15,7 +15,7 @@ FITPARAMETER THEORY ############################################################### asymmetry fun1 -userFcn libBNMR.so ExpRlx 3 4 +userFcn /usr/local/lib/libBNMR.so ExpRlx 3 4 ############################################################### FUNCTIONS diff --git a/src/external/libBNMR/ExpRlx.msr b/src/external/libBNMR/ExpRlx.msr index 8b0d79c9..2b3f52ac 100644 --- a/src/external/libBNMR/ExpRlx.msr +++ b/src/external/libBNMR/ExpRlx.msr @@ -9,7 +9,7 @@ FITPARAMETER ############################################################### THEORY asymmetry 1 -userFcn /home/l_salman/LEM/musrfit/src/external/libBNMR/libBNMR.so ExpRlx 2 3 +userFcn /usr/local/lib/libBNMR.so ExpRlx 2 3 ############################################################### RUN 45377 MUE4 PSI ASCII (name beamline institute data-file-format) diff --git a/src/external/libBNMR/SExpRlx.msr b/src/external/libBNMR/SExpRlx.msr index a296e449..636583f8 100644 --- a/src/external/libBNMR/SExpRlx.msr +++ b/src/external/libBNMR/SExpRlx.msr @@ -10,7 +10,7 @@ FITPARAMETER ############################################################### THEORY asymmetry 1 -userFcn /home/l_salman/LEM/musrfit/src/external/libBNMR/libBNMR.so SExpRlx 2 3 4 +userFcn /usr/local/lib/libBNMR.so SExpRlx 2 3 4 ############################################################### RUN 45377 MUE4 PSI ASCII (name beamline institute data-file-format) From 3a34d3b8ed96bd480feb7ab41aca2b2fd788d9d6 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 1 Apr 2015 16:14:23 +0200 Subject: [PATCH 02/87] Use seconds time scale for bNMR relaxation data. This is needed to avoid divergence due to large numbers. --- src/classes/PMusrCanvas.cpp | 35 ++++++++++++++++++++++------- src/classes/PRunDataHandler.cpp | 6 +++-- src/external/libBNMR/ExpRlx-MUD.msr | 18 +++++++-------- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index 760d7b2f..d6d1aa6f 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -180,8 +180,8 @@ PMusrCanvas::PMusrCanvas() * \param wtopy top y coordinate (in pixels) to place the canvas. * \param ww width (in pixels) of the canvas. * \param wh height (in pixels) of the canvas. - * \param batch flag: if set true, the canvas will not be displayed. This is used when just dumping of a - * graphical output file is wished. + * \param batch flag: if set true, the canvas will not be displayed. This is used when just dumping of a graphical output file is requested. + * \param fourier flag: if set true, the canvas will show the fourier transform of the data according to the msr file. */ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, Int_t wtopx, Int_t wtopy, Int_t ww, Int_t wh, @@ -233,8 +233,8 @@ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, * \param fourierDefault structure holding the pre-defined settings for a Fourier transform * \param markerList pre-defined list of markers * \param colorList pre-defined list of colors - * \param batch flag: if set true, the canvas will not be displayed. This is used when just dumping of a - * graphical output file is wished. + * \param batch flag: if set true, the canvas will not be displayed. This is used when just dumping of a graphical output file is wished. + * \param fourier flag: if set true, the canvas will show the fourier transform of the data according to the msr file. */ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, Int_t wtopx, Int_t wtopy, Int_t ww, Int_t wh, @@ -3660,7 +3660,7 @@ void PMusrCanvas::HandleFourierDifference() if (fData[0].diffFourierRe == 0) { // calculate all the Fourier differences Double_t dval, dvalx; - TString name; + TString name,setup; Int_t theoBin; for (UInt_t i=0; iSetLogy(1); // set x-axis label - fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); + PMsrRunList runs = *fMsrHandler->GetMsrRunList(); + TString setup = fRunList->GetSetup(*runs[0].GetRunName()); + if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { + fHistoFrame->GetXaxis()->SetTitle("time (s)"); + } else { + fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); + } + // set y-axis label TString yAxisTitle; PMsrRunList *runList = fMsrHandler->GetMsrRunList(); @@ -4927,7 +4934,13 @@ void PMusrCanvas::PlotDifference(Bool_t unzoom) fHistoFrame->SetBins(noOfPoints, dataXmin, dataXmax); // set x-axis label - fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); + PMsrRunList runs = *fMsrHandler->GetMsrRunList(); + TString setup = fRunList->GetSetup(*runs[0].GetRunName()); + if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { + fHistoFrame->GetXaxis()->SetTitle("time (s)"); + } else { + fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); + } // set y-axis label fHistoFrame->GetYaxis()->SetTitleOffset(1.3); fHistoFrame->GetYaxis()->SetTitle("data-theory"); @@ -5911,7 +5924,13 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) // define x-axis title TString xAxisTitle(""); if (fCurrentPlotView == PV_DATA) { - xAxisTitle = TString("time (#mus)"); + PMsrRunList runs = *fMsrHandler->GetMsrRunList(); + TString setup = fRunList->GetSetup(*runs[0].GetRunName()); + if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { + xAxisTitle = TString("time (s)"); + } else { + xAxisTitle = TString("time (#mus)"); + } } else { // all the Fourier if (fFourier.fUnits == FOURIER_UNIT_GAUSS) { xAxisTitle = TString("Field (G)"); diff --git a/src/classes/PRunDataHandler.cpp b/src/classes/PRunDataHandler.cpp index 4347a67d..3cd0e4f3 100644 --- a/src/classes/PRunDataHandler.cpp +++ b/src/classes/PRunDataHandler.cpp @@ -3006,8 +3006,10 @@ Bool_t PRunDataHandler::ReadMudFile() setup += TString(str) + TString("/"); if (TString(str) == "BNQR" || TString(str) == "BNMR") { cerr << "PRunDataHandler::ReadMudFile: **INFORMATION** this run was performed on " << str << endl; - // identified BNMR/BNQR, correct time resolution. - timeResMultiplier = 1.0e15; + // identified BNMR/BNQR, do not change multiplier. + // Change x label in PMusrCanvas instead. + // I am keeping this here for now for possible future use. + // timeResMultiplier = 1.0e9; } } success = MUD_getApparatus( fh, str, sizeof(str) ); diff --git a/src/external/libBNMR/ExpRlx-MUD.msr b/src/external/libBNMR/ExpRlx-MUD.msr index 623786c2..335a59f6 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx-MUD.msr @@ -4,10 +4,10 @@ FITPARAMETER ############################################################### # No Name Value Err Min Max - 1 Alphap 1.11662 0.001 none - 2 Asyp 0.025 0.001 none - 3 T 1e6 0 none - 4 Rlx 1e-6 0.020 none + 1 Alphap 1.11662 0.00020 none + 2 Asyp 0.03077 0.00038 none + 3 T 1 0 none + 4 Rlx 0.969 0.020 none 5 Pos 1 0 none 6 Neg -1 0 none @@ -15,7 +15,7 @@ FITPARAMETER THEORY ############################################################### asymmetry fun1 -userFcn /usr/local/lib/libBNMR.so ExpRlx 3 4 +userFcn .libs/libBNMR.so ExpRlx 3 4 ############################################################### FUNCTIONS @@ -32,7 +32,7 @@ data 11 799 11 799 background 800 900 800 900 # estimated bkg: 416.9700 / 465.7600 t0 0.0 0.0 map 2 5 0 0 0 0 0 0 0 0 -fit 5e5 8e6 +fit 0.5 8 packing 5 RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) @@ -44,7 +44,7 @@ data 11 799 11 799 background 800 900 800 900 # estimated bkg: 430.9200 / 479.4500 t0 0.0 0.0 map 2 6 0 0 0 0 0 0 0 0 -fit 5e5 8e6 +fit 0.5 8 packing 5 @@ -62,12 +62,12 @@ use_fit_ranges ############################################################### FOURIER -units MHz # units either 'Gauss', 'MHz', or 'Mc/s' +units MHz # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s' fourier_power 12 apodization STRONG # NONE, WEAK, MEDIUM, STRONG plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2014-11-14 16:37:41 +STATISTIC --- 2015-04-01 16:12:07 chisq = 372.2, NDF = 295, chisq/NDF = 1.261744 From a0d8e76ff0aaad1b6b8bcf515a10b6681dd79037 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 17 Nov 2015 15:03:01 +0100 Subject: [PATCH 03/87] Use MUSR-ROOT format as default for LEM instead of ROOT-NPP --- src/external/MuSRFitGUI/MSR.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm index b496f419..1c7e5ea3 100755 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -17,7 +17,7 @@ my %DATADIRS = ( my %BeamLines = ( "LEM", "MUE4", "LEM (PPC)", "MUE4", "GPS", "PIM3", "LTF", "PIM3", "Dolly", "PIE1", "GPD", "PIE1" ); my %Def_Format = - ( "LEM", "ROOT-NPP", "LEM (PPC)", "ROOT-PPC", "GPS", "PSI-BIN", "LTF", "PSI-BIN", "Dolly", "PSI-BIN" , "GPD", "PSI-BIN"); + ( "LEM", "MUSR-ROOT", "LEM (PPC)", "ROOT-PPC", "GPS", "PSI-BIN", "LTF", "PSI-BIN", "Dolly", "PSI-BIN" , "GPD", "PSI-BIN"); # Additional information to extract run properties from database # For LEM use summary files @@ -1717,7 +1717,7 @@ sub RUNFileNameAuto { my $RUN_Line=$EMPTY; # if BeamLine is empty assume manual name if ($BeamLine eq $EMPTY) { - my %EXTs = ("root","ROOT-NPP", + my %EXTs = ("root","MUSR-ROOT", "bin","PSI-BIN", "msr","MUD"); From e5f98215e9d9287fcd6dfb85a4506fc09a758a75 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 17 Nov 2015 15:40:44 +0100 Subject: [PATCH 04/87] Converge musrfit.cgi and MuSRFit. --- src/external/MuSRFitGUI/MSR.pm | 137 ++++++++++++++++++++++++++------- 1 file changed, 108 insertions(+), 29 deletions(-) diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm index 1c7e5ea3..a6585671 100755 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -11,13 +11,14 @@ my %DATADIRS = ( "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" + "GPD", "/afs/psi.ch/project/bulkmusr/data/gpd", + "HAL", "/afs/psi.ch/project/bulkmusr/data/hifi" ); -my %BeamLines = ( "LEM", "MUE4", "LEM (PPC)", "MUE4", "GPS", "PIM3", "LTF", "PIM3", "Dolly", "PIE1", "GPD", "PIE1" ); +my %BeamLines = ( "LEM", "MUE4", "LEM (PPC)", "MUE4", "GPS", "PIM3", "LTF", "PIM3", "Dolly", "PIE1", "GPD", "PIE1" , "HAL", "PIE3"); my %Def_Format = - ( "LEM", "MUSR-ROOT", "LEM (PPC)", "ROOT-PPC", "GPS", "PSI-BIN", "LTF", "PSI-BIN", "Dolly", "PSI-BIN" , "GPD", "PSI-BIN"); + ( "LEM", "MUSR-ROOT", "LEM (PPC)", "ROOT-PPC", "GPS", "PSI-BIN", "LTF", "PSI-BIN", "Dolly", "PSI-BIN" , "GPD", "PSI-BIN", "HAL", "PSI-MDU"); # Additional information to extract run properties from database # For LEM use summary files @@ -28,6 +29,7 @@ $SUMM_DIR="/afs/psi.ch/project/nemu/data/summ/"; "Dolly","/afs/psi.ch/project/bulkmusr/olddata/list/", "GPD","/afs/psi.ch/project/bulkmusr/olddata/list/", "ALC","/afs/psi.ch/project/bulkmusr/olddata/list/", + "HAL","/afs/psi.ch/project/bulkmusr/olddata/list/", "LTF","/afs/psi.ch/project/bulkmusr/olddata/list/"); # Information available since @@ -36,6 +38,7 @@ $SUMM_DIR="/afs/psi.ch/project/nemu/data/summ/"; "Dolly","1998", "GPD","1993", "ALC","1993", + "HAL","2012", "LTF","1995"); # And to deal with old names of bulk muons @@ -160,6 +163,9 @@ FUNCTIONS 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; @RUNS=split( /,/, $All{"RunNumbers"}); $RUNSType = 0; } @@ -415,13 +421,11 @@ SAVE # 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"; - # } + 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 =""; @@ -441,7 +445,10 @@ $logxy"; 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) { + $FrqRange = "range ".$All{"FRQMIN"}." ".$All{"FRQMAX"}; + } $FOURIER_Block= "############################################################### @@ -451,12 +458,13 @@ 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 = @@ -519,8 +527,6 @@ sub CreateMSRSingleHist { my ($Full_T_Block,$Paramcomp_ref)=MSR::CreateTheory(@FitTypes); my @Paramcomp = @$Paramcomp_ref; - print "Paramcomp= $Paramcomp[0]"; - # If we have a FUNCTIONS Block the Full_T_Block should be # replaced by Func_T_Block $FUNCTIONS_Block = $EMPTY; @@ -664,6 +670,7 @@ FUNCTIONS $NoBg_Line = $NoBg_Line . "backgr.fit $PCount\n"; } } + # End of No and NBg Lines # Now deal with physical parameters and phases elsif ( $Param_ORG ne "Phi" && $Param_ORG ne "No" && $Param_ORG ne "NBg") { @@ -817,13 +824,11 @@ SAVE # 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"; - # } + if ($All{"Yi"} != $All{"Yf"}) { + $PRANGE_Line = "range ".$All{"Xi"}." ".$All{"Xf"}." ".$All{"Yi"}." ".$All{"Yf"}; + } else { + $PRANGE_Line = "range ".$All{"Xi"}." ".$All{"Xf"}; + } } my $RRFBlock=MSR::CreateRRFBlock(\%All); @@ -1057,11 +1062,18 @@ sub CreateTheory { $Parameters = join( $SPACE, $Parameters, $THEORY{'dynGssKTLF'} ); } + # Static Lorentzian or Gaussian KF ZF elsif ( $FitType eq "LGKT" ) { $T_Block = $T_Block . "\n" . "combiLGKT " . $THEORY{'combiLGKT'}; $Parameters = join( $SPACE, $Parameters, $THEORY{'combiLGKT'} ); } + # Static Stretched KF ZF + elsif ( $FitType eq "STRKT" ) { + $T_Block = $T_Block . "\n" . "strKT " . $THEORY{'strKT'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'strKT'} ); + } + # Now some more combined functions (multiplication). # Lorentzian KT LF multiplied by exponential @@ -1109,6 +1121,15 @@ sub CreateTheory { $Parameters = join( $SPACE, $Parameters, $THEORY{'combiLGKT'} ); } + # Stretched KT ZF multiplied by exponential + elsif ( $FitType eq "STRKTExp" ) { + $T_Block = $T_Block . "\n" . "simplExpo " . $THEORY{'simplExpo'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'simplExpo'} ); + $T_Block = + $T_Block . "\n" . "strKT " . $THEORY{'strKT'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'strKT'} ); + } + # Lorentzian or Gaussian KT ZF multiplied by stretched exponential elsif ( $FitType eq "LGKTSExp" ) { $T_Block = $T_Block . "\n" . "generExpo " . $THEORY{'generExpo'}; @@ -1118,6 +1139,15 @@ sub CreateTheory { $Parameters = join( $SPACE, $Parameters, $THEORY{'combiLGKT'} ); } + # Stretched KT ZF multiplied by stretched exponential + elsif ( $FitType eq "STRKTSExp" ) { + $T_Block = $T_Block . "\n" . "generExpo " . $THEORY{'generExpo'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'generExpo'} ); + $T_Block = + $T_Block . "\n" . "strKT " . $THEORY{'strKT'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'strKT'} ); + } + # Lorentzian or Gaussian KT LF multiplied by stretched exponential elsif ( $FitType eq "MolMag" ) { $T_Block = $T_Block . "\n" . "generExpo " . $THEORY{'generExpo'}; @@ -1764,6 +1794,11 @@ sub RUNFileNameAuto { elsif ( $BeamLine eq "GPD" ) { $RUN_File_Name = "deltat_tdc_gpd_" . $RUNtmp; $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; + } + elsif ( $BeamLine eq "HAL" ) { + $RUNtmp=sprintf("%05d",$RUNtmp); + $RUN_File_Name = "tdc_hifi_" . $YEAR . "_" . $RUNtmp; + $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; } $RUN_Line = join( $SPACE, "RUN", $RUNFILE, $BeamLines{$BeamLine}, "PSI", @@ -1792,6 +1827,52 @@ sub CreateRRFBlock { } +######################## +# 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); + + if ( $Arg eq "TITLE" ) { + $RTRN_Val = $lines[3]; + $RTRN_Val =~ s/\n//g; + } + elsif ( $Arg eq "Temp" ) { + foreach my $line (@lines) { + if ( $line =~ /Mean Sample_CF1/ ) { + ( my $tmp, my $T ) = split( /=/, $line ); + ( $T, $tmp ) = split( /\(/, $T ); + $RTRN_Val = $T; + } + } + + } + elsif ( $Arg eq "Field" ) { + foreach my $line (@lines) { + if ( $line =~ /Mean B field/ ) { + ( $tmp, my $B ) = split( /=/, $line ); + ( $B, $tmp ) = split( /\(/, $B ); + $RTRN_Val = $B; + } + } + } + elsif ( $Arg eq "Energy" ) { + foreach my $line (@lines) { + if ( $line =~ /implantation energy/ ) { + ( my $tmp1, my $tmp2, my $E ) = split( /=/, $line ); + ( $E, $tmp ) = split( /keV/, $E ); + $RTRN_Val = $E; + } + } + + } + # $RTRN_Val =~ s/[\.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]//g; + return $RTRN_Val; +} ######################## @@ -2224,7 +2305,7 @@ FUNCTIONS FITPARAMETER ############################################################### # No Name Value Err Min Max "; - my %PTable=MSR::PrepParamTableSh(\%All); + 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++) { @@ -2266,13 +2347,11 @@ SAVE # 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"; - # } + 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 =""; From a66917e9a723f746cb793ce0e72ff74b6179f543 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 29 Jan 2016 10:03:35 +0100 Subject: [PATCH 05/87] Commited changes from Andreas manually. --- src/classes/PMusrCanvas.cpp | 212 ++++++++++++++++++++++++------------ 1 file changed, 143 insertions(+), 69 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index 72ee6a90..da7440ff 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2007-2014 by Andreas Suter * + * Copyright (C) 2007-2016 by Andreas Suter * * andreas.suter@psi.ch * * * * This program is free software; you can redistribute it and/or modify * @@ -75,7 +75,7 @@ PMusrCanvasPlotRange::PMusrCanvasPlotRange() void PMusrCanvasPlotRange::SetXRange(Double_t xmin, Double_t xmax) { if (xmin > xmax) { - cerr << endl << "PMusrCanvasPlotRange::SetXRange: **WARNING** xmin > xmax, will swap them." << endl; + cerr << endl << ">> PMusrCanvasPlotRange::SetXRange(): **WARNING** xmin > xmax, will swap them." << endl; fXmin = xmax; fXmax = xmin; } else { @@ -97,7 +97,7 @@ void PMusrCanvasPlotRange::SetXRange(Double_t xmin, Double_t xmax) void PMusrCanvasPlotRange::SetYRange(Double_t ymin, Double_t ymax) { if (ymin > ymax) { - cerr << endl << "PMusrCanvasPlotRange::SetYRange: **WARNING** ymin > ymax, will swap them." << endl; + cerr << endl << ">> PMusrCanvasPlotRange::SetYRange(): **WARNING** ymin > ymax, will swap them." << endl; fYmin = ymax; fYmax = ymin; } else { @@ -405,37 +405,76 @@ void PMusrCanvas::SetMsrHandler(PMsrHandler *msrHandler) } // check if RRF data are present - if ((fMsrHandler->GetMsrPlotList()->at(0).fRRFPacking > 0) && - (fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq != 0.0)) { + if (((fMsrHandler->GetMsrPlotList()->at(0).fRRFPacking > 0) && + (fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq != 0.0)) || + (fMsrHandler->GetMsrGlobal()->GetRRFPacking() > 0 && + fMsrHandler->GetMsrGlobal()->GetRRFUnit().CompareTo("??"))) { fRRFLatexText = new TLatex(); fRRFLatexText->SetNDC(kTRUE); fRRFLatexText->SetTextFont(62); fRRFLatexText->SetTextSize(0.03); - fRRFText = new TString("RRF: "); - if (fMsrHandler->GetMsrPlotList()->at(0).fRRFUnit == RRF_UNIT_kHz) { - *fRRFText += TString("#nu_{RRF} = "); - *fRRFText += fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq; - *fRRFText += TString(" (kHz)"); - } else if (fMsrHandler->GetMsrPlotList()->at(0).fRRFUnit == RRF_UNIT_MHz) { - *fRRFText += TString("#nu_{RRF} = "); - *fRRFText += fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq; - *fRRFText += TString(" (MHz)"); - } else if (fMsrHandler->GetMsrPlotList()->at(0).fRRFUnit == RRF_UNIT_Mcs) { - *fRRFText += TString("#omega_{RRF} = "); - *fRRFText += fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq; - *fRRFText += TString(" (Mc/s)"); - } else if (fMsrHandler->GetMsrPlotList()->at(0).fRRFUnit == RRF_UNIT_G) { - *fRRFText += TString("B_{RRF} = "); - *fRRFText += fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq; - *fRRFText += TString(" (G)"); - } else if (fMsrHandler->GetMsrPlotList()->at(0).fRRFUnit == RRF_UNIT_T) { - *fRRFText += TString("B_{RRF} = "); - *fRRFText += fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq; - *fRRFText += TString(" (T)"); + Int_t rrfUnitTag = -1; + Double_t rrfFreq = 0.0; + if (fMsrHandler->GetMsrPlotList()->at(0).fRRFPacking > 0) { // RRF single histo PLOT + fRRFText = new TString("RRF: "); + rrfUnitTag = fMsrHandler->GetMsrPlotList()->at(0).fRRFUnit; + rrfFreq = fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq; + TString rrfFreqStr(""); + rrfFreqStr.Form("%.5g", rrfFreq); + if (rrfUnitTag == RRF_UNIT_kHz) { + *fRRFText += TString("#nu_{RRF} = "); + *fRRFText += rrfFreq; + *fRRFText += TString(" (kHz)"); + } else if (rrfUnitTag == RRF_UNIT_MHz) { + *fRRFText += TString("#nu_{RRF} = "); + *fRRFText += rrfFreqStr; + *fRRFText += TString(" (MHz)"); + } else if (rrfUnitTag == RRF_UNIT_Mcs) { + *fRRFText += TString("#omega_{RRF} = "); + *fRRFText += rrfFreqStr; + *fRRFText += TString(" (Mc/s)"); + } else if (rrfUnitTag == RRF_UNIT_G) { + *fRRFText += TString("B_{RRF} = "); + *fRRFText += rrfFreqStr; + *fRRFText += TString(" (G)"); + } else if (rrfUnitTag == RRF_UNIT_T) { + *fRRFText += TString("B_{RRF} = "); + *fRRFText += rrfFreqStr; + *fRRFText += TString(" (T)"); + } + *fRRFText += TString(", RRF packing = "); + *fRRFText += fMsrHandler->GetMsrPlotList()->at(0).fRRFPacking; + } else { // RRF single histo FIT + fRRFText = new TString("RRF: "); + rrfUnitTag = fMsrHandler->GetMsrGlobal()->GetRRFUnitTag(); + rrfFreq = fMsrHandler->GetMsrGlobal()->GetRRFFreq(fMsrHandler->GetMsrGlobal()->GetRRFUnit().Data()); + TString rrfFreqStr(""); + rrfFreqStr.Form("%.5g", rrfFreq); + if (rrfUnitTag == RRF_UNIT_kHz) { + *fRRFText += TString("#nu_{RRF} = "); + *fRRFText += rrfFreqStr; + *fRRFText += TString(" (kHz)"); + } else if (rrfUnitTag == RRF_UNIT_MHz) { + *fRRFText += TString("#nu_{RRF} = "); + *fRRFText += rrfFreqStr; + *fRRFText += TString(" (MHz)"); + } else if (rrfUnitTag == RRF_UNIT_Mcs) { + *fRRFText += TString("#omega_{RRF} = "); + *fRRFText += rrfFreqStr; + *fRRFText += TString(" (Mc/s)"); + } else if (rrfUnitTag == RRF_UNIT_G) { + *fRRFText += TString("B_{RRF} = "); + *fRRFText += rrfFreqStr; + *fRRFText += TString(" (G)"); + } else if (rrfUnitTag == RRF_UNIT_T) { + *fRRFText += TString("B_{RRF} = "); + *fRRFText += rrfFreqStr; + *fRRFText += TString(" (T)"); + } + *fRRFText += TString(", RRF packing = "); + *fRRFText += fMsrHandler->GetMsrGlobal()->GetRRFPacking(); } - *fRRFText += TString(", RRF packing = "); - *fRRFText += fMsrHandler->GetMsrPlotList()->at(0).fRRFPacking; } } @@ -609,7 +648,7 @@ void PMusrCanvas::UpdateDataTheoryPad() // first check that plot number is smaller than the maximal number of runs if ((Int_t)plotInfo.fRuns[i] > (Int_t)runs.size()) { fValid = false; - cerr << endl << "PMusrCanvas::UpdateDataTheoryPad: **ERROR** run plot number " << (Int_t)plotInfo.fRuns[i] << " is larger than the number of runs " << runs.size(); + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** run plot number " << (Int_t)plotInfo.fRuns[i] << " is larger than the number of runs " << runs.size(); cerr << endl; return; } @@ -620,7 +659,7 @@ void PMusrCanvas::UpdateDataTheoryPad() } if (fitType == -1) { fValid = false; - cerr << endl << "PMusrCanvas::UpdateDataTheoryPad: **ERROR** plottype = " << fPlotType; + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** plottype = " << fPlotType; cerr << ", fittype = " << runs[runNo].GetFitType() << "(RUN block)/"; cerr << "fittype = " << globalBlock->GetFitType() << "(GLOBAL block). However, they have to correspond!"; cerr << endl; @@ -643,7 +682,19 @@ void PMusrCanvas::UpdateDataTheoryPad() if (!data) { // something wrong fValid = false; // error message - cerr << endl << "PMusrCanvas::UpdateDataTheoryPad: **ERROR** couldn't obtain run no " << runNo << " for a single histogram plot"; + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a single histogram plot"; + cerr << endl; + return; + } + // handle data + HandleDataSet(i, runNo, data); + break; + case MSR_FITTYPE_SINGLE_HISTO_RRF: + data = fRunList->GetSingleHistoRRF(runNo, PRunListCollection::kRunNo); + if (!data) { // something wrong + fValid = false; + // error message + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a single histogram RRF plot"; cerr << endl; return; } @@ -655,7 +706,19 @@ void PMusrCanvas::UpdateDataTheoryPad() if (!data) { // something wrong fValid = false; // error message - cerr << endl << "PMusrCanvas::UpdateDataTheoryPad: **ERROR** couldn't obtain run no " << runNo << " for a asymmetry plot"; + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a asymmetry plot"; + cerr << endl; + return; + } + // handle data + HandleDataSet(i, runNo, data); + break; + case MSR_FITTYPE_ASYM_RRF: + data = fRunList->GetAsymmetryRRF(runNo, PRunListCollection::kRunNo); + if (!data) { // something wrong + fValid = false; + // error message + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a asymmetry RRF plot"; cerr << endl; return; } @@ -667,7 +730,7 @@ void PMusrCanvas::UpdateDataTheoryPad() if (!data) { // something wrong fValid = false; // error message - cerr << endl << "PMusrCanvas::UpdateDataTheoryPad: **ERROR** couldn't obtain run no " << runNo << " for a mu minus single histogram plot"; + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a mu minus single histogram plot"; cerr << endl; return; } @@ -679,7 +742,7 @@ void PMusrCanvas::UpdateDataTheoryPad() if (!data) { // something wrong fValid = false; // error message - cerr << endl << "PMusrCanvas::UpdateDataTheoryPad: **ERROR** couldn't obtain run no " << runNo << " for a none musr data plot"; + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a none musr data plot"; cerr << endl; return; } @@ -699,7 +762,7 @@ void PMusrCanvas::UpdateDataTheoryPad() default: fValid = false; // error message - cerr << endl << "PMusrCanvas::UpdateDataTheoryPad: **ERROR** wrong plottype tag?!"; + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** wrong plottype tag?!"; cerr << endl; return; break; @@ -822,13 +885,15 @@ void PMusrCanvas::UpdateInfoPad() else tstr = *runs[runNo].GetRunName() + TString(","); // run_name // histo info (depending on the fittype - if (runs[runNo].GetFitType() == MSR_FITTYPE_SINGLE_HISTO) { + if ((runs[runNo].GetFitType() == MSR_FITTYPE_SINGLE_HISTO) || + (runs[runNo].GetFitType() == MSR_FITTYPE_SINGLE_HISTO_RRF)) { tstr += TString("h:"); TString grouping; fMsrHandler->GetGroupingString(runNo, "forward", grouping); tstr += grouping; tstr += TString(","); - } else if (runs[runNo].GetFitType() == MSR_FITTYPE_ASYM) { + } else if ((runs[runNo].GetFitType() == MSR_FITTYPE_ASYM) || + (runs[runNo].GetFitType() == MSR_FITTYPE_ASYM_RRF)) { tstr += TString("h:"); TString grouping; fMsrHandler->GetGroupingString(runNo, "forward", grouping); @@ -1409,7 +1474,7 @@ void PMusrCanvas::SaveGraphicsAndQuit(Char_t *fileName, Char_t *graphicsFormat) } if (idx == -1) { - cerr << endl << "PMusrCanvas::SaveGraphicsAndQuit **ERROR**: fileName (" << fileName << ") is invalid." << endl; + cerr << endl << ">> PMusrCanvas::SaveGraphicsAndQuit(): **ERROR** fileName (" << fileName << ") is invalid." << endl; return; } @@ -1439,7 +1504,7 @@ void PMusrCanvas::SaveGraphicsAndQuit(Char_t *fileName, Char_t *graphicsFormat) void PMusrCanvas::ExportData(const Char_t *fileName) { if (fileName == 0) { // path file name NOT provided, generate a default path file name - cerr << endl << ">> PMusrCanvas::ExportData **ERROR** NO path file name provided. Will do nothing." << endl; + cerr << endl << ">> PMusrCanvas::ExportData(): **ERROR** NO path file name provided. Will do nothing." << endl; return; } @@ -2094,7 +2159,7 @@ void PMusrCanvas::ExportData(const Char_t *fileName) // open output data-file fout.open(fileName, iostream::out); if (!fout.is_open()) { - cerr << endl << ">> PMusrCanvas::ExportData: **ERROR** couldn't open file " << fileName << " for writing." << endl; + cerr << endl << ">> PMusrCanvas::ExportData(): **ERROR** couldn't open file " << fileName << " for writing." << endl; return; } @@ -2433,7 +2498,7 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy, canvasName += fPlotNumber; fMainCanvas = new TCanvas(canvasName.Data(), title, wtopx, wtopy, ww, wh); if (fMainCanvas == 0) { - cerr << endl << "PMusrCanvas::PMusrCanvas: **PANIC ERROR**: Couldn't invoke " << canvasName.Data(); + cerr << endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke " << canvasName.Data(); cerr << endl; return; } @@ -2479,7 +2544,7 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy, // title pad fTitlePad = new TPaveText(0.0, YTITLE, 1.0, 1.0, "NDC"); if (fTitlePad == 0) { - cerr << endl << "PMusrCanvas::PMusrCanvas: **PANIC ERROR**: Couldn't invoke fTitlePad"; + cerr << endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fTitlePad"; cerr << endl; return; } @@ -2491,7 +2556,7 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy, // data/theory pad fDataTheoryPad = new TPad("dataTheoryPad", "dataTheoryPad", 0.0, YINFO, XTHEO, YTITLE); if (fDataTheoryPad == 0) { - cerr << endl << "PMusrCanvas::PMusrCanvas: **PANIC ERROR**: Couldn't invoke fDataTheoryPad"; + cerr << endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fDataTheoryPad"; cerr << endl; return; } @@ -2501,7 +2566,7 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy, // parameter pad fParameterPad = new TPaveText(XTHEO, 0.5, 1.0, YTITLE, "NDC"); if (fParameterPad == 0) { - cerr << endl << "PMusrCanvas::PMusrCanvas: **PANIC ERROR**: Couldn't invoke fParameterPad"; + cerr << endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fParameterPad"; cerr << endl; return; } @@ -2512,7 +2577,7 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy, // theory pad fTheoryPad = new TPaveText(XTHEO, 0.1, 1.0, 0.5, "NDC"); if (fTheoryPad == 0) { - cerr << endl << "PMusrCanvas::PMusrCanvas: **PANIC ERROR**: Couldn't invoke fTheoryPad"; + cerr << endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fTheoryPad"; cerr << endl; return; } @@ -2524,7 +2589,7 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy, // info pad fInfoPad = new TLegend(0.0, 0.0, 1.0, YINFO, "NDC"); if (fInfoPad == 0) { - cerr << endl << "PMusrCanvas::PMusrCanvas: **PANIC ERROR**: Couldn't invoke fInfoPad"; + cerr << endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fInfoPad"; cerr << endl; return; } @@ -2929,9 +2994,9 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) Double_t dval = (startFitRange - data->GetDataTimeStart())/data->GetDataTimeStep(); if (dval < 0.0) { // make sure that startBin >= 0 startBin = 0; - cerr << endl << "PMusrCanvas::HandleDataSet() **WARNING** found startBin data < 0 for 'use_fit_range', will set it to 0" << endl << endl; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found startBin data < 0 for 'use_fit_range', will set it to 0" << endl << endl; } else if (dval >= (Double_t)data->GetValue()->size()) { // make sure that startBin <= length of data vector - cerr << endl << ">> PMusrCanvas::HandleDataSet() **WARNING** found startBin data=" << (UInt_t)dval << " >= data vector size=" << data->GetValue()->size() << " for 'use_fit_range',"; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found startBin data=" << (UInt_t)dval << " >= data vector size=" << data->GetValue()->size() << " for 'use_fit_range',"; cerr << endl << ">> will set it to data vector size" << endl << endl; startBin = data->GetValue()->size(); } else { @@ -2945,9 +3010,9 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) dval = (endFitRange - data->GetDataTimeStart())/data->GetDataTimeStep(); if (dval < 0.0) { // make sure that endBin >= 0 endBin = 0; - cerr << endl << "PMusrCanvas::HandleDataSet() **WARNING** found endBin data < 0 for 'use_fit_range', will set it to 0" << endl << endl; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found endBin data < 0 for 'use_fit_range', will set it to 0" << endl << endl; } else if (dval >= (Double_t)data->GetValue()->size()) { // make sure that endBin <= length of data vector - cerr << endl << ">> PMusrCanvas::HandleDataSet() **WARNING** found endBin data=" << (UInt_t)dval << " >= data vector size=" << data->GetValue()->size() << " for 'use_fit_range',"; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found endBin data=" << (UInt_t)dval << " >= data vector size=" << data->GetValue()->size() << " for 'use_fit_range',"; cerr << endl << ">> will set it to data vector size" << endl << endl; endBin = data->GetValue()->size(); } else { @@ -2960,9 +3025,9 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) Double_t dval = (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] - data->GetDataTimeStart())/data->GetDataTimeStep(); if (dval < 0.0) { // make sure that startBin >= 0 startBin = 0; - cerr << endl << "PMusrCanvas::HandleDataSet() **WARNING** found startBin data < 0 for 'sub_ranges', will set it to 0" << endl << endl; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found startBin data < 0 for 'sub_ranges', will set it to 0" << endl << endl; } else if (dval >= (Double_t)data->GetValue()->size()) { // make sure that startBin <= length of data vector - cerr << endl << ">> PMusrCanvas::HandleDataSet() **WARNING** found startBin data=" << (UInt_t)dval << " >= data vector size=" << data->GetValue()->size() << " for 'sub_ranges',"; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found startBin data=" << (UInt_t)dval << " >= data vector size=" << data->GetValue()->size() << " for 'sub_ranges',"; cerr << endl << ">> will set it to data vector size" << endl << endl; startBin = data->GetValue()->size(); } else { @@ -2972,9 +3037,9 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) dval = (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[runNo] - data->GetDataTimeStart())/data->GetDataTimeStep(); if (dval < 0.0) { // make sure that endBin >= 0 endBin = 0; - cerr << endl << "PMusrCanvas::HandleDataSet() **WARNING** found endBin data < 0 for 'sub_ranges', will set it to 0" << endl << endl; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found endBin data < 0 for 'sub_ranges', will set it to 0" << endl << endl; } else if (dval >= (Double_t)data->GetValue()->size()) { // make sure that endtBin <= length of data vector - cerr << endl << ">> PMusrCanvas::HandleDataSet() **WARNING** found endBin data=" << (UInt_t)dval << " >= data vector size=" << data->GetValue()->size() << " for 'sub_ranges',"; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found endBin data=" << (UInt_t)dval << " >= data vector size=" << data->GetValue()->size() << " for 'sub_ranges',"; cerr << endl << ">> will set it to data vector size" << endl << endl; endBin = data->GetValue()->size(); } else { @@ -3061,9 +3126,9 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) Double_t dval = (startFitRange - data->GetDataTimeStart())/data->GetTheoryTimeStep(); if (dval < 0.0) { // make sure that startBin >= 0 startBin = 0; - cerr << endl << "PMusrCanvas::HandleDataSet() **WARNING** found startBin theory < 0 for 'use_fit_range', will set it to 0" << endl << endl; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found startBin theory < 0 for 'use_fit_range', will set it to 0" << endl << endl; } else if (dval >= (Double_t)data->GetTheory()->size()) { // make sure that startBin <= length of theory vector - cerr << endl << ">> PMusrCanvas::HandleDataSet() **WARNING** found startBin theory=" << (UInt_t)dval << " >= theory vector size=" << data->GetTheory()->size() << " for 'use_fit_range',"; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found startBin theory=" << (UInt_t)dval << " >= theory vector size=" << data->GetTheory()->size() << " for 'use_fit_range',"; cerr << endl << ">> will set it to theory vector size" << endl << endl; startBin = data->GetTheory()->size(); } else { @@ -3077,9 +3142,9 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) dval = (endFitRange - data->GetDataTimeStart())/data->GetTheoryTimeStep(); if (dval < 0.0) { // make sure that endBin >= 0 endBin = 0; - cerr << endl << "PMusrCanvas::HandleDataSet() **WARNING** found endBin theory < 0 for 'use_fit_range', will set it to 0" << endl << endl; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found endBin theory < 0 for 'use_fit_range', will set it to 0" << endl << endl; } else if (dval >= (Double_t)data->GetTheory()->size()) { // make sure that endBin <= length of theory vector - cerr << endl << ">> PMusrCanvas::HandleDataSet() **WARNING** found endBin theory=" << (UInt_t)dval << " >= theory vector size=" << data->GetTheory()->size() << " for 'use_fit_range',"; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found endBin theory=" << (UInt_t)dval << " >= theory vector size=" << data->GetTheory()->size() << " for 'use_fit_range',"; cerr << endl << ">> will set it to theory vector size" << endl << endl; endBin = data->GetTheory()->size(); } else { @@ -3095,9 +3160,9 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) Double_t dval = (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] -data->GetDataTimeStart())/data->GetTheoryTimeStep(); if (dval < 0.0) { // make sure that startBin >= 0 startBin = 0; - cerr << endl << "PMusrCanvas::HandleDataSet() **WARNING** found startBin theory < 0 for 'sub_ranges', will set it to 0" << endl << endl; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found startBin theory < 0 for 'sub_ranges', will set it to 0" << endl << endl; } else if (dval >= (Double_t)data->GetTheory()->size()) { // make sure that startBin <= length of theory vector - cerr << endl << ">> PMusrCanvas::HandleDataSet() **WARNING** found startBin theory=" << (UInt_t)dval << " >= theory vector size=" << data->GetTheory()->size() << " for 'sub_ranges',"; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found startBin theory=" << (UInt_t)dval << " >= theory vector size=" << data->GetTheory()->size() << " for 'sub_ranges',"; cerr << endl << ">> will set it to theory vector size" << endl << endl; startBin = data->GetTheory()->size(); } else { @@ -3107,9 +3172,9 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) dval = (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[runNo] -data->GetDataTimeStart())/data->GetTheoryTimeStep(); if (dval < 0.0) { // make sure that endBin >= 0 endBin = 0; - cerr << endl << "PMusrCanvas::HandleDataSet() **WARNING** found endBin theory < 0 for 'sub_ranges', will set it to 0" << endl << endl; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found endBin theory < 0 for 'sub_ranges', will set it to 0" << endl << endl; } else if (dval >= (Double_t)data->GetTheory()->size()) { // make sure that endtBin <= length of theory vector - cerr << endl << ">> PMusrCanvas::HandleDataSet() **WARNING** found endBin theory=" << (UInt_t)dval << " >= theory vector size=" << data->GetTheory()->size() << " for 'sub_ranges',"; + cerr << endl << ">> PMusrCanvas::HandleDataSet(): **WARNING** found endBin theory=" << (UInt_t)dval << " >= theory vector size=" << data->GetTheory()->size() << " for 'sub_ranges',"; cerr << endl << ">> will set it to theory vector size" << endl << endl; endBin = data->GetTheory()->size(); } else { @@ -3418,7 +3483,7 @@ void PMusrCanvas::HandleFourier() // calculate fourier transform of the data PFourier fourierData(fData[i].data, fFourier.fUnits, startTime, endTime, fFourier.fDCCorrected, fFourier.fFourierPower); if (!fourierData.IsValid()) { - cerr << endl << "**SEVERE ERROR** PMusrCanvas::HandleFourier: couldn't invoke PFourier to calculate the Fourier data ..." << endl; + cerr << endl << ">> PMusrCanvas::HandleFourier(): **SEVERE ERROR** couldn't invoke PFourier to calculate the Fourier data ..." << endl; return; } fourierData.Transform(fFourier.fApodization); @@ -3458,7 +3523,7 @@ void PMusrCanvas::HandleFourier() Int_t powerPad = (Int_t)round(log((endTime-startTime)/fData[i].theory->GetBinWidth(1))/log(2))+3; PFourier fourierTheory(fData[i].theory, fFourier.fUnits, startTime, endTime, fFourier.fDCCorrected, powerPad); if (!fourierTheory.IsValid()) { - cerr << endl << "**SEVERE ERROR** PMusrCanvas::HandleFourier: couldn't invoke PFourier to calculate the Fourier theory ..." << endl; + cerr << endl << ">> PMusrCanvas::HandleFourier(): **SEVERE ERROR** couldn't invoke PFourier to calculate the Fourier theory ..." << endl; return; } fourierTheory.Transform(fFourier.fApodization); @@ -3578,7 +3643,7 @@ void PMusrCanvas::HandleDifferenceFourier() // calculate fourier transform of the data PFourier fourierData(fData[i].diff, fFourier.fUnits, startTime, endTime, fFourier.fDCCorrected, fFourier.fFourierPower); if (!fourierData.IsValid()) { - cerr << endl << "**SEVERE ERROR** PMusrCanvas::HandleFourier: couldn't invoke PFourier to calculate the Fourier diff ..." << endl; + cerr << endl << ">> PMusrCanvas::HandleFourier(): **SEVERE ERROR** couldn't invoke PFourier to calculate the Fourier diff ..." << endl; return; } fourierData.Transform(fFourier.fApodization); @@ -4662,7 +4727,7 @@ void PMusrCanvas::PlotData(Bool_t unzoom) switch (fPlotType) { case MSR_PLOT_SINGLE_HISTO: if (runList->at(0).IsLifetimeCorrected()) { // lifetime correction - yAxisTitle = "asymmetry"; + yAxisTitle = "Asymmetry"; } else { // no liftime correction if (fScaleN0AndBkg) yAxisTitle = "N(t) per nsec"; @@ -4670,8 +4735,12 @@ void PMusrCanvas::PlotData(Bool_t unzoom) yAxisTitle = "N(t) per bin"; } break; + case MSR_PLOT_SINGLE_HISTO_RRF: + case MSR_PLOT_ASYM_RRF: + yAxisTitle = "RRF Asymmetry"; + break; case MSR_PLOT_ASYM: - yAxisTitle = "asymmetry"; + yAxisTitle = "Asymmetry"; break; case MSR_PLOT_MU_MINUS: yAxisTitle = "N(t) per bin"; @@ -4948,7 +5017,7 @@ void PMusrCanvas::PlotDifference(Bool_t unzoom) if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { fHistoFrame->GetXaxis()->SetTitle("time (s)"); } else { - fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); + fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); } // set y-axis label fHistoFrame->GetYaxis()->SetTitleOffset(1.3); @@ -5940,7 +6009,7 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { xAxisTitle = TString("time (s)"); } else { - xAxisTitle = TString("time (#mus)"); + xAxisTitle = TString("time (#mus)"); } } else { // all the Fourier if (fFourier.fUnits == FOURIER_UNIT_GAUSS) { @@ -6125,6 +6194,11 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) break; } + // check if RRF and if yes show a label + if ((fRRFText != 0) && (fRRFLatexText != 0)) { + fRRFLatexText->DrawLatex(0.1, 0.92, fRRFText->Data()); + } + fDataTheoryPad->Update(); fMainCanvas->cd(); From dd3f9b17923a82ec01c4e945044d63e713b54f32 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 22 Feb 2016 10:23:47 +0100 Subject: [PATCH 06/87] Changed msr template file. --- src/external/libBNMR/ExpRlx-MUD.msr | 31 ++++++++++++++++------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/external/libBNMR/ExpRlx-MUD.msr b/src/external/libBNMR/ExpRlx-MUD.msr index 335a59f6..ef423491 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx-MUD.msr @@ -4,12 +4,12 @@ FITPARAMETER ############################################################### # No Name Value Err Min Max - 1 Alphap 1.11662 0.00020 none - 2 Asyp 0.03077 0.00038 none + 1 Alpha 1.11587 0.00038 none + 2 Asy 0.0570 0.0011 none 3 T 1 0 none - 4 Rlx 0.969 0.020 none - 5 Pos 1 0 none - 6 Neg -1 0 none + 4 Rlx 1.015 0.023 none + 5 One 1 0 none + 6 Bet -1.052 0.027 none ############################################################### THEORY @@ -20,7 +20,7 @@ userFcn .libs/libBNMR.so ExpRlx 3 4 ############################################################### FUNCTIONS ############################################################### -fun1 = map1 * map2 +fun1 = 0.5 * map1 * map2 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) @@ -28,9 +28,10 @@ fittype 2 (asymmetry fit) alpha 1 forward 3 backward 4 -data 11 799 11 799 -background 800 900 800 900 # estimated bkg: 416.9700 / 465.7600 -t0 0.0 0.0 +data 11 800 11 800 +#backgr.fix 0 +background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 +t0 10.0 10.0 map 2 5 0 0 0 0 0 0 0 0 fit 0.5 8 packing 5 @@ -40,9 +41,10 @@ fittype 2 (asymmetry fit) alpha 1 forward 5 backward 6 -data 11 799 11 799 -background 800 900 800 900 # estimated bkg: 430.9200 / 479.4500 -t0 0.0 0.0 +data 11 800 11 800 +#backgr.fix 0 +background 1 9 1 9 # estimated bkg: 11.6250 / 15.6250 +t0 10.0 10.0 map 2 6 0 0 0 0 0 0 0 0 fit 0.5 8 packing 5 @@ -58,6 +60,7 @@ SAVE PLOT 2 (asymmetry plot) runs 1 2 use_fit_ranges +view_packing 10 ############################################################### @@ -69,5 +72,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2015-04-01 16:12:07 - chisq = 372.2, NDF = 295, chisq/NDF = 1.261744 +STATISTIC --- 2015-04-14 11:00:19 + chisq = 399.5, NDF = 290, chisq/NDF = 1.377736 From a4e6d111ee24edbc2ee2ff8f04eac20179eabad1 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 14 Dec 2016 13:51:32 +0100 Subject: [PATCH 07/87] Address issue Issue #4 regarding old run on pta instead of tdc. --- src/external/MuSRFitGUI/MSR.pm | 38 ++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm index a6585671..713abcaf 100755 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -446,7 +446,7 @@ $logxy"; 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) { + if ($All{"FRQMAX"} ne $EMPTY && $All{"FRQMIN"} ne $EMPTY && $All{"FRQMAX"} ne $All{"FRQMIN"}) { $FrqRange = "range ".$All{"FRQMIN"}." ".$All{"FRQMAX"}; } @@ -1780,20 +1780,40 @@ sub RUNFileNameAuto { $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; } elsif ( $BeamLine eq "GPS" ) { - $RUN_File_Name = "deltat_tdc_gps_" . $RUNtmp; - $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; + if ($YEAR >= 2008) { + $RUN_File_Name = "deltat_tdc_gps_" . $RUNtmp; + $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; + } else { + $RUN_File_Name = "deltat_pta_gps_" . $RUNtmp; + $RUNFILE = "$DATADIR/d$YEAR/$RUN_File_Name"; + } } elsif ( $BeamLine eq "LTF" ) { - $RUN_File_Name = "deltat_tdc_ltf_" . $RUNtmp; - $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; + if ($YEAR >= 2009) { + $RUN_File_Name = "deltat_tdc_ltf_" . $RUNtmp; + $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; + } else { + $RUN_File_Name = "deltat_pta_ltf_" . $RUNtmp; + $RUNFILE = "$DATADIR/d$YEAR/$RUN_File_Name"; + } } elsif ( $BeamLine eq "Dolly" ) { - $RUN_File_Name = "deltat_tdc_dolly_" . $RUNtmp; - $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; + if ($YEAR >= 2008) { + $RUN_File_Name = "deltat_tdc_dolly_" . $RUNtmp; + $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; + } else { + $RUN_File_Name = "deltat_pta_dolly_" . $RUNtmp; + $RUNFILE = "$DATADIR/d$YEAR/$RUN_File_Name"; + } } elsif ( $BeamLine eq "GPD" ) { - $RUN_File_Name = "deltat_tdc_gpd_" . $RUNtmp; - $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; + if ($YEAR >= 2008) { + $RUN_File_Name = "deltat_tdc_gpd_" . $RUNtmp; + $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; + } else { + $RUN_File_Name = "deltat_pta_gpd_" . $RUNtmp; + $RUNFILE = "$DATADIR/d$YEAR/$RUN_File_Name"; + } } elsif ( $BeamLine eq "HAL" ) { $RUNtmp=sprintf("%05d",$RUNtmp); From c8e1a294aa98913f4b96ee79ed6dc4b5869bad03 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 19 Dec 2016 17:15:01 +0100 Subject: [PATCH 08/87] Manual conflicting commits from Andreas --- src/classes/PMusrCanvas.cpp | 539 +++++++++++++++++++++++++++--------- 1 file changed, 414 insertions(+), 125 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index 02a3e61f..fb5ad054 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -180,13 +180,16 @@ PMusrCanvas::PMusrCanvas() * \param wtopy top y coordinate (in pixels) to place the canvas. * \param ww width (in pixels) of the canvas. * \param wh height (in pixels) of the canvas. - * \param batch flag: if set true, the canvas will not be displayed. This is used when just dumping of a graphical output file is requested. - * \param fourier flag: if set true, the canvas will show the fourier transform of the data according to the msr file. + * \param batch flag: if set true, the canvas will not be displayed. This is used when just dumping of a + * graphical output file is wished. + * \param fourier flag: if set true, the canvas will present the Fourier view. + * \param avg flag: if set true, the canvas will present the averages data/Fourier view. */ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, Int_t wtopx, Int_t wtopy, Int_t ww, Int_t wh, - const Bool_t batch, const Bool_t fourier) : - fStartWithFourier(fourier), fBatchMode(batch), fPlotNumber(number) + const Bool_t batch, const Bool_t fourier, const Bool_t avg) : + fStartWithFourier(fourier), fStartWithAvg(avg), + fBatchMode(batch), fPlotNumber(number) { fTimeout = 0; fTimeoutTimer = 0; @@ -233,17 +236,19 @@ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, * \param fourierDefault structure holding the pre-defined settings for a Fourier transform * \param markerList pre-defined list of markers * \param colorList pre-defined list of colors - * \param batch flag: if set true, the canvas will not be displayed. This is used when just dumping of a graphical output file is wished. - * \param fourier flag: if set true, the canvas will show the fourier transform of the data according to the msr file. + * \param batch flag: if set true, the canvas will not be displayed. This is used when just dumping of a + * graphical output file is wished. + * \param fourier flag: if set true, the canvas will present the Fourier view. + * \param avg flag: if set true, the canvas will present the averages data/Fourier view. */ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, Int_t wtopx, Int_t wtopy, Int_t ww, Int_t wh, PMsrFourierStructure fourierDefault, const PIntVector markerList, const PIntVector colorList, - const Bool_t batch, const Bool_t fourier) : - fStartWithFourier(fourier), fBatchMode(batch), - fPlotNumber(number), fFourier(fourierDefault), - fMarkerList(markerList), fColorList(colorList) + const Bool_t batch, const Bool_t fourier, const Bool_t avg) : + fStartWithFourier(fourier), fStartWithAvg(avg), fBatchMode(batch), + fPlotNumber(number), fFourier(fourierDefault), + fMarkerList(markerList), fColorList(colorList) { fTimeout = 0; fTimeoutTimer = 0; @@ -815,6 +820,12 @@ void PMusrCanvas::UpdateDataTheoryPad() fPopupFourier->CheckEntry(P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE); } break; + case FOURIER_PLOT_PHASE_OPT_REAL: + fCurrentPlotView = PV_FOURIER_PHASE_OPT_REAL; + if (!fBatchMode) { + fPopupFourier->CheckEntry(P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_OPT_REAL); + } + break; default: fCurrentPlotView = PV_FOURIER_PWR; if (!fBatchMode) { @@ -826,6 +837,12 @@ void PMusrCanvas::UpdateDataTheoryPad() HandleFourier(); PlotFourier(); } + + // if fStartWithAvg=true, start with averaged data/Fourier representation + // fStartWithAvg is given at the command line level + if (fStartWithAvg) { + HandleCmdKey(kKeyPress, (Int_t)'a', 0, 0); + } } //-------------------------------------------------------------------------- @@ -1096,6 +1113,11 @@ void PMusrCanvas::HandleCmdKey(Int_t event, Int_t x, Int_t y, TObject *selected) fCurrentPlotView = PV_FOURIER_PHASE; fPopupFourier->CheckEntry(P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE); break; + case FOURIER_PLOT_PHASE_OPT_REAL: + fPreviousPlotView = fCurrentPlotView; + fCurrentPlotView = PV_FOURIER_PHASE_OPT_REAL; + fPopupFourier->CheckEntry(P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_OPT_REAL); + break; default: break; } @@ -1142,10 +1164,13 @@ void PMusrCanvas::HandleCmdKey(Int_t event, Int_t x, Int_t y, TObject *selected) } } else if (x == 'c') { Int_t state = fDataTheoryPad->GetCrosshair(); - if (state == 0) + if (state == 0) { + fMainCanvas->ToggleEventStatus(); fDataTheoryPad->SetCrosshair(2); - else + } else { + fMainCanvas->ToggleEventStatus(); fDataTheoryPad->SetCrosshair(0); + } fMainCanvas->Update(); } else { fMainCanvas->Update(); @@ -1339,6 +1364,36 @@ void PMusrCanvas::HandleMenuPopup(Int_t id) HandleFourierDifference(); PlotFourierDifference(); } + } else if (id == P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_OPT_REAL) { + // set appropriate plot view + fPreviousPlotView = fCurrentPlotView; + fCurrentPlotView = PV_FOURIER_PHASE_OPT_REAL; + // make sure that phase opt. real indeed exists + if (fData[0].dataFourierPhaseOptReal == 0) { + if (fData[0].dataFourierRe == 0) + HandleFourier(); + else + CalcPhaseOptReFT(); + } + // uncheck data + fPopupMain->UnCheckEntry(P_MENU_ID_DATA+P_MENU_PLOT_OFFSET*fPlotNumber); + // check appropriate fourier popup item + fPopupFourier->UnCheckEntries(); + fPopupFourier->CheckEntry(id); + // enable phase increment/decrement + fPopupFourier->EnableEntry(P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_PLUS); + fPopupFourier->EnableEntry(P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_MINUS); + // handle fourier phase + if (!fDifferenceView) { + HandleFourier(); + PlotFourier(); + } else { + if (previousPlotView == PV_DATA) + HandleDifferenceFourier(); + else + HandleFourierDifference(); + PlotFourierDifference(); + } } else if (id == P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_PLUS) { IncrementFourierPhase(); } else if (id == P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_MINUS) { @@ -1746,6 +1801,24 @@ void PMusrCanvas::ExportData(const Char_t *fileName) } } break; + case PV_FOURIER_PHASE_OPT_REAL: + // get current x-range + xminBin = fData[0].dataFourierPhaseOptReal->GetXaxis()->GetFirst(); // first bin of the zoomed range + xmaxBin = fData[0].dataFourierPhaseOptReal->GetXaxis()->GetLast(); // last bin of the zoomed range + xmin = fData[0].dataFourierPhaseOptReal->GetXaxis()->GetBinCenter(xminBin); + xmax = fData[0].dataFourierPhaseOptReal->GetXaxis()->GetBinCenter(xmaxBin); + + // fill ascii dump data + if (fAveragedView) { + GetExportDataSet(fDataAvg.dataFourierPhaseOptReal, xmin, xmax, dumpVector, false); + GetExportDataSet(fDataAvg.theoryFourierPhaseOptReal, xmin, xmax, dumpVector, false); + } else { // go through all the histogramms + for (UInt_t i=0; iAddEntry("Show Real+Imag", P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_REAL_AND_IMAG); fPopupFourier->AddEntry("Show Power", P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PWR); fPopupFourier->AddEntry("Show Phase", P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE); + fPopupFourier->AddEntry("Show PhaseOptReal", P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_OPT_REAL); fPopupFourier->AddSeparator(); fPopupFourier->AddEntry("Phase +", P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_PLUS); fPopupFourier->AddEntry("Phase -", P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_PHASE_MINUS); @@ -2414,16 +2491,19 @@ void PMusrCanvas::InitDataSet(PMusrCanvasDataSet &dataSet) dataSet.dataFourierIm = 0; dataSet.dataFourierPwr = 0; dataSet.dataFourierPhase = 0; + dataSet.dataFourierPhaseOptReal = 0; dataSet.theory = 0; dataSet.theoryFourierRe = 0; dataSet.theoryFourierIm = 0; dataSet.theoryFourierPwr = 0; dataSet.theoryFourierPhase = 0; + dataSet.theoryFourierPhaseOptReal = 0; dataSet.diff = 0; dataSet.diffFourierRe = 0; dataSet.diffFourierIm = 0; dataSet.diffFourierPwr = 0; dataSet.diffFourierPhase = 0; + dataSet.diffFourierPhaseOptReal = 0; dataSet.dataRange = 0; } @@ -2485,6 +2565,10 @@ void PMusrCanvas::CleanupDataSet(PMusrCanvasDataSet &dataSet) delete dataSet.dataFourierPhase; dataSet.dataFourierPhase = 0; } + if (dataSet.dataFourierPhaseOptReal) { + delete dataSet.dataFourierPhaseOptReal; + dataSet.dataFourierPhaseOptReal = 0; + } if (dataSet.theory) { delete dataSet.theory; dataSet.theory = 0; @@ -2505,6 +2589,10 @@ void PMusrCanvas::CleanupDataSet(PMusrCanvasDataSet &dataSet) delete dataSet.theoryFourierPhase; dataSet.theoryFourierPhase = 0; } + if (dataSet.theoryFourierPhaseOptReal) { + delete dataSet.theoryFourierPhaseOptReal; + dataSet.theoryFourierPhaseOptReal = 0; + } if (dataSet.diff) { delete dataSet.diff; dataSet.diff = 0; @@ -2525,6 +2613,10 @@ void PMusrCanvas::CleanupDataSet(PMusrCanvasDataSet &dataSet) delete dataSet.diffFourierPhase; dataSet.diffFourierPhase = 0; } + if (dataSet.diffFourierPhaseOptReal) { + delete dataSet.diffFourierPhaseOptReal; + dataSet.diffFourierPhaseOptReal = 0; + } if (dataSet.dataRange) { delete dataSet.dataRange; dataSet.dataRange = 0; @@ -3257,6 +3349,8 @@ void PMusrCanvas::HandleDifference() */ void PMusrCanvas::HandleFourier() { + Double_t re, im; + // check if plot type is appropriate for fourier if (fPlotType == MSR_PLOT_NON_MUSR) return; @@ -3266,11 +3360,11 @@ void PMusrCanvas::HandleFourier() Int_t bin; double startTime = fXmin; double endTime = fXmax; - if (!fStartWithFourier) { // fHistoFrame presen, hence get start/end from it + if (!fStartWithFourier) { // fHistoFrame present, hence get start/end from it bin = fHistoFrame->GetXaxis()->GetFirst(); - startTime = fHistoFrame->GetBinCenter(bin); + startTime = fHistoFrame->GetBinLowEdge(bin); bin = fHistoFrame->GetXaxis()->GetLast(); - endTime = fHistoFrame->GetBinCenter(bin); + endTime = fHistoFrame->GetBinLowEdge(bin)+fHistoFrame->GetBinWidth(bin); } for (UInt_t i=0; iSetMarkerSize(1); fData[i].dataFourierPwr->SetMarkerSize(1); fData[i].dataFourierPhase->SetMarkerSize(1); + // set marker type fData[i].dataFourierRe->SetMarkerStyle(fData[i].data->GetMarkerStyle()); fData[i].dataFourierIm->SetMarkerStyle(fData[i].data->GetMarkerStyle()); @@ -3328,7 +3423,7 @@ void PMusrCanvas::HandleFourier() // get power part of the data fData[i].theoryFourierPwr = fourierTheory.GetPowerFourier(scale); // get phase part of the data - fData[i].theoryFourierPhase = fourierTheory.GetPhaseFourier(); + fData[i].theoryFourierPhase = fourierTheory.GetPhaseFourier(); // set line colors for the theory fData[i].theoryFourierRe->SetLineColor(fData[i].theory->GetLineColor()); @@ -3337,9 +3432,13 @@ void PMusrCanvas::HandleFourier() fData[i].theoryFourierPhase->SetLineColor(fData[i].theory->GetLineColor()); } + // phase opt. real FT requested initially in the msr-file, hence calculate it here + if (fCurrentPlotView == PV_FOURIER_PHASE_OPT_REAL) { + CalcPhaseOptReFT(); + } + // apply global phase if present if (fFourier.fPhase != 0.0) { - double re, im; const double cp = TMath::Cos(fFourier.fPhase/180.0*TMath::Pi()); const double sp = TMath::Sin(fFourier.fPhase/180.0*TMath::Pi()); @@ -3368,40 +3467,6 @@ void PMusrCanvas::HandleFourier() } } } - - // find optimal Fourier phase if range is given - if ((fFourier.fRangeForPhaseCorrection[0] != -1.0) && (fFourier.fRangeForPhaseCorrection[1] != -1.0)) { - - fCurrentFourierPhase = FindOptimalFourierPhase(); - - // apply optimal Fourier phase - double re, im; - const double cp = TMath::Cos(fCurrentFourierPhase/180.0*TMath::Pi()); - const double sp = TMath::Sin(fCurrentFourierPhase/180.0*TMath::Pi()); - - for (UInt_t i=0; iGetNbinsX(); j++) { // loop over a fourier data set - // calculate new fourier data set value - re = fData[i].dataFourierRe->GetBinContent(j) * cp + fData[i].dataFourierIm->GetBinContent(j) * sp; - im = fData[i].dataFourierIm->GetBinContent(j) * cp - fData[i].dataFourierRe->GetBinContent(j) * sp; - // overwrite fourier data set value - fData[i].dataFourierRe->SetBinContent(j, re); - fData[i].dataFourierIm->SetBinContent(j, im); - } - } - if ((fData[i].theoryFourierRe != 0) && (fData[i].theoryFourierIm != 0)) { - for (Int_t j=0; jGetNbinsX(); j++) { // loop over a fourier data set - // calculate new fourier data set value - re = fData[i].theoryFourierRe->GetBinContent(j) * cp + fData[i].theoryFourierIm->GetBinContent(j) * sp; - im = fData[i].theoryFourierIm->GetBinContent(j) * cp - fData[i].theoryFourierRe->GetBinContent(j) * sp; - // overwrite fourier data set value - fData[i].theoryFourierRe->SetBinContent(j, re); - fData[i].theoryFourierIm->SetBinContent(j, im); - } - } - } - } } } @@ -3518,7 +3583,7 @@ void PMusrCanvas::HandleFourierDifference() if (fData[0].diffFourierRe == 0) { // calculate all the Fourier differences Double_t dval, dvalx; - TString name,setup; + TString name; Int_t theoBin; for (UInt_t i=0; iGetXaxis()->GetXmin(), fData[i].dataFourierPhase->GetXaxis()->GetXmax()); + // phase optimized real part + name = TString(fData[i].dataFourierPhaseOptReal->GetTitle()) + "_diff"; + fData[i].diffFourierPhaseOptReal = new TH1F(name, name, fData[i].dataFourierPhaseOptReal->GetNbinsX(), + fData[i].dataFourierPhaseOptReal->GetXaxis()->GetXmin(), + fData[i].dataFourierPhaseOptReal->GetXaxis()->GetXmax()); + // calculate difference for (UInt_t j=1; jGetEntries(); j++) { dvalx = fData[i].dataFourierRe->GetXaxis()->GetBinCenter(j); // get x-axis value of bin j @@ -3561,6 +3632,10 @@ void PMusrCanvas::HandleFourierDifference() theoBin = fData[i].theoryFourierPhase->FindBin(dvalx); // get the theory x-axis bin dval = fData[i].dataFourierPhase->GetBinContent(j) - fData[i].theoryFourierPhase->GetBinContent(theoBin); fData[i].diffFourierPhase->SetBinContent(j, dval); + dvalx = fData[i].dataFourierPhaseOptReal->GetXaxis()->GetBinCenter(j); // get x-axis value of bin j + theoBin = fData[i].theoryFourierPhaseOptReal->FindBin(dvalx); // get the theory x-axis bin + dval = fData[i].dataFourierPhaseOptReal->GetBinContent(j) - fData[i].theoryFourierPhaseOptReal->GetBinContent(theoBin); + fData[i].diffFourierPhaseOptReal->SetBinContent(j, dval); } } @@ -3574,17 +3649,21 @@ void PMusrCanvas::HandleFourierDifference() fData[i].diffFourierPwr->SetLineColor(fData[i].dataFourierPwr->GetLineColor()); fData[i].diffFourierPhase->SetMarkerColor(fData[i].dataFourierPhase->GetMarkerColor()); fData[i].diffFourierPhase->SetLineColor(fData[i].dataFourierPhase->GetLineColor()); + fData[i].diffFourierPhaseOptReal->SetMarkerColor(fData[i].dataFourierPhaseOptReal->GetMarkerColor()); + fData[i].diffFourierPhaseOptReal->SetLineColor(fData[i].dataFourierPhaseOptReal->GetLineColor()); // set marker size fData[i].diffFourierRe->SetMarkerSize(1); fData[i].diffFourierIm->SetMarkerSize(1); fData[i].diffFourierPwr->SetMarkerSize(1); fData[i].diffFourierPhase->SetMarkerSize(1); + fData[i].diffFourierPhaseOptReal->SetMarkerSize(1); // set marker type fData[i].diffFourierRe->SetMarkerStyle(fData[i].dataFourierRe->GetMarkerStyle()); fData[i].diffFourierIm->SetMarkerStyle(fData[i].dataFourierIm->GetMarkerStyle()); fData[i].diffFourierPwr->SetMarkerStyle(fData[i].dataFourierPwr->GetMarkerStyle()); fData[i].diffFourierPhase->SetMarkerStyle(fData[i].dataFourierPhase->GetMarkerStyle()); + fData[i].diffFourierPhaseOptReal->SetMarkerStyle(fData[i].dataFourierPhaseOptReal->GetMarkerStyle()); // set diffFourierTag fData[i].diffFourierTag = 2; // f-d @@ -3643,6 +3722,12 @@ void PMusrCanvas::HandleAverage() fData[0].dataFourierPhase->GetXaxis()->GetXmin(), fData[0].dataFourierPhase->GetXaxis()->GetXmax()); } + if (fData[0].dataFourierPhaseOptReal != 0) { + name = TString(fData[0].dataFourierPhaseOptReal->GetTitle()) + "_avg"; + fDataAvg.dataFourierPhaseOptReal = new TH1F(name, name, fData[0].dataFourierPhaseOptReal->GetNbinsX(), + fData[0].dataFourierPhaseOptReal->GetXaxis()->GetXmin(), + fData[0].dataFourierPhaseOptReal->GetXaxis()->GetXmax()); + } if (fData[0].theory != 0) { name = TString(fData[0].theory->GetTitle()) + "_avg"; fDataAvg.theory = new TH1F(name, name, fData[0].theory->GetNbinsX(), @@ -3673,6 +3758,12 @@ void PMusrCanvas::HandleAverage() fData[0].theoryFourierPhase->GetXaxis()->GetXmin(), fData[0].theoryFourierPhase->GetXaxis()->GetXmax()); } + if (fData[0].theoryFourierPhaseOptReal != 0) { + name = TString(fData[0].theoryFourierPhaseOptReal->GetTitle()) + "_avg"; + fDataAvg.theoryFourierPhaseOptReal = new TH1F(name, name, fData[0].theoryFourierPhaseOptReal->GetNbinsX(), + fData[0].theoryFourierPhaseOptReal->GetXaxis()->GetXmin(), + fData[0].theoryFourierPhaseOptReal->GetXaxis()->GetXmax()); + } if (fData[0].diff != 0) { name = TString(fData[0].diff->GetTitle()) + "_avg"; fDataAvg.diff = new TH1F(name, name, fData[0].diff->GetNbinsX(), @@ -3703,6 +3794,12 @@ void PMusrCanvas::HandleAverage() fData[0].diffFourierPhase->GetXaxis()->GetXmin(), fData[0].diffFourierPhase->GetXaxis()->GetXmax()); } + if (fData[0].diffFourierPhaseOptReal != 0) { + name = TString(fData[0].diffFourierPhaseOptReal->GetTitle()) + "_avg"; + fDataAvg.diffFourierPhaseOptReal = new TH1F(name, name, fData[0].diffFourierPhaseOptReal->GetNbinsX(), + fData[0].diffFourierPhaseOptReal->GetXaxis()->GetXmin(), + fData[0].diffFourierPhaseOptReal->GetXaxis()->GetXmax()); + } // calculate all the average data sets double dval; @@ -3776,6 +3873,20 @@ void PMusrCanvas::HandleAverage() fDataAvg.dataFourierPhase->SetMarkerSize(fData[0].dataFourierPhase->GetMarkerSize()); fDataAvg.dataFourierPhase->SetMarkerStyle(fData[0].dataFourierPhase->GetMarkerStyle()); } + if (fDataAvg.dataFourierPhaseOptReal != 0) { + for (Int_t i=0; iGetNbinsX(); i++) { + dval = 0.0; + for (UInt_t j=0; jGetBinCenter(i)); + } + fDataAvg.dataFourierPhaseOptReal->SetBinContent(i, dval/fData.size()); + } + // set marker color, line color, maker size, marker type + fDataAvg.dataFourierPhaseOptReal->SetMarkerColor(fData[0].dataFourierPhaseOptReal->GetMarkerColor()); + fDataAvg.dataFourierPhaseOptReal->SetLineColor(fData[0].dataFourierPhaseOptReal->GetLineColor()); + fDataAvg.dataFourierPhaseOptReal->SetMarkerSize(fData[0].dataFourierPhaseOptReal->GetMarkerSize()); + fDataAvg.dataFourierPhaseOptReal->SetMarkerStyle(fData[0].dataFourierPhaseOptReal->GetMarkerStyle()); + } if (fDataAvg.theory != 0) { for (Int_t i=0; iGetNbinsX(); i++) { dval = 0.0; @@ -3842,6 +3953,20 @@ void PMusrCanvas::HandleAverage() fDataAvg.theoryFourierPhase->SetMarkerSize(fData[0].theoryFourierPhase->GetMarkerSize()); fDataAvg.theoryFourierPhase->SetMarkerStyle(fData[0].theoryFourierPhase->GetMarkerStyle()); } + if (fDataAvg.theoryFourierPhaseOptReal != 0) { + for (Int_t i=0; iGetNbinsX(); i++) { + dval = 0.0; + for (UInt_t j=0; jGetBinCenter(i)); + } + fDataAvg.theoryFourierPhaseOptReal->SetBinContent(i, dval/fData.size()); + } + // set marker color, line color, maker size, marker type + fDataAvg.theoryFourierPhaseOptReal->SetMarkerColor(fData[0].theoryFourierPhaseOptReal->GetMarkerColor()); + fDataAvg.theoryFourierPhaseOptReal->SetLineColor(fData[0].theoryFourierPhaseOptReal->GetLineColor()); + fDataAvg.theoryFourierPhaseOptReal->SetMarkerSize(fData[0].theoryFourierPhaseOptReal->GetMarkerSize()); + fDataAvg.theoryFourierPhaseOptReal->SetMarkerStyle(fData[0].theoryFourierPhaseOptReal->GetMarkerStyle()); + } if (fDataAvg.diff != 0) { for (Int_t i=0; iGetNbinsX(); i++) { dval = 0.0; @@ -3907,83 +4032,25 @@ void PMusrCanvas::HandleAverage() fDataAvg.diffFourierPhase->SetBinContent(i, dval/fData.size()); } // set marker color, line color, maker size, marker type - fDataAvg.diffFourierPhase->SetMarkerColor(fData[0].dataFourierRe->GetMarkerColor()); - fDataAvg.diffFourierPhase->SetLineColor(fData[0].dataFourierRe->GetLineColor()); - fDataAvg.diffFourierPhase->SetMarkerSize(fData[0].dataFourierRe->GetMarkerSize()); - fDataAvg.diffFourierPhase->SetMarkerStyle(fData[0].dataFourierRe->GetMarkerStyle()); + fDataAvg.diffFourierPhase->SetMarkerColor(fData[0].dataFourierPhase->GetMarkerColor()); + fDataAvg.diffFourierPhase->SetLineColor(fData[0].dataFourierPhase->GetLineColor()); + fDataAvg.diffFourierPhase->SetMarkerSize(fData[0].dataFourierPhase->GetMarkerSize()); + fDataAvg.diffFourierPhase->SetMarkerStyle(fData[0].dataFourierPhase->GetMarkerStyle()); } -} - -//-------------------------------------------------------------------------- -// FindOptimalFourierPhase (private) -//-------------------------------------------------------------------------- -/** - *

The idea to estimate the optimal phase is that the imaginary part of the fourier should be - * an antisymmetric function around the resonance, hence the asymmetry defined as asymmetry = max+min, - * where max/min is the maximum and minimum of the imaginary part, should be a minimum for the correct phase. - */ -double PMusrCanvas::FindOptimalFourierPhase() -{ - // check that Fourier is really present - if ((fData[0].dataFourierRe == 0) || (fData[0].dataFourierIm == 0)) - return 0.0; - - Double_t minPhase, x, valIm, val_xMin = 0.0, val_xMax = 0.0; - Double_t minIm = 0.0, maxIm = 0.0, asymmetry; - // get min/max of the imaginary part for phase = 0.0 as a starting point - minPhase = 0.0; - Bool_t first = true; - for (Int_t i=0; iGetNbinsX(); i++) { - x = fData[0].dataFourierIm->GetBinCenter(i); - if ((x > fFourier.fRangeForPhaseCorrection[0]) && (x < fFourier.fRangeForPhaseCorrection[1])) { - valIm = fData[0].dataFourierIm->GetBinContent(i); - if (first) { - minIm = valIm; - maxIm = valIm; - val_xMin = valIm; - first = false; - } else { - if (valIm < minIm) - minIm = valIm; - if (valIm > maxIm) - maxIm = valIm; - val_xMax = valIm; + if (fDataAvg.diffFourierPhaseOptReal != 0) { + for (Int_t i=0; iGetNbinsX(); i++) { + dval = 0.0; + for (UInt_t j=0; jGetBinCenter(i)); } + fDataAvg.diffFourierPhaseOptReal->SetBinContent(i, dval/fData.size()); } + // set marker color, line color, maker size, marker type + fDataAvg.diffFourierPhaseOptReal->SetMarkerColor(fData[0].dataFourierPhaseOptReal->GetMarkerColor()); + fDataAvg.diffFourierPhaseOptReal->SetLineColor(fData[0].dataFourierPhaseOptReal->GetLineColor()); + fDataAvg.diffFourierPhaseOptReal->SetMarkerSize(fData[0].dataFourierPhaseOptReal->GetMarkerSize()); + fDataAvg.diffFourierPhaseOptReal->SetMarkerStyle(fData[0].dataFourierPhaseOptReal->GetMarkerStyle()); } - asymmetry = (maxIm+minIm)*(val_xMin-val_xMax); - - // go through all phases an check if there is a larger max-min value of the imaginary part - double cp, sp; - for (double phase=0.1; phase < 180.0; phase += 0.1) { - cp = TMath::Cos(phase / 180.0 * TMath::Pi()); - sp = TMath::Sin(phase / 180.0 * TMath::Pi()); - first = true; - for (Int_t i=0; iGetNbinsX(); i++) { - x = fData[0].dataFourierIm->GetBinCenter(i); - if ((x > fFourier.fRangeForPhaseCorrection[0]) && (x < fFourier.fRangeForPhaseCorrection[1])) { - valIm = -sp * fData[0].dataFourierRe->GetBinContent(i) + cp * fData[0].dataFourierIm->GetBinContent(i); - if (first) { - minIm = valIm; - maxIm = valIm; - val_xMin = valIm; - first = false; - } else { - if (valIm < minIm) - minIm = valIm; - if (valIm > maxIm) - maxIm = valIm; - val_xMax = valIm; - } - } - } - if (fabs(asymmetry) > fabs((maxIm+minIm)*(val_xMin-val_xMax))) { - minPhase = phase; - asymmetry = (maxIm+minIm)*(val_xMin-val_xMax); - } - } - - return minPhase; } //-------------------------------------------------------------------------- @@ -4027,6 +4094,10 @@ void PMusrCanvas::CleanupFourier() delete fData[i].dataFourierPhase; fData[i].dataFourierPhase = 0; } + if (fData[i].dataFourierPhaseOptReal != 0) { + delete fData[i].dataFourierPhaseOptReal; + fData[i].dataFourierPhaseOptReal = 0; + } if (fData[i].theoryFourierRe != 0) { delete fData[i].theoryFourierRe; fData[i].theoryFourierRe = 0; @@ -4043,6 +4114,10 @@ void PMusrCanvas::CleanupFourier() delete fData[i].theoryFourierPhase; fData[i].theoryFourierPhase = 0; } + if (fData[i].theoryFourierPhaseOptReal != 0) { + delete fData[i].theoryFourierPhaseOptReal; + fData[i].theoryFourierPhaseOptReal = 0; + } } } @@ -4071,6 +4146,10 @@ void PMusrCanvas::CleanupFourierDifference() delete fData[i].diffFourierPhase; fData[i].diffFourierPhase = 0; } + if (fData[i].diffFourierPhaseOptReal != 0) { + delete fData[i].diffFourierPhaseOptReal; + fData[i].diffFourierPhaseOptReal = 0; + } } } @@ -4102,6 +4181,10 @@ void PMusrCanvas::CleanupAverage() delete fDataAvg.dataFourierPhase; fDataAvg.dataFourierPhase = 0; } + if (fDataAvg.dataFourierPhaseOptReal != 0) { + delete fDataAvg.dataFourierPhaseOptReal; + fDataAvg.dataFourierPhaseOptReal = 0; + } if (fDataAvg.theory != 0) { delete fDataAvg.theory; fDataAvg.theory = 0; @@ -4122,6 +4205,10 @@ void PMusrCanvas::CleanupAverage() delete fDataAvg.theoryFourierPhase; fDataAvg.theoryFourierPhase = 0; } + if (fDataAvg.theoryFourierPhaseOptReal != 0) { + delete fDataAvg.theoryFourierPhaseOptReal; + fDataAvg.theoryFourierPhaseOptReal = 0; + } if (fDataAvg.diff != 0) { delete fDataAvg.diff; fDataAvg.diff = 0; @@ -4142,6 +4229,68 @@ void PMusrCanvas::CleanupAverage() delete fDataAvg.diffFourierPhase; fDataAvg.diffFourierPhase = 0; } + if (fDataAvg.diffFourierPhaseOptReal != 0) { + delete fDataAvg.diffFourierPhaseOptReal; + fDataAvg.diffFourierPhaseOptReal = 0; + } +} + +//-------------------------------------------------------------------------- +// CalculateDiff (private) +//-------------------------------------------------------------------------- +/** + * @brief PMusrCanvas::CalcPhaseOptReFT + */ +void PMusrCanvas::CalcPhaseOptReFT() +{ + Double_t min = fMsrHandler->GetMsrFourierList()->fRangeForPhaseCorrection[0]; + Double_t max = fMsrHandler->GetMsrFourierList()->fRangeForPhaseCorrection[1]; + + if ((min == -1.0) && (max == -1.0)) { + if ((fFourier.fPlotRange[0] != -1) && (fFourier.fPlotRange[1] != -1)) { + min = fFourier.fPlotRange[0]; + max = fFourier.fPlotRange[1]; + } else { + min = fData[0].dataFourierRe->GetBinLowEdge(1); + max = fData[0].dataFourierRe->GetBinLowEdge(fData[0].dataFourierRe->GetNbinsX())+fData[0].dataFourierRe->GetBinWidth(1); + } + } + + PDoubleVector phaseParam; + Char_t hName[1024]; + Double_t ph, re; + + for (UInt_t i=0; iSetMarkerColor(fData[i].data->GetMarkerColor()); + fData[i].dataFourierPhaseOptReal->SetLineColor(fData[i].data->GetLineColor()); + // set marker size + fData[i].dataFourierPhaseOptReal->SetMarkerSize(1); + // set marker type + fData[i].dataFourierPhaseOptReal->SetMarkerStyle(fData[i].data->GetMarkerStyle()); + + // handle Fourier theory part + // clone theory Re FT + strcpy(hName, fData[i].theoryFourierPhase->GetName()); + strcat(hName, "_Opt_Real"); + fData[i].theoryFourierPhaseOptReal = (TH1F*) fData[i].theoryFourierRe->Clone(hName); + + // rotate the theory according to the optimized phase parameters + // first find minBin for min of the phase correction + Int_t minBin = fData[i].theoryFourierPhaseOptReal->GetXaxis()->FindFixBin(min); + Int_t maxBin = fData[i].theoryFourierPhaseOptReal->GetXaxis()->FindFixBin(max); + + for (Int_t j=1; jGetNbinsX(); j++) { + ph = phaseParam[0] + phaseParam[1] * (Double_t)(j-minBin+1) / (Double_t)(maxBin-minBin); + re = fData[i].theoryFourierRe->GetBinContent(j) * cos(ph) - fData[i].theoryFourierIm->GetBinContent(j) * sin(ph); + fData[i].theoryFourierPhaseOptReal->SetBinContent(j, re); + } + // set line colors for the theory + fData[i].theoryFourierPhaseOptReal->SetLineColor(fData[i].theory->GetLineColor()); + } } //-------------------------------------------------------------------------- @@ -5390,6 +5539,83 @@ void PMusrCanvas::PlotFourier(Bool_t unzoom) } break; + case PV_FOURIER_PHASE_OPT_REAL: + // set x-range + if ((fFourier.fPlotRange[0] != -1) && (fFourier.fPlotRange[1] != -1)) { + xmin = fFourier.fPlotRange[0]; + xmax = fFourier.fPlotRange[1]; + } else { + xmin = fData[0].dataFourierPhaseOptReal->GetBinLowEdge(1); + xmax = fData[0].dataFourierPhaseOptReal->GetBinLowEdge(fData[0].dataFourierPhaseOptReal->GetNbinsX())+fData[0].dataFourierPhaseOptReal->GetBinWidth(1); + } + + // set y-range + // first find minimum/maximum of all histos + ymin = GetMinimum(fData[0].dataFourierPhaseOptReal); + ymax = GetMaximum(fData[0].dataFourierPhaseOptReal); + binContent = GetMinimum(fData[0].theoryFourierPhaseOptReal); + if (binContent < ymin) + ymin = binContent; + binContent = GetMaximum(fData[0].theoryFourierPhaseOptReal); + if (binContent > ymax) + ymax = binContent; + for (UInt_t i=1; i ymax) + ymax = binContent; + binContent = GetMinimum(fData[i].theoryFourierPhaseOptReal); + if (binContent < ymin) + ymin = binContent; + binContent = GetMaximum(fData[i].theoryFourierPhaseOptReal); + if (binContent > ymax) + ymax = binContent; + } + + // delete old fHistoFrame if present + if (fHistoFrame) { + delete fHistoFrame; + fHistoFrame = 0; + } + + fHistoFrame = fDataTheoryPad->DrawFrame(xmin, 1.05*ymin, xmax, 1.05*ymax); + + // find the maximal number of points present in the histograms and increase the default number of points of fHistoFrame (1000) to the needed one + noOfPoints = 1000; + for (UInt_t i=0; iGetNbinsX() > (Int_t)noOfPoints) + noOfPoints = fData[i].dataFourierPhaseOptReal->GetNbinsX(); + } + noOfPoints *= 2; // make sure that there are enough points + fHistoFrame->SetBins(noOfPoints, xmin, xmax); + + for (UInt_t i=0; iGetXaxis()->SetRangeUser(xmin, xmax); + fData[i].dataFourierPhaseOptReal->GetYaxis()->SetRangeUser(1.05*ymin, 1.05*ymax); + fData[i].theoryFourierPhaseOptReal->GetXaxis()->SetRangeUser(xmin, xmax); + fData[i].theoryFourierPhaseOptReal->GetYaxis()->SetRangeUser(1.05*ymin, 1.05*ymax); + } + + // set x-axis title + fHistoFrame->GetXaxis()->SetTitle(xAxisTitle.Data()); + + // set y-axis title + fHistoFrame->GetYaxis()->SetTitleOffset(1.3); + fHistoFrame->GetYaxis()->SetTitle("Phase Opt. Real Fourier"); + + // plot data + for (UInt_t i=0; iDraw("psame"); + } + + // plot theories + for (UInt_t i=0; iDraw("same"); + } + + break; default: break; } @@ -5729,6 +5955,58 @@ void PMusrCanvas::PlotFourierDifference(Bool_t unzoom) PlotFourierPhaseValue(); + break; + case PV_FOURIER_PHASE_OPT_REAL: + // set x-range + if ((fFourier.fPlotRange[0] != -1) && (fFourier.fPlotRange[1] != -1)) { + xmin = fFourier.fPlotRange[0]; + xmax = fFourier.fPlotRange[1]; + } else { + xmin = fData[0].diffFourierPhaseOptReal->GetBinLowEdge(1); + xmax = fData[0].diffFourierPhaseOptReal->GetBinLowEdge(fData[0].diffFourierPhaseOptReal->GetNbinsX())+fData[0].diffFourierPhaseOptReal->GetBinWidth(1); + } + + // set y-range + // first find minimum/maximum of all histos + ymin = GetMinimum(fData[0].diffFourierPhaseOptReal); + ymax = GetMaximum(fData[0].diffFourierPhaseOptReal); + for (UInt_t i=1; i ymax) + ymax = binContent; + } + + // delete old fHistoFrame if present + if (fHistoFrame) { + delete fHistoFrame; + fHistoFrame = 0; + } + + fHistoFrame = fDataTheoryPad->DrawFrame(xmin, 1.05*ymin, xmax, 1.05*ymax); + + // set ranges for phase opt. real Fourier difference + for (UInt_t i=0; iGetXaxis()->SetRangeUser(xmin, xmax); + fData[i].diffFourierPhaseOptReal->GetYaxis()->SetRangeUser(1.05*ymin, 1.05*ymax); + } + + // set x-axis title + fHistoFrame->GetXaxis()->SetTitle(xAxisTitle.Data()); + + // set y-axis title + fHistoFrame->GetYaxis()->SetTitleOffset(1.3); + if (fData[0].diffFourierTag == 1) + fHistoFrame->GetYaxis()->SetTitle("Real Fourier (d-f: data-theory)"); + else + fHistoFrame->GetYaxis()->SetTitle("Real Fourier (f-d: [(F data)-(F theory)]"); + + // plot data + for (UInt_t i=0; iDraw("plsame"); + } break; default: break; @@ -5864,6 +6142,9 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) case PV_FOURIER_PHASE: yAxisTitle = ""; break; + case PV_FOURIER_PHASE_OPT_REAL: + yAxisTitle = ""; + break; default: yAxisTitle = "??"; break; @@ -5983,6 +6264,14 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) fDataAvg.diffFourierPhase->Draw("psame"); } break; + case PV_FOURIER_PHASE_OPT_REAL: + if (!fDifferenceView) { // averaged Fourier Phase Opt Real view + fDataAvg.dataFourierPhaseOptReal->Draw("psame"); + fDataAvg.theoryFourierPhaseOptReal->Draw("same"); + } else { // averaged diff Fourier Phase view + fDataAvg.diffFourierPhaseOptReal->Draw("psame"); + } + break; default: break; } From aaeef7b68560d5aa6e96c5f7cd769c0b61487406 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 20 Mar 2017 17:04:23 +0100 Subject: [PATCH 09/87] Porting MuSRFit to qt4, work in progress... --- src/external/MuSRFitGUI/MuSRFit4.pl | 17 + src/external/MuSRFitGUI/MuSRFit4.pm | 1048 ++++ src/external/MuSRFitGUI/MuSRFit4.ui | 5884 ++++++++++++++++++++++ src/external/MuSRFitGUI/Ui_MuSRFit4.pm | 3353 ++++++++++++ src/external/MuSRFitGUI/icos/Append.odg | Bin 0 -> 10937 bytes src/external/MuSRFitGUI/icos/Append.png | Bin 0 -> 404 bytes src/external/MuSRFitGUI/icos/Export.odg | Bin 0 -> 10837 bytes src/external/MuSRFitGUI/icos/Export.png | Bin 0 -> 374 bytes src/external/MuSRFitGUI/icos/Fit.odg | Bin 11570 -> 11811 bytes src/external/MuSRFitGUI/icos/MuSRFit.odg | Bin 15336 -> 13391 bytes src/external/MuSRFitGUI/icos/Plot.odg | Bin 14709 -> 12961 bytes src/external/MuSRFitGUI/icos/chdir.png | Bin 0 -> 3623 bytes src/external/MuSRFitGUI/icos/exit.png | Bin 0 -> 2073 bytes src/external/MuSRFitGUI/icos/save.png | Bin 0 -> 1646 bytes src/external/MuSRFitGUI/icos/saveMSR.png | Bin 0 -> 2587 bytes 15 files changed, 10302 insertions(+) create mode 100755 src/external/MuSRFitGUI/MuSRFit4.pl create mode 100644 src/external/MuSRFitGUI/MuSRFit4.pm create mode 100644 src/external/MuSRFitGUI/MuSRFit4.ui create mode 100644 src/external/MuSRFitGUI/Ui_MuSRFit4.pm create mode 100644 src/external/MuSRFitGUI/icos/Append.odg create mode 100644 src/external/MuSRFitGUI/icos/Append.png create mode 100644 src/external/MuSRFitGUI/icos/Export.odg create mode 100644 src/external/MuSRFitGUI/icos/Export.png create mode 100644 src/external/MuSRFitGUI/icos/chdir.png create mode 100644 src/external/MuSRFitGUI/icos/exit.png create mode 100644 src/external/MuSRFitGUI/icos/save.png create mode 100644 src/external/MuSRFitGUI/icos/saveMSR.png diff --git a/src/external/MuSRFitGUI/MuSRFit4.pl b/src/external/MuSRFitGUI/MuSRFit4.pl new file mode 100755 index 00000000..61dd0118 --- /dev/null +++ b/src/external/MuSRFitGUI/MuSRFit4.pl @@ -0,0 +1,17 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use QtCore4; +use QtGui4; +use MuSRFit4; + +sub main { + my $app = Qt::Application(\@ARGV); + my $musrfit = MuSRFit4(); + $musrfit->show(); + exit $app->exec(); +} + +main(); diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm new file mode 100644 index 00000000..7dcf5f95 --- /dev/null +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -0,0 +1,1048 @@ +package MuSRFit4; + +use strict; +use warnings; +use QtCore4; +use QtGui4; +use QtCore4::isa qw( Qt::MainWindow ); +# This is redundant +#use QtCore4::isa qw( Qt::Widget ); +use QtCore4::debug qw(ambiguous); +use QtCore4::slots + fileOpen => [], + fileSave => [], + fileChangeDir => [], + filePrint => [], + fileExit => [], + parametersExport => [], + parametersAppend => [], + editUndo => [], + editRedo => [], + editCut => [], + editCopy => [], + editPaste => [], + helpIndex => [], + helpContents => [], + helpAbout => [], + CreateAllInput => [], + CallMSRCreate => [], + UpdateMSRFileInitTable => [], + ActivateT0Hists => [], + ActivateShComp => [], + InitializeTab => [], + TabChanged => [], + GoFit => [], + GoPlot => [], + ShowMuSRT0 => [], + T0Update => [], + RunSelectionToggle => [], + fileBrowse => [], + AppendToFunctions => [], + InitializeFunctions => [], + t0UpdateClicked => []; +use Ui_MuSRFit4; + +sub NEW { + my ( $class, $parent ) = @_; + $class->SUPER::NEW($parent); + this->{ui} = Ui_MuSRFit4->setupUi(this); +} + +# 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 . +# +# Copyright 2009 by Zaher Salman and the LEM Group. +# + +sub fileOpen() +{ + my $file=Qt::FileDialog::getOpenFileName( + ".", + "MSR Files (*.msr *.mlog)", + this, + "open file dialog", + "Choose a MSR file"); + print "Selected file: $file\n"; +# TODO: Possibly decipher the MSR file and setup the GUI accordingly +# Find run numbers, beamlines etc. +# Get theory block and understand it +# Get parameters list and update table + +} + + +sub fileSave() +{ + my %All=CreateAllInput(); + my $FILENAME=$All{"FILENAME"}.".msr"; + my $file=Qt::FileDialog::getSaveFileName( + "$FILENAME", + "MSR Files (*.msr *.mlog)", + this, + "save file dialog", + "Choose a filename to save under"); + +# If the user gave a filename the copy to it + if ($file ne "") { +# TODO: check if the extension is correct, or add it. + if (-e $FILENAME) { + 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); + } + } + } +} + +sub fileChangeDir() +{ + my $newdir=Qt::FileDialog::getExistingDirectory( + "", + this, + "get existing directory", + "Choose a directory", + 1); + chdir ("$newdir"); +} + +sub filePrint() +{ + +} + + +sub fileExit() +{ + my $Ans = Qt::MessageBox::question( this, "Quit?","Are you sure you want to quit?","&Yes","&No","",0,1); + if ($Ans==0) { +# Then quit + Qt::Application::exit( 0 ); + } +# Otherwize go back +} + +sub parametersExport() +{ + my %All=CreateAllInput(); +# Add also a flag for header + $All{"Header"}=1; + my $FILENAME=$All{"FILENAME"}.".dat"; + my $file=Qt::FileDialog::getSaveFileName( + "$FILENAME", + "Data Files (*.dat)", + this, + "export file dialog", + "Choose a filename to export to"); + +# If the user gave a filename the copy to it + if ($file ne "") { + my $Text = MSR::ExportParams(\%All); + open( DATF,q{>},"$file" ); + print DATF $Text; + close(DATF); + } +} + + +sub parametersAppend() +{ + my %All=CreateAllInput(); +# Add also a flag for header + $All{"Header"}=0; + my $FILENAME=$All{"FILENAME"}.".dat"; + my $file=Qt::FileDialog::getOpenFileName( + "./", + "Data Files (*.dat)", + this, + "append file dialog", + "Choose a filename to append to"); + +# If the user gave a filename the copy to it + if ($file ne "") { + my $Text = MSR::ExportParams(\%All); + open( DATF,q{>>},"$file" ); + print DATF $Text; + close(DATF); + } +} + + +sub editUndo() +{ + +} + + +sub editRedo() +{ + +} + + +sub editCut() +{ + +} + + +sub editCopy() +{ + +} + + +sub editPaste() +{ + +} + + +sub helpIndex() +{ + +} + + +sub helpContents() +{ + +} + +sub 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 . + + Copyright 2009 by Zaher Salman and the LEM Group. + + "; + my $AboutWindow = Qt::MessageBox::information( this, "About MuSRFit GUI",$AboutText); +} + +sub CreateAllInput() +{ + my %All=(); + +# From RUNS Tab +# Run data file + $All{"RunNumbers"} = this->{ui}->runNumbers->text(); + $All{"RunFiles"} = this->{ui}->runFiles->text(); + $All{"BeamLine"} = this->{ui}->beamLine->currentText; + $All{"RUNSType"} = this->{ui}->manualFile->isOn(); + $All{"YEAR"} = this->{ui}->year->currentText; + if ($All{"YEAR"} eq "") { +# If year combobox is empty fill it up from 2004 up to current year + my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(); + my $current_year = 1900 + $yearOffset; + for (my $i=$current_year;$i>=2004;$i--) { + this->{ui}->year->insertItem($i,-1); + print "inserted-$i\n"; + } + } +# Time range and BINS + $All{"Tis"} = this->{ui}->tis->text; + $All{"Tfs"} = this->{ui}->tfs->text; + $All{"BINS"} = this->{ui}->bins->text; + $All{"FitAsyType"} = this->{ui}->fitAsyType->currentText; + $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); + } + elsif ( $All{"FitAsyType"} eq "SingleHist" ) { + this->{ui}->ltc->setHidden(0); + } + +# From Fitting Tab +# Plot range + $All{"Xi"}=this->{ui}->xi->text; + $All{"Xf"}=this->{ui}->xf->text; + $All{"Yi"}=this->{ui}->yi->text; + $All{"Yf"}=this->{ui}->yf->text; + $All{"ViewBin"}=this->{ui}->viewBin->text; +# Life time correction + if (this->{ui}->ltc->isChecked()) { + $All{"ltc"}="y"; + } else { + $All{"ltc"}="n"; + } +# Minuit commands + if ( $All{"go"} eq "" ) { + $All{"go"}="PLOT"; + } +# Get minimization process + $All{"Minimization"} = this->{ui}->minimization->currentText(); + $All{"go"}=$All{"Minimization"}; + +# Get Error calculation process + $All{"ErrorCalc"} = this->{ui}->errorCalc->currentText(); + $All{"go"}=$All{"ErrorCalc"}; + + RunSelectionToggle(); + my @RUNS = (); + if ($All{"RUNSType"} ) { + @RUNS = split( /,/, $All{"RunFiles"}); + } else { + $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; + @RUNS = split( /,/, $All{"RunNumbers"} ); + } + +# From MSR File Tab + $All{"TITLE"}= this->{ui}->title->text; + $All{"FILENAME"}= this->{ui}->fileName->text; + +# From Fourier Tab + $All{"FUNITS"}= this->{ui}->fUnits->currentText; + $All{"FAPODIZATION"}= this->{ui}->fapodization->currentText; + $All{"FPLOT"}= this->{ui}->fplot->currentText; + $All{"FPHASE"}=this->{ui}->fphase->text; +# Fourier range + $All{"FrqMin"}=this->{ui}->frqMin->text; + $All{"FrqMax"}=this->{ui}->frqMax->text; + +# Rotating reference frame parameters + $All{"RRFFrq"}=this->{ui}->rrfFrq->text; + $All{"RRFPack"}=this->{ui}->rrfPack->text; + $All{"RRFPhase"}=this->{ui}->rrfPhase->text; + $All{"RRFUnits"}=this->{ui}->rrfUnits->currentText; + +# Get values of t0 and Bg/Data bins if given + my $NHist = 1; + foreach my $Hist (@Hists) { + foreach ("t0","Bg1","Bg2","Data1","Data2") { + my $Name = "$_$NHist"; + $All{$Name}=child($Name)->text; +# TODO: If empty fill with defaults + if ($All{$Name} eq "") { + $All{$Name}=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); + child($Name)->setText($All{$Name}); + } + } + $NHist++; + } + +# 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,"MolMag", + 14,"Meissner", + 15,"LGKT", + 16,"LGKTExp", + 17,"LGKTSExp", + 18,"None" + ); + + my $FT1=this->{ui}->fitType1->currentItem; + my $FT2=this->{ui}->fitType2->currentItem; + my $FT3=this->{ui}->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; + +# Functions block + $All{"FunctionsBlock"}=this->{ui}->functionsBlock->text; +# and the associated theory block + $All{"Func_T_Block"}=this->{ui}->theoryBlock->text; + +# Shared settings are detected here + $All{"EnableSharing"} = this->{ui}->buttonGroupSharing->isChecked(); + + 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, ( "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; +# TODO: I need to take care of single hist fits here + if ( $All{"FitAsyType"} eq "SingleHist" ) { + $Param=$Param.$Hists[0]; + } + if ( $#FitTypes != 0 && ( $Param ne "Alpha" && $Param ne "No" && $Param ne "NBg" ) ){ + $Param = join( "", $Param, "_", $Component); + } + +# Is there any point of sharing, multiple runs? + if ( $#RUNS == 0 && $All{"FitAsyType"} eq "Asymmetry") { + $Shared = 1; + } + elsif ( $#RUNS == 0 && $#Hists == 0 && $All{"FitAsyType"} eq "SingleHist" ) { + $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{"RUNSType"}) { + $All{"FILENAME"}=$RUNS[0]."_".$All{"BeamLine"}."_".$All{"YEAR"}; + if ($All{"BeamLine"} eq "LEM (PPC)") { + $All{"FILENAME"}=$RUNS[0]."_LEM_".$All{"YEAR"}; + } + } else { + $All{"FILENAME"}="TMP"; + } + + +# This has to be at the end of CreateAll + my %PTable=MSR::PrepParamTable(\%All); + +# Setup the table with the right size + my $NParam=scalar keys( %PTable ); + +# Read initial values of paramets from tabel + my $erradd = "d"; + my $minadd = "_min"; + my $maxadd = "_max"; + my $Header=this->{ui}->initParamTable->verticalHeader(); +# TODO: Should not go over all rows, only on parameters. + if ($NParam > 0) { + for (my $i=0;$i<$NParam;$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*this->{ui}->initParamTable->item($i,0)->text($i,0); + $All{"$erradd$Param"}=1.0*this->{ui}->initParamTable->item($i,1)->text($i,1); + $All{"$Param$minadd"}=1.0*this->{ui}->initParamTable->item($i,2)->text($i,2); + $All{"$Param$maxadd"}=1.0*this->{ui}->initParamTable->item($i,3)->text($i,3); + } + } + + +# Return Hash with all important values + return %All; +} + +sub CallMSRCreate() +{ + use MSR; + my %All=CreateAllInput(); + +# Check if the option for checking for existing files is selected + my $FileExistCheck= this->{ui}->fileExistCheck->isOn(); + my $FILENAME=$All{"FILENAME"}.".msr"; + my $Answer=0; + if ($All{"RunNumbers"} ne "" || $All{"RunFiles"} ne "") { + if ( $FileExistCheck==1 ) { + if (-e $FILENAME) { +# Warning: MSR file exists +# my $Warning = "Warning: MSR file $FILENAME Already exists!\nIf you continue it will overwriten."; + my $Warning = "Warning: MSR file $FILENAME Already exists!\nDo you want to overwrite it?"; +# my $WarningWindow = Qt::MessageBox::information( this, "Warning",$Warning); +# $Answer =1,0 for yes and no + $Answer= Qt::MessageBox::warning( this, "Warning",$Warning, "&No", "&Yes", undef, 1,1); + } + } else { +# Just overwrite file + $Answer=1; + } + + if ($Answer) { + if ( $All{"FitAsyType"} eq "Asymmetry" ) { + if ($All{"RUNSType"}) { + my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSR(\%All); +# Open output file FILENAME.msr + open( OUTF,q{>},"$FILENAME" ); + 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"}; + if ($All{"BeamLine"} eq "LEM (PPC)") { + $Extension = "_LEM_".$All{"YEAR"}; + } + + if (-e $FILENAME) { + my $RUN0 = $FILENAME; + $RUN0 =~ s/$Extension//g; + $RUN0 =~ s/.msr//g; + my $cmd = $All{"RunNumbers"}; + $cmd =~ s/,/ /g; + $cmd = "msr2data \[".$cmd."\] ".$Extension." msr-".$RUN0." global"; + $cmd = $cmd."; mv $RUN0+global$Extension.msr ".$FILENAME; + print $cmd."\n"; + my $pid = open(FTO,"$cmd 2>&1 |"); + while () { + this->{ui}->fitTextOutput->append("$_"); + } + close(FTO); + } + } + } + elsif ( $All{"FitAsyType"} eq "SingleHist" ) { + my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSRSingleHist(\%All); +# Open output file FILENAME.msr + open( OUTF,q{>},"$FILENAME" ); + print OUTF ("$FullMSRFile"); + close(OUTF); + } + UpdateMSRFileInitTable(); + } + } + return $Answer; +} + +sub UpdateMSRFileInitTable() +{ + my %All=CreateAllInput(); + my $FILENAME=$All{"FILENAME"}; + open (MSRF,q{<},"$FILENAME.msr" ); + my @lines = ; + close(IFILE); + this->{ui}->textMSROutput->setText(""); + foreach my $line (@lines) { + this->{ui}->textMSROutput->append("$line"); + } + + (my $TBlock_ref, my $FPBlock_ref)=MSR::ExtractBlks(@lines); + my @FPBloc = @$FPBlock_ref; + + my $PCount=0; + foreach my $line (@FPBloc) { + $PCount++; + my @Param=split(/\s+/,$line); + +# Depending on how many elements in @Param determine what they mean +# 0th element is empty (always) +# 1st element is the order (always) +# 2nd element is the name (always) +# 3rd element is the value (always) +# 4th element can be taken as step/error (always) +# 5th element can be +# if it is last element or there are two more = positive error, check $#Param=5/7 +# if there is only one more = minimum, check $#Param=6 + +# To summarize, check the value of $#Param + my $value=1.0*$Param[3]; + my $error = 1.0*$Param[4]; + my $minvalue=0.0; + my $maxvalue=0.0; + if ($#Param == 4) { + $minvalue=0.0; + $maxvalue=0.0; + } + elsif ($#Param == 6) { + $minvalue=1.0*$Param[5]; + $maxvalue=1.0*$Param[6]; + } + elsif ($#Param == 5 || $#Param == 7) { + $minvalue=1.0*$Param[6]; + $maxvalue=1.0*$Param[7]; + } +# Now update the initialization tabel + this->{ui}->initParamTable->setText($PCount-1,0,$value); + this->{ui}->initParamTable->setText($PCount-1,1,$error); + this->{ui}->initParamTable->setText($PCount-1,2,$minvalue); + this->{ui}->initParamTable->setText($PCount-1,3,$maxvalue); +# Set bg color to mark different runs + } + return; +} + +sub ActivateT0Hists() +{ + my %All=CreateAllInput(); + my @Hists = split(/,/, $All{"LRBF"} ); + my $HistBox = ""; + for (my $iHist=1; $iHist<=4; $iHist++) { + $HistBox="groupHist$iHist"; + my $HistBoxHandle = child($HistBox); + if ($iHist<=$#Hists+1) { +# Activate this histogram box + $HistBoxHandle->setHidden(0); + $HistBoxHandle->setEnabled(1); + $HistBoxHandle->setTitle("Hist # $Hists[$iHist-1]"); + } else { +# Deactivate this histogram box + $HistBoxHandle->setHidden(1); + $HistBoxHandle->setEnabled(0); + } + } + +# TODO: Set default values + +} + +sub ActivateShComp() +{ + my %All=CreateAllInput(); + my @RUNS = split( /,/, $All{"RunNumbers"} ); + +# Hide all sharing components + this->{ui}->sharingComp1->setHidden(1); + this->{ui}->sharingComp2->setHidden(1); + this->{ui}->sharingComp3->setHidden(1); + this->{ui}->sharingComp1->setEnabled(0); + this->{ui}->sharingComp2->setEnabled(0); + this->{ui}->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; + $Full_T_Block= $All{"Full_T_Block"}; + +# Possible to share only if sharing is enabled altogether + my $EnableSharing = $All{"EnableSharing"}; + if ($EnableSharing) { + 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, ( "No", "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<=9;$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++; + } + } +} + +sub InitializeTab() +{ + my %All=CreateAllInput(); + this->{ui}->initParamTable->setLeftMargin(100); + my $NRows = this->{ui}->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. + this->{ui}->initParamTable->hideRow($i); +# this->{ui}->initParamTable->removeRow($i); + } + } + + my %PTable=MSR::PrepParamTable(\%All); + +# Setup the table with the right size + my $NParam=scalar keys( %PTable ); + if ($NParam>$NRows) { + this->{ui}->initParamTable->setNumRows($NParam); + } + +# Fill the table with labels and values of parametr + for (my $PCount=0;$PCount<$NParam;$PCount++) { + my ($Param,$value,$error,$minvalue,$maxvalue,$RUN) = split(/,/,$PTable{$PCount}); +# Now make sure we have no nans + if ($error eq "nan") { $error=0.1;} +# If you use this then reading the parameters from the table is a problem +# You need to extract the correct parameter name from the row label +# this->{ui}->initParamTable->verticalHeader()->setLabel( $PCount,"$RUN: $Param"); + this->{ui}->initParamTable->verticalHeader()->setLabel( $PCount,"$Param"); + this->{ui}->initParamTable->showRow($PCount); + this->{ui}->initParamTable->setText($PCount,0,$value); + this->{ui}->initParamTable->setText($PCount,1,$error); + this->{ui}->initParamTable->setText($PCount,2,$minvalue); + this->{ui}->initParamTable->setText($PCount,3,$maxvalue); + } +} + +sub TabChanged() +{ +# TODO: First check if there are some runs given, otherwise disbale + my %All=CreateAllInput(); + +# First make sure we have sharing initialized + ActivateShComp(); +# Here we need to apply sharing if selected... + InitializeTab(); + UpdateMSRFileInitTable(); +# And also setup T0 and Bg bins + ActivateT0Hists(); + +# Initialize FUNCTIONS block only if it has not been initialized yet + if ($All{"Func_T_Block"} eq "" ) { + InitializeFunctions(); + } +} + + +sub GoFit() +{ + my %All=CreateAllInput(); +# Check here is the number of histograms makes sense +# other wise give error. + my @Hists = split( /,/, $All{"LRBF"} ); + if ($All{"FitAsyType"} eq "Asymmetry" && $#Hists != 1) { +# we have a problem here send error message + my $Warning = "Error: The number of histograms should be 2 for an asymmetry fit!"; + my $WarningWindow = Qt::MessageBox::information( this, "Error",$Warning); + } else { + this->{ui}->musrfit_tabs->setCurrentPage(1); + my $Answer=CallMSRCreate(); + if ($Answer) { + my $FILENAME=$All{"FILENAME"}.".msr"; + if (-e $FILENAME) { + my $cmd="musrfit -t $FILENAME"; + my $pid = open(FTO,"$cmd 2>&1 |"); + while () { + this->{ui}->fitTextOutput->append("$_"); + } + close(FTO); + $cmd="musrview $FILENAME &"; + $pid = system($cmd); + } else { + this->{ui}->fitTextOutput->append("Cannot find MSR file!"); + } + this->{ui}->fitTextOutput->append("-----------------------------------------------------------------------------------------------------------------------------"); +# update MSR File tab and initialization table + UpdateMSRFileInitTable(); + } + } + return; +} + +sub GoPlot() +{ + my %All=CreateAllInput(); +# Check here is the number of histograms makes sense +# other wise give error. + my @Hists = split( /,/, $All{"LRBF"} ); + if ($All{"FitAsyType"} eq "Asymmetry" && $#Hists != 1) { +# we have a problem here send error message + my $Warning = "Error: The number of histograms should be 2 for an asymmetry fit!"; + my $WarningWindow = Qt::MessageBox::information( this, "Error",$Warning); + } else { + my $Answer=CallMSRCreate(); + my $FILENAME=$All{"FILENAME"}.".msr"; + if ($Answer) { + if (-e $FILENAME) { + my $cmd="musrview $FILENAME &"; + my $pid = system($cmd); + } else { + this->{ui}->fitTextOutput->append("Cannot find MSR file!"); + this->{ui}->fitTextOutput->append("-----------------------------------------------------------------------------------------------------------------------------"); + } + } + } + return; +} + + +sub ShowMuSRT0() +{ + my %All=CreateAllInput(); + this->{ui}->musrfit_tabs->setCurrentPage(6); +# Create MSR file and then run musrt0 + my $Answer=CallMSRCreate(); + + if ($Answer) { + my $FILENAME=$All{"FILENAME"}.".msr"; + if (-e $FILENAME) { + my $cmd="musrt0 $FILENAME &"; + my $pid = system($cmd); + this->{ui}->t0Update->setEnabled(1) + } else { + print STDERR "Cannot find MSR file!\n"; + } + } + return; +} + + +sub T0Update() +{ + my %All = CreateAllInput(); + my @Hists = split(/,/, $All{"LRBF"} ); + +# Get values of t0 and Bg/Data bins if given + my $NHist = 1; + foreach my $Hist (@Hists) { + foreach ("t0","Bg1","Bg2","Data1","Data2") { + my $Name = "$_$NHist"; + my $tmp=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); + child($Name)->setText($tmp); + } + $NHist++ + } + +} + + +sub RunSelectionToggle() +{ + my $ManualFile= this->{ui}->manualFile->isChecked(); + if ($ManualFile) { +# Manual RUN selection + this->{ui}->runsMan->setEnabled(1); + this->{ui}->runsMan->setHidden(0); + this->{ui}->runNumbers->setText(""); + this->{ui}->runsAuto->setEnabled(0); + this->{ui}->runsAuto->setHidden(1); + } else { +# Auto RUN selection + this->{ui}->runsMan->setEnabled(0); + this->{ui}->runsMan->setHidden(1); + this->{ui}->runFiles->setText(""); + this->{ui}->runsAuto->setEnabled(1); + this->{ui}->runsAuto->setHidden(0); + } + +} + +sub fileBrowse() +{ + my $RunFiles=this->{ui}->runFiles->text(); + print "Runs:$RunFiles\n"; + my $files_ref=Qt::FileDialog::getOpenFileNames( + "Data files (*.root *.bin)", + "./", + this, + "open files dialog", + "Select one or more files to fit"); + my @files = @$files_ref; + if ($RunFiles eq "") { +# We started with an empty list + $RunFiles=join(",",@files); + } else { +# Add files to existing list + $RunFiles=join(",",$RunFiles,@files); + } + this->{ui}->runFiles->setText($RunFiles); +} + +sub AppendToFunctions() +{ + my $ParName=this->{ui}->cParamsCombo->currentText(); + my $Full_T_Block=this->{ui}->theoryBlock->text; + my $Constraint=this->{ui}->constraintLine->text; +# Then clear the text + this->{ui}->constraintLine->setText(""); + +# Check how many constraints (lines) in FUNCTIONS Block + my $i=this->{ui}->functionsBlock->lines(); + my $ConstLine="fun$i = $Constraint\n"; + this->{ui}->functionsBlock->append($ConstLine); + +# Replace parameter in theory block with fun$i + $Full_T_Block=~ s/$ParName/fun$i/; + this->{ui}->theoryBlock->setText($Full_T_Block); +} + +sub InitializeFunctions() +{ + 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 ); + } + } + +# Get number of parameters to determine the size of the table + my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateTheory(@FitTypes); + my @Paramcomp = @$Paramcomp_ref; + $Full_T_Block= $All{"Full_T_Block"}; + +# Initialize Parameters List in function block (constraints). + my $ParametersList=""; + this->{ui}->parametersList->setText(""); +# Counter for function block (with out Alpha etc.) + my $ParCount=0; + this->{ui}->cParamsCombo->clear(); + +# Possibly use the parameters block to axtract names for the dropdown menu +# this makes sense if we can use fun in map line. Check! + my $Component=1; + foreach my $FitType (@FitTypes) { + my $Parameters=$Paramcomp[$Component-1]; + my @Params = split( /\s+/, $Parameters ); + +# Alpha, No and NBg are counted in the parameters + if ( $Component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) { + unshift( @Params, "Alpha" ); + } + elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { + unshift( @Params, ( "No", "NBg" ) ); + } + +# Add list to the constraints drop down menu + for (my $i=1; $i<=9;$i++) { + my $CParam = $Params[$i-1]."_".$Component; + if ($Params[$i-1] ne "" ) { + if ($Params[$i-1] ne "Alpha" && $Params[$i-1] ne "No" && $Params[$i-1] ne "NBg") { + this->{ui}->cParamsCombo->insertItem($CParam,-1); + $Full_T_Block=~ s/\b$Params[$i-1]\b/$CParam/; + } +# also enumerate the parameters as should be used in the FUNCTIONS Block + $ParCount++; + $ParametersList=$ParametersList."$CParam \t is \t par$ParCount\n"; + this->{ui}->parametersList->setText($ParametersList); + } + } + $Component++; + } +# Set theory block in Constraints + this->{ui}->theoryBlock->setText($Full_T_Block); +# Then clear the text + this->{ui}->constraintLine->setText(""); + this->{ui}->functionsBlock->setText(""); +} + + + + +sub t0UpdateClicked() +{ +# Read MSR file and get new values of t0,Bg and Data + my %All=CreateAllInput(); + my $FILENAME=$All{"FILENAME"}; + open (MSRF,q{<},"$FILENAME.msr" ); + my @lines = ; + close(IFILE); + + my @T0s = grep {/t0 /} @lines; + my @Bgs = grep {/background /} @lines; + my @Datas = grep {/data /} @lines; + + my @Hists = split(/,/, $All{"LRBF"} ); + my $NHist = $#Hists+1; + print "Histograms: $NHist\n"; + + my $FinHist = 1; +# First T0s + while ($FinHist) { + my $counter=0; + (my $tmp,my @SplitT0) = split( /\s+/, $T0s[$counter]); + ($tmp,my @SplitBg) = split( /\s+/, $Bgs[$counter]); + ($tmp,my @SplitData) = split( /\s+/, $Datas[$counter]); + if ($#SplitBg>0) { + foreach (@SplitBg) { + print $_."\n"; + } + } + $counter++; + if ($counter>=$#Bgs) {$FinHist=0;} + } + +# Finally, disable the update button + this->{ui}->t0Update->setEnabled(0); +# t0Update->setText("musrt0") +} + +1; diff --git a/src/external/MuSRFitGUI/MuSRFit4.ui b/src/external/MuSRFitGUI/MuSRFit4.ui new file mode 100644 index 00000000..5fcc65ea --- /dev/null +++ b/src/external/MuSRFitGUI/MuSRFit4.ui @@ -0,0 +1,5884 @@ + + + MuSRFit4 + + + + 0 + 0 + 830 + 726 + + + + + 1 + 1 + + + + + 582 + 505 + + + + MuSRFit GUI + + + + icos/MuSRFit.pngicos/MuSRFit.png + + + MuSRFitGUI + + + + + + + true + + + + 1 + 1 + + + + + 560 + 400 + + + + + 32767 + 32767 + + + + 0 + + + + RUNS + + + + + 10 + 380 + 581 + 31 + + + + + 0 + + + QLayout::SetMinimumSize + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 81 + 21 + + + + + + + + + 0 + 0 + + + + Fit type + + + false + + + + + + + + 0 + 0 + + + + + Asymmetry + + + + + SingleHist + + + + + + + + + 0 + 0 + + + + Histograms list + + + false + + + + + + + + 0 + 0 + + + + 1 5,3 7 + + + + + + + + + 1 + 13 + 811 + 361 + + + + + QLayout::SetMinimumSize + + + + + + 0 + 0 + + + + RUN Numbers + + + + + 10 + 20 + 771 + 48 + + + + + 0 + + + + + + 0 + 0 + + + + + 0 + 20 + + + + false + + + QComboBox::InsertAtTop + + + true + + + false + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + Year + + + false + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + On beam line + + + false + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + LEM + + + + + GPS + + + + + Dolly + + + + + LTF + + + + + LEM (PPC) + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 181 + 21 + + + + + + + + + 0 + 0 + + + + + 0 + 23 + + + + Numbers of RUNs to fit. Multiple runs are comma separated. + + + Numbers of RUNs to fit. Multiple runs are comma separated. + + + + + + + + + + + + 0 + 0 + + + + RUN Files + + + + + 10 + 20 + 771 + 52 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 411 + 21 + + + + + + + + true + + + + 0 + 0 + + + + + 0 + 23 + + + + Names of data files to be fit. Multiple data files are comma separated. + + + Names of data files to be fit. Multiple data files are comma separated. + + + + + + + true + + + + 0 + 0 + + + + + 0 + 20 + + + + Browse to select data files for fitting. + + + Browse to select data files for fitting. + + + Browse + + + + + + + + + + + + 0 + 0 + + + + Theory Function + + + + + 10 + 20 + 773 + 95 + + + + + QLayout::SetMinimumSize + + + 0 + + + 0 + + + + + + 0 + 0 + + + + 18 + + + + Exponential + + + + + Gaussian + + + + + Stretch Exp. + + + + + Exponential Cos + + + + + Gaussian Cos + + + + + Stretch Cos + + + + + Lorentzian Dynamic KT + + + + + Gaussian Dynamic KT + + + + + Background + + + + + Lorentzian Kubo-Toyabe LF x Exp + + + + + Gaussian Kubo-Toyabe LF x Exp + + + + + Lorentzian Kubo-Toyabe LF x Str Exp + + + + + Gaussian Kubo-Toyabe LF x Str Exp + + + + + MolMag + + + + + Meissner State Model + + + + + Lor-Gss combi KT + + + + + Lor-Gss combi KT x Exp + + + + + Lor-Gss combi KT x SExp + + + + + None + + + + + + + + + 0 + 0 + + + + Final Time + + + false + + + tfs + + + + + + + + 0 + 0 + + + + false + + + false + + + + Exponential + + + + + Gaussian + + + + + Stretch Exp. + + + + + Exponential Cos + + + + + Gaussian Cos + + + + + Stretch Cos + + + + + Lorentzian Dynamic KT + + + + + Gaussian Dynamic KT + + + + + Background + + + + + Lorentzian Kubo-Toyabe LF x Exp + + + + + Gaussian Kubo-Toyabe LF x Exp + + + + + Lorentzian Kubo-Toyabe LF x Str Exp + + + + + Gaussian Kubo-Toyabe LF x Str Exp + + + + + MolMag + + + + + Meissner State Model + + + + + Lor-Gss combi KT + + + + + Lor-Gss combi KT x Exp + + + + + Lor-Gss combi KT x SExp + + + + + + + + + 0 + 0 + + + + 100 + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + Third Component + + + false + + + fitType1 + + + + + + + + 0 + 0 + + + + 0 + + + + + + + + 0 + 0 + + + + 8 + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + First Component + + + false + + + fitType1 + + + + + + + + 0 + 0 + + + + Binning Factor + + + false + + + bins + + + + + + + + 0 + 0 + + + + Initial Time + + + false + + + tis + + + + + + + + 0 + 0 + + + + 18 + + + + Exponential + + + + + Gaussian + + + + + Stretch Exp. + + + + + Exponential Cos + + + + + Gaussian Cos + + + + + Stretch Cos + + + + + Lorentzian Dynamic KT + + + + + Gaussian Dynamic KT + + + + + Background + + + + + Lorentzian Kubo-Toyabe LF x Exp + + + + + Gaussian Kubo-Toyabe LF x Exp + + + + + Lorentzian Kubo-Toyabe LF x Str Exp + + + + + Gaussian Kubo-Toyabe LF x Str Exp + + + + + MolMag + + + + + Meissner State Model + + + + + Lor-Gss combi KT + + + + + Lor-Gss combi KT x Exp + + + + + Lor-Gss combi KT x SExp + + + + + None + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + Second Component + + + false + + + fitType1 + + + + + + + + + + runsAuto + groupBox + layoutWidget + runsMan + + + + Fitting + + + + + + + + + + + HESSE + + + + + MINOS + + + + + + + + Life time correction + + + true + + + + + + + X Range + + + false + + + + + + + View Binning + + + false + + + + + + + + + + + + + + + + Y Range + + + false + + + + + + + + + + + + + + MINIMIZE + + + + + MIGRAD + + + + + SIMPLEX + + + + + + + + Minimization type + + + false + + + + + + + Error estimation + + + false + + + + + + + + + + + + + + + Sharing + + + + + + + 0 + 0 + + + + Shared parameters among different runs + + + Qt::AlignLeading + + + true + + + false + + + + false + + + + 199 + 20 + 162 + 330 + + + + + 0 + 0 + + + + 2nd Component + + + + + 2 + 30 + 185 + 20 + + + + FitType2 + + + false + + + + + + 40 + 60 + 81 + 266 + + + + + 0 + + + 0 + + + + + Param1 + + + + + + + Param2 + + + + + + + Param3 + + + + + + + Param4 + + + + + + + Param5 + + + + + + + false + + + Param6 + + + false + + + + + + + false + + + Param7 + + + false + + + + + + + false + + + Param8 + + + false + + + + + + + false + + + Param9 + + + false + + + + + + + + + false + + + + 367 + 20 + 162 + 330 + + + + + 0 + 0 + + + + 3rd Component + + + Qt::AlignJustify|Qt::AlignVCenter + + + + + 2 + 30 + 185 + 20 + + + + FitType3 + + + false + + + + + + 41 + 58 + 81 + 266 + + + + + + + Param1 + + + + + + + Param2 + + + + + + + Param3 + + + + + + + Param4 + + + + + + + Param5 + + + + + + + false + + + Param6 + + + false + + + + + + + false + + + Param7 + + + false + + + + + + + false + + + Param8 + + + false + + + + + + + false + + + Param9 + + + false + + + + + + + + + false + + + + 31 + 20 + 162 + 330 + + + + + 0 + 0 + + + + 1st Component + + + Qt::AlignLeading + + + + + 40 + 60 + 81 + 266 + + + + + 0 + + + 0 + + + + + Param1 + + + + + + + Param2 + + + + + + + Param3 + + + + + + + Param4 + + + + + + + false + + + Param5 + + + false + + + + + + + false + + + Param6 + + + false + + + + + + + false + + + Param7 + + + false + + + + + + + false + + + Param8 + + + false + + + + + + + false + + + Param9 + + + false + + + + + + + + + 2 + 30 + 185 + 20 + + + + FitType1 + + + false + + + + + + + + + + Initialization + + + + + + 1 + + + 4 + + + false + + + false + + + true + + + false + + + + Alpha + + + + + Value + + + + + Error + + + + + Min + + + + + Max + + + + + + + + + MSR File + + + + + + 0 + + + + + + 0 + 0 + + + + + + + + + + + + + 0 + 0 + + + + Enter the label (defaul is run title from the first run) + + + false + + + title + + + + + + + + 1 + 1 + + + + Title line for MSR file (optional) + + + Title line for MSR file (optional) + + + + + + + + + + + + Enter [name] for output [name].msr file (optional) + + + false + + + fileName + + + + + + + + 0 + 0 + + + + Name of the produced MSR file (optional) + + + Name of the produced MSR file (optional) + + + + + + + + + + + + + + true + + + + + + + + + + FFT/RRF + + + + + + + 0 + 0 + + + + Fourier transform parameters + + + + + 12 + 19 + 510 + 117 + + + + + 5 + + + 5 + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + MHz + + + + + Gauss + + + + + Mc/s + + + + + + + + + 0 + 0 + + + + + power + + + + + real + + + + + imag + + + + + real_and_imag + + + + + phase + + + + + + + + + + + false + + + + + + + Phase: + + + false + + + + + + + Plot + + + false + + + + + + + + + + false + + + + + + + + 0 + 0 + + + + + STRONG + + + + + MEDIUM + + + + + WEAK + + + + + NONE + + + + + + + + Apodization + + + false + + + + + + + + + + false + + + + + + + to + + + false + + + + + + + + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + false + + + + + + + + + + false + + + + + + + + 0 + 0 + + + + + + + + Range: from + + + false + + + + + + + Units + + + + + + + + + + + + 0 + 0 + + + + Rotatting reference frame (RRF) parameters + + + + + 10 + 18 + 265 + 100 + + + + + 5 + + + 5 + + + + + Phase + + + false + + + + + + + Frequency + + + false + + + + + + + + + + false + + + + + + + + + + + + + + + + + false + + + + + + + + + + Packing + + + false + + + + + + + + MHz + + + + + kHz + + + + + Mc/s + + + + + G + + + + + T + + + + + + + + + + + + + + + + t0/Bg + + + + + + + + + 1 + 1 + + + + + 0 + 0 + + + + + + + + + 5 + 18 + 100 + 150 + + + + + + + t0 + + + false + + + + + + + Bg1 + + + false + + + + + + + Bg2 + + + false + + + + + + + Data 1 + + + false + + + + + + + Data 2 + + + false + + + + + + + + + + + + 1 + 1 + + + + + 0 + 0 + + + + Hist1 + + + + + 8 + 17 + 75 + 150 + + + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + true + + + + 1 + 1 + + + + Hist2 + + + + + 8 + 17 + 75 + 150 + + + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + true + + + + 1 + 1 + + + + Hist3 + + + + + 8 + 17 + 75 + 150 + + + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + true + + + + 1 + 1 + + + + Hist4 + + + + + 8 + 17 + 75 + 150 + + + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 461 + 20 + + + + + + + + false + + + + 0 + 0 + + + + Use musrt0 to set values + + + Update + + + + + + + + + + Constraints + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + THEORY Block + + + false + + + + + + + true + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + Parameters List + + + false + + + + + + + true + + + + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + = + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + + + + + 0 + 0 + + + + Add + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + FUNCTIONS Block + + + false + + + + + + + + + + + + + + + false + + + + + + + + 100 + 32767 + + + + Reset + + + + + + + + + + + + + + + + true + + + + 0 + 0 + 830 + 20 + + + + + &File + + + + + + + + + Actions + + + + + + + + Parameters + + + + + + + Options + + + + + + + &Help + + + + + + + + + + + + + File Menu + + + TopToolBarArea + + + false + + + + + + + + Actions Menu + + + TopToolBarArea + + + false + + + + + + + + + + + icos/save.pngicos/save.png + + + &Save MSR... + + + &Save MSR... + + + &Save MSR + + + Ctrl+S + + + + + + icos/exit.pngicos/exit.png + + + E&xit + + + Exit + + + + + + + + &About + + + About + + + + + + + + true + + + false + + + Overwrite MSR File + + + Overwrite MSR File + + + Enable overwriting MSR files + + + Enable/Disable checking for MSR files. + + + + + true + + + Maual file selection + + + Maual file selection + + + + + + icos/chdir.pngicos/chdir.png + + + &Change dir + + + &Change dir + + + Ctrl+C + + + + + new item + + + new item + + + + + + icos/Export.pngicos/Export.png + + + &Export As... + + + Export As... + + + Alt+E + + + + + + icos/Append.pngicos/Append.png + + + &Append To... + + + Append To... + + + Alt+A + + + + + + icos/Fit.pngicos/Fit.png + + + Fit and Plot + + + Ctrl+F + + + + + false + + + + icos/Plot.pngicos/Plot.png + + + Plot + + + Ctrl+P + + + + + + icos/T0.pngicos/T0.png + + + Show t0 and Bg Bins + + + Ctrl+T + + + + + true + + + Fourier + + + Fourier + + + + + true + + + T0 and Bg bins + + + T0 and Bg bins + + + + + + musrfit_tabs + runNumbers + beamLine + year + runFiles + browse + fitType1 + tis + fitType2 + tfs + fitType3 + bins + fitAsyType + histsLRBF + minimization + errorCalc + ltc + xi + yi + xf + yf + viewBin + fitTextOutput + buttonGroupSharing + shParam_1_1 + shParam_1_2 + shParam_1_3 + shParam_1_4 + shParam_1_5 + shParam_1_6 + shParam_1_7 + shParam_1_8 + shParam_1_9 + shParam_2_1 + shParam_2_2 + shParam_2_3 + shParam_2_4 + shParam_2_5 + shParam_2_6 + shParam_2_7 + shParam_2_8 + shParam_2_9 + shParam_3_1 + shParam_3_2 + shParam_3_3 + shParam_3_4 + shParam_3_5 + shParam_3_6 + shParam_3_7 + shParam_3_8 + shParam_3_9 + initParamTable + title + fileName + textMSROutput + fapodization + fplot + fphase + rrfFrq + rrfUnits + rrfPack + rrfPhase + t01 + bg11 + bg21 + data11 + data21 + t02 + bg12 + bg22 + data12 + data22 + t03 + bg13 + bg23 + data13 + data23 + t04 + bg14 + bg24 + data14 + data24 + theoryBlock + parametersList + cParamsCombo + constraintLine + addConstraint + functionsBlock + resetFunc + t0Update + + + + + fit + activated() + MuSRFit4 + GoFit() + + + -1 + -1 + + + 20 + 20 + + + + + parametersAppend_ToAction + activated() + MuSRFit4 + parametersAppend() + + + -1 + -1 + + + 20 + 20 + + + + + parametersExport_AsAction + activated() + MuSRFit4 + parametersExport() + + + -1 + -1 + + + 20 + 20 + + + + + fileChangeDirAction + activated() + MuSRFit4 + fileChangeDir() + + + -1 + -1 + + + 20 + 20 + + + + + fileSaveAction + activated() + MuSRFit4 + fileSave() + + + -1 + -1 + + + 20 + 20 + + + + + fileExitAction + activated() + MuSRFit4 + fileExit() + + + -1 + -1 + + + 20 + 20 + + + + + helpAboutAction + activated() + MuSRFit4 + helpAbout() + + + -1 + -1 + + + 20 + 20 + + + + + t0 + activated() + MuSRFit4 + ShowMuSRT0() + + + -1 + -1 + + + 20 + 20 + + + + + plot + activated() + MuSRFit4 + GoPlot() + + + -1 + -1 + + + 20 + 20 + + + + + resetFunc + clicked() + MuSRFit4 + InitializeFunctions() + + + 732 + 705 + + + 20 + 20 + + + + + addConstraint + clicked() + MuSRFit4 + AppendToFunctions() + + + 782 + 379 + + + 20 + 20 + + + + + buttonGroupSharing + toggled(bool) + MuSRFit4 + ActivateShComp() + + + 28 + 98 + + + 20 + 20 + + + + + musrfit_tabs + currentChanged(int) + MuSRFit4 + TabChanged() + + + 24 + 74 + + + 20 + 20 + + + + + t0Update + clicked() + MuSRFit4 + t0UpdateClicked() + + + 761 + 693 + + + 20 + 20 + + + + + buttonGroupSharing + toggled(bool) + MuSRFit4 + ActivateShComp() + + + 28 + 98 + + + 20 + 20 + + + + + menuBar + triggered(QAction*) + MuSRFit4 + RunSelectionToggle() + + + 213 + 10 + + + 832 + 305 + + + + + + t0UpdateClicked() + GoFit() + parametersAppend() + parametersExport() + fileChangeDir() + fileOpen() + fileSave() + filePrint() + fileExit() + helpAbout() + ShowMuSRT0() + GoPlot() + RunSelectionToggle() + InitializeFunctions() + AppendToFunctions() + ActivateShComp() + TabChanged() + + diff --git a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm new file mode 100644 index 00000000..7b5e0fca --- /dev/null +++ b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm @@ -0,0 +1,3353 @@ +############################################################################### +# +############################################################################### + +################################################################################# +## Form generated from reading UI file 'MuSRFit4.ui' +## +## Created: Mon Mar 20 16:58:34 2017 +## by: Qt User Interface Compiler version 4.8.6 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +package Ui_MuSRFit4; + +use strict; +use warnings; +use QtCore4; +use QtGui4; + +sub fileSaveAction { + return shift->{fileSaveAction}; +} + +sub fileExitAction { + return shift->{fileExitAction}; +} + +sub helpAboutAction { + return shift->{helpAboutAction}; +} + +sub fileExistCheck { + return shift->{fileExistCheck}; +} + +sub manualFile { + return shift->{manualFile}; +} + +sub fileChangeDirAction { + return shift->{fileChangeDirAction}; +} + +sub optionsnew_itemAction { + return shift->{optionsnew_itemAction}; +} + +sub parametersExport_AsAction { + return shift->{parametersExport_AsAction}; +} + +sub parametersAppend_ToAction { + return shift->{parametersAppend_ToAction}; +} + +sub fit { + return shift->{fit}; +} + +sub plot { + return shift->{plot}; +} + +sub t0 { + return shift->{t0}; +} + +sub optionsFourier { + return shift->{optionsFourier}; +} + +sub optionsT0 { + return shift->{optionsT0}; +} + +sub widget { + return shift->{widget}; +} + +sub gridLayout { + return shift->{gridLayout}; +} + +sub musrfit_tabs { + return shift->{musrfit_tabs}; +} + +sub runsPage { + return shift->{runsPage}; +} + +sub layoutWidget { + return shift->{layoutWidget}; +} + +sub _2 { + return shift->{_2}; +} + +sub spacer4 { + return shift->{spacer4}; +} + +sub fitAsyTypeLabel { + return shift->{fitAsyTypeLabel}; +} + +sub fitAsyType { + return shift->{fitAsyType}; +} + +sub histsLRBFLabel { + return shift->{histsLRBFLabel}; +} + +sub histsLRBF { + return shift->{histsLRBF}; +} + +sub widget1 { + return shift->{widget1}; +} + +sub verticalLayout { + return shift->{verticalLayout}; +} + +sub runsAuto { + return shift->{runsAuto}; +} + +sub layoutWidget_2 { + return shift->{layoutWidget_2}; +} + +sub runNumbers_2 { + return shift->{runNumbers_2}; +} + +sub year { + return shift->{year}; +} + +sub yearLabel { + return shift->{yearLabel}; +} + +sub beamLineLabel { + return shift->{beamLineLabel}; +} + +sub beamLine { + return shift->{beamLine}; +} + +sub spacer2 { + return shift->{spacer2}; +} + +sub runNumbers { + return shift->{runNumbers}; +} + +sub runsMan { + return shift->{runsMan}; +} + +sub layoutWidget_4 { + return shift->{layoutWidget_4}; +} + +sub runFiles_2 { + return shift->{runFiles_2}; +} + +sub spacer3 { + return shift->{spacer3}; +} + +sub runFiles { + return shift->{runFiles}; +} + +sub browse { + return shift->{browse}; +} + +sub groupBox { + return shift->{groupBox}; +} + +sub layoutWidget_3 { + return shift->{layoutWidget_3}; +} + +sub theoryFun { + return shift->{theoryFun}; +} + +sub fitType2 { + return shift->{fitType2}; +} + +sub tfsLabel { + return shift->{tfsLabel}; +} + +sub fitType1 { + return shift->{fitType1}; +} + +sub bins { + return shift->{bins}; +} + +sub comp3Label { + return shift->{comp3Label}; +} + +sub tis { + return shift->{tis}; +} + +sub tfs { + return shift->{tfs}; +} + +sub comp1Label { + return shift->{comp1Label}; +} + +sub binsLabel { + return shift->{binsLabel}; +} + +sub tisLabel { + return shift->{tisLabel}; +} + +sub fitType3 { + return shift->{fitType3}; +} + +sub comp2Label { + return shift->{comp2Label}; +} + +sub fittingPage { + return shift->{fittingPage}; +} + +sub gridLayout1 { + return shift->{gridLayout1}; +} + +sub fitGrid { + return shift->{fitGrid}; +} + +sub fitLayout { + return shift->{fitLayout}; +} + +sub errorCalc { + return shift->{errorCalc}; +} + +sub ltc { + return shift->{ltc}; +} + +sub textLabel1_4 { + return shift->{textLabel1_4}; +} + +sub textLabel1_4_2_2 { + return shift->{textLabel1_4_2_2}; +} + +sub xi { + return shift->{xi}; +} + +sub yf { + return shift->{yf}; +} + +sub viewBin { + return shift->{viewBin}; +} + +sub textLabel1_4_2 { + return shift->{textLabel1_4_2}; +} + +sub xf { + return shift->{xf}; +} + +sub yi { + return shift->{yi}; +} + +sub minimization { + return shift->{minimization}; +} + +sub textLabel1_5 { + return shift->{textLabel1_5}; +} + +sub textLabel1_5_2 { + return shift->{textLabel1_5_2}; +} + +sub fitTextOutput { + return shift->{fitTextOutput}; +} + +sub sharingPage { + return shift->{sharingPage}; +} + +sub gridLayout2 { + return shift->{gridLayout2}; +} + +sub buttonGroupSharing { + return shift->{buttonGroupSharing}; +} + +sub sharingComp2 { + return shift->{sharingComp2}; +} + +sub comp2ShLabel { + return shift->{comp2ShLabel}; +} + +sub layout13 { + return shift->{layout13}; +} + +sub vboxLayout { + return shift->{vboxLayout}; +} + +sub shParam_2_1 { + return shift->{shParam_2_1}; +} + +sub shParam_2_2 { + return shift->{shParam_2_2}; +} + +sub shParam_2_3 { + return shift->{shParam_2_3}; +} + +sub shParam_2_4 { + return shift->{shParam_2_4}; +} + +sub shParam_2_5 { + return shift->{shParam_2_5}; +} + +sub shParam_2_6 { + return shift->{shParam_2_6}; +} + +sub shParam_2_7 { + return shift->{shParam_2_7}; +} + +sub shParam_2_8 { + return shift->{shParam_2_8}; +} + +sub shParam_2_9 { + return shift->{shParam_2_9}; +} + +sub sharingComp3 { + return shift->{sharingComp3}; +} + +sub comp3ShLabel { + return shift->{comp3ShLabel}; +} + +sub layout15 { + return shift->{layout15}; +} + +sub vboxLayout1 { + return shift->{vboxLayout1}; +} + +sub shParam_3_1 { + return shift->{shParam_3_1}; +} + +sub shParam_3_2 { + return shift->{shParam_3_2}; +} + +sub shParam_3_3 { + return shift->{shParam_3_3}; +} + +sub shParam_3_4 { + return shift->{shParam_3_4}; +} + +sub shParam_3_5 { + return shift->{shParam_3_5}; +} + +sub shParam_3_6 { + return shift->{shParam_3_6}; +} + +sub shParam_3_7 { + return shift->{shParam_3_7}; +} + +sub shParam_3_8 { + return shift->{shParam_3_8}; +} + +sub shParam_3_9 { + return shift->{shParam_3_9}; +} + +sub sharingComp1 { + return shift->{sharingComp1}; +} + +sub layout14 { + return shift->{layout14}; +} + +sub vboxLayout2 { + return shift->{vboxLayout2}; +} + +sub shParam_1_1 { + return shift->{shParam_1_1}; +} + +sub shParam_1_2 { + return shift->{shParam_1_2}; +} + +sub shParam_1_3 { + return shift->{shParam_1_3}; +} + +sub shParam_1_4 { + return shift->{shParam_1_4}; +} + +sub shParam_1_5 { + return shift->{shParam_1_5}; +} + +sub shParam_1_6 { + return shift->{shParam_1_6}; +} + +sub shParam_1_7 { + return shift->{shParam_1_7}; +} + +sub shParam_1_8 { + return shift->{shParam_1_8}; +} + +sub shParam_1_9 { + return shift->{shParam_1_9}; +} + +sub comp1ShLabel { + return shift->{comp1ShLabel}; +} + +sub initializationPage { + return shift->{initializationPage}; +} + +sub gridLayout3 { + return shift->{gridLayout3}; +} + +sub initParamTable { + return shift->{initParamTable}; +} + +sub msrPage { + return shift->{msrPage}; +} + +sub gridLayout4 { + return shift->{gridLayout4}; +} + +sub vboxLayout3 { + return shift->{vboxLayout3}; +} + +sub groupTitle { + return shift->{groupTitle}; +} + +sub gridLayout5 { + return shift->{gridLayout5}; +} + +sub vboxLayout4 { + return shift->{vboxLayout4}; +} + +sub titleLabel { + return shift->{titleLabel}; +} + +sub title { + return shift->{title}; +} + +sub hboxLayout { + return shift->{hboxLayout}; +} + +sub fileNameLabel { + return shift->{fileNameLabel}; +} + +sub fileName { + return shift->{fileName}; +} + +sub textMSROutput { + return shift->{textMSROutput}; +} + +sub fourierPage { + return shift->{fourierPage}; +} + +sub gridLayout6 { + return shift->{gridLayout6}; +} + +sub fourierBox { + return shift->{fourierBox}; +} + +sub layout34 { + return shift->{layout34}; +} + +sub gridLayout7 { + return shift->{gridLayout7}; +} + +sub frqMax { + return shift->{frqMax}; +} + +sub funits { + return shift->{funits}; +} + +sub fplot { + return shift->{fplot}; +} + +sub textLabel1_3_8 { + return shift->{textLabel1_3_8}; +} + +sub textLabel1_7 { + return shift->{textLabel1_7}; +} + +sub fplotLabel { + return shift->{fplotLabel}; +} + +sub textLabel1_3_4 { + return shift->{textLabel1_3_4}; +} + +sub fapodization { + return shift->{fapodization}; +} + +sub fapodizationLabel { + return shift->{fapodizationLabel}; +} + +sub textLabel1_3_3 { + return shift->{textLabel1_3_3}; +} + +sub textLabel1_2 { + return shift->{textLabel1_2}; +} + +sub textLabel1_3_6 { + return shift->{textLabel1_3_6}; +} + +sub fphase { + return shift->{fphase}; +} + +sub textLabel1_3_5 { + return shift->{textLabel1_3_5}; +} + +sub textLabel1_3_7 { + return shift->{textLabel1_3_7}; +} + +sub frqMin { + return shift->{frqMin}; +} + +sub textLabel1 { + return shift->{textLabel1}; +} + +sub label { + return shift->{label}; +} + +sub rrfBox { + return shift->{rrfBox}; +} + +sub layout35 { + return shift->{layout35}; +} + +sub gridLayout8 { + return shift->{gridLayout8}; +} + +sub textLabel1_6_2_2 { + return shift->{textLabel1_6_2_2}; +} + +sub textLabel1_6 { + return shift->{textLabel1_6}; +} + +sub textLabel1_6_2_4 { + return shift->{textLabel1_6_2_4}; +} + +sub rrfFrq { + return shift->{rrfFrq}; +} + +sub textLabel1_6_2_3 { + return shift->{textLabel1_6_2_3}; +} + +sub rrfPack { + return shift->{rrfPack}; +} + +sub textLabel1_6_2 { + return shift->{textLabel1_6_2}; +} + +sub rrfUnits { + return shift->{rrfUnits}; +} + +sub rrfPhase { + return shift->{rrfPhase}; +} + +sub t0Page { + return shift->{t0Page}; +} + +sub gridLayout9 { + return shift->{gridLayout9}; +} + +sub hboxLayout1 { + return shift->{hboxLayout1}; +} + +sub groupHist0 { + return shift->{groupHist0}; +} + +sub layout16_2 { + return shift->{layout16_2}; +} + +sub vboxLayout5 { + return shift->{vboxLayout5}; +} + +sub textLabel2 { + return shift->{textLabel2}; +} + +sub textLabel2_2_2_3 { + return shift->{textLabel2_2_2_3}; +} + +sub textLabel2_2_2 { + return shift->{textLabel2_2_2}; +} + +sub textLabel2_2_2_2 { + return shift->{textLabel2_2_2_2}; +} + +sub textLabel2_2_2_2_2 { + return shift->{textLabel2_2_2_2_2}; +} + +sub groupHist1 { + return shift->{groupHist1}; +} + +sub layout18 { + return shift->{layout18}; +} + +sub vboxLayout6 { + return shift->{vboxLayout6}; +} + +sub t01 { + return shift->{t01}; +} + +sub bg11 { + return shift->{bg11}; +} + +sub bg21 { + return shift->{bg21}; +} + +sub data11 { + return shift->{data11}; +} + +sub data21 { + return shift->{data21}; +} + +sub groupHist2 { + return shift->{groupHist2}; +} + +sub layout18_2 { + return shift->{layout18_2}; +} + +sub vboxLayout7 { + return shift->{vboxLayout7}; +} + +sub t02 { + return shift->{t02}; +} + +sub bg12 { + return shift->{bg12}; +} + +sub bg22 { + return shift->{bg22}; +} + +sub data12 { + return shift->{data12}; +} + +sub data22 { + return shift->{data22}; +} + +sub groupHist3 { + return shift->{groupHist3}; +} + +sub layout18_3 { + return shift->{layout18_3}; +} + +sub vboxLayout8 { + return shift->{vboxLayout8}; +} + +sub t03 { + return shift->{t03}; +} + +sub bg13 { + return shift->{bg13}; +} + +sub bg23 { + return shift->{bg23}; +} + +sub data13 { + return shift->{data13}; +} + +sub data23 { + return shift->{data23}; +} + +sub groupHist4 { + return shift->{groupHist4}; +} + +sub layout18_4 { + return shift->{layout18_4}; +} + +sub vboxLayout9 { + return shift->{vboxLayout9}; +} + +sub t04 { + return shift->{t04}; +} + +sub bg14 { + return shift->{bg14}; +} + +sub bg24 { + return shift->{bg24}; +} + +sub data14 { + return shift->{data14}; +} + +sub data24 { + return shift->{data24}; +} + +sub hboxLayout2 { + return shift->{hboxLayout2}; +} + +sub spacer1 { + return shift->{spacer1}; +} + +sub t0Update { + return shift->{t0Update}; +} + +sub tabPage { + return shift->{tabPage}; +} + +sub gridLayout10 { + return shift->{gridLayout10}; +} + +sub vboxLayout10 { + return shift->{vboxLayout10}; +} + +sub gridLayout11 { + return shift->{gridLayout11}; +} + +sub theoryBlock_Label { + return shift->{theoryBlock_Label}; +} + +sub theoryBlock { + return shift->{theoryBlock}; +} + +sub parametersList_Label { + return shift->{parametersList_Label}; +} + +sub parametersList { + return shift->{parametersList}; +} + +sub hboxLayout3 { + return shift->{hboxLayout3}; +} + +sub cParamsCombo { + return shift->{cParamsCombo}; +} + +sub textLabel1_4_6 { + return shift->{textLabel1_4_6}; +} + +sub constraintLine { + return shift->{constraintLine}; +} + +sub addConstraint { + return shift->{addConstraint}; +} + +sub textLabel2_2_3_4 { + return shift->{textLabel2_2_3_4}; +} + +sub functionsBlock { + return shift->{functionsBlock}; +} + +sub hboxLayout4 { + return shift->{hboxLayout4}; +} + +sub textLabel1_6_3 { + return shift->{textLabel1_6_3}; +} + +sub resetFunc { + return shift->{resetFunc}; +} + +sub menuBar { + return shift->{menuBar}; +} + +sub fileMenu { + return shift->{fileMenu}; +} + +sub actions { + return shift->{actions}; +} + +sub parameters { + return shift->{parameters}; +} + +sub options { + return shift->{options}; +} + +sub helpMenu { + return shift->{helpMenu}; +} + +sub fileToolBar { + return shift->{fileToolBar}; +} + +sub actionsToolBar { + return shift->{actionsToolBar}; +} + + +sub setupUi { + my ( $class, $muSRFit4 ) = @_; + my $self = bless {}, $class; + if ( !defined $muSRFit4->objectName() ) { + $muSRFit4->setObjectName( "muSRFit4" ); + } + $muSRFit4->resize( 830, 726 ); + my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); + $self->{$sizePolicy} = $sizePolicy; + $sizePolicy->setHorizontalStretch( 1 ); + $sizePolicy->setVerticalStretch( 1 ); + $sizePolicy->setHeightForWidth( $muSRFit4->sizePolicy()->hasHeightForWidth() ); + $muSRFit4->setSizePolicy( $sizePolicy ); + $muSRFit4->setMinimumSize( Qt::Size(582, 505) ); + my $icon = Qt::Icon(); + $icon->addPixmap(Qt::Pixmap("icos/MuSRFit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $muSRFit4->setWindowIcon( $icon ); + my $fileSaveAction = Qt::Action($muSRFit4); + $self->{fileSaveAction} = $fileSaveAction; + $fileSaveAction->setObjectName( "fileSaveAction" ); + my $icon1 = Qt::Icon(); + $icon1->addPixmap(Qt::Pixmap("icos/save.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $fileSaveAction->setIcon( $icon1 ); + my $fileExitAction = Qt::Action($muSRFit4); + $self->{fileExitAction} = $fileExitAction; + $fileExitAction->setObjectName( "fileExitAction" ); + my $icon2 = Qt::Icon(); + $icon2->addPixmap(Qt::Pixmap("icos/exit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $fileExitAction->setIcon( $icon2 ); + my $helpAboutAction = Qt::Action($muSRFit4); + $self->{helpAboutAction} = $helpAboutAction; + $helpAboutAction->setObjectName( "helpAboutAction" ); + my $fileExistCheck = Qt::Action($muSRFit4); + $self->{fileExistCheck} = $fileExistCheck; + $fileExistCheck->setObjectName( "fileExistCheck" ); + $fileExistCheck->setCheckable( 1 ); + $fileExistCheck->setChecked( 0 ); + my $manualFile = Qt::Action($muSRFit4); + $self->{manualFile} = $manualFile; + $manualFile->setObjectName( "manualFile" ); + $manualFile->setCheckable( 1 ); + my $fileChangeDirAction = Qt::Action($muSRFit4); + $self->{fileChangeDirAction} = $fileChangeDirAction; + $fileChangeDirAction->setObjectName( "fileChangeDirAction" ); + my $icon3 = Qt::Icon(); + $icon3->addPixmap(Qt::Pixmap("icos/chdir.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $fileChangeDirAction->setIcon( $icon3 ); + my $optionsnew_itemAction = Qt::Action($muSRFit4); + $self->{optionsnew_itemAction} = $optionsnew_itemAction; + $optionsnew_itemAction->setObjectName( "optionsnew_itemAction" ); + my $parametersExport_AsAction = Qt::Action($muSRFit4); + $self->{parametersExport_AsAction} = $parametersExport_AsAction; + $parametersExport_AsAction->setObjectName( "parametersExport_AsAction" ); + my $icon4 = Qt::Icon(); + $icon4->addPixmap(Qt::Pixmap("icos/Export.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $parametersExport_AsAction->setIcon( $icon4 ); + my $parametersAppend_ToAction = Qt::Action($muSRFit4); + $self->{parametersAppend_ToAction} = $parametersAppend_ToAction; + $parametersAppend_ToAction->setObjectName( "parametersAppend_ToAction" ); + my $icon5 = Qt::Icon(); + $icon5->addPixmap(Qt::Pixmap("icos/Append.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $parametersAppend_ToAction->setIcon( $icon5 ); + my $fit = Qt::Action($muSRFit4); + $self->{fit} = $fit; + $fit->setObjectName( "fit" ); + my $icon6 = Qt::Icon(); + $icon6->addPixmap(Qt::Pixmap("icos/Fit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $fit->setIcon( $icon6 ); + my $plot = Qt::Action($muSRFit4); + $self->{plot} = $plot; + $plot->setObjectName( "plot" ); + $plot->setCheckable( 0 ); + my $icon7 = Qt::Icon(); + $icon7->addPixmap(Qt::Pixmap("icos/Plot.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $plot->setIcon( $icon7 ); + my $t0 = Qt::Action($muSRFit4); + $self->{t0} = $t0; + $t0->setObjectName( "t0" ); + my $icon8 = Qt::Icon(); + $icon8->addPixmap(Qt::Pixmap("icos/T0.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $t0->setIcon( $icon8 ); + my $optionsFourier = Qt::Action($muSRFit4); + $self->{optionsFourier} = $optionsFourier; + $optionsFourier->setObjectName( "optionsFourier" ); + $optionsFourier->setCheckable( 1 ); + my $optionsT0 = Qt::Action($muSRFit4); + $self->{optionsT0} = $optionsT0; + $optionsT0->setObjectName( "optionsT0" ); + $optionsT0->setCheckable( 1 ); + my $widget = Qt::Widget( $muSRFit4 ); + $self->{widget} = $widget; + $widget->setObjectName( "widget" ); + my $gridLayout = Qt::GridLayout( $widget ); + $self->{gridLayout} = $gridLayout; + $gridLayout->setSpacing( 6 ); + $gridLayout->setMargin( 11 ); + $gridLayout->setObjectName( "gridLayout" ); + my $musrfit_tabs = Qt::TabWidget( $widget ); + $self->{musrfit_tabs} = $musrfit_tabs; + $musrfit_tabs->setObjectName( "musrfit_tabs" ); + $musrfit_tabs->setEnabled( 1 ); + $sizePolicy->setHeightForWidth( $musrfit_tabs->sizePolicy()->hasHeightForWidth() ); + $musrfit_tabs->setSizePolicy( $sizePolicy ); + $musrfit_tabs->setMinimumSize( Qt::Size(560, 400) ); + $musrfit_tabs->setMaximumSize( Qt::Size(32767, 32767) ); + my $runsPage = Qt::Widget( ); + $self->{runsPage} = $runsPage; + $runsPage->setObjectName( "runsPage" ); + my $layoutWidget = Qt::Widget( $runsPage ); + $self->{layoutWidget} = $layoutWidget; + $layoutWidget->setObjectName( "layoutWidget" ); + $layoutWidget->setGeometry( Qt::Rect(10, 380, 581, 31) ); + my $_2 = Qt::HBoxLayout( $layoutWidget ); + $self->{_2} = $_2; + $_2->setSpacing( 0 ); + $_2->setMargin( 11 ); + $_2->setObjectName( "_2" ); + $_2->setSizeConstraint( Qt::Layout::SetMinimumSize() ); + $_2->setContentsMargins(0, 0, 0, 0 ); + my $spacer4 = Qt::SpacerItem( 81, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); + + $_2->addItem( $spacer4 ); + + my $fitAsyTypeLabel = Qt::Label( $layoutWidget ); + $self->{fitAsyTypeLabel} = $fitAsyTypeLabel; + $fitAsyTypeLabel->setObjectName( "fitAsyTypeLabel" ); + my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy1} = $sizePolicy1; + $sizePolicy1->setHorizontalStretch( 0 ); + $sizePolicy1->setVerticalStretch( 0 ); + $sizePolicy1->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); + $fitAsyTypeLabel->setSizePolicy( $sizePolicy1 ); + $fitAsyTypeLabel->setWordWrap( 0 ); + + $_2->addWidget( $fitAsyTypeLabel ); + + my $fitAsyType = Qt::ComboBox( $layoutWidget ); + $self->{fitAsyType} = $fitAsyType; + $fitAsyType->setObjectName( "fitAsyType" ); + $sizePolicy1->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); + $fitAsyType->setSizePolicy( $sizePolicy1 ); + + $_2->addWidget( $fitAsyType ); + + my $histsLRBFLabel = Qt::Label( $layoutWidget ); + $self->{histsLRBFLabel} = $histsLRBFLabel; + $histsLRBFLabel->setObjectName( "histsLRBFLabel" ); + $sizePolicy1->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); + $histsLRBFLabel->setSizePolicy( $sizePolicy1 ); + $histsLRBFLabel->setWordWrap( 0 ); + + $_2->addWidget( $histsLRBFLabel ); + + my $histsLRBF = Qt::LineEdit( $layoutWidget ); + $self->{histsLRBF} = $histsLRBF; + $histsLRBF->setObjectName( "histsLRBF" ); + $sizePolicy1->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); + $histsLRBF->setSizePolicy( $sizePolicy1 ); + + $_2->addWidget( $histsLRBF ); + + my $widget1 = Qt::Widget( $runsPage ); + $self->{widget1} = $widget1; + $widget1->setObjectName( "widget1" ); + $widget1->setGeometry( Qt::Rect(1, 13, 811, 361) ); + my $verticalLayout = Qt::VBoxLayout( $widget1 ); + $self->{verticalLayout} = $verticalLayout; + $verticalLayout->setSpacing( 6 ); + $verticalLayout->setMargin( 11 ); + $verticalLayout->setObjectName( "verticalLayout" ); + $verticalLayout->setSizeConstraint( Qt::Layout::SetMinimumSize() ); + $verticalLayout->setContentsMargins(0, 0, 0, 0 ); + my $runsAuto = Qt::GroupBox( $widget1 ); + $self->{runsAuto} = $runsAuto; + $runsAuto->setObjectName( "runsAuto" ); + my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); + $self->{$sizePolicy2} = $sizePolicy2; + $sizePolicy2->setHorizontalStretch( 0 ); + $sizePolicy2->setVerticalStretch( 0 ); + $sizePolicy2->setHeightForWidth( $runsAuto->sizePolicy()->hasHeightForWidth() ); + $runsAuto->setSizePolicy( $sizePolicy2 ); + my $layoutWidget_2 = Qt::Widget( $runsAuto ); + $self->{layoutWidget_2} = $layoutWidget_2; + $layoutWidget_2->setObjectName( "layoutWidget_2" ); + $layoutWidget_2->setGeometry( Qt::Rect(10, 20, 771, 48) ); + my $runNumbers_2 = Qt::GridLayout( $layoutWidget_2 ); + $self->{runNumbers_2} = $runNumbers_2; + $runNumbers_2->setSpacing( 0 ); + $runNumbers_2->setMargin( 11 ); + $runNumbers_2->setObjectName( "runNumbers_2" ); + $runNumbers_2->setContentsMargins(0, 0, 0, 0 ); + my $year = Qt::ComboBox( $layoutWidget_2 ); + $self->{year} = $year; + $year->setObjectName( "year" ); + my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy3} = $sizePolicy3; + $sizePolicy3->setHorizontalStretch( 0 ); + $sizePolicy3->setVerticalStretch( 0 ); + $sizePolicy3->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); + $year->setSizePolicy( $sizePolicy3 ); + $year->setMinimumSize( Qt::Size(0, 20) ); + $year->setEditable( 0 ); + $year->setInsertPolicy( Qt::ComboBox::InsertAtTop() ); + $year->setAutoCompletion( 1 ); + $year->setDuplicatesEnabled( 0 ); + + $runNumbers_2->addWidget( $year, 1, 4, 1, 1 ); + + my $yearLabel = Qt::Label( $layoutWidget_2 ); + $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( $layoutWidget_2 ); + $self->{beamLineLabel} = $beamLineLabel; + $beamLineLabel->setObjectName( "beamLineLabel" ); + $sizePolicy4->setHeightForWidth( $beamLineLabel->sizePolicy()->hasHeightForWidth() ); + $beamLineLabel->setSizePolicy( $sizePolicy4 ); + $beamLineLabel->setMinimumSize( Qt::Size(0, 20) ); + $beamLineLabel->setWordWrap( 0 ); + + $runNumbers_2->addWidget( $beamLineLabel, 1, 1, 1, 1 ); + + my $beamLine = Qt::ComboBox( $layoutWidget_2 ); + $self->{beamLine} = $beamLine; + $beamLine->setObjectName( "beamLine" ); + $sizePolicy3->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); + $beamLine->setSizePolicy( $sizePolicy3 ); + $beamLine->setMinimumSize( Qt::Size(0, 20) ); + + $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( $layoutWidget_2 ); + $self->{runNumbers} = $runNumbers; + $runNumbers->setObjectName( "runNumbers" ); + my $sizePolicy5 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy5} = $sizePolicy5; + $sizePolicy5->setHorizontalStretch( 0 ); + $sizePolicy5->setVerticalStretch( 0 ); + $sizePolicy5->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); + $runNumbers->setSizePolicy( $sizePolicy5 ); + $runNumbers->setMinimumSize( Qt::Size(0, 23) ); + + $runNumbers_2->addWidget( $runNumbers, 0, 0, 1, 5 ); + + + $verticalLayout->addWidget( $runsAuto ); + + my $runsMan = Qt::GroupBox( $widget1 ); + $self->{runsMan} = $runsMan; + $runsMan->setObjectName( "runsMan" ); + $sizePolicy2->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); + $runsMan->setSizePolicy( $sizePolicy2 ); + my $layoutWidget_4 = Qt::Widget( $runsMan ); + $self->{layoutWidget_4} = $layoutWidget_4; + $layoutWidget_4->setObjectName( "layoutWidget_4" ); + $layoutWidget_4->setGeometry( Qt::Rect(10, 20, 771, 52) ); + my $runFiles_2 = Qt::GridLayout( $layoutWidget_4 ); + $self->{runFiles_2} = $runFiles_2; + $runFiles_2->setSpacing( 6 ); + $runFiles_2->setMargin( 11 ); + $runFiles_2->setObjectName( "runFiles_2" ); + $runFiles_2->setContentsMargins(0, 0, 0, 0 ); + my $spacer3 = Qt::SpacerItem( 411, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); + + $runFiles_2->addItem( $spacer3, 1, 0, 1, 1 ); + + my $runFiles = Qt::LineEdit( $layoutWidget_4 ); + $self->{runFiles} = $runFiles; + $runFiles->setObjectName( "runFiles" ); + $runFiles->setEnabled( 1 ); + $sizePolicy5->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); + $runFiles->setSizePolicy( $sizePolicy5 ); + $runFiles->setMinimumSize( Qt::Size(0, 23) ); + + $runFiles_2->addWidget( $runFiles, 0, 0, 1, 2 ); + + my $browse = Qt::PushButton( $layoutWidget_4 ); + $self->{browse} = $browse; + $browse->setObjectName( "browse" ); + $browse->setEnabled( 1 ); + $sizePolicy3->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); + $browse->setSizePolicy( $sizePolicy3 ); + $browse->setMinimumSize( Qt::Size(0, 20) ); + + $runFiles_2->addWidget( $browse, 1, 1, 1, 1 ); + + + $verticalLayout->addWidget( $runsMan ); + + my $groupBox = Qt::GroupBox( $widget1 ); + $self->{groupBox} = $groupBox; + $groupBox->setObjectName( "groupBox" ); + $sizePolicy2->setHeightForWidth( $groupBox->sizePolicy()->hasHeightForWidth() ); + $groupBox->setSizePolicy( $sizePolicy2 ); + my $layoutWidget_3 = Qt::Widget( $groupBox ); + $self->{layoutWidget_3} = $layoutWidget_3; + $layoutWidget_3->setObjectName( "layoutWidget_3" ); + $layoutWidget_3->setGeometry( Qt::Rect(10, 20, 773, 95) ); + my $theoryFun = Qt::GridLayout( $layoutWidget_3 ); + $self->{theoryFun} = $theoryFun; + $theoryFun->setSpacing( 0 ); + $theoryFun->setMargin( 0 ); + $theoryFun->setObjectName( "theoryFun" ); + $theoryFun->setSizeConstraint( Qt::Layout::SetMinimumSize() ); + $theoryFun->setContentsMargins(0, 0, 0, 0 ); + my $fitType2 = Qt::ComboBox( $layoutWidget_3 ); + $self->{fitType2} = $fitType2; + $fitType2->setObjectName( "fitType2" ); + $sizePolicy1->setHeightForWidth( $fitType2->sizePolicy()->hasHeightForWidth() ); + $fitType2->setSizePolicy( $sizePolicy1 ); + + $theoryFun->addWidget( $fitType2, 1, 1, 1, 1 ); + + my $tfsLabel = Qt::Label( $layoutWidget_3 ); + $self->{tfsLabel} = $tfsLabel; + $tfsLabel->setObjectName( "tfsLabel" ); + $sizePolicy1->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); + $tfsLabel->setSizePolicy( $sizePolicy1 ); + $tfsLabel->setWordWrap( 0 ); + + $theoryFun->addWidget( $tfsLabel, 2, 1, 1, 1 ); + + my $fitType1 = Qt::ComboBox( $layoutWidget_3 ); + $self->{fitType1} = $fitType1; + $fitType1->setObjectName( "fitType1" ); + $sizePolicy1->setHeightForWidth( $fitType1->sizePolicy()->hasHeightForWidth() ); + $fitType1->setSizePolicy( $sizePolicy1 ); + $fitType1->setAutoCompletion( 0 ); + $fitType1->setDuplicatesEnabled( 0 ); + + $theoryFun->addWidget( $fitType1, 1, 0, 1, 1 ); + + my $bins = Qt::LineEdit( $layoutWidget_3 ); + $self->{bins} = $bins; + $bins->setObjectName( "bins" ); + $sizePolicy1->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); + $bins->setSizePolicy( $sizePolicy1 ); + + $theoryFun->addWidget( $bins, 3, 2, 1, 1 ); + + my $comp3Label = Qt::Label( $layoutWidget_3 ); + $self->{comp3Label} = $comp3Label; + $comp3Label->setObjectName( "comp3Label" ); + my $palette = Qt::Palette(); + my $brush = Qt::Brush(Qt::Color(0, 0, 0, 255)); + $brush->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); + my $brush1 = Qt::Brush(Qt::Color(230, 240, 249, 255)); + $brush1->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); + my $brush2 = Qt::Brush(Qt::Color(255, 255, 255, 255)); + $brush2->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); + my $brush3 = Qt::Brush(Qt::Color(242, 247, 252, 255)); + $brush3->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); + my $brush4 = Qt::Brush(Qt::Color(115, 120, 124, 255)); + $brush4->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); + my $brush5 = Qt::Brush(Qt::Color(154, 160, 166, 255)); + $brush5->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); + my $brush6 = Qt::Brush(Qt::Color(255, 255, 127, 255)); + $brush6->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); + my $brush7 = Qt::Brush(Qt::Color(0, 0, 128, 255)); + $brush7->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); + $palette->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); + my $brush8 = Qt::Brush(Qt::Color(0, 0, 238, 255)); + $brush8->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); + my $brush9 = Qt::Brush(Qt::Color(82, 24, 139, 255)); + $brush9->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); + my $brush10 = Qt::Brush(Qt::Color(128, 128, 128, 255)); + $brush10->setStyle( Qt::SolidPattern() ); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); + $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); + $comp3Label->setPalette( $palette ); + $comp3Label->setWordWrap( 0 ); + + $theoryFun->addWidget( $comp3Label, 0, 2, 1, 1 ); + + my $tis = Qt::LineEdit( $layoutWidget_3 ); + $self->{tis} = $tis; + $tis->setObjectName( "tis" ); + $sizePolicy1->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); + $tis->setSizePolicy( $sizePolicy1 ); + + $theoryFun->addWidget( $tis, 3, 0, 1, 1 ); + + my $tfs = Qt::LineEdit( $layoutWidget_3 ); + $self->{tfs} = $tfs; + $tfs->setObjectName( "tfs" ); + $sizePolicy1->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); + $tfs->setSizePolicy( $sizePolicy1 ); + + $theoryFun->addWidget( $tfs, 3, 1, 1, 1 ); + + my $comp1Label = Qt::Label( $layoutWidget_3 ); + $self->{comp1Label} = $comp1Label; + $comp1Label->setObjectName( "comp1Label" ); + my $palette1 = Qt::Palette(); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); + $comp1Label->setPalette( $palette1 ); + $comp1Label->setWordWrap( 0 ); + + $theoryFun->addWidget( $comp1Label, 0, 0, 1, 1 ); + + my $binsLabel = Qt::Label( $layoutWidget_3 ); + $self->{binsLabel} = $binsLabel; + $binsLabel->setObjectName( "binsLabel" ); + $sizePolicy1->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); + $binsLabel->setSizePolicy( $sizePolicy1 ); + $binsLabel->setWordWrap( 0 ); + + $theoryFun->addWidget( $binsLabel, 2, 2, 1, 1 ); + + my $tisLabel = Qt::Label( $layoutWidget_3 ); + $self->{tisLabel} = $tisLabel; + $tisLabel->setObjectName( "tisLabel" ); + $sizePolicy1->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); + $tisLabel->setSizePolicy( $sizePolicy1 ); + $tisLabel->setWordWrap( 0 ); + + $theoryFun->addWidget( $tisLabel, 2, 0, 1, 1 ); + + my $fitType3 = Qt::ComboBox( $layoutWidget_3 ); + $self->{fitType3} = $fitType3; + $fitType3->setObjectName( "fitType3" ); + $sizePolicy1->setHeightForWidth( $fitType3->sizePolicy()->hasHeightForWidth() ); + $fitType3->setSizePolicy( $sizePolicy1 ); + + $theoryFun->addWidget( $fitType3, 1, 2, 1, 1 ); + + my $comp2Label = Qt::Label( $layoutWidget_3 ); + $self->{comp2Label} = $comp2Label; + $comp2Label->setObjectName( "comp2Label" ); + my $palette2 = Qt::Palette(); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); + $comp2Label->setPalette( $palette2 ); + $comp2Label->setWordWrap( 0 ); + + $theoryFun->addWidget( $comp2Label, 0, 1, 1, 1 ); + + + $verticalLayout->addWidget( $groupBox ); + + $musrfit_tabs->addTab( $runsPage, Qt::Application::translate( 'MuSRFit4', "RUNS", undef, Qt::Application::UnicodeUTF8() ) ); + $runsAuto->raise(); + $groupBox->raise(); + $layoutWidget->raise(); + $runsMan->raise(); + my $fittingPage = Qt::Widget( ); + $self->{fittingPage} = $fittingPage; + $fittingPage->setObjectName( "fittingPage" ); + my $gridLayout1 = Qt::GridLayout( $fittingPage ); + $self->{gridLayout1} = $gridLayout1; + $gridLayout1->setSpacing( 6 ); + $gridLayout1->setMargin( 11 ); + $gridLayout1->setObjectName( "gridLayout1" ); + my $fitGrid = Qt::VBoxLayout( ); + $self->{fitGrid} = $fitGrid; + $fitGrid->setSpacing( 6 ); + $fitGrid->setObjectName( "fitGrid" ); + my $fitLayout = Qt::GridLayout( ); + $self->{fitLayout} = $fitLayout; + $fitLayout->setSpacing( 6 ); + $fitLayout->setObjectName( "fitLayout" ); + my $errorCalc = Qt::ComboBox( $fittingPage ); + $self->{errorCalc} = $errorCalc; + $errorCalc->setObjectName( "errorCalc" ); + + $fitLayout->addWidget( $errorCalc, 1, 1, 1, 1 ); + + my $ltc = Qt::CheckBox( $fittingPage ); + $self->{ltc} = $ltc; + $ltc->setObjectName( "ltc" ); + $ltc->setChecked( 1 ); + + $fitLayout->addWidget( $ltc, 3, 0, 1, 2 ); + + my $textLabel1_4 = Qt::Label( $fittingPage ); + $self->{textLabel1_4} = $textLabel1_4; + $textLabel1_4->setObjectName( "textLabel1_4" ); + $textLabel1_4->setWordWrap( 0 ); + + $fitLayout->addWidget( $textLabel1_4, 0, 2, 1, 1 ); + + my $textLabel1_4_2_2 = Qt::Label( $fittingPage ); + $self->{textLabel1_4_2_2} = $textLabel1_4_2_2; + $textLabel1_4_2_2->setObjectName( "textLabel1_4_2_2" ); + $textLabel1_4_2_2->setWordWrap( 0 ); + + $fitLayout->addWidget( $textLabel1_4_2_2, 3, 3, 1, 1 ); + + my $xi = Qt::LineEdit( $fittingPage ); + $self->{xi} = $xi; + $xi->setObjectName( "xi" ); + + $fitLayout->addWidget( $xi, 0, 3, 1, 1 ); + + my $yf = Qt::LineEdit( $fittingPage ); + $self->{yf} = $yf; + $yf->setObjectName( "yf" ); + + $fitLayout->addWidget( $yf, 1, 4, 1, 1 ); + + my $viewBin = Qt::LineEdit( $fittingPage ); + $self->{viewBin} = $viewBin; + $viewBin->setObjectName( "viewBin" ); + + $fitLayout->addWidget( $viewBin, 3, 4, 1, 1 ); + + my $textLabel1_4_2 = Qt::Label( $fittingPage ); + $self->{textLabel1_4_2} = $textLabel1_4_2; + $textLabel1_4_2->setObjectName( "textLabel1_4_2" ); + $textLabel1_4_2->setWordWrap( 0 ); + + $fitLayout->addWidget( $textLabel1_4_2, 1, 2, 1, 1 ); + + my $xf = Qt::LineEdit( $fittingPage ); + $self->{xf} = $xf; + $xf->setObjectName( "xf" ); + + $fitLayout->addWidget( $xf, 0, 4, 1, 1 ); + + my $yi = Qt::LineEdit( $fittingPage ); + $self->{yi} = $yi; + $yi->setObjectName( "yi" ); + + $fitLayout->addWidget( $yi, 1, 3, 1, 1 ); + + my $minimization = Qt::ComboBox( $fittingPage ); + $self->{minimization} = $minimization; + $minimization->setObjectName( "minimization" ); + + $fitLayout->addWidget( $minimization, 0, 1, 1, 1 ); + + my $textLabel1_5 = Qt::Label( $fittingPage ); + $self->{textLabel1_5} = $textLabel1_5; + $textLabel1_5->setObjectName( "textLabel1_5" ); + $textLabel1_5->setWordWrap( 0 ); + + $fitLayout->addWidget( $textLabel1_5, 0, 0, 1, 1 ); + + my $textLabel1_5_2 = Qt::Label( $fittingPage ); + $self->{textLabel1_5_2} = $textLabel1_5_2; + $textLabel1_5_2->setObjectName( "textLabel1_5_2" ); + $textLabel1_5_2->setWordWrap( 0 ); + + $fitLayout->addWidget( $textLabel1_5_2, 1, 0, 1, 1 ); + + + $fitGrid->addLayout( $fitLayout ); + + + $gridLayout1->addLayout( $fitGrid, 0, 0, 1, 1 ); + + my $fitTextOutput = Qt::TextEdit( $fittingPage ); + $self->{fitTextOutput} = $fitTextOutput; + $fitTextOutput->setObjectName( "fitTextOutput" ); + + $gridLayout1->addWidget( $fitTextOutput, 1, 0, 1, 1 ); + + $musrfit_tabs->addTab( $fittingPage, Qt::Application::translate( 'MuSRFit4', "Fitting", undef, Qt::Application::UnicodeUTF8() ) ); + my $sharingPage = Qt::Widget( ); + $self->{sharingPage} = $sharingPage; + $sharingPage->setObjectName( "sharingPage" ); + my $gridLayout2 = Qt::GridLayout( $sharingPage ); + $self->{gridLayout2} = $gridLayout2; + $gridLayout2->setSpacing( 6 ); + $gridLayout2->setMargin( 11 ); + $gridLayout2->setObjectName( "gridLayout2" ); + my $buttonGroupSharing = Qt::GroupBox( $sharingPage ); + $self->{buttonGroupSharing} = $buttonGroupSharing; + $buttonGroupSharing->setObjectName( "buttonGroupSharing" ); + $sizePolicy2->setHeightForWidth( $buttonGroupSharing->sizePolicy()->hasHeightForWidth() ); + $buttonGroupSharing->setSizePolicy( $sizePolicy2 ); + $buttonGroupSharing->setAlignment( Qt::AlignLeading() ); + $buttonGroupSharing->setCheckable( 1 ); + $buttonGroupSharing->setChecked( 0 ); + my $sharingComp2 = Qt::GroupBox( $buttonGroupSharing ); + $self->{sharingComp2} = $sharingComp2; + $sharingComp2->setObjectName( "sharingComp2" ); + $sharingComp2->setEnabled( 0 ); + $sharingComp2->setGeometry( Qt::Rect(199, 20, 162, 330) ); + my $sizePolicy6 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); + $self->{$sizePolicy6} = $sizePolicy6; + $sizePolicy6->setHorizontalStretch( 0 ); + $sizePolicy6->setVerticalStretch( 0 ); + $sizePolicy6->setHeightForWidth( $sharingComp2->sizePolicy()->hasHeightForWidth() ); + $sharingComp2->setSizePolicy( $sizePolicy6 ); + my $comp2ShLabel = Qt::Label( $sharingComp2 ); + $self->{comp2ShLabel} = $comp2ShLabel; + $comp2ShLabel->setObjectName( "comp2ShLabel" ); + $comp2ShLabel->setGeometry( Qt::Rect(2, 30, 185, 20) ); + $comp2ShLabel->setWordWrap( 0 ); + my $layout13 = Qt::Widget( $sharingComp2 ); + $self->{layout13} = $layout13; + $layout13->setObjectName( "layout13" ); + $layout13->setGeometry( Qt::Rect(40, 60, 81, 266) ); + my $vboxLayout = Qt::VBoxLayout( $layout13 ); + $self->{vboxLayout} = $vboxLayout; + $vboxLayout->setSpacing( 0 ); + $vboxLayout->setMargin( 0 ); + $vboxLayout->setObjectName( "vboxLayout" ); + $vboxLayout->setContentsMargins(0, 0, 0, 0 ); + my $shParam_2_1 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_1} = $shParam_2_1; + $shParam_2_1->setObjectName( "shParam_2_1" ); + + $vboxLayout->addWidget( $shParam_2_1 ); + + my $shParam_2_2 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_2} = $shParam_2_2; + $shParam_2_2->setObjectName( "shParam_2_2" ); + + $vboxLayout->addWidget( $shParam_2_2 ); + + my $shParam_2_3 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_3} = $shParam_2_3; + $shParam_2_3->setObjectName( "shParam_2_3" ); + + $vboxLayout->addWidget( $shParam_2_3 ); + + my $shParam_2_4 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_4} = $shParam_2_4; + $shParam_2_4->setObjectName( "shParam_2_4" ); + + $vboxLayout->addWidget( $shParam_2_4 ); + + my $shParam_2_5 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_5} = $shParam_2_5; + $shParam_2_5->setObjectName( "shParam_2_5" ); + + $vboxLayout->addWidget( $shParam_2_5 ); + + my $shParam_2_6 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_6} = $shParam_2_6; + $shParam_2_6->setObjectName( "shParam_2_6" ); + $shParam_2_6->setEnabled( 0 ); + $shParam_2_6->setTristate( 0 ); + + $vboxLayout->addWidget( $shParam_2_6 ); + + my $shParam_2_7 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_7} = $shParam_2_7; + $shParam_2_7->setObjectName( "shParam_2_7" ); + $shParam_2_7->setEnabled( 0 ); + $shParam_2_7->setTristate( 0 ); + + $vboxLayout->addWidget( $shParam_2_7 ); + + my $shParam_2_8 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_8} = $shParam_2_8; + $shParam_2_8->setObjectName( "shParam_2_8" ); + $shParam_2_8->setEnabled( 0 ); + $shParam_2_8->setTristate( 0 ); + + $vboxLayout->addWidget( $shParam_2_8 ); + + my $shParam_2_9 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_9} = $shParam_2_9; + $shParam_2_9->setObjectName( "shParam_2_9" ); + $shParam_2_9->setEnabled( 0 ); + $shParam_2_9->setTristate( 0 ); + + $vboxLayout->addWidget( $shParam_2_9 ); + + my $sharingComp3 = Qt::GroupBox( $buttonGroupSharing ); + $self->{sharingComp3} = $sharingComp3; + $sharingComp3->setObjectName( "sharingComp3" ); + $sharingComp3->setEnabled( 0 ); + $sharingComp3->setGeometry( Qt::Rect(367, 20, 162, 330) ); + $sizePolicy6->setHeightForWidth( $sharingComp3->sizePolicy()->hasHeightForWidth() ); + $sharingComp3->setSizePolicy( $sizePolicy6 ); + $sharingComp3->setAlignment( Qt::AlignJustify()|Qt::AlignVCenter() ); + my $comp3ShLabel = Qt::Label( $sharingComp3 ); + $self->{comp3ShLabel} = $comp3ShLabel; + $comp3ShLabel->setObjectName( "comp3ShLabel" ); + $comp3ShLabel->setGeometry( Qt::Rect(2, 30, 185, 20) ); + $comp3ShLabel->setWordWrap( 0 ); + my $layout15 = Qt::Widget( $sharingComp3 ); + $self->{layout15} = $layout15; + $layout15->setObjectName( "layout15" ); + $layout15->setGeometry( Qt::Rect(41, 58, 81, 266) ); + my $vboxLayout1 = Qt::VBoxLayout( $layout15 ); + $self->{vboxLayout1} = $vboxLayout1; + $vboxLayout1->setSpacing( 6 ); + $vboxLayout1->setMargin( 11 ); + $vboxLayout1->setObjectName( "vboxLayout1" ); + $vboxLayout1->setContentsMargins(0, 0, 0, 0 ); + my $shParam_3_1 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_1} = $shParam_3_1; + $shParam_3_1->setObjectName( "shParam_3_1" ); + + $vboxLayout1->addWidget( $shParam_3_1 ); + + my $shParam_3_2 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_2} = $shParam_3_2; + $shParam_3_2->setObjectName( "shParam_3_2" ); + + $vboxLayout1->addWidget( $shParam_3_2 ); + + my $shParam_3_3 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_3} = $shParam_3_3; + $shParam_3_3->setObjectName( "shParam_3_3" ); + + $vboxLayout1->addWidget( $shParam_3_3 ); + + my $shParam_3_4 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_4} = $shParam_3_4; + $shParam_3_4->setObjectName( "shParam_3_4" ); + + $vboxLayout1->addWidget( $shParam_3_4 ); + + my $shParam_3_5 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_5} = $shParam_3_5; + $shParam_3_5->setObjectName( "shParam_3_5" ); + + $vboxLayout1->addWidget( $shParam_3_5 ); + + my $shParam_3_6 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_6} = $shParam_3_6; + $shParam_3_6->setObjectName( "shParam_3_6" ); + $shParam_3_6->setEnabled( 0 ); + $shParam_3_6->setTristate( 0 ); + + $vboxLayout1->addWidget( $shParam_3_6 ); + + my $shParam_3_7 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_7} = $shParam_3_7; + $shParam_3_7->setObjectName( "shParam_3_7" ); + $shParam_3_7->setEnabled( 0 ); + $shParam_3_7->setTristate( 0 ); + + $vboxLayout1->addWidget( $shParam_3_7 ); + + my $shParam_3_8 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_8} = $shParam_3_8; + $shParam_3_8->setObjectName( "shParam_3_8" ); + $shParam_3_8->setEnabled( 0 ); + $shParam_3_8->setTristate( 0 ); + + $vboxLayout1->addWidget( $shParam_3_8 ); + + my $shParam_3_9 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_9} = $shParam_3_9; + $shParam_3_9->setObjectName( "shParam_3_9" ); + $shParam_3_9->setEnabled( 0 ); + $shParam_3_9->setTristate( 0 ); + + $vboxLayout1->addWidget( $shParam_3_9 ); + + my $sharingComp1 = Qt::GroupBox( $buttonGroupSharing ); + $self->{sharingComp1} = $sharingComp1; + $sharingComp1->setObjectName( "sharingComp1" ); + $sharingComp1->setEnabled( 0 ); + $sharingComp1->setGeometry( Qt::Rect(31, 20, 162, 330) ); + $sizePolicy6->setHeightForWidth( $sharingComp1->sizePolicy()->hasHeightForWidth() ); + $sharingComp1->setSizePolicy( $sizePolicy6 ); + $sharingComp1->setAlignment( Qt::AlignLeading() ); + my $layout14 = Qt::Widget( $sharingComp1 ); + $self->{layout14} = $layout14; + $layout14->setObjectName( "layout14" ); + $layout14->setGeometry( Qt::Rect(40, 60, 81, 266) ); + my $vboxLayout2 = Qt::VBoxLayout( $layout14 ); + $self->{vboxLayout2} = $vboxLayout2; + $vboxLayout2->setSpacing( 0 ); + $vboxLayout2->setMargin( 0 ); + $vboxLayout2->setObjectName( "vboxLayout2" ); + $vboxLayout2->setContentsMargins(0, 0, 0, 0 ); + my $shParam_1_1 = Qt::CheckBox( $layout14 ); + $self->{shParam_1_1} = $shParam_1_1; + $shParam_1_1->setObjectName( "shParam_1_1" ); + + $vboxLayout2->addWidget( $shParam_1_1 ); + + my $shParam_1_2 = Qt::CheckBox( $layout14 ); + $self->{shParam_1_2} = $shParam_1_2; + $shParam_1_2->setObjectName( "shParam_1_2" ); + + $vboxLayout2->addWidget( $shParam_1_2 ); + + my $shParam_1_3 = Qt::CheckBox( $layout14 ); + $self->{shParam_1_3} = $shParam_1_3; + $shParam_1_3->setObjectName( "shParam_1_3" ); + + $vboxLayout2->addWidget( $shParam_1_3 ); + + my $shParam_1_4 = Qt::CheckBox( $layout14 ); + $self->{shParam_1_4} = $shParam_1_4; + $shParam_1_4->setObjectName( "shParam_1_4" ); + + $vboxLayout2->addWidget( $shParam_1_4 ); + + my $shParam_1_5 = Qt::CheckBox( $layout14 ); + $self->{shParam_1_5} = $shParam_1_5; + $shParam_1_5->setObjectName( "shParam_1_5" ); + $shParam_1_5->setEnabled( 0 ); + $shParam_1_5->setTristate( 0 ); + + $vboxLayout2->addWidget( $shParam_1_5 ); + + my $shParam_1_6 = Qt::CheckBox( $layout14 ); + $self->{shParam_1_6} = $shParam_1_6; + $shParam_1_6->setObjectName( "shParam_1_6" ); + $shParam_1_6->setEnabled( 0 ); + $shParam_1_6->setTristate( 0 ); + + $vboxLayout2->addWidget( $shParam_1_6 ); + + my $shParam_1_7 = Qt::CheckBox( $layout14 ); + $self->{shParam_1_7} = $shParam_1_7; + $shParam_1_7->setObjectName( "shParam_1_7" ); + $shParam_1_7->setEnabled( 0 ); + $shParam_1_7->setTristate( 0 ); + + $vboxLayout2->addWidget( $shParam_1_7 ); + + my $shParam_1_8 = Qt::CheckBox( $layout14 ); + $self->{shParam_1_8} = $shParam_1_8; + $shParam_1_8->setObjectName( "shParam_1_8" ); + $shParam_1_8->setEnabled( 0 ); + $shParam_1_8->setTristate( 0 ); + + $vboxLayout2->addWidget( $shParam_1_8 ); + + my $shParam_1_9 = Qt::CheckBox( $layout14 ); + $self->{shParam_1_9} = $shParam_1_9; + $shParam_1_9->setObjectName( "shParam_1_9" ); + $shParam_1_9->setEnabled( 0 ); + $shParam_1_9->setTristate( 0 ); + + $vboxLayout2->addWidget( $shParam_1_9 ); + + my $comp1ShLabel = Qt::Label( $sharingComp1 ); + $self->{comp1ShLabel} = $comp1ShLabel; + $comp1ShLabel->setObjectName( "comp1ShLabel" ); + $comp1ShLabel->setGeometry( Qt::Rect(2, 30, 185, 20) ); + $comp1ShLabel->setWordWrap( 0 ); + + $gridLayout2->addWidget( $buttonGroupSharing, 0, 0, 1, 1 ); + + $musrfit_tabs->addTab( $sharingPage, Qt::Application::translate( 'MuSRFit4', "Sharing", undef, Qt::Application::UnicodeUTF8() ) ); + my $initializationPage = Qt::Widget( ); + $self->{initializationPage} = $initializationPage; + $initializationPage->setObjectName( "initializationPage" ); + my $gridLayout3 = Qt::GridLayout( $initializationPage ); + $self->{gridLayout3} = $gridLayout3; + $gridLayout3->setSpacing( 6 ); + $gridLayout3->setMargin( 11 ); + $gridLayout3->setObjectName( "gridLayout3" ); + my $initParamTable = Qt::TableWidget( $initializationPage ); + $self->{initParamTable} = $initParamTable; + $initParamTable->setObjectName( "initParamTable" ); + $initParamTable->setRowCount( 1 ); + $initParamTable->setColumnCount( 4 ); + + $gridLayout3->addWidget( $initParamTable, 0, 0, 1, 1 ); + + $musrfit_tabs->addTab( $initializationPage, Qt::Application::translate( 'MuSRFit4', "Initialization", undef, Qt::Application::UnicodeUTF8() ) ); + my $msrPage = Qt::Widget( ); + $self->{msrPage} = $msrPage; + $msrPage->setObjectName( "msrPage" ); + my $gridLayout4 = Qt::GridLayout( $msrPage ); + $self->{gridLayout4} = $gridLayout4; + $gridLayout4->setSpacing( 6 ); + $gridLayout4->setMargin( 11 ); + $gridLayout4->setObjectName( "gridLayout4" ); + my $vboxLayout3 = Qt::VBoxLayout( ); + $self->{vboxLayout3} = $vboxLayout3; + $vboxLayout3->setSpacing( 6 ); + $vboxLayout3->setMargin( 0 ); + $vboxLayout3->setObjectName( "vboxLayout3" ); + my $groupTitle = Qt::GroupBox( $msrPage ); + $self->{groupTitle} = $groupTitle; + $groupTitle->setObjectName( "groupTitle" ); + $sizePolicy5->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); + $groupTitle->setSizePolicy( $sizePolicy5 ); + my $gridLayout5 = Qt::GridLayout( $groupTitle ); + $self->{gridLayout5} = $gridLayout5; + $gridLayout5->setSpacing( 6 ); + $gridLayout5->setMargin( 11 ); + $gridLayout5->setObjectName( "gridLayout5" ); + my $vboxLayout4 = Qt::VBoxLayout( ); + $self->{vboxLayout4} = $vboxLayout4; + $vboxLayout4->setSpacing( 6 ); + $vboxLayout4->setObjectName( "vboxLayout4" ); + my $titleLabel = Qt::Label( $groupTitle ); + $self->{titleLabel} = $titleLabel; + $titleLabel->setObjectName( "titleLabel" ); + $sizePolicy4->setHeightForWidth( $titleLabel->sizePolicy()->hasHeightForWidth() ); + $titleLabel->setSizePolicy( $sizePolicy4 ); + $titleLabel->setWordWrap( 0 ); + + $vboxLayout4->addWidget( $titleLabel ); + + 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 ); + + $vboxLayout4->addWidget( $title ); + + my $hboxLayout = Qt::HBoxLayout( ); + $self->{hboxLayout} = $hboxLayout; + $hboxLayout->setSpacing( 6 ); + $hboxLayout->setObjectName( "hboxLayout" ); + my $fileNameLabel = Qt::Label( $groupTitle ); + $self->{fileNameLabel} = $fileNameLabel; + $fileNameLabel->setObjectName( "fileNameLabel" ); + $fileNameLabel->setWordWrap( 0 ); + + $hboxLayout->addWidget( $fileNameLabel ); + + my $fileName = Qt::LineEdit( $groupTitle ); + $self->{fileName} = $fileName; + $fileName->setObjectName( "fileName" ); + $sizePolicy5->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); + $fileName->setSizePolicy( $sizePolicy5 ); + + $hboxLayout->addWidget( $fileName ); + + + $vboxLayout4->addLayout( $hboxLayout ); + + + $gridLayout5->addLayout( $vboxLayout4, 0, 0, 1, 1 ); + + + $vboxLayout3->addWidget( $groupTitle ); + + my $textMSROutput = Qt::TextEdit( $msrPage ); + $self->{textMSROutput} = $textMSROutput; + $textMSROutput->setObjectName( "textMSROutput" ); + $textMSROutput->setOverwriteMode( 1 ); + + $vboxLayout3->addWidget( $textMSROutput ); + + + $gridLayout4->addLayout( $vboxLayout3, 0, 0, 1, 1 ); + + $musrfit_tabs->addTab( $msrPage, Qt::Application::translate( 'MuSRFit4', "MSR File", undef, Qt::Application::UnicodeUTF8() ) ); + my $fourierPage = Qt::Widget( ); + $self->{fourierPage} = $fourierPage; + $fourierPage->setObjectName( "fourierPage" ); + my $gridLayout6 = Qt::GridLayout( $fourierPage ); + $self->{gridLayout6} = $gridLayout6; + $gridLayout6->setSpacing( 6 ); + $gridLayout6->setMargin( 11 ); + $gridLayout6->setObjectName( "gridLayout6" ); + my $fourierBox = Qt::GroupBox( $fourierPage ); + $self->{fourierBox} = $fourierBox; + $fourierBox->setObjectName( "fourierBox" ); + $sizePolicy2->setHeightForWidth( $fourierBox->sizePolicy()->hasHeightForWidth() ); + $fourierBox->setSizePolicy( $sizePolicy2 ); + my $layout34 = Qt::Widget( $fourierBox ); + $self->{layout34} = $layout34; + $layout34->setObjectName( "layout34" ); + $layout34->setGeometry( Qt::Rect(12, 19, 510, 117) ); + my $gridLayout7 = Qt::GridLayout( $layout34 ); + $self->{gridLayout7} = $gridLayout7; + $gridLayout7->setSpacing( 5 ); + $gridLayout7->setMargin( 5 ); + $gridLayout7->setObjectName( "gridLayout7" ); + $gridLayout7->setContentsMargins(0, 0, 0, 0 ); + my $frqMax = Qt::LineEdit( $layout34 ); + $self->{frqMax} = $frqMax; + $frqMax->setObjectName( "frqMax" ); + $sizePolicy4->setHeightForWidth( $frqMax->sizePolicy()->hasHeightForWidth() ); + $frqMax->setSizePolicy( $sizePolicy4 ); + + $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 ); + + $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 ); + + $gridLayout7->addWidget( $fplot, 2, 2, 1, 1 ); + + my $textLabel1_3_8 = Qt::Label( $layout34 ); + $self->{textLabel1_3_8} = $textLabel1_3_8; + $textLabel1_3_8->setObjectName( "textLabel1_3_8" ); + $textLabel1_3_8->setWordWrap( 0 ); + + $gridLayout7->addWidget( $textLabel1_3_8, 2, 6, 1, 1 ); + + my $textLabel1_7 = Qt::Label( $layout34 ); + $self->{textLabel1_7} = $textLabel1_7; + $textLabel1_7->setObjectName( "textLabel1_7" ); + $textLabel1_7->setWordWrap( 0 ); + + $gridLayout7->addWidget( $textLabel1_7, 1, 3, 1, 1 ); + + my $fplotLabel = Qt::Label( $layout34 ); + $self->{fplotLabel} = $fplotLabel; + $fplotLabel->setObjectName( "fplotLabel" ); + $fplotLabel->setWordWrap( 0 ); + + $gridLayout7->addWidget( $fplotLabel, 2, 1, 1, 1 ); + + my $textLabel1_3_4 = Qt::Label( $layout34 ); + $self->{textLabel1_3_4} = $textLabel1_3_4; + $textLabel1_3_4->setObjectName( "textLabel1_3_4" ); + $textLabel1_3_4->setWordWrap( 0 ); + + $gridLayout7->addWidget( $textLabel1_3_4, 1, 6, 1, 1 ); + + my $fapodization = Qt::ComboBox( $layout34 ); + $self->{fapodization} = $fapodization; + $fapodization->setObjectName( "fapodization" ); + $sizePolicy4->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); + $fapodization->setSizePolicy( $sizePolicy4 ); + + $gridLayout7->addWidget( $fapodization, 1, 2, 1, 1 ); + + my $fapodizationLabel = Qt::Label( $layout34 ); + $self->{fapodizationLabel} = $fapodizationLabel; + $fapodizationLabel->setObjectName( "fapodizationLabel" ); + $fapodizationLabel->setWordWrap( 0 ); + + $gridLayout7->addWidget( $fapodizationLabel, 1, 1, 1, 1 ); + + my $textLabel1_3_3 = Qt::Label( $layout34 ); + $self->{textLabel1_3_3} = $textLabel1_3_3; + $textLabel1_3_3->setObjectName( "textLabel1_3_3" ); + $textLabel1_3_3->setWordWrap( 0 ); + + $gridLayout7->addWidget( $textLabel1_3_3, 1, 5, 1, 1 ); + + my $textLabel1_2 = Qt::Label( $layout34 ); + $self->{textLabel1_2} = $textLabel1_2; + $textLabel1_2->setObjectName( "textLabel1_2" ); + $textLabel1_2->setWordWrap( 0 ); + + $gridLayout7->addWidget( $textLabel1_2, 0, 5, 1, 1 ); + + my $textLabel1_3_6 = Qt::Label( $layout34 ); + $self->{textLabel1_3_6} = $textLabel1_3_6; + $textLabel1_3_6->setObjectName( "textLabel1_3_6" ); + $textLabel1_3_6->setWordWrap( 0 ); + + $gridLayout7->addWidget( $textLabel1_3_6, 2, 4, 1, 1 ); + + my $fphase = Qt::LineEdit( $layout34 ); + $self->{fphase} = $fphase; + $fphase->setObjectName( "fphase" ); + $sizePolicy4->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); + $fphase->setSizePolicy( $sizePolicy4 ); + + $gridLayout7->addWidget( $fphase, 1, 4, 1, 1 ); + + my $textLabel1_3_5 = Qt::Label( $layout34 ); + $self->{textLabel1_3_5} = $textLabel1_3_5; + $textLabel1_3_5->setObjectName( "textLabel1_3_5" ); + $textLabel1_3_5->setWordWrap( 0 ); + + $gridLayout7->addWidget( $textLabel1_3_5, 2, 3, 1, 1 ); + + my $textLabel1_3_7 = Qt::Label( $layout34 ); + $self->{textLabel1_3_7} = $textLabel1_3_7; + $textLabel1_3_7->setObjectName( "textLabel1_3_7" ); + $textLabel1_3_7->setWordWrap( 0 ); + + $gridLayout7->addWidget( $textLabel1_3_7, 2, 5, 1, 1 ); + + my $frqMin = Qt::LineEdit( $layout34 ); + $self->{frqMin} = $frqMin; + $frqMin->setObjectName( "frqMin" ); + $sizePolicy4->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); + $frqMin->setSizePolicy( $sizePolicy4 ); + + $gridLayout7->addWidget( $frqMin, 0, 4, 1, 1 ); + + my $textLabel1 = Qt::Label( $layout34 ); + $self->{textLabel1} = $textLabel1; + $textLabel1->setObjectName( "textLabel1" ); + $textLabel1->setWordWrap( 0 ); + + $gridLayout7->addWidget( $textLabel1, 0, 3, 1, 1 ); + + my $label = Qt::Label( $layout34 ); + $self->{label} = $label; + $label->setObjectName( "label" ); + + $gridLayout7->addWidget( $label, 0, 1, 1, 1 ); + + + $gridLayout6->addWidget( $fourierBox, 0, 0, 1, 1 ); + + my $rrfBox = Qt::GroupBox( $fourierPage ); + $self->{rrfBox} = $rrfBox; + $rrfBox->setObjectName( "rrfBox" ); + $sizePolicy2->setHeightForWidth( $rrfBox->sizePolicy()->hasHeightForWidth() ); + $rrfBox->setSizePolicy( $sizePolicy2 ); + my $layout35 = Qt::Widget( $rrfBox ); + $self->{layout35} = $layout35; + $layout35->setObjectName( "layout35" ); + $layout35->setGeometry( Qt::Rect(10, 18, 265, 100) ); + my $gridLayout8 = Qt::GridLayout( $layout35 ); + $self->{gridLayout8} = $gridLayout8; + $gridLayout8->setSpacing( 5 ); + $gridLayout8->setMargin( 5 ); + $gridLayout8->setObjectName( "gridLayout8" ); + $gridLayout8->setContentsMargins(0, 0, 0, 0 ); + my $textLabel1_6_2_2 = Qt::Label( $layout35 ); + $self->{textLabel1_6_2_2} = $textLabel1_6_2_2; + $textLabel1_6_2_2->setObjectName( "textLabel1_6_2_2" ); + $textLabel1_6_2_2->setWordWrap( 0 ); + + $gridLayout8->addWidget( $textLabel1_6_2_2, 2, 0, 1, 1 ); + + my $textLabel1_6 = Qt::Label( $layout35 ); + $self->{textLabel1_6} = $textLabel1_6; + $textLabel1_6->setObjectName( "textLabel1_6" ); + $textLabel1_6->setWordWrap( 0 ); + + $gridLayout8->addWidget( $textLabel1_6, 0, 0, 1, 1 ); + + my $textLabel1_6_2_4 = Qt::Label( $layout35 ); + $self->{textLabel1_6_2_4} = $textLabel1_6_2_4; + $textLabel1_6_2_4->setObjectName( "textLabel1_6_2_4" ); + $textLabel1_6_2_4->setWordWrap( 0 ); + + $gridLayout8->addWidget( $textLabel1_6_2_4, 2, 2, 1, 1 ); + + my $rrfFrq = Qt::LineEdit( $layout35 ); + $self->{rrfFrq} = $rrfFrq; + $rrfFrq->setObjectName( "rrfFrq" ); + + $gridLayout8->addWidget( $rrfFrq, 0, 1, 1, 1 ); + + my $textLabel1_6_2_3 = Qt::Label( $layout35 ); + $self->{textLabel1_6_2_3} = $textLabel1_6_2_3; + $textLabel1_6_2_3->setObjectName( "textLabel1_6_2_3" ); + $textLabel1_6_2_3->setWordWrap( 0 ); + + $gridLayout8->addWidget( $textLabel1_6_2_3, 1, 2, 1, 1 ); + + my $rrfPack = Qt::LineEdit( $layout35 ); + $self->{rrfPack} = $rrfPack; + $rrfPack->setObjectName( "rrfPack" ); + + $gridLayout8->addWidget( $rrfPack, 1, 1, 1, 1 ); + + my $textLabel1_6_2 = Qt::Label( $layout35 ); + $self->{textLabel1_6_2} = $textLabel1_6_2; + $textLabel1_6_2->setObjectName( "textLabel1_6_2" ); + $textLabel1_6_2->setWordWrap( 0 ); + + $gridLayout8->addWidget( $textLabel1_6_2, 1, 0, 1, 1 ); + + my $rrfUnits = Qt::ComboBox( $layout35 ); + $self->{rrfUnits} = $rrfUnits; + $rrfUnits->setObjectName( "rrfUnits" ); + + $gridLayout8->addWidget( $rrfUnits, 0, 2, 1, 1 ); + + my $rrfPhase = Qt::LineEdit( $layout35 ); + $self->{rrfPhase} = $rrfPhase; + $rrfPhase->setObjectName( "rrfPhase" ); + + $gridLayout8->addWidget( $rrfPhase, 2, 1, 1, 1 ); + + + $gridLayout6->addWidget( $rrfBox, 1, 0, 1, 1 ); + + $musrfit_tabs->addTab( $fourierPage, Qt::Application::translate( 'MuSRFit4', "FFT/RRF", undef, Qt::Application::UnicodeUTF8() ) ); + my $t0Page = Qt::Widget( ); + $self->{t0Page} = $t0Page; + $t0Page->setObjectName( "t0Page" ); + my $gridLayout9 = Qt::GridLayout( $t0Page ); + $self->{gridLayout9} = $gridLayout9; + $gridLayout9->setSpacing( 6 ); + $gridLayout9->setMargin( 11 ); + $gridLayout9->setObjectName( "gridLayout9" ); + my $hboxLayout1 = Qt::HBoxLayout( ); + $self->{hboxLayout1} = $hboxLayout1; + $hboxLayout1->setSpacing( 6 ); + $hboxLayout1->setObjectName( "hboxLayout1" ); + my $groupHist0 = Qt::GroupBox( $t0Page ); + $self->{groupHist0} = $groupHist0; + $groupHist0->setObjectName( "groupHist0" ); + $sizePolicy->setHeightForWidth( $groupHist0->sizePolicy()->hasHeightForWidth() ); + $groupHist0->setSizePolicy( $sizePolicy ); + $groupHist0->setMinimumSize( Qt::Size(0, 0) ); + my $layout16_2 = Qt::Widget( $groupHist0 ); + $self->{layout16_2} = $layout16_2; + $layout16_2->setObjectName( "layout16_2" ); + $layout16_2->setGeometry( Qt::Rect(5, 18, 100, 150) ); + my $vboxLayout5 = Qt::VBoxLayout( $layout16_2 ); + $self->{vboxLayout5} = $vboxLayout5; + $vboxLayout5->setSpacing( 6 ); + $vboxLayout5->setMargin( 11 ); + $vboxLayout5->setObjectName( "vboxLayout5" ); + $vboxLayout5->setContentsMargins(0, 0, 0, 0 ); + my $textLabel2 = Qt::Label( $layout16_2 ); + $self->{textLabel2} = $textLabel2; + $textLabel2->setObjectName( "textLabel2" ); + $textLabel2->setWordWrap( 0 ); + + $vboxLayout5->addWidget( $textLabel2 ); + + my $textLabel2_2_2_3 = Qt::Label( $layout16_2 ); + $self->{textLabel2_2_2_3} = $textLabel2_2_2_3; + $textLabel2_2_2_3->setObjectName( "textLabel2_2_2_3" ); + $textLabel2_2_2_3->setWordWrap( 0 ); + + $vboxLayout5->addWidget( $textLabel2_2_2_3 ); + + my $textLabel2_2_2 = Qt::Label( $layout16_2 ); + $self->{textLabel2_2_2} = $textLabel2_2_2; + $textLabel2_2_2->setObjectName( "textLabel2_2_2" ); + $textLabel2_2_2->setWordWrap( 0 ); + + $vboxLayout5->addWidget( $textLabel2_2_2 ); + + my $textLabel2_2_2_2 = Qt::Label( $layout16_2 ); + $self->{textLabel2_2_2_2} = $textLabel2_2_2_2; + $textLabel2_2_2_2->setObjectName( "textLabel2_2_2_2" ); + $textLabel2_2_2_2->setWordWrap( 0 ); + + $vboxLayout5->addWidget( $textLabel2_2_2_2 ); + + my $textLabel2_2_2_2_2 = Qt::Label( $layout16_2 ); + $self->{textLabel2_2_2_2_2} = $textLabel2_2_2_2_2; + $textLabel2_2_2_2_2->setObjectName( "textLabel2_2_2_2_2" ); + $textLabel2_2_2_2_2->setWordWrap( 0 ); + + $vboxLayout5->addWidget( $textLabel2_2_2_2_2 ); + + + $hboxLayout1->addWidget( $groupHist0 ); + + my $groupHist1 = Qt::GroupBox( $t0Page ); + $self->{groupHist1} = $groupHist1; + $groupHist1->setObjectName( "groupHist1" ); + $sizePolicy->setHeightForWidth( $groupHist1->sizePolicy()->hasHeightForWidth() ); + $groupHist1->setSizePolicy( $sizePolicy ); + $groupHist1->setMinimumSize( Qt::Size(0, 0) ); + my $layout18 = Qt::Widget( $groupHist1 ); + $self->{layout18} = $layout18; + $layout18->setObjectName( "layout18" ); + $layout18->setGeometry( Qt::Rect(8, 17, 75, 150) ); + my $vboxLayout6 = Qt::VBoxLayout( $layout18 ); + $self->{vboxLayout6} = $vboxLayout6; + $vboxLayout6->setSpacing( 0 ); + $vboxLayout6->setMargin( 0 ); + $vboxLayout6->setObjectName( "vboxLayout6" ); + $vboxLayout6->setContentsMargins(0, 0, 0, 0 ); + my $t01 = Qt::LineEdit( $layout18 ); + $self->{t01} = $t01; + $t01->setObjectName( "t01" ); + + $vboxLayout6->addWidget( $t01 ); + + my $bg11 = Qt::LineEdit( $layout18 ); + $self->{bg11} = $bg11; + $bg11->setObjectName( "bg11" ); + + $vboxLayout6->addWidget( $bg11 ); + + my $bg21 = Qt::LineEdit( $layout18 ); + $self->{bg21} = $bg21; + $bg21->setObjectName( "bg21" ); + + $vboxLayout6->addWidget( $bg21 ); + + my $data11 = Qt::LineEdit( $layout18 ); + $self->{data11} = $data11; + $data11->setObjectName( "data11" ); + + $vboxLayout6->addWidget( $data11 ); + + my $data21 = Qt::LineEdit( $layout18 ); + $self->{data21} = $data21; + $data21->setObjectName( "data21" ); + + $vboxLayout6->addWidget( $data21 ); + + + $hboxLayout1->addWidget( $groupHist1 ); + + my $groupHist2 = Qt::GroupBox( $t0Page ); + $self->{groupHist2} = $groupHist2; + $groupHist2->setObjectName( "groupHist2" ); + $groupHist2->setEnabled( 1 ); + $sizePolicy->setHeightForWidth( $groupHist2->sizePolicy()->hasHeightForWidth() ); + $groupHist2->setSizePolicy( $sizePolicy ); + my $layout18_2 = Qt::Widget( $groupHist2 ); + $self->{layout18_2} = $layout18_2; + $layout18_2->setObjectName( "layout18_2" ); + $layout18_2->setGeometry( Qt::Rect(8, 17, 75, 150) ); + my $vboxLayout7 = Qt::VBoxLayout( $layout18_2 ); + $self->{vboxLayout7} = $vboxLayout7; + $vboxLayout7->setSpacing( 0 ); + $vboxLayout7->setMargin( 0 ); + $vboxLayout7->setObjectName( "vboxLayout7" ); + $vboxLayout7->setContentsMargins(0, 0, 0, 0 ); + my $t02 = Qt::LineEdit( $layout18_2 ); + $self->{t02} = $t02; + $t02->setObjectName( "t02" ); + + $vboxLayout7->addWidget( $t02 ); + + my $bg12 = Qt::LineEdit( $layout18_2 ); + $self->{bg12} = $bg12; + $bg12->setObjectName( "bg12" ); + + $vboxLayout7->addWidget( $bg12 ); + + my $bg22 = Qt::LineEdit( $layout18_2 ); + $self->{bg22} = $bg22; + $bg22->setObjectName( "bg22" ); + + $vboxLayout7->addWidget( $bg22 ); + + my $data12 = Qt::LineEdit( $layout18_2 ); + $self->{data12} = $data12; + $data12->setObjectName( "data12" ); + + $vboxLayout7->addWidget( $data12 ); + + my $data22 = Qt::LineEdit( $layout18_2 ); + $self->{data22} = $data22; + $data22->setObjectName( "data22" ); + + $vboxLayout7->addWidget( $data22 ); + + + $hboxLayout1->addWidget( $groupHist2 ); + + my $groupHist3 = Qt::GroupBox( $t0Page ); + $self->{groupHist3} = $groupHist3; + $groupHist3->setObjectName( "groupHist3" ); + $groupHist3->setEnabled( 1 ); + $sizePolicy->setHeightForWidth( $groupHist3->sizePolicy()->hasHeightForWidth() ); + $groupHist3->setSizePolicy( $sizePolicy ); + my $layout18_3 = Qt::Widget( $groupHist3 ); + $self->{layout18_3} = $layout18_3; + $layout18_3->setObjectName( "layout18_3" ); + $layout18_3->setGeometry( Qt::Rect(8, 17, 75, 150) ); + my $vboxLayout8 = Qt::VBoxLayout( $layout18_3 ); + $self->{vboxLayout8} = $vboxLayout8; + $vboxLayout8->setSpacing( 0 ); + $vboxLayout8->setMargin( 0 ); + $vboxLayout8->setObjectName( "vboxLayout8" ); + $vboxLayout8->setContentsMargins(0, 0, 0, 0 ); + my $t03 = Qt::LineEdit( $layout18_3 ); + $self->{t03} = $t03; + $t03->setObjectName( "t03" ); + + $vboxLayout8->addWidget( $t03 ); + + my $bg13 = Qt::LineEdit( $layout18_3 ); + $self->{bg13} = $bg13; + $bg13->setObjectName( "bg13" ); + + $vboxLayout8->addWidget( $bg13 ); + + my $bg23 = Qt::LineEdit( $layout18_3 ); + $self->{bg23} = $bg23; + $bg23->setObjectName( "bg23" ); + + $vboxLayout8->addWidget( $bg23 ); + + my $data13 = Qt::LineEdit( $layout18_3 ); + $self->{data13} = $data13; + $data13->setObjectName( "data13" ); + + $vboxLayout8->addWidget( $data13 ); + + my $data23 = Qt::LineEdit( $layout18_3 ); + $self->{data23} = $data23; + $data23->setObjectName( "data23" ); + + $vboxLayout8->addWidget( $data23 ); + + + $hboxLayout1->addWidget( $groupHist3 ); + + my $groupHist4 = Qt::GroupBox( $t0Page ); + $self->{groupHist4} = $groupHist4; + $groupHist4->setObjectName( "groupHist4" ); + $groupHist4->setEnabled( 1 ); + $sizePolicy->setHeightForWidth( $groupHist4->sizePolicy()->hasHeightForWidth() ); + $groupHist4->setSizePolicy( $sizePolicy ); + my $layout18_4 = Qt::Widget( $groupHist4 ); + $self->{layout18_4} = $layout18_4; + $layout18_4->setObjectName( "layout18_4" ); + $layout18_4->setGeometry( Qt::Rect(8, 17, 75, 150) ); + my $vboxLayout9 = Qt::VBoxLayout( $layout18_4 ); + $self->{vboxLayout9} = $vboxLayout9; + $vboxLayout9->setSpacing( 0 ); + $vboxLayout9->setMargin( 0 ); + $vboxLayout9->setObjectName( "vboxLayout9" ); + $vboxLayout9->setContentsMargins(0, 0, 0, 0 ); + my $t04 = Qt::LineEdit( $layout18_4 ); + $self->{t04} = $t04; + $t04->setObjectName( "t04" ); + + $vboxLayout9->addWidget( $t04 ); + + my $bg14 = Qt::LineEdit( $layout18_4 ); + $self->{bg14} = $bg14; + $bg14->setObjectName( "bg14" ); + + $vboxLayout9->addWidget( $bg14 ); + + my $bg24 = Qt::LineEdit( $layout18_4 ); + $self->{bg24} = $bg24; + $bg24->setObjectName( "bg24" ); + + $vboxLayout9->addWidget( $bg24 ); + + my $data14 = Qt::LineEdit( $layout18_4 ); + $self->{data14} = $data14; + $data14->setObjectName( "data14" ); + + $vboxLayout9->addWidget( $data14 ); + + my $data24 = Qt::LineEdit( $layout18_4 ); + $self->{data24} = $data24; + $data24->setObjectName( "data24" ); + + $vboxLayout9->addWidget( $data24 ); + + + $hboxLayout1->addWidget( $groupHist4 ); + + + $gridLayout9->addLayout( $hboxLayout1, 0, 0, 1, 1 ); + + my $hboxLayout2 = Qt::HBoxLayout( ); + $self->{hboxLayout2} = $hboxLayout2; + $hboxLayout2->setSpacing( 6 ); + $hboxLayout2->setObjectName( "hboxLayout2" ); + my $spacer1 = Qt::SpacerItem( 461, 20, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); + + $hboxLayout2->addItem( $spacer1 ); + + my $t0Update = Qt::PushButton( $t0Page ); + $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 ); + + $hboxLayout2->addWidget( $t0Update ); + + + $gridLayout9->addLayout( $hboxLayout2, 1, 0, 1, 1 ); + + $musrfit_tabs->addTab( $t0Page, Qt::Application::translate( 'MuSRFit4', "t0/Bg", undef, Qt::Application::UnicodeUTF8() ) ); + my $tabPage = Qt::Widget( ); + $self->{tabPage} = $tabPage; + $tabPage->setObjectName( "tabPage" ); + my $gridLayout10 = Qt::GridLayout( $tabPage ); + $self->{gridLayout10} = $gridLayout10; + $gridLayout10->setSpacing( 6 ); + $gridLayout10->setMargin( 11 ); + $gridLayout10->setObjectName( "gridLayout10" ); + my $vboxLayout10 = Qt::VBoxLayout( ); + $self->{vboxLayout10} = $vboxLayout10; + $vboxLayout10->setSpacing( 6 ); + $vboxLayout10->setObjectName( "vboxLayout10" ); + my $gridLayout11 = Qt::GridLayout( ); + $self->{gridLayout11} = $gridLayout11; + $gridLayout11->setSpacing( 6 ); + $gridLayout11->setObjectName( "gridLayout11" ); + my $theoryBlock_Label = Qt::Label( $tabPage ); + $self->{theoryBlock_Label} = $theoryBlock_Label; + $theoryBlock_Label->setObjectName( "theoryBlock_Label" ); + my $palette3 = Qt::Palette(); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); + $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); + $palette3->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); + $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); + $theoryBlock_Label->setPalette( $palette3 ); + $theoryBlock_Label->setWordWrap( 0 ); + + $gridLayout11->addWidget( $theoryBlock_Label, 0, 0, 1, 1 ); + + my $theoryBlock = Qt::TextEdit( $tabPage ); + $self->{theoryBlock} = $theoryBlock; + $theoryBlock->setObjectName( "theoryBlock" ); + $theoryBlock->setEnabled( 1 ); + + $gridLayout11->addWidget( $theoryBlock, 1, 0, 1, 1 ); + + my $parametersList_Label = Qt::Label( $tabPage ); + $self->{parametersList_Label} = $parametersList_Label; + $parametersList_Label->setObjectName( "parametersList_Label" ); + my $palette4 = Qt::Palette(); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); + $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); + $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); + $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); + $parametersList_Label->setPalette( $palette4 ); + $parametersList_Label->setWordWrap( 0 ); + + $gridLayout11->addWidget( $parametersList_Label, 0, 1, 1, 1 ); + + my $parametersList = Qt::TextEdit( $tabPage ); + $self->{parametersList} = $parametersList; + $parametersList->setObjectName( "parametersList" ); + $parametersList->setEnabled( 1 ); + + $gridLayout11->addWidget( $parametersList, 1, 1, 1, 1 ); + + + $vboxLayout10->addLayout( $gridLayout11 ); + + my $hboxLayout3 = Qt::HBoxLayout( ); + $self->{hboxLayout3} = $hboxLayout3; + $hboxLayout3->setSpacing( 6 ); + $hboxLayout3->setObjectName( "hboxLayout3" ); + my $cParamsCombo = Qt::ComboBox( $tabPage ); + $self->{cParamsCombo} = $cParamsCombo; + $cParamsCombo->setObjectName( "cParamsCombo" ); + $sizePolicy9->setHeightForWidth( $cParamsCombo->sizePolicy()->hasHeightForWidth() ); + $cParamsCombo->setSizePolicy( $sizePolicy9 ); + + $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 ); + $textLabel1_4_6->setWordWrap( 0 ); + + $hboxLayout3->addWidget( $textLabel1_4_6 ); + + my $constraintLine = Qt::LineEdit( $tabPage ); + $self->{constraintLine} = $constraintLine; + $constraintLine->setObjectName( "constraintLine" ); + $sizePolicy5->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); + $constraintLine->setSizePolicy( $sizePolicy5 ); + $constraintLine->setMinimumSize( Qt::Size(0, 25) ); + + $hboxLayout3->addWidget( $constraintLine ); + + my $addConstraint = Qt::PushButton( $tabPage ); + $self->{addConstraint} = $addConstraint; + $addConstraint->setObjectName( "addConstraint" ); + $sizePolicy9->setHeightForWidth( $addConstraint->sizePolicy()->hasHeightForWidth() ); + $addConstraint->setSizePolicy( $sizePolicy9 ); + + $hboxLayout3->addWidget( $addConstraint ); + + + $vboxLayout10->addLayout( $hboxLayout3 ); + + my $textLabel2_2_3_4 = Qt::Label( $tabPage ); + $self->{textLabel2_2_3_4} = $textLabel2_2_3_4; + $textLabel2_2_3_4->setObjectName( "textLabel2_2_3_4" ); + my $palette5 = Qt::Palette(); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); + $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); + $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); + $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); + $textLabel2_2_3_4->setPalette( $palette5 ); + $textLabel2_2_3_4->setWordWrap( 0 ); + + $vboxLayout10->addWidget( $textLabel2_2_3_4 ); + + my $functionsBlock = Qt::TextEdit( $tabPage ); + $self->{functionsBlock} = $functionsBlock; + $functionsBlock->setObjectName( "functionsBlock" ); + + $vboxLayout10->addWidget( $functionsBlock ); + + my $hboxLayout4 = Qt::HBoxLayout( ); + $self->{hboxLayout4} = $hboxLayout4; + $hboxLayout4->setSpacing( 6 ); + $hboxLayout4->setObjectName( "hboxLayout4" ); + my $textLabel1_6_3 = Qt::Label( $tabPage ); + $self->{textLabel1_6_3} = $textLabel1_6_3; + $textLabel1_6_3->setObjectName( "textLabel1_6_3" ); + $textLabel1_6_3->setWordWrap( 0 ); + + $hboxLayout4->addWidget( $textLabel1_6_3 ); + + my $resetFunc = Qt::PushButton( $tabPage ); + $self->{resetFunc} = $resetFunc; + $resetFunc->setObjectName( "resetFunc" ); + $resetFunc->setMaximumSize( Qt::Size(100, 32767) ); + + $hboxLayout4->addWidget( $resetFunc ); + + + $vboxLayout10->addLayout( $hboxLayout4 ); + + + $gridLayout10->addLayout( $vboxLayout10, 0, 0, 1, 1 ); + + $musrfit_tabs->addTab( $tabPage, Qt::Application::translate( 'MuSRFit4', "Constraints", undef, Qt::Application::UnicodeUTF8() ) ); + + $gridLayout->addWidget( $musrfit_tabs, 1, 0, 1, 1 ); + + $muSRFit4->setCentralWidget( $widget ); + my $menuBar = Qt::MenuBar( $muSRFit4 ); + $self->{menuBar} = $menuBar; + $menuBar->setObjectName( "menuBar" ); + $menuBar->setEnabled( 1 ); + $menuBar->setGeometry( Qt::Rect(0, 0, 830, 20) ); + my $fileMenu = Qt::Menu( $menuBar ); + $self->{fileMenu} = $fileMenu; + $fileMenu->setObjectName( "fileMenu" ); + my $actions = Qt::Menu( $menuBar ); + $self->{actions} = $actions; + $actions->setObjectName( "actions" ); + my $parameters = Qt::Menu( $menuBar ); + $self->{parameters} = $parameters; + $parameters->setObjectName( "parameters" ); + my $options = Qt::Menu( $menuBar ); + $self->{options} = $options; + $options->setObjectName( "options" ); + my $helpMenu = Qt::Menu( $menuBar ); + $self->{helpMenu} = $helpMenu; + $helpMenu->setObjectName( "helpMenu" ); + $muSRFit4->setMenuBar( $menuBar ); + my $fileToolBar = Qt::ToolBar( $muSRFit4 ); + $self->{fileToolBar} = $fileToolBar; + $fileToolBar->setObjectName( "fileToolBar" ); + $muSRFit4->addToolBar( Qt::TopToolBarArea(), $fileToolBar ); + my $actionsToolBar = Qt::ToolBar( $muSRFit4 ); + $self->{actionsToolBar} = $actionsToolBar; + $actionsToolBar->setObjectName( "actionsToolBar" ); + $muSRFit4->addToolBar( Qt::TopToolBarArea(), $actionsToolBar ); + $tfsLabel->setBuddy( $tfs ); + $comp3Label->setBuddy( $fitType1 ); + $comp1Label->setBuddy( $fitType1 ); + $binsLabel->setBuddy( $bins ); + $tisLabel->setBuddy( $tis ); + $comp2Label->setBuddy( $fitType1 ); + $titleLabel->setBuddy( $title ); + $fileNameLabel->setBuddy( $fileName ); + Qt::Widget::setTabOrder( $musrfit_tabs, $runNumbers ); + Qt::Widget::setTabOrder( $runNumbers, $beamLine ); + Qt::Widget::setTabOrder( $beamLine, $year ); + Qt::Widget::setTabOrder( $year, $runFiles ); + Qt::Widget::setTabOrder( $runFiles, $browse ); + Qt::Widget::setTabOrder( $browse, $fitType1 ); + Qt::Widget::setTabOrder( $fitType1, $tis ); + Qt::Widget::setTabOrder( $tis, $fitType2 ); + Qt::Widget::setTabOrder( $fitType2, $tfs ); + Qt::Widget::setTabOrder( $tfs, $fitType3 ); + Qt::Widget::setTabOrder( $fitType3, $bins ); + Qt::Widget::setTabOrder( $bins, $fitAsyType ); + Qt::Widget::setTabOrder( $fitAsyType, $histsLRBF ); + Qt::Widget::setTabOrder( $histsLRBF, $minimization ); + Qt::Widget::setTabOrder( $minimization, $errorCalc ); + Qt::Widget::setTabOrder( $errorCalc, $ltc ); + Qt::Widget::setTabOrder( $ltc, $xi ); + Qt::Widget::setTabOrder( $xi, $yi ); + Qt::Widget::setTabOrder( $yi, $xf ); + Qt::Widget::setTabOrder( $xf, $yf ); + Qt::Widget::setTabOrder( $yf, $viewBin ); + Qt::Widget::setTabOrder( $viewBin, $fitTextOutput ); + Qt::Widget::setTabOrder( $fitTextOutput, $buttonGroupSharing ); + Qt::Widget::setTabOrder( $buttonGroupSharing, $shParam_1_1 ); + Qt::Widget::setTabOrder( $shParam_1_1, $shParam_1_2 ); + Qt::Widget::setTabOrder( $shParam_1_2, $shParam_1_3 ); + Qt::Widget::setTabOrder( $shParam_1_3, $shParam_1_4 ); + Qt::Widget::setTabOrder( $shParam_1_4, $shParam_1_5 ); + Qt::Widget::setTabOrder( $shParam_1_5, $shParam_1_6 ); + Qt::Widget::setTabOrder( $shParam_1_6, $shParam_1_7 ); + Qt::Widget::setTabOrder( $shParam_1_7, $shParam_1_8 ); + Qt::Widget::setTabOrder( $shParam_1_8, $shParam_1_9 ); + Qt::Widget::setTabOrder( $shParam_1_9, $shParam_2_1 ); + Qt::Widget::setTabOrder( $shParam_2_1, $shParam_2_2 ); + Qt::Widget::setTabOrder( $shParam_2_2, $shParam_2_3 ); + Qt::Widget::setTabOrder( $shParam_2_3, $shParam_2_4 ); + Qt::Widget::setTabOrder( $shParam_2_4, $shParam_2_5 ); + Qt::Widget::setTabOrder( $shParam_2_5, $shParam_2_6 ); + Qt::Widget::setTabOrder( $shParam_2_6, $shParam_2_7 ); + Qt::Widget::setTabOrder( $shParam_2_7, $shParam_2_8 ); + Qt::Widget::setTabOrder( $shParam_2_8, $shParam_2_9 ); + Qt::Widget::setTabOrder( $shParam_2_9, $shParam_3_1 ); + Qt::Widget::setTabOrder( $shParam_3_1, $shParam_3_2 ); + Qt::Widget::setTabOrder( $shParam_3_2, $shParam_3_3 ); + Qt::Widget::setTabOrder( $shParam_3_3, $shParam_3_4 ); + Qt::Widget::setTabOrder( $shParam_3_4, $shParam_3_5 ); + Qt::Widget::setTabOrder( $shParam_3_5, $shParam_3_6 ); + Qt::Widget::setTabOrder( $shParam_3_6, $shParam_3_7 ); + Qt::Widget::setTabOrder( $shParam_3_7, $shParam_3_8 ); + Qt::Widget::setTabOrder( $shParam_3_8, $shParam_3_9 ); + Qt::Widget::setTabOrder( $shParam_3_9, $initParamTable ); + Qt::Widget::setTabOrder( $initParamTable, $title ); + Qt::Widget::setTabOrder( $title, $fileName ); + Qt::Widget::setTabOrder( $fileName, $textMSROutput ); + Qt::Widget::setTabOrder( $textMSROutput, $fapodization ); + Qt::Widget::setTabOrder( $fapodization, $fplot ); + Qt::Widget::setTabOrder( $fplot, $fphase ); + Qt::Widget::setTabOrder( $fphase, $rrfFrq ); + Qt::Widget::setTabOrder( $rrfFrq, $rrfUnits ); + Qt::Widget::setTabOrder( $rrfUnits, $rrfPack ); + Qt::Widget::setTabOrder( $rrfPack, $rrfPhase ); + Qt::Widget::setTabOrder( $rrfPhase, $t01 ); + Qt::Widget::setTabOrder( $t01, $bg11 ); + Qt::Widget::setTabOrder( $bg11, $bg21 ); + Qt::Widget::setTabOrder( $bg21, $data11 ); + Qt::Widget::setTabOrder( $data11, $data21 ); + Qt::Widget::setTabOrder( $data21, $t02 ); + Qt::Widget::setTabOrder( $t02, $bg12 ); + Qt::Widget::setTabOrder( $bg12, $bg22 ); + Qt::Widget::setTabOrder( $bg22, $data12 ); + Qt::Widget::setTabOrder( $data12, $data22 ); + Qt::Widget::setTabOrder( $data22, $t03 ); + Qt::Widget::setTabOrder( $t03, $bg13 ); + Qt::Widget::setTabOrder( $bg13, $bg23 ); + Qt::Widget::setTabOrder( $bg23, $data13 ); + Qt::Widget::setTabOrder( $data13, $data23 ); + Qt::Widget::setTabOrder( $data23, $t04 ); + Qt::Widget::setTabOrder( $t04, $bg14 ); + Qt::Widget::setTabOrder( $bg14, $bg24 ); + Qt::Widget::setTabOrder( $bg24, $data14 ); + Qt::Widget::setTabOrder( $data14, $data24 ); + Qt::Widget::setTabOrder( $data24, $theoryBlock ); + Qt::Widget::setTabOrder( $theoryBlock, $parametersList ); + Qt::Widget::setTabOrder( $parametersList, $cParamsCombo ); + Qt::Widget::setTabOrder( $cParamsCombo, $constraintLine ); + Qt::Widget::setTabOrder( $constraintLine, $addConstraint ); + Qt::Widget::setTabOrder( $addConstraint, $functionsBlock ); + Qt::Widget::setTabOrder( $functionsBlock, $resetFunc ); + Qt::Widget::setTabOrder( $resetFunc, $t0Update ); + + $menuBar->addAction( $fileMenu->menuAction() ); + $menuBar->addAction( $actions->menuAction() ); + $menuBar->addAction( $parameters->menuAction() ); + $menuBar->addAction( $options->menuAction() ); + $menuBar->addAction( $helpMenu->menuAction() ); + $menuBar->addSeparator(); + $fileMenu->addAction( $fileSaveAction ); + $fileMenu->addAction( $fileChangeDirAction ); + $fileMenu->addSeparator(); + $fileMenu->addAction( $fileExitAction ); + $actions->addAction( $fit ); + $actions->addAction( $plot ); + $actions->addAction( $t0 ); + $parameters->addAction( $parametersExport_AsAction ); + $parameters->addAction( $parametersAppend_ToAction ); + $options->addAction( $fileExistCheck ); + $options->addAction( $manualFile ); + $helpMenu->addAction( $helpAboutAction ); + $fileToolBar->addAction( $fileExitAction ); + $fileToolBar->addAction( $fileChangeDirAction ); + $fileToolBar->addAction( $fileSaveAction ); + $actionsToolBar->addAction( $fit ); + $actionsToolBar->addAction( $plot ); + $actionsToolBar->addAction( $t0 ); + $actionsToolBar->addAction( $parametersExport_AsAction ); + $actionsToolBar->addAction( $parametersAppend_ToAction ); + + $self->retranslateUi( $muSRFit4 ); + Qt::Object::connect($fit, SIGNAL 'activated()' , $muSRFit4, SLOT 'GoFit()' ); + Qt::Object::connect($parametersAppend_ToAction, SIGNAL 'activated()' , $muSRFit4, SLOT 'parametersAppend()' ); + Qt::Object::connect($parametersExport_AsAction, SIGNAL 'activated()' , $muSRFit4, SLOT 'parametersExport()' ); + Qt::Object::connect($fileChangeDirAction, SIGNAL 'activated()' , $muSRFit4, SLOT 'fileChangeDir()' ); + Qt::Object::connect($fileSaveAction, SIGNAL 'activated()' , $muSRFit4, SLOT 'fileSave()' ); + Qt::Object::connect($fileExitAction, SIGNAL 'activated()' , $muSRFit4, SLOT 'fileExit()' ); + Qt::Object::connect($helpAboutAction, SIGNAL 'activated()' , $muSRFit4, SLOT 'helpAbout()' ); + Qt::Object::connect($t0, SIGNAL 'activated()' , $muSRFit4, SLOT 'ShowMuSRT0()' ); + Qt::Object::connect($plot, SIGNAL 'activated()' , $muSRFit4, SLOT 'GoPlot()' ); + Qt::Object::connect($resetFunc, SIGNAL 'clicked()' , $muSRFit4, SLOT 'InitializeFunctions()' ); + Qt::Object::connect($addConstraint, SIGNAL 'clicked()' , $muSRFit4, SLOT 'AppendToFunctions()' ); + Qt::Object::connect($buttonGroupSharing, SIGNAL 'toggled(bool)' , $muSRFit4, SLOT 'ActivateShComp()' ); + Qt::Object::connect($musrfit_tabs, SIGNAL 'currentChanged(int)' , $muSRFit4, SLOT 'TabChanged()' ); + Qt::Object::connect($t0Update, SIGNAL 'clicked()' , $muSRFit4, SLOT 't0UpdateClicked()' ); + Qt::Object::connect($buttonGroupSharing, SIGNAL 'toggled(bool)' , $muSRFit4, SLOT 'ActivateShComp()' ); + Qt::Object::connect($menuBar, SIGNAL 'triggered(QAction*)' , $muSRFit4, SLOT 'RunSelectionToggle()' ); + + $musrfit_tabs->setCurrentIndex( 0 ); + $fitType2->setCurrentIndex( 18 ); + $fitType3->setCurrentIndex( 18 ); + + + Qt::MetaObject::connectSlotsByName( $muSRFit4 ); + return $self; +} # setupUi + +sub setup_ui { + my ( $muSRFit4 ) = @_; + return setupUi( $muSRFit4 ); +} + +sub retranslateUi { + my ( $self, $muSRFit4 ) = @_; + $muSRFit4->setWindowTitle( Qt::Application::translate( 'MuSRFit4', "MuSRFit GUI", undef, Qt::Application::UnicodeUTF8() ) ); + $muSRFit4->setWindowIconText( Qt::Application::translate( 'MuSRFit4', "MuSRFitGUI", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileSaveAction}->setText( Qt::Application::translate( 'MuSRFit4', "&Save MSR...", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileSaveAction}->setIconText( Qt::Application::translate( 'MuSRFit4', "&Save MSR...", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileSaveAction}->setStatusTip( Qt::Application::translate( 'MuSRFit4', "&Save MSR", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileSaveAction}->setShortcut( Qt::KeySequence( Qt::Application::translate( 'MuSRFit4', "Ctrl+S", undef, Qt::Application::UnicodeUTF8() ) ) ); + $self->{fileExitAction}->setText( Qt::Application::translate( 'MuSRFit4', "E&xit", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileExitAction}->setIconText( Qt::Application::translate( 'MuSRFit4', "Exit", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileExitAction}->setShortcut( Qt::KeySequence( '' ) ); + $self->{helpAboutAction}->setText( Qt::Application::translate( 'MuSRFit4', "&About", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{helpAboutAction}->setIconText( Qt::Application::translate( 'MuSRFit4', "About", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{helpAboutAction}->setShortcut( Qt::KeySequence( '' ) ); + $self->{fileExistCheck}->setText( Qt::Application::translate( 'MuSRFit4', "Overwrite MSR File", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileExistCheck}->setIconText( Qt::Application::translate( 'MuSRFit4', "Overwrite MSR File", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileExistCheck}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Enable overwriting MSR files", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileExistCheck}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Enable/Disable checking for MSR files.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{manualFile}->setText( Qt::Application::translate( 'MuSRFit4', "Maual file selection", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{manualFile}->setIconText( Qt::Application::translate( 'MuSRFit4', "Maual file selection", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileChangeDirAction}->setText( Qt::Application::translate( 'MuSRFit4', "&Change dir", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileChangeDirAction}->setIconText( Qt::Application::translate( 'MuSRFit4', "&Change dir", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileChangeDirAction}->setShortcut( Qt::KeySequence( Qt::Application::translate( 'MuSRFit4', "Ctrl+C", undef, Qt::Application::UnicodeUTF8() ) ) ); + $self->{optionsnew_itemAction}->setText( Qt::Application::translate( 'MuSRFit4', "new item", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{optionsnew_itemAction}->setIconText( Qt::Application::translate( 'MuSRFit4', "new item", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{parametersExport_AsAction}->setText( Qt::Application::translate( 'MuSRFit4', "&Export As...", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{parametersExport_AsAction}->setIconText( Qt::Application::translate( 'MuSRFit4', "Export As...", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{parametersExport_AsAction}->setShortcut( Qt::KeySequence( Qt::Application::translate( 'MuSRFit4', "Alt+E", undef, Qt::Application::UnicodeUTF8() ) ) ); + $self->{parametersAppend_ToAction}->setText( Qt::Application::translate( 'MuSRFit4', "&Append To...", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{parametersAppend_ToAction}->setIconText( Qt::Application::translate( 'MuSRFit4', "Append To...", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{parametersAppend_ToAction}->setShortcut( Qt::KeySequence( Qt::Application::translate( 'MuSRFit4', "Alt+A", undef, Qt::Application::UnicodeUTF8() ) ) ); + $self->{fit}->setIconText( Qt::Application::translate( 'MuSRFit4', "Fit and Plot", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fit}->setShortcut( Qt::KeySequence( Qt::Application::translate( 'MuSRFit4', "Ctrl+F", undef, Qt::Application::UnicodeUTF8() ) ) ); + $self->{plot}->setIconText( Qt::Application::translate( 'MuSRFit4', "Plot", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{plot}->setShortcut( Qt::KeySequence( Qt::Application::translate( 'MuSRFit4', "Ctrl+P", undef, Qt::Application::UnicodeUTF8() ) ) ); + $self->{t0}->setIconText( Qt::Application::translate( 'MuSRFit4', "Show t0 and Bg Bins", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{t0}->setShortcut( Qt::KeySequence( Qt::Application::translate( 'MuSRFit4', "Ctrl+T", undef, Qt::Application::UnicodeUTF8() ) ) ); + $self->{optionsFourier}->setText( Qt::Application::translate( 'MuSRFit4', "Fourier", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{optionsFourier}->setIconText( Qt::Application::translate( 'MuSRFit4', "Fourier", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{optionsT0}->setText( Qt::Application::translate( 'MuSRFit4', "T0 and Bg bins", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{optionsT0}->setIconText( Qt::Application::translate( 'MuSRFit4', "T0 and Bg bins", 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() )]); + $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->{beamLine}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "LEM", 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->{runsMan}->setTitle( Qt::Application::translate( 'MuSRFit4', "RUN Files", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runFiles}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runFiles}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{browse}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{browse}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{browse}->setText( Qt::Application::translate( 'MuSRFit4', "Browse", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{groupBox}->setTitle( Qt::Application::translate( 'MuSRFit4', "Theory Function", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fitType2}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Exponential Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Background", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "MolMag", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "None", undef, Qt::Application::UnicodeUTF8() )]); + $self->{tfsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Final Time", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fitType1}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Exponential Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Background", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "MolMag", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() )]); + $self->{bins}->setText( Qt::Application::translate( 'MuSRFit4', "100", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{comp3Label}->setText( Qt::Application::translate( 'MuSRFit4', "Third Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tis}->setText( Qt::Application::translate( 'MuSRFit4', "0", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tfs}->setText( Qt::Application::translate( 'MuSRFit4', "8", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{comp1Label}->setText( Qt::Application::translate( 'MuSRFit4', "First Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{binsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tisLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Initial Time", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fitType3}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Exponential Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Background", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "MolMag", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "None", undef, Qt::Application::UnicodeUTF8() )]); + $self->{comp2Label}->setText( Qt::Application::translate( 'MuSRFit4', "Second Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{runsPage}), Qt::Application::translate( 'MuSRFit4', "RUNS", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{errorCalc}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "HESSE", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "MINOS", undef, Qt::Application::UnicodeUTF8() )]); + $self->{ltc}->setText( Qt::Application::translate( 'MuSRFit4', "Life time correction", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4}->setText( Qt::Application::translate( 'MuSRFit4', "X Range", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "View Binning", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_2}->setText( Qt::Application::translate( 'MuSRFit4', "Y Range", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{minimization}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "MINIMIZE", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "MIGRAD", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "SIMPLEX", undef, Qt::Application::UnicodeUTF8() )]); + $self->{textLabel1_5}->setText( Qt::Application::translate( 'MuSRFit4', "Minimization type", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_5_2}->setText( Qt::Application::translate( 'MuSRFit4', "Error estimation", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{fittingPage}), Qt::Application::translate( 'MuSRFit4', "Fitting", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{buttonGroupSharing}->setTitle( Qt::Application::translate( 'MuSRFit4', "Shared parameters among different runs", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{sharingComp2}->setTitle( Qt::Application::translate( 'MuSRFit4', "2nd Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{comp2ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType2", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_2_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_2_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_2_4}->setText( Qt::Application::translate( 'MuSRFit4', "Param4", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_2_5}->setText( Qt::Application::translate( 'MuSRFit4', "Param5", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_2_6}->setText( Qt::Application::translate( 'MuSRFit4', "Param6", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_2_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_2_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_2_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{sharingComp3}->setTitle( Qt::Application::translate( 'MuSRFit4', "3rd Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{comp3ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType3", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_3_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_3_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_3_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_3_4}->setText( Qt::Application::translate( 'MuSRFit4', "Param4", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_3_5}->setText( Qt::Application::translate( 'MuSRFit4', "Param5", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_3_6}->setText( Qt::Application::translate( 'MuSRFit4', "Param6", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_3_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_3_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_3_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{sharingComp1}->setTitle( Qt::Application::translate( 'MuSRFit4', "1st Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_4}->setText( Qt::Application::translate( 'MuSRFit4', "Param4", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_5}->setText( Qt::Application::translate( 'MuSRFit4', "Param5", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_6}->setText( Qt::Application::translate( 'MuSRFit4', "Param6", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{comp1ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{sharingPage}), Qt::Application::translate( 'MuSRFit4', "Sharing", undef, Qt::Application::UnicodeUTF8() ) ); + my $initParamTable = $self->{initParamTable}; + if ( $initParamTable->columnCount < 4 ) { + $initParamTable->setColumnCount(4); + } + + my $__colItem = Qt::TableWidgetItem(); + $__colItem->setText( Qt::Application::translate( 'MuSRFit4', "Value", undef, Qt::Application::UnicodeUTF8() ) ); + $initParamTable->setHorizontalHeaderItem( 0, $__colItem ); + + my $__colItem1 = Qt::TableWidgetItem(); + $__colItem1->setText( Qt::Application::translate( 'MuSRFit4', "Error", undef, Qt::Application::UnicodeUTF8() ) ); + $initParamTable->setHorizontalHeaderItem( 1, $__colItem1 ); + + my $__colItem2 = Qt::TableWidgetItem(); + $__colItem2->setText( Qt::Application::translate( 'MuSRFit4', "Min", undef, Qt::Application::UnicodeUTF8() ) ); + $initParamTable->setHorizontalHeaderItem( 2, $__colItem2 ); + + my $__colItem3 = Qt::TableWidgetItem(); + $__colItem3->setText( Qt::Application::translate( 'MuSRFit4', "Max", undef, Qt::Application::UnicodeUTF8() ) ); + $initParamTable->setHorizontalHeaderItem( 3, $__colItem3 ); + if ( $initParamTable->rowCount() < 1 ) { + $initParamTable->setRowCount(1); + } + + my $__rowItem = Qt::TableWidgetItem(); + $__rowItem->setText( Qt::Application::translate( 'MuSRFit4', "Alpha", undef, Qt::Application::UnicodeUTF8() ) ); + $initParamTable->setVerticalHeaderItem( 0, $__rowItem ); + $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{initializationPage}), Qt::Application::translate( 'MuSRFit4', "Initialization", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{groupTitle}->setTitle( '' ); + $self->{titleLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Enter the label (defaul is run title from the first run)", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{title}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Title line for MSR file (optional)", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{title}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Title line for MSR file (optional)", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{title}->setText( '' ); + $self->{fileNameLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Enter [name] for output [name].msr file (optional)", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileName}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Name of the produced MSR file (optional)", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileName}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Name of the produced MSR file (optional)", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{msrPage}), Qt::Application::translate( 'MuSRFit4', "MSR File", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fourierBox}->setTitle( Qt::Application::translate( 'MuSRFit4', "Fourier transform parameters", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{funits}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "MHz", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gauss", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Mc/s", undef, Qt::Application::UnicodeUTF8() )]); + $self->{fplot}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "power", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "real", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "imag", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "real_and_imag", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "phase", undef, Qt::Application::UnicodeUTF8() )]); + $self->{textLabel1_3_8}->setText( '' ); + $self->{textLabel1_7}->setText( Qt::Application::translate( 'MuSRFit4', "Phase:", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fplotLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Plot", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_3_4}->setText( '' ); + $self->{fapodization}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "STRONG", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "MEDIUM", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "WEAK", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "NONE", undef, Qt::Application::UnicodeUTF8() )]); + $self->{fapodizationLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Apodization", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_3_3}->setText( '' ); + $self->{textLabel1_2}->setText( Qt::Application::translate( 'MuSRFit4', "to", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_3_6}->setText( '' ); + $self->{textLabel1_3_5}->setText( '' ); + $self->{textLabel1_3_7}->setText( '' ); + $self->{textLabel1}->setText( Qt::Application::translate( 'MuSRFit4', "Range: from", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{label}->setText( Qt::Application::translate( 'MuSRFit4', "Units", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{rrfBox}->setTitle( Qt::Application::translate( 'MuSRFit4', "Rotatting reference frame (RRF) parameters", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_6_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "Phase", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_6}->setText( Qt::Application::translate( 'MuSRFit4', "Frequency", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_6_2_4}->setText( '' ); + $self->{rrfFrq}->setText( '' ); + $self->{textLabel1_6_2_3}->setText( '' ); + $self->{textLabel1_6_2}->setText( Qt::Application::translate( 'MuSRFit4', "Packing", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{rrfUnits}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "MHz", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "kHz", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Mc/s", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "G", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "T", undef, Qt::Application::UnicodeUTF8() )]); + $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{fourierPage}), Qt::Application::translate( 'MuSRFit4', "FFT/RRF", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{groupHist0}->setTitle( '' ); + $self->{textLabel2}->setText( Qt::Application::translate( 'MuSRFit4', "t0", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel2_2_2_3}->setText( Qt::Application::translate( 'MuSRFit4', "Bg1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel2_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "Bg2", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel2_2_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "Data 1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel2_2_2_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "Data 2", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{groupHist1}->setTitle( Qt::Application::translate( 'MuSRFit4', "Hist1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{groupHist2}->setTitle( Qt::Application::translate( 'MuSRFit4', "Hist2", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{groupHist3}->setTitle( Qt::Application::translate( 'MuSRFit4', "Hist3", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{groupHist4}->setTitle( Qt::Application::translate( 'MuSRFit4', "Hist4", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{t0Update}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Use musrt0 to set values", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{t0Update}->setText( Qt::Application::translate( 'MuSRFit4', "Update", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{t0Page}), Qt::Application::translate( 'MuSRFit4', "t0/Bg", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{theoryBlock_Label}->setText( Qt::Application::translate( 'MuSRFit4', "THEORY Block", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{parametersList_Label}->setText( Qt::Application::translate( 'MuSRFit4', "Parameters List", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_6}->setText( Qt::Application::translate( 'MuSRFit4', "=", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{addConstraint}->setText( Qt::Application::translate( 'MuSRFit4', "Add", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel2_2_3_4}->setText( Qt::Application::translate( 'MuSRFit4', "FUNCTIONS Block", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_6_3}->setText( '' ); + $self->{resetFunc}->setText( Qt::Application::translate( 'MuSRFit4', "Reset", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{tabPage}), Qt::Application::translate( 'MuSRFit4', "Constraints", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileMenu}->setTitle( Qt::Application::translate( 'MuSRFit4', "&File", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{actions}->setTitle( Qt::Application::translate( 'MuSRFit4', "Actions", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{parameters}->setTitle( Qt::Application::translate( 'MuSRFit4', "Parameters", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{options}->setTitle( Qt::Application::translate( 'MuSRFit4', "Options", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{helpMenu}->setTitle( Qt::Application::translate( 'MuSRFit4', "&Help", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileToolBar}->setProperty("label", Qt::Variant( Qt::Application::translate( 'MuSRFit4', "File Menu", undef, Qt::Application::UnicodeUTF8() ) )); + $self->{actionsToolBar}->setProperty("label", Qt::Variant( Qt::Application::translate( 'MuSRFit4', "Actions Menu", undef, Qt::Application::UnicodeUTF8() ) )); +} # retranslateUi + +sub retranslate_ui { + my ( $muSRFit4 ) = @_; + retranslateUi( $muSRFit4 ); +} + +1; \ No newline at end of file diff --git a/src/external/MuSRFitGUI/icos/Append.odg b/src/external/MuSRFitGUI/icos/Append.odg new file mode 100644 index 0000000000000000000000000000000000000000..070faea887c5a0d8271c2ddfb9e21ea94714b3fb GIT binary patch literal 10937 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 literal 0 HcmV?d00001 diff --git a/src/external/MuSRFitGUI/icos/Append.png b/src/external/MuSRFitGUI/icos/Append.png new file mode 100644 index 0000000000000000000000000000000000000000..e799c7bb8520fef116f250c02608253416c328ab GIT binary patch literal 404 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 literal 0 HcmV?d00001 diff --git a/src/external/MuSRFitGUI/icos/Export.png b/src/external/MuSRFitGUI/icos/Export.png new file mode 100644 index 0000000000000000000000000000000000000000..eadae1401cad8faca5fdb8762b6efaa6e45a56fd GIT binary patch literal 374 zcmV-+0g3*JP)Pnf-!&SXnXRmi{3;%+YL>~c7J$F(@M|ta z0RPoNxAu%xP`0X1l3_@0ga+U0v0!1Hu(;wa}YZITrroyDOOnwmOi)a|4y#N3J literal 0 HcmV?d00001 diff --git a/src/external/MuSRFitGUI/icos/Fit.odg b/src/external/MuSRFitGUI/icos/Fit.odg index 538821986e39d3d881d69d7f13728f3a48e673ac..57b22fcbd477da83073030e441689e3b3e499b27 100644 GIT binary patch literal 11811 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 n)%5Rh@JGVN|2|dVot)p|s)_@bh literal 11570 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 diff --git a/src/external/MuSRFitGUI/icos/MuSRFit.odg b/src/external/MuSRFitGUI/icos/MuSRFit.odg index 4ac0254cc7fdb23954cac80344cc7c1bad05cbc6..a3365d8b957bff449e8a3820446dcb8066c56aec 100644 GIT binary patch literal 13391 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 literal 15336 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 diff --git a/src/external/MuSRFitGUI/icos/Plot.odg b/src/external/MuSRFitGUI/icos/Plot.odg index 902d076e9063f987a9db34538b3ff265b40ae538..c550f2e67fe82beea982574b5acbe59399d53524 100644 GIT binary patch literal 12961 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

nz(S+>@gXBW-G&^&*`fhVd?ani}Y_ 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 F`+wj3H&p-t diff --git a/src/external/MuSRFitGUI/icos/chdir.png b/src/external/MuSRFitGUI/icos/chdir.png new file mode 100644 index 0000000000000000000000000000000000000000..35755c4b533e62dce89621c2b6233e7172c6a0b8 GIT binary patch literal 3623 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 literal 0 HcmV?d00001 diff --git a/src/external/MuSRFitGUI/icos/exit.png b/src/external/MuSRFitGUI/icos/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..0237eac069cfdd6d1c61b22f2248c2ec2a8f5905 GIT binary patch literal 2073 zcmV+!2RP)- zl~wsCMKtR8pZn96hnW0_j8i}aR8$BXkTPN z13ljSXn#KogM(yKsjUdXvK&x=&@?n%$GmwHb8>Rg;#G#$F-&8*zOp1S(3Gh@7a6czI52>sGoRdkifc1|i6&QcQpOCCawzqM-mG#Nwbd zk){ry6iO+Sl!!8n!A0uQ#c_yk+QhmC9&k|r^kkBmufIl`rth@ym#9IYyk6blE!zRl zFey<&R2y1{w@8VSvaue=arJoAs*QNCtpy~OcA%`pi-xE*xMqyr-cEe`c8U`d^_|c( zl0!pS)6kC@LvIHZR~UQHZiK6|4jS*hMJBn)~mk`@jKW0|TVreHUuWZh74L zXPzP4)y3?$-!lEh7g&>%P=l=U*1Xdcs<)7yNYH!e5S@=af}Tj=?H8(E;wy#Fbt1jJ z^gi_z$vu0xaq1MtrAr`$n;SutTcD8E+;&w_7NC=o5Be822{YQ?F92^AOuF%HIBM*g@H~%5plNg;JV?j>{Rmz6$2#-#STi&A zcUH^7ymhOpExK_dcfI^FZJRf{B{o3WR+6~613?5lM;wRtp&_~-eYDE>!q^zsPn^KG zcoDS4s-0qy%=_;%{rTs}Qps3KI8vf)o5YSC zBzErf`|X7VZhiP6`OBBxhDPu!g%AQ+D3Ja5WB&g6XTM92#prnGA+$)utzcf@nn>$q z)T5CQB=_z`kH`HX3%~yA8zah5Gt+5|3l|XKFlZXarAw$%$v4WLnPK|eIg&#|Xt5Xo ziQT)2^z=}gn5fdVat8v@(4$de+qPA@ZJXTr^T>SO&4;p+#^@+xufOi*f>J2cL|Inl zP^M`ZqoWkY#z^eiq`L3HCrN@HVgH47ryz>(JWfxxb)MWci}JN+)lFes(deu))c zp%;=5Xfck%dClnW*+mFUp8kfo&N6I3a|40(Kvk z_d-*JK!A(VFp!4fckAu#=+P*}t5>n-=8%QLqW6V*#)C_ls(i96?8!-&hO|~9TPmYL zCuE^O@y|ai4#eX`@4g%J#tonIo&n9S_`m>(y?cFK_UtUBt5?x##;wc&k3Lc<PtC z{QbiZl{YJ(>(C+M_uNz0NUeO;KI@uB&$G|c*5B{z$zQyPdF4vgoRuRGNMKnkQks}x z>hx*ysgyq?wqpkyj~*r5-tI5l$Z+qu?Ay1bYI}B;>|1X!dEx}Zqhl=# znn+7I5OhGRxzGRf6XVZ6&(z72*wfRks6*K{#*aUee(5Eqjva%1ev#f*_kpGe1Qj-l zjx|0`=ExD|&YYq1@L>`oBZN0?LW{)^y6zswP17v|qod59J4f!5Pq1&@YN)r>eW0bo zTre8-jspOgCdPN)kw1T)a9dhHrNJO5L3!r00000NkvXXu0mjf DS+oXE literal 0 HcmV?d00001 diff --git a/src/external/MuSRFitGUI/icos/save.png b/src/external/MuSRFitGUI/icos/save.png new file mode 100644 index 0000000000000000000000000000000000000000..d43622c2546755dae427552f1e3f49e62d4d651f GIT binary patch literal 1646 zcmV-!29f!RP)NtVT%}qq)3~)tNUmadhkxeD|^B;+iCnJ1fV6D8Z#glDC z4xOZt@fF~g2Wy9KRMqn$(o@yYx{xu#8|Qu?MLcT?=aEsbTR0S@mnFPmLj3YS+ea^3 zRegPgZ2P0}F;ta}jhA`vr|-$Vd;jM8KR=6NL^Nolf#pVlHZq72q>g|QjfspZFgf~w z7$a}K`8_UQz9KjOb(0%6K9|G@>#I3=Vp*~QKq1c(l3?ai)ffR0*xTFV>C>lt`^`7% zL*T8~&+x&OpK*|xmJAW$(@(zTW>k!st+5FN4BOk={PuUhiG#s_s`9$FlF5bdzj~md zE6?B)+N%CNhhVo&?9Ta81a=~N;y-l-8W5B z#F)A7n}6k!A;&at(q*wRhAhvPPNs`}I}uQAYQd2mW^dR<9I3NT2Xk~H5M#uZt|l?h z9y;;o)Wsq~p63{AmqWlBLvN+m<(AHnxyT-q0J7{(s5`p3PzaRHEj0%6JX@X%i7}*U zdQ4r-2h*VjbSEG}l63RB<6wztG~#_&sHCG47g%dMRpO2WAcQbkN1ftg8U)+H|2q>f z#?b36H;r~BKbNguMCzP(&$$RV=MG+PoCs9wJ?Fr4T}VXO`s<(7mt~xlpBHJR7$blG z$KO=u=!xbc;49DFyLTrKNK$Led%qCjMPO%VhlgK(%|ZyMDi!Rh`P%Ce+%j>=agnIX;0p`Z$?a+v>BQLU8}V{G1`2pUDxG(Fx-{5(w4h=|Z` zs;X#=RHa8Xl4f=6JbC<-s)~rnfiXgeHU6=mhf({u`niZJEvuyho9;RI9_=PUM#0#wPfY>Y%5v{R&%Hn!UT0#29!Kv_Bl z#s0zZBofw6F8l|X_Q3y_G}O-|P&jsX2P2KxFbP$~nkkiBKn!R+JU&qZs!CZn3ilcwAXg3`(rEtgUab+Uv2J=j3^cF$UF0dg8u;;Bh0S9S3D2^001I-R9JLVZ)S9NVRB^v s0C?IfFE7{2%*!rLPAo{(%P&d?05;eLSP)anTmS$707*qoM6N<$f(?Baod5s; literal 0 HcmV?d00001 diff --git a/src/external/MuSRFitGUI/icos/saveMSR.png b/src/external/MuSRFitGUI/icos/saveMSR.png new file mode 100644 index 0000000000000000000000000000000000000000..59fcdc4336d3f605c723d3f06b44970a7bade416 GIT binary patch literal 2587 zcmV+$3gq>PP)F3t_dk1rM)Jlik`#F0JA*?0c?-#HG5qf zgV~yo*I)YsE}TDS?{W7QyaL_2`nFeg?%X*V;`SmYLYRlX`K`NWW@g0I>8nsuVQ}z9 z0KkHB8AD5NLT^tul$4z%A_QQ6PC`}~ArZ$P5CYO&5JEsW0w2uQQC?6+z1B!P+iwK& z-FN;z%*>JSyrdbCnx2_~?*|C<90qYi0+^JdBY_CN$PyC{ZA45u0gGzN}PwRtwRbZDZp**zbVb+m?I@q=OS_$06>pd#1Mc7WA{F=b5{maE`d-z`wt!f z0NlT0X9ApZ1OT8=Q~-d$Hz^S}PYa&PB}zmIf((EdP%7WQ_8oXO!b2$&l4O(_X&sM%95f9lD-*s=W^nfreF)RXO!g8$hYn%yoohi1luO;Y z5Bbs;?z9VP-q`2Y0N`lRot~`&3~Y>lZsUO3P*b{2((%`X8pyrfAReM z2&7|dt2S|^iW>&X^CGagznnO~G&vmsX17>z)99mSh;o5Hxa)r4+5Pz@ly>5;Y~7l9 zz<6aETBpoJTXP6pZ`YPA?n^`--NN*C@BUtkw4dhh#6-ZhEnD%+7Y+je#x7mKAK&;3 z0AN>a-tXMCs2w|jT^rZ6B(ZF;ANyWDfwbr!=%D#+TehM^ZA=JhXL09`KmG*n+5A-$ z4dJdkKAB0{?z-bP2ZW;#czS#?5fd4}%8xB>g1vVg-n}r{lxPR*-L`oPz|>(OOL-G9 z+fKFzCX6;F<)}J}HbFeXgr?=Ly>qUTHN6%l^ys6HyVIdEE%nvQ2eEqjU^Euwqzh?hPLqqbBfmOo zv9!%b^IZTZ-+BX=CMxjjwPuDGo45C|N0Qm&zNe$(+gC1Wshy{Pl)P_E?D*}IZ(-BM zQ5-$?QW8(QD3rFZ@Z9qx{`JqXmOHNxE>{wpllwMp!jYp#+dAcz(M{kh??>j5HZRXp z89Yaiy_5;fWWss9M5Z`!z0i-fYI7^V?boG zD{%}@lsFzf+p%dfO>GV^sM&1`S6 zG!wPeKxg3heR&(!es*m$dZZScYtbPyM2F5ve5=JbJbitWZGyzw;|vu z57JW!HA^X>lxmhr9PkiaNKT~cjNzuAh+vF?k_u8ufbHrpJq1sBxp*Y$b{c4HLk0$o zdIMVP2;fhi_%Uj=dSu*w5I_jv`wu_t3SqWFZMTP<(10-p#u!K`o!JSnV1Na{6y0}C zKG2SUfPnH8lv4Jk%(!@QJmH*y)@U>uku%3NKtxdwwWPIjMzB9EezSNz7+Nl8s9^ zJdZngNJ?w%h!6}BKut2_=7pv4Fum61I(+~VZb#I@Mj6oBf@(CH&K?Jy?%^CV21X|} z#BNTgDPn>YvXc|H4x^F;Jf-YHqqPNLOw;kekx6N-n{#4X2u&$8Clg84&JWiCVrpin zLO>}6f3AUIv8z*Es5Jp&1nRXK>h%VE-v<$4c5cprv0FePt%Pc|S_W(@Ekwk$-Cia& zVDU8SwJ2hB&;XwVcujsuoZ%G;ATkJo0LB>f_4Z-%%4INF=}RIEELwyh2qIviz32Hy zs3oHfwA9fiiWx9uBCz#(9i`F&%+1xpZwN9>eBuP;<*BLR{=UB73V}~&HDEwSLu*Sw zYmFZ~^25kELvUJaOixcIq#H^#9i8GfZj5#rw9^(-LfX~pjB{uY07?LA08ByyXV0Ij z_m<1wT{`s9=RD85C8+@dAR_zLS|bR8M5v4}SUTEiQO1nY$(b<*+GwQ9ocZN^0{{a6 zDgek!56@JqwbNr`2X0=rY)@CQxUgBnF{oB&F?o5?<}FTgY1ML8b+$V%!Ddm*!2XBVv1Ax;6d;pUG-u8pw9~19ay2A$!4GqaptXj2r)v8r}eSLji zS65e|P$(#+l;^+;XC9K7r4WLdSx70FnaQ0qGi$B2@qIt2R;zPUQ&SB9SKm8*db(Dt zwfi>300ICr0H)kAixwX}lymU-19`=Y6J-kLIg|gTJWIj=&@Kw`zX89>)jL|FXa@iQ002ovPDHLkV1oGE!EFEl literal 0 HcmV?d00001 From 2460f845b1a1e150c605b7eb8aef862ac2493373 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 22 Mar 2017 23:07:42 +0100 Subject: [PATCH 10/87] More progress in porting MuSRFit to qt4. --- src/external/MuSRFitGUI/MuSRFit4.pm | 206 +- src/external/MuSRFitGUI/MuSRFit4.ui | 3737 +++++++++++++----------- src/external/MuSRFitGUI/Ui_MuSRFit4.pm | 1743 +++++------ 3 files changed, 3009 insertions(+), 2677 deletions(-) diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm index 7dcf5f95..fc614e85 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.pm +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -46,6 +46,7 @@ sub NEW { my ( $class, $parent ) = @_; $class->SUPER::NEW($parent); this->{ui} = Ui_MuSRFit4->setupUi(this); + my %All=CreateAllInput(); } # This file is part of MuSRFitGUI. @@ -91,6 +92,7 @@ sub fileSave() "$FILENAME", "MSR Files (*.msr *.mlog)", this, + "save file dialog", "Choose a filename to save under"); @@ -257,15 +259,16 @@ sub CreateAllInput() $All{"RunNumbers"} = this->{ui}->runNumbers->text(); $All{"RunFiles"} = this->{ui}->runFiles->text(); $All{"BeamLine"} = this->{ui}->beamLine->currentText; - $All{"RUNSType"} = this->{ui}->manualFile->isOn(); + $All{"RUNSType"} = this->{ui}->manualFile->isChecked(); $All{"YEAR"} = this->{ui}->year->currentText; - if ($All{"YEAR"} eq "") { + if (!defined($All{"YEAR"}) || $All{"YEAR"} eq "") { # If year combobox is empty fill it up from 2004 up to current year my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(); my $current_year = 1900 + $yearOffset; +# my @years = ($current_year..2004); +# this->{ui}->year->addItems(@years); for (my $i=$current_year;$i>=2004;$i--) { - this->{ui}->year->insertItem($i,-1); - print "inserted-$i\n"; + this->{ui}->year->addItem($i); } } # Time range and BINS @@ -297,7 +300,7 @@ sub CreateAllInput() $All{"ltc"}="n"; } # Minuit commands - if ( $All{"go"} eq "" ) { + if ( !defined($All{"go"}) || $All{"go"} eq "" ) { $All{"go"}="PLOT"; } # Get minimization process @@ -322,7 +325,7 @@ sub CreateAllInput() $All{"FILENAME"}= this->{ui}->fileName->text; # From Fourier Tab - $All{"FUNITS"}= this->{ui}->fUnits->currentText; + $All{"FUNITS"}= this->{ui}->funits->currentText; $All{"FAPODIZATION"}= this->{ui}->fapodization->currentText; $All{"FPLOT"}= this->{ui}->fplot->currentText; $All{"FPHASE"}=this->{ui}->fphase->text; @@ -339,13 +342,13 @@ sub CreateAllInput() # Get values of t0 and Bg/Data bins if given my $NHist = 1; foreach my $Hist (@Hists) { - foreach ("t0","Bg1","Bg2","Data1","Data2") { + foreach ("t0","bg1","bg2","data1","data2") { my $Name = "$_$NHist"; - $All{$Name}=child($Name)->text; + $All{$Name}=child("Qt::LineEdit",$Name)->text; # TODO: If empty fill with defaults if ($All{$Name} eq "") { $All{$Name}=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); - child($Name)->setText($All{$Name}); + child("Qt::LineEdit",$Name)->setText($All{$Name}); } } $NHist++; @@ -373,9 +376,9 @@ sub CreateAllInput() 18,"None" ); - my $FT1=this->{ui}->fitType1->currentItem; - my $FT2=this->{ui}->fitType2->currentItem; - my $FT3=this->{ui}->fitType3->currentItem; + my $FT1=this->{ui}->fitType1->currentIndex; + my $FT2=this->{ui}->fitType2->currentIndex; + my $FT3=this->{ui}->fitType3->currentIndex; $All{"FitType1"} = $FTs{$FT1}; $All{"FitType2"} = $FTs{$FT2}; $All{"FitType3"} = $FTs{$FT3}; @@ -394,9 +397,9 @@ sub CreateAllInput() my @Paramcomp = @$Paramcomp_ref; # Functions block - $All{"FunctionsBlock"}=this->{ui}->functionsBlock->text; + $All{"FunctionsBlock"}=this->{ui}->functionsBlock->toPlainText; # and the associated theory block - $All{"Func_T_Block"}=this->{ui}->theoryBlock->text; + $All{"Func_T_Block"}=this->{ui}->theoryBlock->toPlainText; # Shared settings are detected here $All{"EnableSharing"} = this->{ui}->buttonGroupSharing->isChecked(); @@ -438,8 +441,8 @@ sub CreateAllInput() } 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); + my $ChkName="shParam_".$Component."_".$NP; + my $ChkBx = child("Qt::Widget",$ChkName); $Shared = $ChkBx->isChecked(); } $All{"Sh_$Param"}=$Shared; @@ -452,10 +455,12 @@ sub CreateAllInput() # Done with shared parameters detecting # Construct a default filename if empty - if ( $All{"FILENAME"} eq "" && !$All{"RUNSType"}) { - $All{"FILENAME"}=$RUNS[0]."_".$All{"BeamLine"}."_".$All{"YEAR"}; - if ($All{"BeamLine"} eq "LEM (PPC)") { - $All{"FILENAME"}=$RUNS[0]."_LEM_".$All{"YEAR"}; + if (defined($RUNS[0])) { + if ( $All{"FILENAME"} eq "" && !$All{"RUNSType"}) { + $All{"FILENAME"}=$RUNS[0]."_".$All{"BeamLine"}."_".$All{"YEAR"}; + if ($All{"BeamLine"} eq "LEM (PPC)") { + $All{"FILENAME"}=$RUNS[0]."_LEM_".$All{"YEAR"}; + } } } else { $All{"FILENAME"}="TMP"; @@ -472,21 +477,23 @@ sub CreateAllInput() my $erradd = "d"; my $minadd = "_min"; my $maxadd = "_max"; - my $Header=this->{ui}->initParamTable->verticalHeader(); + my $QTable=this->{ui}->initParamTable; # TODO: Should not go over all rows, only on parameters. if ($NParam > 0) { +# Set appropriate number of rows + $QTable->setRowCount($NParam); for (my $i=0;$i<$NParam;$i++) { # Take label of row, i.e. name of parameter - my $Param=$Header->label($i); + if (defined($QTable->verticalHeaderItem($i)) && defined($QTable->item($i,1)) && defined($QTable->item($i,2)) && defined($QTable->item($i,3)) && defined($QTable->item($i,4))) { + my $Param=$QTable->verticalHeaderItem($i)->text(); # Then take the value, error, max and min (as numbers) - $All{"$Param"}=1.0*this->{ui}->initParamTable->item($i,0)->text($i,0); - $All{"$erradd$Param"}=1.0*this->{ui}->initParamTable->item($i,1)->text($i,1); - $All{"$Param$minadd"}=1.0*this->{ui}->initParamTable->item($i,2)->text($i,2); - $All{"$Param$maxadd"}=1.0*this->{ui}->initParamTable->item($i,3)->text($i,3); + $All{"$Param"}=1.0*$QTable->item($i,0)->text(); + $All{"$erradd$Param"}=1.0*$QTable->item($i,1)->text(); + $All{"$Param$minadd"}=1.0*$QTable->item($i,2)->text(); + $All{"$Param$maxadd"}=1.0*$QTable->item($i,3)->text(); + } } } - - # Return Hash with all important values return %All; } @@ -497,7 +504,7 @@ sub CallMSRCreate() my %All=CreateAllInput(); # Check if the option for checking for existing files is selected - my $FileExistCheck= this->{ui}->fileExistCheck->isOn(); + my $FileExistCheck= this->{ui}->fileExistCheck->isChecked(); my $FILENAME=$All{"FILENAME"}.".msr"; my $Answer=0; if ($All{"RunNumbers"} ne "" || $All{"RunFiles"} ne "") { @@ -572,12 +579,15 @@ sub UpdateMSRFileInitTable() { my %All=CreateAllInput(); my $FILENAME=$All{"FILENAME"}; - open (MSRF,q{<},"$FILENAME.msr" ); - my @lines = ; - close(IFILE); + my @lines=(); + if (-e "$FILENAME.msr") { + open (MSRF,q{<},"$FILENAME.msr" ); + @lines = ; + close(IFILE); + } this->{ui}->textMSROutput->setText(""); foreach my $line (@lines) { - this->{ui}->textMSROutput->append("$line"); + this->{ui}->textMSROutput->insertPlainText("$line"); } (my $TBlock_ref, my $FPBlock_ref)=MSR::ExtractBlks(@lines); @@ -585,7 +595,6 @@ sub UpdateMSRFileInitTable() my $PCount=0; foreach my $line (@FPBloc) { - $PCount++; my @Param=split(/\s+/,$line); # Depending on how many elements in @Param determine what they mean @@ -603,7 +612,8 @@ sub UpdateMSRFileInitTable() my $error = 1.0*$Param[4]; my $minvalue=0.0; my $maxvalue=0.0; - if ($#Param == 4) { +# for (my $i=0;$i<=$#Param;$i++) { print "$i - $Param[$i]\n";} + if ($#Param == 4 || $#Param == 5) { $minvalue=0.0; $maxvalue=0.0; } @@ -611,16 +621,25 @@ sub UpdateMSRFileInitTable() $minvalue=1.0*$Param[5]; $maxvalue=1.0*$Param[6]; } - elsif ($#Param == 5 || $#Param == 7) { + elsif ($#Param == 7) { $minvalue=1.0*$Param[6]; $maxvalue=1.0*$Param[7]; } -# Now update the initialization tabel - this->{ui}->initParamTable->setText($PCount-1,0,$value); - this->{ui}->initParamTable->setText($PCount-1,1,$error); - this->{ui}->initParamTable->setText($PCount-1,2,$minvalue); - this->{ui}->initParamTable->setText($PCount-1,3,$maxvalue); +# Now update the initialization tabel + my $QTable = this->{ui}->initParamTable; +# print "PCount=$PCount and value=$value\n"; + if (defined($QTable->item($PCount,0)) & defined($QTable->item($PCount,1)) & defined($QTable->item($PCount,2)) & defined($QTable->item($PCount,3))) { + $QTable->setItem($PCount,0,Qt::TableWidgetItem()); + $QTable->setItem($PCount,1,Qt::TableWidgetItem()); + $QTable->setItem($PCount,2,Qt::TableWidgetItem()); + $QTable->setItem($PCount,3,Qt::TableWidgetItem()); + $QTable->item($PCount,0)->setText($value); + $QTable->item($PCount,1)->setText($error); + $QTable->item($PCount,2)->setText($minvalue); + $QTable->item($PCount,3)->setText($maxvalue); + } # Set bg color to mark different runs + $PCount++; } return; } @@ -632,7 +651,7 @@ sub ActivateT0Hists() my $HistBox = ""; for (my $iHist=1; $iHist<=4; $iHist++) { $HistBox="groupHist$iHist"; - my $HistBoxHandle = child($HistBox); + my $HistBoxHandle = child("Qt::Widget",$HistBox); if ($iHist<=$#Hists+1) { # Activate this histogram box $HistBoxHandle->setHidden(0); @@ -693,21 +712,21 @@ sub ActivateShComp() # Make the component appear first (only if we have multiple runs) - my $ShCompG="SharingComp".$Component; - my $ShCG = child($ShCompG); + my $ShCompG="sharingComp".$Component; + my $ShCG = child("Qt::Widget",$ShCompG); if ($#RUNS>0) { $ShCG->setHidden(0); $ShCG->setEnabled(1); } - my $CompShLabel = "Comp".$Component."ShLabel"; - my $CompShL = child($CompShLabel); + my $CompShLabel = "comp".$Component."ShLabel"; + my $CompShL = child("Qt::Widget",$CompShLabel); $CompShL->setText($All{"FitType$Component"}); # Change state/label of parameters for (my $i=1; $i<=9;$i++) { - my $ParamChkBx="ShParam_".$Component."_".$i; - my $ChkBx = child($ParamChkBx); - if ($Params[$i-1] ne "") { + my $ParamChkBx="shParam_".$Component."_".$i; + my $ChkBx = child("Qt::Widget",$ParamChkBx); + if (defined($Params[$i-1])) { $ChkBx->setHidden(0); $ChkBx->setEnabled(1); $ChkBx ->setText($Params[$i-1]); @@ -723,40 +742,47 @@ sub ActivateShComp() sub InitializeTab() { my %All=CreateAllInput(); - this->{ui}->initParamTable->setLeftMargin(100); - my $NRows = this->{ui}->initParamTable->numRows(); + my $QTable = this->{ui}->initParamTable; + my $NRows = $QTable->rowCount(); # Remove any rows in table if ($NRows > 0) { for (my $i=0;$i<$NRows;$i++) { # TODO: Better remove the row rather than hide it. - this->{ui}->initParamTable->hideRow($i); -# this->{ui}->initParamTable->removeRow($i); + $QTable->hideRow($i); +# $QTable->removeRow($i); } } my %PTable=MSR::PrepParamTable(\%All); # Setup the table with the right size - my $NParam=scalar keys( %PTable ); +# my $NParam=scalar keys( %PTable ); + my $NParam=keys( %PTable ); if ($NParam>$NRows) { - this->{ui}->initParamTable->setNumRows($NParam); + $QTable->setNumRows($NParam); } + +# for (my $i=0;$i<$NParam;$i++) {print "Line=$PTable{$i}\n";} + -# Fill the table with labels and values of parametr +# Fill the table with labels and values of parameter for (my $PCount=0;$PCount<$NParam;$PCount++) { my ($Param,$value,$error,$minvalue,$maxvalue,$RUN) = split(/,/,$PTable{$PCount}); # Now make sure we have no nans if ($error eq "nan") { $error=0.1;} -# If you use this then reading the parameters from the table is a problem -# You need to extract the correct parameter name from the row label -# this->{ui}->initParamTable->verticalHeader()->setLabel( $PCount,"$RUN: $Param"); - this->{ui}->initParamTable->verticalHeader()->setLabel( $PCount,"$Param"); - this->{ui}->initParamTable->showRow($PCount); - this->{ui}->initParamTable->setText($PCount,0,$value); - this->{ui}->initParamTable->setText($PCount,1,$error); - this->{ui}->initParamTable->setText($PCount,2,$minvalue); - this->{ui}->initParamTable->setText($PCount,3,$maxvalue); + # Make sure items exist before addressing them + $QTable->setVerticalHeaderItem($PCount,Qt::TableWidgetItem()); + $QTable->verticalHeaderItem($PCount)->setText($Param); + $QTable->showRow($PCount); + $QTable->setItem($PCount,0,Qt::TableWidgetItem()); + $QTable->item($PCount,0)->setText($value); + $QTable->setItem($PCount,1,Qt::TableWidgetItem()); + $QTable->item($PCount,1)->setText($error); + $QTable->setItem($PCount,2,Qt::TableWidgetItem()); + $QTable->item($PCount,2)->setText($minvalue); + $QTable->setItem($PCount,3,Qt::TableWidgetItem()); + $QTable->item($PCount,3)->setText($maxvalue); } } @@ -791,7 +817,7 @@ sub GoFit() my $Warning = "Error: The number of histograms should be 2 for an asymmetry fit!"; my $WarningWindow = Qt::MessageBox::information( this, "Error",$Warning); } else { - this->{ui}->musrfit_tabs->setCurrentPage(1); + this->{ui}->musrfit_tabs->setCurrentIndex(1); my $Answer=CallMSRCreate(); if ($Answer) { my $FILENAME=$All{"FILENAME"}.".msr"; @@ -799,15 +825,15 @@ sub GoFit() my $cmd="musrfit -t $FILENAME"; my $pid = open(FTO,"$cmd 2>&1 |"); while () { - this->{ui}->fitTextOutput->append("$_"); + this->{ui}->fitTextOutput->insertPlainText("$_"); } close(FTO); $cmd="musrview $FILENAME &"; $pid = system($cmd); } else { - this->{ui}->fitTextOutput->append("Cannot find MSR file!"); + this->{ui}->fitTextOutput->insertPlainText("Cannot find MSR file!"); } - this->{ui}->fitTextOutput->append("-----------------------------------------------------------------------------------------------------------------------------"); + this->{ui}->fitTextOutput->insertPlainText("-----------------------------------------------------------------------------------------------------------------------------"); # update MSR File tab and initialization table UpdateMSRFileInitTable(); } @@ -833,8 +859,8 @@ sub GoPlot() my $cmd="musrview $FILENAME &"; my $pid = system($cmd); } else { - this->{ui}->fitTextOutput->append("Cannot find MSR file!"); - this->{ui}->fitTextOutput->append("-----------------------------------------------------------------------------------------------------------------------------"); + this->{ui}->fitTextOutput->insertPlainText("Cannot find MSR file!"); + this->{ui}->fitTextOutput->insertPlainText("-----------------------------------------------------------------------------------------------------------------------------"); } } } @@ -874,7 +900,7 @@ sub T0Update() foreach ("t0","Bg1","Bg2","Data1","Data2") { my $Name = "$_$NHist"; my $tmp=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); - child($Name)->setText($tmp); + child("Qt::Widget",$Name)->setText($tmp); } $NHist++ } @@ -927,15 +953,21 @@ sub fileBrowse() sub AppendToFunctions() { my $ParName=this->{ui}->cParamsCombo->currentText(); - my $Full_T_Block=this->{ui}->theoryBlock->text; - my $Constraint=this->{ui}->constraintLine->text; + my $Full_T_Block=""; + my $Constraint=""; + if (defined(this->{ui}->theoryBlock->toPlainText)) { + $Full_T_Block=this->{ui}->theoryBlock->toPlainText; + } + if (defined(this->{ui}->constraintLine->toPlainText)) { + $Constraint=this->{ui}->constraintLine->toPlainText; + } # Then clear the text this->{ui}->constraintLine->setText(""); # Check how many constraints (lines) in FUNCTIONS Block my $i=this->{ui}->functionsBlock->lines(); my $ConstLine="fun$i = $Constraint\n"; - this->{ui}->functionsBlock->append($ConstLine); + this->{ui}->functionsBlock->insertPlainText($ConstLine); # Replace parameter in theory block with fun$i $Full_T_Block=~ s/$ParName/fun$i/; @@ -983,10 +1015,10 @@ sub InitializeFunctions() # Add list to the constraints drop down menu for (my $i=1; $i<=9;$i++) { - my $CParam = $Params[$i-1]."_".$Component; - if ($Params[$i-1] ne "" ) { + if (defined($Params[$i-1])) { + my $CParam = $Params[$i-1]."_".$Component; if ($Params[$i-1] ne "Alpha" && $Params[$i-1] ne "No" && $Params[$i-1] ne "NBg") { - this->{ui}->cParamsCombo->insertItem($CParam,-1); + this->{ui}->cParamsCombo->addItem($CParam); $Full_T_Block=~ s/\b$Params[$i-1]\b/$CParam/; } # also enumerate the parameters as should be used in the FUNCTIONS Block @@ -1045,4 +1077,22 @@ sub t0UpdateClicked() # t0Update->setText("musrt0") } +# Function: return widget attribute given its type and name +sub child { +# Take type and name from input + my ( $object, $name ) = @_; + + my $Attrib = this->findChildren($object,$name); + if (@$Attrib) { + $Attrib = @$Attrib[0]; + } else { + $Attrib = 0; + } +# print "name = $name and attrib = $Attrib\n"; + +# Return handle on widget + return($Attrib); +} + + 1; diff --git a/src/external/MuSRFitGUI/MuSRFit4.ui b/src/external/MuSRFitGUI/MuSRFit4.ui index 5fcc65ea..e65f78dc 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.ui +++ b/src/external/MuSRFitGUI/MuSRFit4.ui @@ -6,8 +6,8 @@ 0 0 - 830 - 726 + 600 + 505 @@ -18,7 +18,7 @@ - 582 + 600 505 @@ -34,7 +34,7 @@ - + true @@ -47,7 +47,7 @@ - 560 + 600 400 @@ -64,1148 +64,478 @@ RUNS - - - - 10 - 380 - 581 - 31 - - - - - 0 - - - QLayout::SetMinimumSize - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 81 - 21 - - - - - - - - - 0 - 0 - - - - Fit type - - - false - - - - - - - - 0 - 0 - - - - - Asymmetry + + + + + QLayout::SetMinimumSize + + + 0 + + + + + + 1 + 1 + - - - - SingleHist + + + 0 + 80 + - - - - - - - - 0 - 0 - - - - Histograms list - - - false - - - - - - - - 0 - 0 - - - - 1 5,3 7 - - - - - - - - - 1 - 13 - 811 - 361 - - - - - QLayout::SetMinimumSize - - - - - - 0 - 0 - - - - RUN Numbers - - - - - 10 - 20 - 771 - 48 - + + + 1 + 1 + - - - 0 - - - - - - 0 - 0 - - - - - 0 - 20 - - - - false - - - QComboBox::InsertAtTop - - - true - - - false - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - Year - - - false - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - On beam line - - - false - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - LEM - + + RUN Files + + + Qt::AlignHCenter|Qt::AlignTop + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 411 + 21 + + + - - - GPS - + + + + true + + + + 0 + 0 + + + + + 0 + 23 + + + + + 16777215 + 25 + + + + Names of data files to be fit. Multiple data files are comma separated. + + + Names of data files to be fit. Multiple data files are comma separated. + + - - - Dolly - + + + + true + + + + 0 + 0 + + + + + 0 + 20 + + + + + 16777215 + 25 + + + + Browse to select data files for fitting. + + + Browse to select data files for fitting. + + + Browse + + - - - LTF - - - - - LEM (PPC) - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 181 - 21 - - - - - - - - - 0 - 0 - - - - - 0 - 23 - - - - Numbers of RUNs to fit. Multiple runs are comma separated. - - - Numbers of RUNs to fit. Multiple runs are comma separated. - - + - - - - - - - 0 - 0 - - - - RUN Files - - - - - 10 - 20 - 771 - 52 - + + + + + QLayout::SetMinimumSize - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 411 - 21 - - - - - - - - true - - - - 0 - 0 - - - - - 0 - 23 - - - - Names of data files to be fit. Multiple data files are comma separated. - - - Names of data files to be fit. Multiple data files are comma separated. - - - - - - - true - - - - 0 - 0 - - - - - 0 - 20 - - - - Browse to select data files for fitting. - - - Browse to select data files for fitting. - + + + + + 0 + 0 + + + + Fit type + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + - Browse + Asymmetry - + + + + SingleHist + + + + + + + + + 0 + 0 + + + + Histograms list + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 1 5,3 7 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 81 + 21 + + + + + + + + + + + 1 + 1 + + + + + 0 + 80 + + + + RUN Numbers + + + Qt::AlignHCenter|Qt::AlignTop + + + + + + 0 + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + 16777215 + 25 + + + + false + + + QComboBox::InsertAtTop + + + true + + + false + + + + + + + + 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 + + + + + + + + + 0 + 0 + + + + + 0 + 23 + + + + + 16777215 + 25 + + + + Numbers of RUNs to fit. Multiple runs are comma separated. + + + Numbers of RUNs to fit. Multiple runs are comma separated. + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + - - - - - - - 0 - 0 - - - - Theory Function - - - - - 10 - 20 - 773 - 95 - + + + + + + 0 + 0 + - - - QLayout::SetMinimumSize - - - 0 - - - 0 - - - - - - 0 - 0 - - - - 18 - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - Lor-Gss combi KT - - - - - Lor-Gss combi KT x Exp - - - - - Lor-Gss combi KT x SExp - - - - - None - - - - - - - - - 0 - 0 - - - - Final Time - - - false - - - tfs - - - - - - - - 0 - 0 - - - - false - - - false - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - Lor-Gss combi KT - - - - - Lor-Gss combi KT x Exp - - - - - Lor-Gss combi KT x SExp - - - - - - - - - 0 - 0 - - - - 100 - - - - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 242 - 247 - 252 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - - 128 - 128 - 128 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - Third Component - - - false - - - fitType1 - - - - - - - - 0 - 0 - - - - 0 - - - - - - - - 0 - 0 - - - - 8 - - - + + + 0 + 220 + + + + + 0 + 0 + + + + Theory Function + + @@ -1661,153 +991,7 @@ - - - - - 0 - 0 - - - - Binning Factor - - - false - - - bins - - - - - - - - 0 - 0 - - - - Initial Time - - - false - - - tis - - - - - - - - 0 - 0 - - - - 18 - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - Lor-Gss combi KT - - - - - Lor-Gss combi KT x Exp - - - - - Lor-Gss combi KT x SExp - - - - - None - - - - - + @@ -2262,16 +1446,1063 @@ + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + Third Component + + + false + + + fitType1 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + false + + + false + + + + Exponential + + + + + Gaussian + + + + + Stretch Exp. + + + + + Exponential Cos + + + + + Gaussian Cos + + + + + Stretch Cos + + + + + Lorentzian Dynamic KT + + + + + Gaussian Dynamic KT + + + + + Background + + + + + Lorentzian Kubo-Toyabe LF x Exp + + + + + Gaussian Kubo-Toyabe LF x Exp + + + + + Lorentzian Kubo-Toyabe LF x Str Exp + + + + + Gaussian Kubo-Toyabe LF x Str Exp + + + + + MolMag + + + + + Meissner State Model + + + + + Lor-Gss combi KT + + + + + Lor-Gss combi KT x Exp + + + + + Lor-Gss combi KT x SExp + + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 18 + + + + Exponential + + + + + Gaussian + + + + + Stretch Exp. + + + + + Exponential Cos + + + + + Gaussian Cos + + + + + Stretch Cos + + + + + Lorentzian Dynamic KT + + + + + Gaussian Dynamic KT + + + + + Background + + + + + Lorentzian Kubo-Toyabe LF x Exp + + + + + Gaussian Kubo-Toyabe LF x Exp + + + + + Lorentzian Kubo-Toyabe LF x Str Exp + + + + + Gaussian Kubo-Toyabe LF x Str Exp + + + + + MolMag + + + + + Meissner State Model + + + + + Lor-Gss combi KT + + + + + Lor-Gss combi KT x Exp + + + + + Lor-Gss combi KT x SExp + + + + + None + + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 18 + + + + Exponential + + + + + Gaussian + + + + + Stretch Exp. + + + + + Exponential Cos + + + + + Gaussian Cos + + + + + Stretch Cos + + + + + Lorentzian Dynamic KT + + + + + Gaussian Dynamic KT + + + + + Background + + + + + Lorentzian Kubo-Toyabe LF x Exp + + + + + Gaussian Kubo-Toyabe LF x Exp + + + + + Lorentzian Kubo-Toyabe LF x Str Exp + + + + + Gaussian Kubo-Toyabe LF x Str Exp + + + + + MolMag + + + + + Meissner State Model + + + + + Lor-Gss combi KT + + + + + Lor-Gss combi KT x Exp + + + + + Lor-Gss combi KT x SExp + + + + + None + + + + + + + + + 0 + 0 + + + + Initial Fit Time + + + false + + + tis + + + + + + + + 0 + 0 + + + + Final Fit Time + + + false + + + tfs + + + + + + + + 0 + 0 + + + + Fit Binning Factor + + + false + + + bins + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 0 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 8 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 100 + + + + + + + Min X + + + false + + + + + + + Max X + + + false + + + + + + + View Binning Factor + + + false + + + + + + + + 0 + 25 + + + + + + + + + 0 + 25 + + + + + + + + + 0 + 25 + + + + + + + + Min Y + + + false + + + + + + + Max Y + + + false + + + + + + + + + + false + + + + + + + + + + + + + Life time correction + + + true + + + - - - - - runsAuto - groupBox - layoutWidget - runsMan + + + + @@ -2284,6 +2515,18 @@ + + + 0 + 25 + + + + + 150 + 16777215 + + HESSE @@ -2296,63 +2539,20 @@ - - - - Life time correction - - - true - - - - - - - X Range - - - false - - - - - - - View Binning - - - false - - - - - - - - - - - - - - - - Y Range - - - false - - - - - - - - - + + + 0 + 25 + + + + + 150 + 16777215 + + MINIMIZE @@ -2375,6 +2575,9 @@ Minimization type + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + false @@ -2385,6 +2588,9 @@ Error estimation + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + false @@ -2424,441 +2630,429 @@ false - - - false - - - - 199 - 20 - 162 - 330 - - - - - 0 - 0 - - - - 2nd Component - - - - - 2 - 30 - 185 - 20 - - - - FitType2 - - - false - - - - - - 40 - 60 - 81 - 266 - - - - - 0 - - - 0 - + + + - - - Param1 - - - - - - - Param2 - - - - - - - Param3 - - - - - - - Param4 - - - - - - - Param5 - - - - - + false - - Param6 + + + 0 + 0 + - - false + + 1st Component + + Qt::AlignLeading + + + + + 40 + 60 + 81 + 266 + + + + + 0 + + + 0 + + + + + Param1 + + + + + + + Param2 + + + + + + + Param3 + + + + + + + Param4 + + + + + + + false + + + Param5 + + + false + + + + + + + false + + + Param6 + + + false + + + + + + + false + + + Param7 + + + false + + + + + + + false + + + Param8 + + + false + + + + + + + false + + + Param9 + + + false + + + + + + + + + 2 + 30 + 141 + 20 + + + + FitType1 + + + false + + - + false - - Param7 + + + 0 + 0 + - - false + + 2nd Component + + + + 2 + 30 + 141 + 20 + + + + FitType2 + + + false + + + + + + 40 + 60 + 81 + 266 + + + + + 0 + + + 0 + + + + + Param1 + + + + + + + Param2 + + + + + + + Param3 + + + + + + + Param4 + + + + + + + Param5 + + + + + + + false + + + Param6 + + + false + + + + + + + false + + + Param7 + + + false + + + + + + + false + + + Param8 + + + false + + + + + + + false + + + Param9 + + + false + + + + + - + false - - Param8 + + + 0 + 0 + - - false + + 3rd Component - - - - - - false - - - Param9 - - - false + + Qt::AlignJustify|Qt::AlignVCenter + + + + 2 + 30 + 141 + 20 + + + + FitType3 + + + false + + + + + + 41 + 58 + 81 + 266 + + + + + + + Param1 + + + + + + + Param2 + + + + + + + Param3 + + + + + + + Param4 + + + + + + + Param5 + + + + + + + false + + + Param6 + + + false + + + + + + + false + + + Param7 + + + false + + + + + + + false + + + Param8 + + + false + + + + + + + false + + + Param9 + + + false + + + + + - - - - - false - - - - 367 - 20 - 162 - 330 - - - - - 0 - 0 - - - - 3rd Component - - - Qt::AlignJustify|Qt::AlignVCenter - - - - - 2 - 30 - 185 - 20 - - - - FitType3 - - - false - - - - - - 41 - 58 - 81 - 266 - - - - - - - Param1 - - - - - - - Param2 - - - - - - - Param3 - - - - - - - Param4 - - - - - - - Param5 - - - - - - - false - - - Param6 - - - false - - - - - - - false - - - Param7 - - - false - - - - - - - false - - - Param8 - - - false - - - - - - - false - - - Param9 - - - false - - - - - - - - - false - - - - 31 - 20 - 162 - 330 - - - - - 0 - 0 - - - - 1st Component - - - Qt::AlignLeading - - - - - 40 - 60 - 81 - 266 - - - - - 0 - - - 0 - - - - - Param1 - - - - - - - Param2 - - - - - - - Param3 - - - - - - - Param4 - - - - - - - false - - - Param5 - - - false - - - - - - - false - - - Param6 - - - false - - - - - - - false - - - Param7 - - - false - - - - - - - false - - - Param8 - - - false - - - - - - - false - - - Param9 - - - false - - - - - - - - - 2 - 30 - 185 - 20 - - - - FitType1 - - - false - - - + + @@ -5242,7 +5436,7 @@ 0 0 - 830 + 600 20 @@ -5305,6 +5499,12 @@ + + + 0 + 0 + + Actions Menu @@ -5519,21 +5719,15 @@ runFiles browse fitType1 - tis fitType2 - tfs fitType3 + tis + tfs bins fitAsyType histsLRBF minimization errorCalc - ltc - xi - yi - xf - yf - viewBin fitTextOutput buttonGroupSharing shParam_1_1 @@ -5567,8 +5761,11 @@ title fileName textMSROutput + funits fapodization fplot + frqMin + frqMax fphase rrfFrq rrfUnits @@ -5594,6 +5791,7 @@ bg24 data14 data24 + t0Update theoryBlock parametersList cParamsCombo @@ -5601,7 +5799,6 @@ addConstraint functionsBlock resetFunc - t0Update @@ -5756,8 +5953,8 @@ InitializeFunctions() - 732 - 705 + 608 + 489 20 @@ -5772,8 +5969,8 @@ AppendToFunctions() - 782 - 379 + 608 + 284 20 @@ -5820,8 +6017,8 @@ t0UpdateClicked() - 761 - 693 + 609 + 490 20 @@ -5852,12 +6049,12 @@ RunSelectionToggle() - 213 - 10 + 208 + 9 - 832 - 305 + 626 + 246 diff --git a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm index 7b5e0fca..b9eea50e 100644 --- a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm +++ b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm @@ -5,7 +5,7 @@ ################################################################################# ## Form generated from reading UI file 'MuSRFit4.ui' ## -## Created: Mon Mar 20 16:58:34 2017 +## Created: Wed Mar 22 17:10:29 2017 ## by: Qt User Interface Compiler version 4.8.6 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! @@ -90,16 +90,40 @@ sub runsPage { return shift->{runsPage}; } -sub layoutWidget { - return shift->{layoutWidget}; +sub gridLayout_1 { + return shift->{gridLayout_1}; } -sub _2 { - return shift->{_2}; +sub gridLayout_2 { + return shift->{gridLayout_2}; } -sub spacer4 { - return shift->{spacer4}; +sub runsMan { + return shift->{runsMan}; +} + +sub gridLayout_4 { + return shift->{gridLayout_4}; +} + +sub runFiles_2 { + return shift->{runFiles_2}; +} + +sub spacer3 { + return shift->{spacer3}; +} + +sub runFiles { + return shift->{runFiles}; +} + +sub browse { + return shift->{browse}; +} + +sub gridLayout_6 { + return shift->{gridLayout_6}; } sub fitAsyTypeLabel { @@ -118,20 +142,16 @@ sub histsLRBF { return shift->{histsLRBF}; } -sub widget1 { - return shift->{widget1}; -} - -sub verticalLayout { - return shift->{verticalLayout}; +sub spacer4 { + return shift->{spacer4}; } sub runsAuto { return shift->{runsAuto}; } -sub layoutWidget_2 { - return shift->{layoutWidget_2}; +sub gridLayout_3 { + return shift->{gridLayout_3}; } sub runNumbers_2 { @@ -162,60 +182,48 @@ sub runNumbers { return shift->{runNumbers}; } -sub runsMan { - return shift->{runsMan}; -} - -sub layoutWidget_4 { - return shift->{layoutWidget_4}; -} - -sub runFiles_2 { - return shift->{runFiles_2}; -} - -sub spacer3 { - return shift->{spacer3}; -} - -sub runFiles { - return shift->{runFiles}; -} - -sub browse { - return shift->{browse}; -} - sub groupBox { return shift->{groupBox}; } -sub layoutWidget_3 { - return shift->{layoutWidget_3}; +sub gridLayout_8 { + return shift->{gridLayout_8}; } -sub theoryFun { - return shift->{theoryFun}; +sub comp1Label { + return shift->{comp1Label}; } -sub fitType2 { - return shift->{fitType2}; +sub comp2Label { + return shift->{comp2Label}; } -sub tfsLabel { - return shift->{tfsLabel}; +sub comp3Label { + return shift->{comp3Label}; } sub fitType1 { return shift->{fitType1}; } -sub bins { - return shift->{bins}; +sub fitType2 { + return shift->{fitType2}; } -sub comp3Label { - return shift->{comp3Label}; +sub fitType3 { + return shift->{fitType3}; +} + +sub tisLabel { + return shift->{tisLabel}; +} + +sub tfsLabel { + return shift->{tfsLabel}; +} + +sub binsLabel { + return shift->{binsLabel}; } sub tis { @@ -226,24 +234,56 @@ sub tfs { return shift->{tfs}; } -sub comp1Label { - return shift->{comp1Label}; +sub bins { + return shift->{bins}; } -sub binsLabel { - return shift->{binsLabel}; +sub textLabel1_4 { + return shift->{textLabel1_4}; } -sub tisLabel { - return shift->{tisLabel}; +sub textLabel1_8 { + return shift->{textLabel1_8}; } -sub fitType3 { - return shift->{fitType3}; +sub textLabel1_4_2_2 { + return shift->{textLabel1_4_2_2}; } -sub comp2Label { - return shift->{comp2Label}; +sub xi { + return shift->{xi}; +} + +sub xf { + return shift->{xf}; +} + +sub viewBin { + return shift->{viewBin}; +} + +sub textLabel1_4_2 { + return shift->{textLabel1_4_2}; +} + +sub textLabel1_4_3 { + return shift->{textLabel1_4_3}; +} + +sub textLabel1_4_4 { + return shift->{textLabel1_4_4}; +} + +sub yi { + return shift->{yi}; +} + +sub yf { + return shift->{yf}; +} + +sub ltc { + return shift->{ltc}; } sub fittingPage { @@ -266,42 +306,6 @@ sub errorCalc { return shift->{errorCalc}; } -sub ltc { - return shift->{ltc}; -} - -sub textLabel1_4 { - return shift->{textLabel1_4}; -} - -sub textLabel1_4_2_2 { - return shift->{textLabel1_4_2_2}; -} - -sub xi { - return shift->{xi}; -} - -sub yf { - return shift->{yf}; -} - -sub viewBin { - return shift->{viewBin}; -} - -sub textLabel1_4_2 { - return shift->{textLabel1_4_2}; -} - -sub xf { - return shift->{xf}; -} - -sub yi { - return shift->{yi}; -} - sub minimization { return shift->{minimization}; } @@ -330,6 +334,66 @@ sub buttonGroupSharing { return shift->{buttonGroupSharing}; } +sub gridLayout_7 { + return shift->{gridLayout_7}; +} + +sub horizontalLayout { + return shift->{horizontalLayout}; +} + +sub sharingComp1 { + return shift->{sharingComp1}; +} + +sub layout14 { + return shift->{layout14}; +} + +sub _5 { + return shift->{_5}; +} + +sub shParam_1_1 { + return shift->{shParam_1_1}; +} + +sub shParam_1_2 { + return shift->{shParam_1_2}; +} + +sub shParam_1_3 { + return shift->{shParam_1_3}; +} + +sub shParam_1_4 { + return shift->{shParam_1_4}; +} + +sub shParam_1_5 { + return shift->{shParam_1_5}; +} + +sub shParam_1_6 { + return shift->{shParam_1_6}; +} + +sub shParam_1_7 { + return shift->{shParam_1_7}; +} + +sub shParam_1_8 { + return shift->{shParam_1_8}; +} + +sub shParam_1_9 { + return shift->{shParam_1_9}; +} + +sub comp1ShLabel { + return shift->{comp1ShLabel}; +} + sub sharingComp2 { return shift->{sharingComp2}; } @@ -342,8 +406,8 @@ sub layout13 { return shift->{layout13}; } -sub vboxLayout { - return shift->{vboxLayout}; +sub _1 { + return shift->{_1}; } sub shParam_2_1 { @@ -394,8 +458,8 @@ sub layout15 { return shift->{layout15}; } -sub vboxLayout1 { - return shift->{vboxLayout1}; +sub _3 { + return shift->{_3}; } sub shParam_3_1 { @@ -434,58 +498,6 @@ sub shParam_3_9 { return shift->{shParam_3_9}; } -sub sharingComp1 { - return shift->{sharingComp1}; -} - -sub layout14 { - return shift->{layout14}; -} - -sub vboxLayout2 { - return shift->{vboxLayout2}; -} - -sub shParam_1_1 { - return shift->{shParam_1_1}; -} - -sub shParam_1_2 { - return shift->{shParam_1_2}; -} - -sub shParam_1_3 { - return shift->{shParam_1_3}; -} - -sub shParam_1_4 { - return shift->{shParam_1_4}; -} - -sub shParam_1_5 { - return shift->{shParam_1_5}; -} - -sub shParam_1_6 { - return shift->{shParam_1_6}; -} - -sub shParam_1_7 { - return shift->{shParam_1_7}; -} - -sub shParam_1_8 { - return shift->{shParam_1_8}; -} - -sub shParam_1_9 { - return shift->{shParam_1_9}; -} - -sub comp1ShLabel { - return shift->{comp1ShLabel}; -} - sub initializationPage { return shift->{initializationPage}; } @@ -506,8 +518,8 @@ sub gridLayout4 { return shift->{gridLayout4}; } -sub vboxLayout3 { - return shift->{vboxLayout3}; +sub vboxLayout { + return shift->{vboxLayout}; } sub groupTitle { @@ -518,8 +530,8 @@ sub gridLayout5 { return shift->{gridLayout5}; } -sub vboxLayout4 { - return shift->{vboxLayout4}; +sub vboxLayout1 { + return shift->{vboxLayout1}; } sub titleLabel { @@ -706,8 +718,8 @@ sub layout16_2 { return shift->{layout16_2}; } -sub vboxLayout5 { - return shift->{vboxLayout5}; +sub vboxLayout2 { + return shift->{vboxLayout2}; } sub textLabel2 { @@ -738,8 +750,8 @@ sub layout18 { return shift->{layout18}; } -sub vboxLayout6 { - return shift->{vboxLayout6}; +sub vboxLayout3 { + return shift->{vboxLayout3}; } sub t01 { @@ -770,8 +782,8 @@ sub layout18_2 { return shift->{layout18_2}; } -sub vboxLayout7 { - return shift->{vboxLayout7}; +sub vboxLayout4 { + return shift->{vboxLayout4}; } sub t02 { @@ -802,8 +814,8 @@ sub layout18_3 { return shift->{layout18_3}; } -sub vboxLayout8 { - return shift->{vboxLayout8}; +sub vboxLayout5 { + return shift->{vboxLayout5}; } sub t03 { @@ -834,8 +846,8 @@ sub layout18_4 { return shift->{layout18_4}; } -sub vboxLayout9 { - return shift->{vboxLayout9}; +sub vboxLayout6 { + return shift->{vboxLayout6}; } sub t04 { @@ -878,8 +890,8 @@ sub gridLayout10 { return shift->{gridLayout10}; } -sub vboxLayout10 { - return shift->{vboxLayout10}; +sub vboxLayout7 { + return shift->{vboxLayout7}; } sub gridLayout11 { @@ -981,14 +993,14 @@ sub setupUi { if ( !defined $muSRFit4->objectName() ) { $muSRFit4->setObjectName( "muSRFit4" ); } - $muSRFit4->resize( 830, 726 ); + $muSRFit4->resize( 600, 505 ); my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); $self->{$sizePolicy} = $sizePolicy; $sizePolicy->setHorizontalStretch( 1 ); $sizePolicy->setVerticalStretch( 1 ); $sizePolicy->setHeightForWidth( $muSRFit4->sizePolicy()->hasHeightForWidth() ); $muSRFit4->setSizePolicy( $sizePolicy ); - $muSRFit4->setMinimumSize( Qt::Size(582, 505) ); + $muSRFit4->setMinimumSize( Qt::Size(600, 505) ); my $icon = Qt::Icon(); $icon->addPixmap(Qt::Pixmap("icos/MuSRFit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $muSRFit4->setWindowIcon( $icon ); @@ -1078,104 +1090,155 @@ sub setupUi { $musrfit_tabs->setEnabled( 1 ); $sizePolicy->setHeightForWidth( $musrfit_tabs->sizePolicy()->hasHeightForWidth() ); $musrfit_tabs->setSizePolicy( $sizePolicy ); - $musrfit_tabs->setMinimumSize( Qt::Size(560, 400) ); + $musrfit_tabs->setMinimumSize( Qt::Size(600, 400) ); $musrfit_tabs->setMaximumSize( Qt::Size(32767, 32767) ); my $runsPage = Qt::Widget( ); $self->{runsPage} = $runsPage; $runsPage->setObjectName( "runsPage" ); - my $layoutWidget = Qt::Widget( $runsPage ); - $self->{layoutWidget} = $layoutWidget; - $layoutWidget->setObjectName( "layoutWidget" ); - $layoutWidget->setGeometry( Qt::Rect(10, 380, 581, 31) ); - my $_2 = Qt::HBoxLayout( $layoutWidget ); - $self->{_2} = $_2; - $_2->setSpacing( 0 ); - $_2->setMargin( 11 ); - $_2->setObjectName( "_2" ); - $_2->setSizeConstraint( Qt::Layout::SetMinimumSize() ); - $_2->setContentsMargins(0, 0, 0, 0 ); - my $spacer4 = Qt::SpacerItem( 81, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); + my $gridLayout_1 = Qt::GridLayout( $runsPage ); + $self->{gridLayout_1} = $gridLayout_1; + $gridLayout_1->setSpacing( 6 ); + $gridLayout_1->setMargin( 11 ); + $gridLayout_1->setObjectName( "gridLayout_1" ); + my $gridLayout_2 = Qt::GridLayout( ); + $self->{gridLayout_2} = $gridLayout_2; + $gridLayout_2->setSpacing( 0 ); + $gridLayout_2->setObjectName( "gridLayout_2" ); + $gridLayout_2->setSizeConstraint( Qt::Layout::SetMinimumSize() ); + my $runsMan = Qt::GroupBox( $runsPage ); + $self->{runsMan} = $runsMan; + $runsMan->setObjectName( "runsMan" ); + $sizePolicy->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); + $runsMan->setSizePolicy( $sizePolicy ); + $runsMan->setMinimumSize( Qt::Size(0, 80) ); + $runsMan->setBaseSize( Qt::Size(1, 1) ); + $runsMan->setAlignment( Qt::AlignHCenter()|Qt::AlignTop() ); + my $gridLayout_4 = Qt::GridLayout( $runsMan ); + $self->{gridLayout_4} = $gridLayout_4; + $gridLayout_4->setSpacing( 6 ); + $gridLayout_4->setMargin( 11 ); + $gridLayout_4->setObjectName( "gridLayout_4" ); + my $runFiles_2 = Qt::GridLayout( ); + $self->{runFiles_2} = $runFiles_2; + $runFiles_2->setSpacing( 6 ); + $runFiles_2->setObjectName( "runFiles_2" ); + my $spacer3 = Qt::SpacerItem( 411, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); - $_2->addItem( $spacer4 ); + $runFiles_2->addItem( $spacer3, 1, 0, 1, 1 ); - my $fitAsyTypeLabel = Qt::Label( $layoutWidget ); - $self->{fitAsyTypeLabel} = $fitAsyTypeLabel; - $fitAsyTypeLabel->setObjectName( "fitAsyTypeLabel" ); - my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); + my $runFiles = Qt::LineEdit( $runsMan ); + $self->{runFiles} = $runFiles; + $runFiles->setObjectName( "runFiles" ); + $runFiles->setEnabled( 1 ); + my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); $self->{$sizePolicy1} = $sizePolicy1; $sizePolicy1->setHorizontalStretch( 0 ); $sizePolicy1->setVerticalStretch( 0 ); - $sizePolicy1->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); - $fitAsyTypeLabel->setSizePolicy( $sizePolicy1 ); - $fitAsyTypeLabel->setWordWrap( 0 ); + $sizePolicy1->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); + $runFiles->setSizePolicy( $sizePolicy1 ); + $runFiles->setMinimumSize( Qt::Size(0, 23) ); + $runFiles->setMaximumSize( Qt::Size(16777215, 25) ); - $_2->addWidget( $fitAsyTypeLabel ); + $runFiles_2->addWidget( $runFiles, 0, 0, 1, 2 ); - my $fitAsyType = Qt::ComboBox( $layoutWidget ); - $self->{fitAsyType} = $fitAsyType; - $fitAsyType->setObjectName( "fitAsyType" ); - $sizePolicy1->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); - $fitAsyType->setSizePolicy( $sizePolicy1 ); - - $_2->addWidget( $fitAsyType ); - - my $histsLRBFLabel = Qt::Label( $layoutWidget ); - $self->{histsLRBFLabel} = $histsLRBFLabel; - $histsLRBFLabel->setObjectName( "histsLRBFLabel" ); - $sizePolicy1->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); - $histsLRBFLabel->setSizePolicy( $sizePolicy1 ); - $histsLRBFLabel->setWordWrap( 0 ); - - $_2->addWidget( $histsLRBFLabel ); - - my $histsLRBF = Qt::LineEdit( $layoutWidget ); - $self->{histsLRBF} = $histsLRBF; - $histsLRBF->setObjectName( "histsLRBF" ); - $sizePolicy1->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); - $histsLRBF->setSizePolicy( $sizePolicy1 ); - - $_2->addWidget( $histsLRBF ); - - my $widget1 = Qt::Widget( $runsPage ); - $self->{widget1} = $widget1; - $widget1->setObjectName( "widget1" ); - $widget1->setGeometry( Qt::Rect(1, 13, 811, 361) ); - my $verticalLayout = Qt::VBoxLayout( $widget1 ); - $self->{verticalLayout} = $verticalLayout; - $verticalLayout->setSpacing( 6 ); - $verticalLayout->setMargin( 11 ); - $verticalLayout->setObjectName( "verticalLayout" ); - $verticalLayout->setSizeConstraint( Qt::Layout::SetMinimumSize() ); - $verticalLayout->setContentsMargins(0, 0, 0, 0 ); - my $runsAuto = Qt::GroupBox( $widget1 ); - $self->{runsAuto} = $runsAuto; - $runsAuto->setObjectName( "runsAuto" ); - my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); + my $browse = Qt::PushButton( $runsMan ); + $self->{browse} = $browse; + $browse->setObjectName( "browse" ); + $browse->setEnabled( 1 ); + my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); $self->{$sizePolicy2} = $sizePolicy2; $sizePolicy2->setHorizontalStretch( 0 ); $sizePolicy2->setVerticalStretch( 0 ); - $sizePolicy2->setHeightForWidth( $runsAuto->sizePolicy()->hasHeightForWidth() ); - $runsAuto->setSizePolicy( $sizePolicy2 ); - my $layoutWidget_2 = Qt::Widget( $runsAuto ); - $self->{layoutWidget_2} = $layoutWidget_2; - $layoutWidget_2->setObjectName( "layoutWidget_2" ); - $layoutWidget_2->setGeometry( Qt::Rect(10, 20, 771, 48) ); - my $runNumbers_2 = Qt::GridLayout( $layoutWidget_2 ); - $self->{runNumbers_2} = $runNumbers_2; - $runNumbers_2->setSpacing( 0 ); - $runNumbers_2->setMargin( 11 ); - $runNumbers_2->setObjectName( "runNumbers_2" ); - $runNumbers_2->setContentsMargins(0, 0, 0, 0 ); - my $year = Qt::ComboBox( $layoutWidget_2 ); - $self->{year} = $year; - $year->setObjectName( "year" ); - my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); + $sizePolicy2->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); + $browse->setSizePolicy( $sizePolicy2 ); + $browse->setMinimumSize( Qt::Size(0, 20) ); + $browse->setMaximumSize( Qt::Size(16777215, 25) ); + + $runFiles_2->addWidget( $browse, 1, 1, 1, 1 ); + + + $gridLayout_4->addLayout( $runFiles_2, 0, 0, 1, 1 ); + + + $gridLayout_2->addWidget( $runsMan, 1, 0, 1, 1 ); + + my $gridLayout_6 = Qt::GridLayout( ); + $self->{gridLayout_6} = $gridLayout_6; + $gridLayout_6->setSpacing( 6 ); + $gridLayout_6->setObjectName( "gridLayout_6" ); + $gridLayout_6->setSizeConstraint( Qt::Layout::SetMinimumSize() ); + my $fitAsyTypeLabel = Qt::Label( $runsPage ); + $self->{fitAsyTypeLabel} = $fitAsyTypeLabel; + $fitAsyTypeLabel->setObjectName( "fitAsyTypeLabel" ); + my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); $self->{$sizePolicy3} = $sizePolicy3; $sizePolicy3->setHorizontalStretch( 0 ); $sizePolicy3->setVerticalStretch( 0 ); - $sizePolicy3->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); - $year->setSizePolicy( $sizePolicy3 ); + $sizePolicy3->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); + $fitAsyTypeLabel->setSizePolicy( $sizePolicy3 ); + $fitAsyTypeLabel->setWordWrap( 0 ); + + $gridLayout_6->addWidget( $fitAsyTypeLabel, 0, 0, 1, 1 ); + + my $fitAsyType = Qt::ComboBox( $runsPage ); + $self->{fitAsyType} = $fitAsyType; + $fitAsyType->setObjectName( "fitAsyType" ); + $sizePolicy3->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); + $fitAsyType->setSizePolicy( $sizePolicy3 ); + $fitAsyType->setMinimumSize( Qt::Size(0, 25) ); + $fitAsyType->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout_6->addWidget( $fitAsyType, 0, 1, 1, 1 ); + + my $histsLRBFLabel = Qt::Label( $runsPage ); + $self->{histsLRBFLabel} = $histsLRBFLabel; + $histsLRBFLabel->setObjectName( "histsLRBFLabel" ); + $sizePolicy3->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); + $histsLRBFLabel->setSizePolicy( $sizePolicy3 ); + $histsLRBFLabel->setWordWrap( 0 ); + + $gridLayout_6->addWidget( $histsLRBFLabel, 0, 2, 1, 1 ); + + my $histsLRBF = Qt::LineEdit( $runsPage ); + $self->{histsLRBF} = $histsLRBF; + $histsLRBF->setObjectName( "histsLRBF" ); + $sizePolicy3->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); + $histsLRBF->setSizePolicy( $sizePolicy3 ); + $histsLRBF->setMinimumSize( Qt::Size(0, 25) ); + $histsLRBF->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout_6->addWidget( $histsLRBF, 0, 3, 1, 1 ); + + my $spacer4 = Qt::SpacerItem( 81, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); + + $gridLayout_6->addItem( $spacer4, 0, 4, 1, 1 ); + + + $gridLayout_2->addLayout( $gridLayout_6, 3, 0, 1, 1 ); + + 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) ); + $runsAuto->setAlignment( Qt::AlignHCenter()|Qt::AlignTop() ); + my $gridLayout_3 = Qt::GridLayout( $runsAuto ); + $self->{gridLayout_3} = $gridLayout_3; + $gridLayout_3->setSpacing( 6 ); + $gridLayout_3->setMargin( 11 ); + $gridLayout_3->setObjectName( "gridLayout_3" ); + my $runNumbers_2 = Qt::GridLayout( ); + $self->{runNumbers_2} = $runNumbers_2; + $runNumbers_2->setSpacing( 0 ); + $runNumbers_2->setObjectName( "runNumbers_2" ); + my $year = Qt::ComboBox( $runsAuto ); + $self->{year} = $year; + $year->setObjectName( "year" ); + $sizePolicy2->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); + $year->setSizePolicy( $sizePolicy2 ); $year->setMinimumSize( Qt::Size(0, 20) ); + $year->setMaximumSize( Qt::Size(16777215, 25) ); $year->setEditable( 0 ); $year->setInsertPolicy( Qt::ComboBox::InsertAtTop() ); $year->setAutoCompletion( 1 ); @@ -1183,7 +1246,7 @@ sub setupUi { $runNumbers_2->addWidget( $year, 1, 4, 1, 1 ); - my $yearLabel = Qt::Label( $layoutWidget_2 ); + my $yearLabel = Qt::Label( $runsAuto ); $self->{yearLabel} = $yearLabel; $yearLabel->setObjectName( "yearLabel" ); my $sizePolicy4 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Preferred() ); @@ -1197,22 +1260,24 @@ sub setupUi { $runNumbers_2->addWidget( $yearLabel, 1, 3, 1, 1 ); - my $beamLineLabel = Qt::Label( $layoutWidget_2 ); + 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( $layoutWidget_2 ); + my $beamLine = Qt::ComboBox( $runsAuto ); $self->{beamLine} = $beamLine; $beamLine->setObjectName( "beamLine" ); - $sizePolicy3->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); - $beamLine->setSizePolicy( $sizePolicy3 ); + $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 ); @@ -1220,118 +1285,42 @@ sub setupUi { $runNumbers_2->addItem( $spacer2, 1, 0, 1, 1 ); - my $runNumbers = Qt::LineEdit( $layoutWidget_2 ); + my $runNumbers = Qt::LineEdit( $runsAuto ); $self->{runNumbers} = $runNumbers; $runNumbers->setObjectName( "runNumbers" ); - my $sizePolicy5 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy5} = $sizePolicy5; - $sizePolicy5->setHorizontalStretch( 0 ); - $sizePolicy5->setVerticalStretch( 0 ); - $sizePolicy5->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); - $runNumbers->setSizePolicy( $sizePolicy5 ); + $sizePolicy1->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); + $runNumbers->setSizePolicy( $sizePolicy1 ); $runNumbers->setMinimumSize( Qt::Size(0, 23) ); + $runNumbers->setMaximumSize( Qt::Size(16777215, 25) ); + $runNumbers->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); $runNumbers_2->addWidget( $runNumbers, 0, 0, 1, 5 ); - $verticalLayout->addWidget( $runsAuto ); - - my $runsMan = Qt::GroupBox( $widget1 ); - $self->{runsMan} = $runsMan; - $runsMan->setObjectName( "runsMan" ); - $sizePolicy2->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); - $runsMan->setSizePolicy( $sizePolicy2 ); - my $layoutWidget_4 = Qt::Widget( $runsMan ); - $self->{layoutWidget_4} = $layoutWidget_4; - $layoutWidget_4->setObjectName( "layoutWidget_4" ); - $layoutWidget_4->setGeometry( Qt::Rect(10, 20, 771, 52) ); - my $runFiles_2 = Qt::GridLayout( $layoutWidget_4 ); - $self->{runFiles_2} = $runFiles_2; - $runFiles_2->setSpacing( 6 ); - $runFiles_2->setMargin( 11 ); - $runFiles_2->setObjectName( "runFiles_2" ); - $runFiles_2->setContentsMargins(0, 0, 0, 0 ); - my $spacer3 = Qt::SpacerItem( 411, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); - - $runFiles_2->addItem( $spacer3, 1, 0, 1, 1 ); - - my $runFiles = Qt::LineEdit( $layoutWidget_4 ); - $self->{runFiles} = $runFiles; - $runFiles->setObjectName( "runFiles" ); - $runFiles->setEnabled( 1 ); - $sizePolicy5->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); - $runFiles->setSizePolicy( $sizePolicy5 ); - $runFiles->setMinimumSize( Qt::Size(0, 23) ); - - $runFiles_2->addWidget( $runFiles, 0, 0, 1, 2 ); - - my $browse = Qt::PushButton( $layoutWidget_4 ); - $self->{browse} = $browse; - $browse->setObjectName( "browse" ); - $browse->setEnabled( 1 ); - $sizePolicy3->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); - $browse->setSizePolicy( $sizePolicy3 ); - $browse->setMinimumSize( Qt::Size(0, 20) ); - - $runFiles_2->addWidget( $browse, 1, 1, 1, 1 ); + $gridLayout_3->addLayout( $runNumbers_2, 0, 0, 1, 1 ); - $verticalLayout->addWidget( $runsMan ); + $gridLayout_2->addWidget( $runsAuto, 0, 0, 1, 1 ); - my $groupBox = Qt::GroupBox( $widget1 ); + my $groupBox = Qt::GroupBox( $runsPage ); $self->{groupBox} = $groupBox; $groupBox->setObjectName( "groupBox" ); - $sizePolicy2->setHeightForWidth( $groupBox->sizePolicy()->hasHeightForWidth() ); - $groupBox->setSizePolicy( $sizePolicy2 ); - my $layoutWidget_3 = Qt::Widget( $groupBox ); - $self->{layoutWidget_3} = $layoutWidget_3; - $layoutWidget_3->setObjectName( "layoutWidget_3" ); - $layoutWidget_3->setGeometry( Qt::Rect(10, 20, 773, 95) ); - my $theoryFun = Qt::GridLayout( $layoutWidget_3 ); - $self->{theoryFun} = $theoryFun; - $theoryFun->setSpacing( 0 ); - $theoryFun->setMargin( 0 ); - $theoryFun->setObjectName( "theoryFun" ); - $theoryFun->setSizeConstraint( Qt::Layout::SetMinimumSize() ); - $theoryFun->setContentsMargins(0, 0, 0, 0 ); - my $fitType2 = Qt::ComboBox( $layoutWidget_3 ); - $self->{fitType2} = $fitType2; - $fitType2->setObjectName( "fitType2" ); - $sizePolicy1->setHeightForWidth( $fitType2->sizePolicy()->hasHeightForWidth() ); - $fitType2->setSizePolicy( $sizePolicy1 ); - - $theoryFun->addWidget( $fitType2, 1, 1, 1, 1 ); - - my $tfsLabel = Qt::Label( $layoutWidget_3 ); - $self->{tfsLabel} = $tfsLabel; - $tfsLabel->setObjectName( "tfsLabel" ); - $sizePolicy1->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); - $tfsLabel->setSizePolicy( $sizePolicy1 ); - $tfsLabel->setWordWrap( 0 ); - - $theoryFun->addWidget( $tfsLabel, 2, 1, 1, 1 ); - - my $fitType1 = Qt::ComboBox( $layoutWidget_3 ); - $self->{fitType1} = $fitType1; - $fitType1->setObjectName( "fitType1" ); - $sizePolicy1->setHeightForWidth( $fitType1->sizePolicy()->hasHeightForWidth() ); - $fitType1->setSizePolicy( $sizePolicy1 ); - $fitType1->setAutoCompletion( 0 ); - $fitType1->setDuplicatesEnabled( 0 ); - - $theoryFun->addWidget( $fitType1, 1, 0, 1, 1 ); - - my $bins = Qt::LineEdit( $layoutWidget_3 ); - $self->{bins} = $bins; - $bins->setObjectName( "bins" ); - $sizePolicy1->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); - $bins->setSizePolicy( $sizePolicy1 ); - - $theoryFun->addWidget( $bins, 3, 2, 1, 1 ); - - my $comp3Label = Qt::Label( $layoutWidget_3 ); - $self->{comp3Label} = $comp3Label; - $comp3Label->setObjectName( "comp3Label" ); + 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 ); + $groupBox->setMinimumSize( Qt::Size(0, 220) ); + $groupBox->setBaseSize( Qt::Size(0, 0) ); + my $gridLayout_8 = Qt::GridLayout( $groupBox ); + $self->{gridLayout_8} = $gridLayout_8; + $gridLayout_8->setSpacing( 6 ); + $gridLayout_8->setMargin( 11 ); + $gridLayout_8->setObjectName( "gridLayout_8" ); + my $comp1Label = Qt::Label( $groupBox ); + $self->{comp1Label} = $comp1Label; + $comp1Label->setObjectName( "comp1Label" ); my $palette = Qt::Palette(); my $brush = Qt::Brush(Qt::Color(0, 0, 0, 255)); $brush->setStyle( Qt::SolidPattern() ); @@ -1403,30 +1392,14 @@ sub setupUi { $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); - $comp3Label->setPalette( $palette ); - $comp3Label->setWordWrap( 0 ); + $comp1Label->setPalette( $palette ); + $comp1Label->setWordWrap( 0 ); - $theoryFun->addWidget( $comp3Label, 0, 2, 1, 1 ); + $gridLayout_8->addWidget( $comp1Label, 0, 0, 1, 1 ); - my $tis = Qt::LineEdit( $layoutWidget_3 ); - $self->{tis} = $tis; - $tis->setObjectName( "tis" ); - $sizePolicy1->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); - $tis->setSizePolicy( $sizePolicy1 ); - - $theoryFun->addWidget( $tis, 3, 0, 1, 1 ); - - my $tfs = Qt::LineEdit( $layoutWidget_3 ); - $self->{tfs} = $tfs; - $tfs->setObjectName( "tfs" ); - $sizePolicy1->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); - $tfs->setSizePolicy( $sizePolicy1 ); - - $theoryFun->addWidget( $tfs, 3, 1, 1, 1 ); - - my $comp1Label = Qt::Label( $layoutWidget_3 ); - $self->{comp1Label} = $comp1Label; - $comp1Label->setObjectName( "comp1Label" ); + my $comp2Label = Qt::Label( $groupBox ); + $self->{comp2Label} = $comp2Label; + $comp2Label->setObjectName( "comp2Label" ); my $palette1 = Qt::Palette(); $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); @@ -1476,40 +1449,14 @@ sub setupUi { $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); - $comp1Label->setPalette( $palette1 ); - $comp1Label->setWordWrap( 0 ); + $comp2Label->setPalette( $palette1 ); + $comp2Label->setWordWrap( 0 ); - $theoryFun->addWidget( $comp1Label, 0, 0, 1, 1 ); + $gridLayout_8->addWidget( $comp2Label, 0, 2, 1, 1 ); - my $binsLabel = Qt::Label( $layoutWidget_3 ); - $self->{binsLabel} = $binsLabel; - $binsLabel->setObjectName( "binsLabel" ); - $sizePolicy1->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); - $binsLabel->setSizePolicy( $sizePolicy1 ); - $binsLabel->setWordWrap( 0 ); - - $theoryFun->addWidget( $binsLabel, 2, 2, 1, 1 ); - - my $tisLabel = Qt::Label( $layoutWidget_3 ); - $self->{tisLabel} = $tisLabel; - $tisLabel->setObjectName( "tisLabel" ); - $sizePolicy1->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); - $tisLabel->setSizePolicy( $sizePolicy1 ); - $tisLabel->setWordWrap( 0 ); - - $theoryFun->addWidget( $tisLabel, 2, 0, 1, 1 ); - - my $fitType3 = Qt::ComboBox( $layoutWidget_3 ); - $self->{fitType3} = $fitType3; - $fitType3->setObjectName( "fitType3" ); - $sizePolicy1->setHeightForWidth( $fitType3->sizePolicy()->hasHeightForWidth() ); - $fitType3->setSizePolicy( $sizePolicy1 ); - - $theoryFun->addWidget( $fitType3, 1, 2, 1, 1 ); - - my $comp2Label = Qt::Label( $layoutWidget_3 ); - $self->{comp2Label} = $comp2Label; - $comp2Label->setObjectName( "comp2Label" ); + my $comp3Label = Qt::Label( $groupBox ); + $self->{comp3Label} = $comp3Label; + $comp3Label->setObjectName( "comp3Label" ); my $palette2 = Qt::Palette(); $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); @@ -1559,19 +1506,189 @@ sub setupUi { $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); - $comp2Label->setPalette( $palette2 ); - $comp2Label->setWordWrap( 0 ); + $comp3Label->setPalette( $palette2 ); + $comp3Label->setWordWrap( 0 ); - $theoryFun->addWidget( $comp2Label, 0, 1, 1, 1 ); + $gridLayout_8->addWidget( $comp3Label, 0, 4, 1, 1 ); + + my $fitType1 = Qt::ComboBox( $groupBox ); + $self->{fitType1} = $fitType1; + $fitType1->setObjectName( "fitType1" ); + $sizePolicy3->setHeightForWidth( $fitType1->sizePolicy()->hasHeightForWidth() ); + $fitType1->setSizePolicy( $sizePolicy3 ); + $fitType1->setMinimumSize( Qt::Size(0, 25) ); + $fitType1->setMaximumSize( Qt::Size(16777215, 25) ); + $fitType1->setAutoCompletion( 0 ); + $fitType1->setDuplicatesEnabled( 0 ); + + $gridLayout_8->addWidget( $fitType1, 1, 0, 1, 2 ); + + my $fitType2 = Qt::ComboBox( $groupBox ); + $self->{fitType2} = $fitType2; + $fitType2->setObjectName( "fitType2" ); + $sizePolicy3->setHeightForWidth( $fitType2->sizePolicy()->hasHeightForWidth() ); + $fitType2->setSizePolicy( $sizePolicy3 ); + $fitType2->setMinimumSize( Qt::Size(0, 25) ); + $fitType2->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout_8->addWidget( $fitType2, 1, 2, 1, 2 ); + + my $fitType3 = Qt::ComboBox( $groupBox ); + $self->{fitType3} = $fitType3; + $fitType3->setObjectName( "fitType3" ); + $sizePolicy3->setHeightForWidth( $fitType3->sizePolicy()->hasHeightForWidth() ); + $fitType3->setSizePolicy( $sizePolicy3 ); + $fitType3->setMinimumSize( Qt::Size(0, 25) ); + $fitType3->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout_8->addWidget( $fitType3, 1, 4, 1, 1 ); + + my $tisLabel = Qt::Label( $groupBox ); + $self->{tisLabel} = $tisLabel; + $tisLabel->setObjectName( "tisLabel" ); + $sizePolicy3->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); + $tisLabel->setSizePolicy( $sizePolicy3 ); + $tisLabel->setWordWrap( 0 ); + + $gridLayout_8->addWidget( $tisLabel, 2, 0, 1, 1 ); + + my $tfsLabel = Qt::Label( $groupBox ); + $self->{tfsLabel} = $tfsLabel; + $tfsLabel->setObjectName( "tfsLabel" ); + $sizePolicy3->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); + $tfsLabel->setSizePolicy( $sizePolicy3 ); + $tfsLabel->setWordWrap( 0 ); + + $gridLayout_8->addWidget( $tfsLabel, 2, 2, 1, 1 ); + + my $binsLabel = Qt::Label( $groupBox ); + $self->{binsLabel} = $binsLabel; + $binsLabel->setObjectName( "binsLabel" ); + $sizePolicy3->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); + $binsLabel->setSizePolicy( $sizePolicy3 ); + $binsLabel->setWordWrap( 0 ); + + $gridLayout_8->addWidget( $binsLabel, 2, 4, 1, 1 ); + + my $tis = Qt::LineEdit( $groupBox ); + $self->{tis} = $tis; + $tis->setObjectName( "tis" ); + $sizePolicy3->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); + $tis->setSizePolicy( $sizePolicy3 ); + $tis->setMinimumSize( Qt::Size(0, 25) ); + $tis->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout_8->addWidget( $tis, 3, 0, 1, 1 ); + + my $tfs = Qt::LineEdit( $groupBox ); + $self->{tfs} = $tfs; + $tfs->setObjectName( "tfs" ); + $sizePolicy3->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); + $tfs->setSizePolicy( $sizePolicy3 ); + $tfs->setMinimumSize( Qt::Size(0, 25) ); + $tfs->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout_8->addWidget( $tfs, 3, 2, 1, 1 ); + + my $bins = Qt::LineEdit( $groupBox ); + $self->{bins} = $bins; + $bins->setObjectName( "bins" ); + $sizePolicy3->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); + $bins->setSizePolicy( $sizePolicy3 ); + $bins->setMinimumSize( Qt::Size(0, 25) ); + $bins->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout_8->addWidget( $bins, 3, 4, 1, 1 ); + + my $textLabel1_4 = Qt::Label( $groupBox ); + $self->{textLabel1_4} = $textLabel1_4; + $textLabel1_4->setObjectName( "textLabel1_4" ); + $textLabel1_4->setWordWrap( 0 ); + + $gridLayout_8->addWidget( $textLabel1_4, 4, 0, 1, 1 ); + + my $textLabel1_8 = Qt::Label( $groupBox ); + $self->{textLabel1_8} = $textLabel1_8; + $textLabel1_8->setObjectName( "textLabel1_8" ); + $textLabel1_8->setWordWrap( 0 ); + + $gridLayout_8->addWidget( $textLabel1_8, 4, 2, 1, 1 ); + + my $textLabel1_4_2_2 = Qt::Label( $groupBox ); + $self->{textLabel1_4_2_2} = $textLabel1_4_2_2; + $textLabel1_4_2_2->setObjectName( "textLabel1_4_2_2" ); + $textLabel1_4_2_2->setWordWrap( 0 ); + + $gridLayout_8->addWidget( $textLabel1_4_2_2, 4, 4, 1, 1 ); + + my $xi = Qt::LineEdit( $groupBox ); + $self->{xi} = $xi; + $xi->setObjectName( "xi" ); + $xi->setMinimumSize( Qt::Size(0, 25) ); + + $gridLayout_8->addWidget( $xi, 5, 0, 1, 1 ); + + my $xf = Qt::LineEdit( $groupBox ); + $self->{xf} = $xf; + $xf->setObjectName( "xf" ); + $xf->setMinimumSize( Qt::Size(0, 25) ); + + $gridLayout_8->addWidget( $xf, 5, 2, 1, 1 ); + + my $viewBin = Qt::LineEdit( $groupBox ); + $self->{viewBin} = $viewBin; + $viewBin->setObjectName( "viewBin" ); + $viewBin->setMinimumSize( Qt::Size(0, 25) ); + + $gridLayout_8->addWidget( $viewBin, 5, 3, 1, 2 ); + + my $textLabel1_4_2 = Qt::Label( $groupBox ); + $self->{textLabel1_4_2} = $textLabel1_4_2; + $textLabel1_4_2->setObjectName( "textLabel1_4_2" ); + $textLabel1_4_2->setWordWrap( 0 ); + + $gridLayout_8->addWidget( $textLabel1_4_2, 6, 0, 1, 1 ); + + my $textLabel1_4_3 = Qt::Label( $groupBox ); + $self->{textLabel1_4_3} = $textLabel1_4_3; + $textLabel1_4_3->setObjectName( "textLabel1_4_3" ); + $textLabel1_4_3->setWordWrap( 0 ); + + $gridLayout_8->addWidget( $textLabel1_4_3, 6, 2, 1, 1 ); + + my $textLabel1_4_4 = Qt::Label( $groupBox ); + $self->{textLabel1_4_4} = $textLabel1_4_4; + $textLabel1_4_4->setObjectName( "textLabel1_4_4" ); + $textLabel1_4_4->setWordWrap( 0 ); + + $gridLayout_8->addWidget( $textLabel1_4_4, 6, 4, 1, 1 ); + + my $yi = Qt::LineEdit( $groupBox ); + $self->{yi} = $yi; + $yi->setObjectName( "yi" ); + + $gridLayout_8->addWidget( $yi, 7, 0, 1, 1 ); + + my $yf = Qt::LineEdit( $groupBox ); + $self->{yf} = $yf; + $yf->setObjectName( "yf" ); + + $gridLayout_8->addWidget( $yf, 7, 1, 1, 2 ); + + my $ltc = Qt::CheckBox( $groupBox ); + $self->{ltc} = $ltc; + $ltc->setObjectName( "ltc" ); + $ltc->setChecked( 1 ); + + $gridLayout_8->addWidget( $ltc, 7, 4, 1, 1 ); - $verticalLayout->addWidget( $groupBox ); + $gridLayout_2->addWidget( $groupBox, 2, 0, 1, 1 ); + + + $gridLayout_1->addLayout( $gridLayout_2, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $runsPage, Qt::Application::translate( 'MuSRFit4', "RUNS", undef, Qt::Application::UnicodeUTF8() ) ); - $runsAuto->raise(); - $groupBox->raise(); - $layoutWidget->raise(); - $runsMan->raise(); my $fittingPage = Qt::Widget( ); $self->{fittingPage} = $fittingPage; $fittingPage->setObjectName( "fittingPage" ); @@ -1591,76 +1708,23 @@ sub setupUi { my $errorCalc = Qt::ComboBox( $fittingPage ); $self->{errorCalc} = $errorCalc; $errorCalc->setObjectName( "errorCalc" ); + $errorCalc->setMinimumSize( Qt::Size(0, 25) ); + $errorCalc->setMaximumSize( Qt::Size(150, 16777215) ); $fitLayout->addWidget( $errorCalc, 1, 1, 1, 1 ); - my $ltc = Qt::CheckBox( $fittingPage ); - $self->{ltc} = $ltc; - $ltc->setObjectName( "ltc" ); - $ltc->setChecked( 1 ); - - $fitLayout->addWidget( $ltc, 3, 0, 1, 2 ); - - my $textLabel1_4 = Qt::Label( $fittingPage ); - $self->{textLabel1_4} = $textLabel1_4; - $textLabel1_4->setObjectName( "textLabel1_4" ); - $textLabel1_4->setWordWrap( 0 ); - - $fitLayout->addWidget( $textLabel1_4, 0, 2, 1, 1 ); - - my $textLabel1_4_2_2 = Qt::Label( $fittingPage ); - $self->{textLabel1_4_2_2} = $textLabel1_4_2_2; - $textLabel1_4_2_2->setObjectName( "textLabel1_4_2_2" ); - $textLabel1_4_2_2->setWordWrap( 0 ); - - $fitLayout->addWidget( $textLabel1_4_2_2, 3, 3, 1, 1 ); - - my $xi = Qt::LineEdit( $fittingPage ); - $self->{xi} = $xi; - $xi->setObjectName( "xi" ); - - $fitLayout->addWidget( $xi, 0, 3, 1, 1 ); - - my $yf = Qt::LineEdit( $fittingPage ); - $self->{yf} = $yf; - $yf->setObjectName( "yf" ); - - $fitLayout->addWidget( $yf, 1, 4, 1, 1 ); - - my $viewBin = Qt::LineEdit( $fittingPage ); - $self->{viewBin} = $viewBin; - $viewBin->setObjectName( "viewBin" ); - - $fitLayout->addWidget( $viewBin, 3, 4, 1, 1 ); - - my $textLabel1_4_2 = Qt::Label( $fittingPage ); - $self->{textLabel1_4_2} = $textLabel1_4_2; - $textLabel1_4_2->setObjectName( "textLabel1_4_2" ); - $textLabel1_4_2->setWordWrap( 0 ); - - $fitLayout->addWidget( $textLabel1_4_2, 1, 2, 1, 1 ); - - my $xf = Qt::LineEdit( $fittingPage ); - $self->{xf} = $xf; - $xf->setObjectName( "xf" ); - - $fitLayout->addWidget( $xf, 0, 4, 1, 1 ); - - my $yi = Qt::LineEdit( $fittingPage ); - $self->{yi} = $yi; - $yi->setObjectName( "yi" ); - - $fitLayout->addWidget( $yi, 1, 3, 1, 1 ); - my $minimization = Qt::ComboBox( $fittingPage ); $self->{minimization} = $minimization; $minimization->setObjectName( "minimization" ); + $minimization->setMinimumSize( Qt::Size(0, 25) ); + $minimization->setMaximumSize( Qt::Size(150, 16777215) ); $fitLayout->addWidget( $minimization, 0, 1, 1, 1 ); my $textLabel1_5 = Qt::Label( $fittingPage ); $self->{textLabel1_5} = $textLabel1_5; $textLabel1_5->setObjectName( "textLabel1_5" ); + $textLabel1_5->setAlignment( Qt::AlignRight()|Qt::AlignTrailing()|Qt::AlignVCenter() ); $textLabel1_5->setWordWrap( 0 ); $fitLayout->addWidget( $textLabel1_5, 0, 0, 1, 1 ); @@ -1668,6 +1732,7 @@ sub setupUi { my $textLabel1_5_2 = Qt::Label( $fittingPage ); $self->{textLabel1_5_2} = $textLabel1_5_2; $textLabel1_5_2->setObjectName( "textLabel1_5_2" ); + $textLabel1_5_2->setAlignment( Qt::AlignRight()|Qt::AlignTrailing()|Qt::AlignVCenter() ); $textLabel1_5_2->setWordWrap( 0 ); $fitLayout->addWidget( $textLabel1_5_2, 1, 0, 1, 1 ); @@ -1696,189 +1761,28 @@ sub setupUi { my $buttonGroupSharing = Qt::GroupBox( $sharingPage ); $self->{buttonGroupSharing} = $buttonGroupSharing; $buttonGroupSharing->setObjectName( "buttonGroupSharing" ); - $sizePolicy2->setHeightForWidth( $buttonGroupSharing->sizePolicy()->hasHeightForWidth() ); - $buttonGroupSharing->setSizePolicy( $sizePolicy2 ); + $sizePolicy5->setHeightForWidth( $buttonGroupSharing->sizePolicy()->hasHeightForWidth() ); + $buttonGroupSharing->setSizePolicy( $sizePolicy5 ); $buttonGroupSharing->setAlignment( Qt::AlignLeading() ); $buttonGroupSharing->setCheckable( 1 ); $buttonGroupSharing->setChecked( 0 ); - my $sharingComp2 = Qt::GroupBox( $buttonGroupSharing ); - $self->{sharingComp2} = $sharingComp2; - $sharingComp2->setObjectName( "sharingComp2" ); - $sharingComp2->setEnabled( 0 ); - $sharingComp2->setGeometry( Qt::Rect(199, 20, 162, 330) ); - my $sizePolicy6 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); - $self->{$sizePolicy6} = $sizePolicy6; - $sizePolicy6->setHorizontalStretch( 0 ); - $sizePolicy6->setVerticalStretch( 0 ); - $sizePolicy6->setHeightForWidth( $sharingComp2->sizePolicy()->hasHeightForWidth() ); - $sharingComp2->setSizePolicy( $sizePolicy6 ); - my $comp2ShLabel = Qt::Label( $sharingComp2 ); - $self->{comp2ShLabel} = $comp2ShLabel; - $comp2ShLabel->setObjectName( "comp2ShLabel" ); - $comp2ShLabel->setGeometry( Qt::Rect(2, 30, 185, 20) ); - $comp2ShLabel->setWordWrap( 0 ); - my $layout13 = Qt::Widget( $sharingComp2 ); - $self->{layout13} = $layout13; - $layout13->setObjectName( "layout13" ); - $layout13->setGeometry( Qt::Rect(40, 60, 81, 266) ); - my $vboxLayout = Qt::VBoxLayout( $layout13 ); - $self->{vboxLayout} = $vboxLayout; - $vboxLayout->setSpacing( 0 ); - $vboxLayout->setMargin( 0 ); - $vboxLayout->setObjectName( "vboxLayout" ); - $vboxLayout->setContentsMargins(0, 0, 0, 0 ); - my $shParam_2_1 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_1} = $shParam_2_1; - $shParam_2_1->setObjectName( "shParam_2_1" ); - - $vboxLayout->addWidget( $shParam_2_1 ); - - my $shParam_2_2 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_2} = $shParam_2_2; - $shParam_2_2->setObjectName( "shParam_2_2" ); - - $vboxLayout->addWidget( $shParam_2_2 ); - - my $shParam_2_3 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_3} = $shParam_2_3; - $shParam_2_3->setObjectName( "shParam_2_3" ); - - $vboxLayout->addWidget( $shParam_2_3 ); - - my $shParam_2_4 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_4} = $shParam_2_4; - $shParam_2_4->setObjectName( "shParam_2_4" ); - - $vboxLayout->addWidget( $shParam_2_4 ); - - my $shParam_2_5 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_5} = $shParam_2_5; - $shParam_2_5->setObjectName( "shParam_2_5" ); - - $vboxLayout->addWidget( $shParam_2_5 ); - - my $shParam_2_6 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_6} = $shParam_2_6; - $shParam_2_6->setObjectName( "shParam_2_6" ); - $shParam_2_6->setEnabled( 0 ); - $shParam_2_6->setTristate( 0 ); - - $vboxLayout->addWidget( $shParam_2_6 ); - - my $shParam_2_7 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_7} = $shParam_2_7; - $shParam_2_7->setObjectName( "shParam_2_7" ); - $shParam_2_7->setEnabled( 0 ); - $shParam_2_7->setTristate( 0 ); - - $vboxLayout->addWidget( $shParam_2_7 ); - - my $shParam_2_8 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_8} = $shParam_2_8; - $shParam_2_8->setObjectName( "shParam_2_8" ); - $shParam_2_8->setEnabled( 0 ); - $shParam_2_8->setTristate( 0 ); - - $vboxLayout->addWidget( $shParam_2_8 ); - - my $shParam_2_9 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_9} = $shParam_2_9; - $shParam_2_9->setObjectName( "shParam_2_9" ); - $shParam_2_9->setEnabled( 0 ); - $shParam_2_9->setTristate( 0 ); - - $vboxLayout->addWidget( $shParam_2_9 ); - - my $sharingComp3 = Qt::GroupBox( $buttonGroupSharing ); - $self->{sharingComp3} = $sharingComp3; - $sharingComp3->setObjectName( "sharingComp3" ); - $sharingComp3->setEnabled( 0 ); - $sharingComp3->setGeometry( Qt::Rect(367, 20, 162, 330) ); - $sizePolicy6->setHeightForWidth( $sharingComp3->sizePolicy()->hasHeightForWidth() ); - $sharingComp3->setSizePolicy( $sizePolicy6 ); - $sharingComp3->setAlignment( Qt::AlignJustify()|Qt::AlignVCenter() ); - my $comp3ShLabel = Qt::Label( $sharingComp3 ); - $self->{comp3ShLabel} = $comp3ShLabel; - $comp3ShLabel->setObjectName( "comp3ShLabel" ); - $comp3ShLabel->setGeometry( Qt::Rect(2, 30, 185, 20) ); - $comp3ShLabel->setWordWrap( 0 ); - my $layout15 = Qt::Widget( $sharingComp3 ); - $self->{layout15} = $layout15; - $layout15->setObjectName( "layout15" ); - $layout15->setGeometry( Qt::Rect(41, 58, 81, 266) ); - my $vboxLayout1 = Qt::VBoxLayout( $layout15 ); - $self->{vboxLayout1} = $vboxLayout1; - $vboxLayout1->setSpacing( 6 ); - $vboxLayout1->setMargin( 11 ); - $vboxLayout1->setObjectName( "vboxLayout1" ); - $vboxLayout1->setContentsMargins(0, 0, 0, 0 ); - my $shParam_3_1 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_1} = $shParam_3_1; - $shParam_3_1->setObjectName( "shParam_3_1" ); - - $vboxLayout1->addWidget( $shParam_3_1 ); - - my $shParam_3_2 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_2} = $shParam_3_2; - $shParam_3_2->setObjectName( "shParam_3_2" ); - - $vboxLayout1->addWidget( $shParam_3_2 ); - - my $shParam_3_3 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_3} = $shParam_3_3; - $shParam_3_3->setObjectName( "shParam_3_3" ); - - $vboxLayout1->addWidget( $shParam_3_3 ); - - my $shParam_3_4 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_4} = $shParam_3_4; - $shParam_3_4->setObjectName( "shParam_3_4" ); - - $vboxLayout1->addWidget( $shParam_3_4 ); - - my $shParam_3_5 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_5} = $shParam_3_5; - $shParam_3_5->setObjectName( "shParam_3_5" ); - - $vboxLayout1->addWidget( $shParam_3_5 ); - - my $shParam_3_6 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_6} = $shParam_3_6; - $shParam_3_6->setObjectName( "shParam_3_6" ); - $shParam_3_6->setEnabled( 0 ); - $shParam_3_6->setTristate( 0 ); - - $vboxLayout1->addWidget( $shParam_3_6 ); - - my $shParam_3_7 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_7} = $shParam_3_7; - $shParam_3_7->setObjectName( "shParam_3_7" ); - $shParam_3_7->setEnabled( 0 ); - $shParam_3_7->setTristate( 0 ); - - $vboxLayout1->addWidget( $shParam_3_7 ); - - my $shParam_3_8 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_8} = $shParam_3_8; - $shParam_3_8->setObjectName( "shParam_3_8" ); - $shParam_3_8->setEnabled( 0 ); - $shParam_3_8->setTristate( 0 ); - - $vboxLayout1->addWidget( $shParam_3_8 ); - - my $shParam_3_9 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_9} = $shParam_3_9; - $shParam_3_9->setObjectName( "shParam_3_9" ); - $shParam_3_9->setEnabled( 0 ); - $shParam_3_9->setTristate( 0 ); - - $vboxLayout1->addWidget( $shParam_3_9 ); - + my $gridLayout_7 = Qt::GridLayout( $buttonGroupSharing ); + $self->{gridLayout_7} = $gridLayout_7; + $gridLayout_7->setSpacing( 6 ); + $gridLayout_7->setMargin( 11 ); + $gridLayout_7->setObjectName( "gridLayout_7" ); + my $horizontalLayout = Qt::HBoxLayout( ); + $self->{horizontalLayout} = $horizontalLayout; + $horizontalLayout->setSpacing( 6 ); + $horizontalLayout->setObjectName( "horizontalLayout" ); my $sharingComp1 = Qt::GroupBox( $buttonGroupSharing ); $self->{sharingComp1} = $sharingComp1; $sharingComp1->setObjectName( "sharingComp1" ); $sharingComp1->setEnabled( 0 ); - $sharingComp1->setGeometry( Qt::Rect(31, 20, 162, 330) ); + 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 ); $sharingComp1->setAlignment( Qt::AlignLeading() ); @@ -1886,35 +1790,35 @@ sub setupUi { $self->{layout14} = $layout14; $layout14->setObjectName( "layout14" ); $layout14->setGeometry( Qt::Rect(40, 60, 81, 266) ); - my $vboxLayout2 = Qt::VBoxLayout( $layout14 ); - $self->{vboxLayout2} = $vboxLayout2; - $vboxLayout2->setSpacing( 0 ); - $vboxLayout2->setMargin( 0 ); - $vboxLayout2->setObjectName( "vboxLayout2" ); - $vboxLayout2->setContentsMargins(0, 0, 0, 0 ); + my $_5 = Qt::VBoxLayout( $layout14 ); + $self->{_5} = $_5; + $_5->setSpacing( 0 ); + $_5->setMargin( 0 ); + $_5->setObjectName( "_5" ); + $_5->setContentsMargins(0, 0, 0, 0 ); my $shParam_1_1 = Qt::CheckBox( $layout14 ); $self->{shParam_1_1} = $shParam_1_1; $shParam_1_1->setObjectName( "shParam_1_1" ); - $vboxLayout2->addWidget( $shParam_1_1 ); + $_5->addWidget( $shParam_1_1 ); my $shParam_1_2 = Qt::CheckBox( $layout14 ); $self->{shParam_1_2} = $shParam_1_2; $shParam_1_2->setObjectName( "shParam_1_2" ); - $vboxLayout2->addWidget( $shParam_1_2 ); + $_5->addWidget( $shParam_1_2 ); my $shParam_1_3 = Qt::CheckBox( $layout14 ); $self->{shParam_1_3} = $shParam_1_3; $shParam_1_3->setObjectName( "shParam_1_3" ); - $vboxLayout2->addWidget( $shParam_1_3 ); + $_5->addWidget( $shParam_1_3 ); my $shParam_1_4 = Qt::CheckBox( $layout14 ); $self->{shParam_1_4} = $shParam_1_4; $shParam_1_4->setObjectName( "shParam_1_4" ); - $vboxLayout2->addWidget( $shParam_1_4 ); + $_5->addWidget( $shParam_1_4 ); my $shParam_1_5 = Qt::CheckBox( $layout14 ); $self->{shParam_1_5} = $shParam_1_5; @@ -1922,7 +1826,7 @@ sub setupUi { $shParam_1_5->setEnabled( 0 ); $shParam_1_5->setTristate( 0 ); - $vboxLayout2->addWidget( $shParam_1_5 ); + $_5->addWidget( $shParam_1_5 ); my $shParam_1_6 = Qt::CheckBox( $layout14 ); $self->{shParam_1_6} = $shParam_1_6; @@ -1930,7 +1834,7 @@ sub setupUi { $shParam_1_6->setEnabled( 0 ); $shParam_1_6->setTristate( 0 ); - $vboxLayout2->addWidget( $shParam_1_6 ); + $_5->addWidget( $shParam_1_6 ); my $shParam_1_7 = Qt::CheckBox( $layout14 ); $self->{shParam_1_7} = $shParam_1_7; @@ -1938,7 +1842,7 @@ sub setupUi { $shParam_1_7->setEnabled( 0 ); $shParam_1_7->setTristate( 0 ); - $vboxLayout2->addWidget( $shParam_1_7 ); + $_5->addWidget( $shParam_1_7 ); my $shParam_1_8 = Qt::CheckBox( $layout14 ); $self->{shParam_1_8} = $shParam_1_8; @@ -1946,7 +1850,7 @@ sub setupUi { $shParam_1_8->setEnabled( 0 ); $shParam_1_8->setTristate( 0 ); - $vboxLayout2->addWidget( $shParam_1_8 ); + $_5->addWidget( $shParam_1_8 ); my $shParam_1_9 = Qt::CheckBox( $layout14 ); $self->{shParam_1_9} = $shParam_1_9; @@ -1954,14 +1858,193 @@ sub setupUi { $shParam_1_9->setEnabled( 0 ); $shParam_1_9->setTristate( 0 ); - $vboxLayout2->addWidget( $shParam_1_9 ); + $_5->addWidget( $shParam_1_9 ); my $comp1ShLabel = Qt::Label( $sharingComp1 ); $self->{comp1ShLabel} = $comp1ShLabel; $comp1ShLabel->setObjectName( "comp1ShLabel" ); - $comp1ShLabel->setGeometry( Qt::Rect(2, 30, 185, 20) ); + $comp1ShLabel->setGeometry( Qt::Rect(2, 30, 141, 20) ); $comp1ShLabel->setWordWrap( 0 ); + $horizontalLayout->addWidget( $sharingComp1 ); + + my $sharingComp2 = Qt::GroupBox( $buttonGroupSharing ); + $self->{sharingComp2} = $sharingComp2; + $sharingComp2->setObjectName( "sharingComp2" ); + $sharingComp2->setEnabled( 0 ); + $sizePolicy6->setHeightForWidth( $sharingComp2->sizePolicy()->hasHeightForWidth() ); + $sharingComp2->setSizePolicy( $sizePolicy6 ); + my $comp2ShLabel = Qt::Label( $sharingComp2 ); + $self->{comp2ShLabel} = $comp2ShLabel; + $comp2ShLabel->setObjectName( "comp2ShLabel" ); + $comp2ShLabel->setGeometry( Qt::Rect(2, 30, 141, 20) ); + $comp2ShLabel->setWordWrap( 0 ); + my $layout13 = Qt::Widget( $sharingComp2 ); + $self->{layout13} = $layout13; + $layout13->setObjectName( "layout13" ); + $layout13->setGeometry( Qt::Rect(40, 60, 81, 266) ); + my $_1 = Qt::VBoxLayout( $layout13 ); + $self->{_1} = $_1; + $_1->setSpacing( 0 ); + $_1->setMargin( 0 ); + $_1->setObjectName( "_1" ); + $_1->setContentsMargins(0, 0, 0, 0 ); + my $shParam_2_1 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_1} = $shParam_2_1; + $shParam_2_1->setObjectName( "shParam_2_1" ); + + $_1->addWidget( $shParam_2_1 ); + + my $shParam_2_2 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_2} = $shParam_2_2; + $shParam_2_2->setObjectName( "shParam_2_2" ); + + $_1->addWidget( $shParam_2_2 ); + + my $shParam_2_3 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_3} = $shParam_2_3; + $shParam_2_3->setObjectName( "shParam_2_3" ); + + $_1->addWidget( $shParam_2_3 ); + + my $shParam_2_4 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_4} = $shParam_2_4; + $shParam_2_4->setObjectName( "shParam_2_4" ); + + $_1->addWidget( $shParam_2_4 ); + + my $shParam_2_5 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_5} = $shParam_2_5; + $shParam_2_5->setObjectName( "shParam_2_5" ); + + $_1->addWidget( $shParam_2_5 ); + + my $shParam_2_6 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_6} = $shParam_2_6; + $shParam_2_6->setObjectName( "shParam_2_6" ); + $shParam_2_6->setEnabled( 0 ); + $shParam_2_6->setTristate( 0 ); + + $_1->addWidget( $shParam_2_6 ); + + my $shParam_2_7 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_7} = $shParam_2_7; + $shParam_2_7->setObjectName( "shParam_2_7" ); + $shParam_2_7->setEnabled( 0 ); + $shParam_2_7->setTristate( 0 ); + + $_1->addWidget( $shParam_2_7 ); + + my $shParam_2_8 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_8} = $shParam_2_8; + $shParam_2_8->setObjectName( "shParam_2_8" ); + $shParam_2_8->setEnabled( 0 ); + $shParam_2_8->setTristate( 0 ); + + $_1->addWidget( $shParam_2_8 ); + + my $shParam_2_9 = Qt::CheckBox( $layout13 ); + $self->{shParam_2_9} = $shParam_2_9; + $shParam_2_9->setObjectName( "shParam_2_9" ); + $shParam_2_9->setEnabled( 0 ); + $shParam_2_9->setTristate( 0 ); + + $_1->addWidget( $shParam_2_9 ); + + + $horizontalLayout->addWidget( $sharingComp2 ); + + my $sharingComp3 = Qt::GroupBox( $buttonGroupSharing ); + $self->{sharingComp3} = $sharingComp3; + $sharingComp3->setObjectName( "sharingComp3" ); + $sharingComp3->setEnabled( 0 ); + $sizePolicy6->setHeightForWidth( $sharingComp3->sizePolicy()->hasHeightForWidth() ); + $sharingComp3->setSizePolicy( $sizePolicy6 ); + $sharingComp3->setAlignment( Qt::AlignJustify()|Qt::AlignVCenter() ); + my $comp3ShLabel = Qt::Label( $sharingComp3 ); + $self->{comp3ShLabel} = $comp3ShLabel; + $comp3ShLabel->setObjectName( "comp3ShLabel" ); + $comp3ShLabel->setGeometry( Qt::Rect(2, 30, 141, 20) ); + $comp3ShLabel->setWordWrap( 0 ); + my $layout15 = Qt::Widget( $sharingComp3 ); + $self->{layout15} = $layout15; + $layout15->setObjectName( "layout15" ); + $layout15->setGeometry( Qt::Rect(41, 58, 81, 266) ); + my $_3 = Qt::VBoxLayout( $layout15 ); + $self->{_3} = $_3; + $_3->setSpacing( 6 ); + $_3->setMargin( 11 ); + $_3->setObjectName( "_3" ); + $_3->setContentsMargins(0, 0, 0, 0 ); + my $shParam_3_1 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_1} = $shParam_3_1; + $shParam_3_1->setObjectName( "shParam_3_1" ); + + $_3->addWidget( $shParam_3_1 ); + + my $shParam_3_2 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_2} = $shParam_3_2; + $shParam_3_2->setObjectName( "shParam_3_2" ); + + $_3->addWidget( $shParam_3_2 ); + + my $shParam_3_3 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_3} = $shParam_3_3; + $shParam_3_3->setObjectName( "shParam_3_3" ); + + $_3->addWidget( $shParam_3_3 ); + + my $shParam_3_4 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_4} = $shParam_3_4; + $shParam_3_4->setObjectName( "shParam_3_4" ); + + $_3->addWidget( $shParam_3_4 ); + + my $shParam_3_5 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_5} = $shParam_3_5; + $shParam_3_5->setObjectName( "shParam_3_5" ); + + $_3->addWidget( $shParam_3_5 ); + + my $shParam_3_6 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_6} = $shParam_3_6; + $shParam_3_6->setObjectName( "shParam_3_6" ); + $shParam_3_6->setEnabled( 0 ); + $shParam_3_6->setTristate( 0 ); + + $_3->addWidget( $shParam_3_6 ); + + my $shParam_3_7 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_7} = $shParam_3_7; + $shParam_3_7->setObjectName( "shParam_3_7" ); + $shParam_3_7->setEnabled( 0 ); + $shParam_3_7->setTristate( 0 ); + + $_3->addWidget( $shParam_3_7 ); + + my $shParam_3_8 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_8} = $shParam_3_8; + $shParam_3_8->setObjectName( "shParam_3_8" ); + $shParam_3_8->setEnabled( 0 ); + $shParam_3_8->setTristate( 0 ); + + $_3->addWidget( $shParam_3_8 ); + + my $shParam_3_9 = Qt::CheckBox( $layout15 ); + $self->{shParam_3_9} = $shParam_3_9; + $shParam_3_9->setObjectName( "shParam_3_9" ); + $shParam_3_9->setEnabled( 0 ); + $shParam_3_9->setTristate( 0 ); + + $_3->addWidget( $shParam_3_9 ); + + + $horizontalLayout->addWidget( $sharingComp3 ); + + + $gridLayout_7->addLayout( $horizontalLayout, 0, 0, 1, 1 ); + + $gridLayout2->addWidget( $buttonGroupSharing, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $sharingPage, Qt::Application::translate( 'MuSRFit4', "Sharing", undef, Qt::Application::UnicodeUTF8() ) ); @@ -1990,25 +2073,25 @@ sub setupUi { $gridLayout4->setSpacing( 6 ); $gridLayout4->setMargin( 11 ); $gridLayout4->setObjectName( "gridLayout4" ); - my $vboxLayout3 = Qt::VBoxLayout( ); - $self->{vboxLayout3} = $vboxLayout3; - $vboxLayout3->setSpacing( 6 ); - $vboxLayout3->setMargin( 0 ); - $vboxLayout3->setObjectName( "vboxLayout3" ); + my $vboxLayout = Qt::VBoxLayout( ); + $self->{vboxLayout} = $vboxLayout; + $vboxLayout->setSpacing( 6 ); + $vboxLayout->setMargin( 0 ); + $vboxLayout->setObjectName( "vboxLayout" ); my $groupTitle = Qt::GroupBox( $msrPage ); $self->{groupTitle} = $groupTitle; $groupTitle->setObjectName( "groupTitle" ); - $sizePolicy5->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); - $groupTitle->setSizePolicy( $sizePolicy5 ); + $sizePolicy1->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); + $groupTitle->setSizePolicy( $sizePolicy1 ); my $gridLayout5 = Qt::GridLayout( $groupTitle ); $self->{gridLayout5} = $gridLayout5; $gridLayout5->setSpacing( 6 ); $gridLayout5->setMargin( 11 ); $gridLayout5->setObjectName( "gridLayout5" ); - my $vboxLayout4 = Qt::VBoxLayout( ); - $self->{vboxLayout4} = $vboxLayout4; - $vboxLayout4->setSpacing( 6 ); - $vboxLayout4->setObjectName( "vboxLayout4" ); + my $vboxLayout1 = Qt::VBoxLayout( ); + $self->{vboxLayout1} = $vboxLayout1; + $vboxLayout1->setSpacing( 6 ); + $vboxLayout1->setObjectName( "vboxLayout1" ); my $titleLabel = Qt::Label( $groupTitle ); $self->{titleLabel} = $titleLabel; $titleLabel->setObjectName( "titleLabel" ); @@ -2016,7 +2099,7 @@ sub setupUi { $titleLabel->setSizePolicy( $sizePolicy4 ); $titleLabel->setWordWrap( 0 ); - $vboxLayout4->addWidget( $titleLabel ); + $vboxLayout1->addWidget( $titleLabel ); my $title = Qt::LineEdit( $groupTitle ); $self->{title} = $title; @@ -2028,7 +2111,7 @@ sub setupUi { $sizePolicy7->setHeightForWidth( $title->sizePolicy()->hasHeightForWidth() ); $title->setSizePolicy( $sizePolicy7 ); - $vboxLayout4->addWidget( $title ); + $vboxLayout1->addWidget( $title ); my $hboxLayout = Qt::HBoxLayout( ); $self->{hboxLayout} = $hboxLayout; @@ -2044,29 +2127,29 @@ sub setupUi { my $fileName = Qt::LineEdit( $groupTitle ); $self->{fileName} = $fileName; $fileName->setObjectName( "fileName" ); - $sizePolicy5->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); - $fileName->setSizePolicy( $sizePolicy5 ); + $sizePolicy1->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); + $fileName->setSizePolicy( $sizePolicy1 ); $hboxLayout->addWidget( $fileName ); - $vboxLayout4->addLayout( $hboxLayout ); + $vboxLayout1->addLayout( $hboxLayout ); - $gridLayout5->addLayout( $vboxLayout4, 0, 0, 1, 1 ); + $gridLayout5->addLayout( $vboxLayout1, 0, 0, 1, 1 ); - $vboxLayout3->addWidget( $groupTitle ); + $vboxLayout->addWidget( $groupTitle ); my $textMSROutput = Qt::TextEdit( $msrPage ); $self->{textMSROutput} = $textMSROutput; $textMSROutput->setObjectName( "textMSROutput" ); $textMSROutput->setOverwriteMode( 1 ); - $vboxLayout3->addWidget( $textMSROutput ); + $vboxLayout->addWidget( $textMSROutput ); - $gridLayout4->addLayout( $vboxLayout3, 0, 0, 1, 1 ); + $gridLayout4->addLayout( $vboxLayout, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $msrPage, Qt::Application::translate( 'MuSRFit4', "MSR File", undef, Qt::Application::UnicodeUTF8() ) ); my $fourierPage = Qt::Widget( ); @@ -2080,8 +2163,8 @@ sub setupUi { my $fourierBox = Qt::GroupBox( $fourierPage ); $self->{fourierBox} = $fourierBox; $fourierBox->setObjectName( "fourierBox" ); - $sizePolicy2->setHeightForWidth( $fourierBox->sizePolicy()->hasHeightForWidth() ); - $fourierBox->setSizePolicy( $sizePolicy2 ); + $sizePolicy5->setHeightForWidth( $fourierBox->sizePolicy()->hasHeightForWidth() ); + $fourierBox->setSizePolicy( $sizePolicy5 ); my $layout34 = Qt::Widget( $fourierBox ); $self->{layout34} = $layout34; $layout34->setObjectName( "layout34" ); @@ -2233,8 +2316,8 @@ sub setupUi { my $rrfBox = Qt::GroupBox( $fourierPage ); $self->{rrfBox} = $rrfBox; $rrfBox->setObjectName( "rrfBox" ); - $sizePolicy2->setHeightForWidth( $rrfBox->sizePolicy()->hasHeightForWidth() ); - $rrfBox->setSizePolicy( $sizePolicy2 ); + $sizePolicy5->setHeightForWidth( $rrfBox->sizePolicy()->hasHeightForWidth() ); + $rrfBox->setSizePolicy( $sizePolicy5 ); my $layout35 = Qt::Widget( $rrfBox ); $self->{layout35} = $layout35; $layout35->setObjectName( "layout35" ); @@ -2330,46 +2413,46 @@ sub setupUi { $self->{layout16_2} = $layout16_2; $layout16_2->setObjectName( "layout16_2" ); $layout16_2->setGeometry( Qt::Rect(5, 18, 100, 150) ); - my $vboxLayout5 = Qt::VBoxLayout( $layout16_2 ); - $self->{vboxLayout5} = $vboxLayout5; - $vboxLayout5->setSpacing( 6 ); - $vboxLayout5->setMargin( 11 ); - $vboxLayout5->setObjectName( "vboxLayout5" ); - $vboxLayout5->setContentsMargins(0, 0, 0, 0 ); + my $vboxLayout2 = Qt::VBoxLayout( $layout16_2 ); + $self->{vboxLayout2} = $vboxLayout2; + $vboxLayout2->setSpacing( 6 ); + $vboxLayout2->setMargin( 11 ); + $vboxLayout2->setObjectName( "vboxLayout2" ); + $vboxLayout2->setContentsMargins(0, 0, 0, 0 ); my $textLabel2 = Qt::Label( $layout16_2 ); $self->{textLabel2} = $textLabel2; $textLabel2->setObjectName( "textLabel2" ); $textLabel2->setWordWrap( 0 ); - $vboxLayout5->addWidget( $textLabel2 ); + $vboxLayout2->addWidget( $textLabel2 ); my $textLabel2_2_2_3 = Qt::Label( $layout16_2 ); $self->{textLabel2_2_2_3} = $textLabel2_2_2_3; $textLabel2_2_2_3->setObjectName( "textLabel2_2_2_3" ); $textLabel2_2_2_3->setWordWrap( 0 ); - $vboxLayout5->addWidget( $textLabel2_2_2_3 ); + $vboxLayout2->addWidget( $textLabel2_2_2_3 ); my $textLabel2_2_2 = Qt::Label( $layout16_2 ); $self->{textLabel2_2_2} = $textLabel2_2_2; $textLabel2_2_2->setObjectName( "textLabel2_2_2" ); $textLabel2_2_2->setWordWrap( 0 ); - $vboxLayout5->addWidget( $textLabel2_2_2 ); + $vboxLayout2->addWidget( $textLabel2_2_2 ); my $textLabel2_2_2_2 = Qt::Label( $layout16_2 ); $self->{textLabel2_2_2_2} = $textLabel2_2_2_2; $textLabel2_2_2_2->setObjectName( "textLabel2_2_2_2" ); $textLabel2_2_2_2->setWordWrap( 0 ); - $vboxLayout5->addWidget( $textLabel2_2_2_2 ); + $vboxLayout2->addWidget( $textLabel2_2_2_2 ); my $textLabel2_2_2_2_2 = Qt::Label( $layout16_2 ); $self->{textLabel2_2_2_2_2} = $textLabel2_2_2_2_2; $textLabel2_2_2_2_2->setObjectName( "textLabel2_2_2_2_2" ); $textLabel2_2_2_2_2->setWordWrap( 0 ); - $vboxLayout5->addWidget( $textLabel2_2_2_2_2 ); + $vboxLayout2->addWidget( $textLabel2_2_2_2_2 ); $hboxLayout1->addWidget( $groupHist0 ); @@ -2384,41 +2467,41 @@ sub setupUi { $self->{layout18} = $layout18; $layout18->setObjectName( "layout18" ); $layout18->setGeometry( Qt::Rect(8, 17, 75, 150) ); - my $vboxLayout6 = Qt::VBoxLayout( $layout18 ); - $self->{vboxLayout6} = $vboxLayout6; - $vboxLayout6->setSpacing( 0 ); - $vboxLayout6->setMargin( 0 ); - $vboxLayout6->setObjectName( "vboxLayout6" ); - $vboxLayout6->setContentsMargins(0, 0, 0, 0 ); + my $vboxLayout3 = Qt::VBoxLayout( $layout18 ); + $self->{vboxLayout3} = $vboxLayout3; + $vboxLayout3->setSpacing( 0 ); + $vboxLayout3->setMargin( 0 ); + $vboxLayout3->setObjectName( "vboxLayout3" ); + $vboxLayout3->setContentsMargins(0, 0, 0, 0 ); my $t01 = Qt::LineEdit( $layout18 ); $self->{t01} = $t01; $t01->setObjectName( "t01" ); - $vboxLayout6->addWidget( $t01 ); + $vboxLayout3->addWidget( $t01 ); my $bg11 = Qt::LineEdit( $layout18 ); $self->{bg11} = $bg11; $bg11->setObjectName( "bg11" ); - $vboxLayout6->addWidget( $bg11 ); + $vboxLayout3->addWidget( $bg11 ); my $bg21 = Qt::LineEdit( $layout18 ); $self->{bg21} = $bg21; $bg21->setObjectName( "bg21" ); - $vboxLayout6->addWidget( $bg21 ); + $vboxLayout3->addWidget( $bg21 ); my $data11 = Qt::LineEdit( $layout18 ); $self->{data11} = $data11; $data11->setObjectName( "data11" ); - $vboxLayout6->addWidget( $data11 ); + $vboxLayout3->addWidget( $data11 ); my $data21 = Qt::LineEdit( $layout18 ); $self->{data21} = $data21; $data21->setObjectName( "data21" ); - $vboxLayout6->addWidget( $data21 ); + $vboxLayout3->addWidget( $data21 ); $hboxLayout1->addWidget( $groupHist1 ); @@ -2433,41 +2516,41 @@ sub setupUi { $self->{layout18_2} = $layout18_2; $layout18_2->setObjectName( "layout18_2" ); $layout18_2->setGeometry( Qt::Rect(8, 17, 75, 150) ); - my $vboxLayout7 = Qt::VBoxLayout( $layout18_2 ); - $self->{vboxLayout7} = $vboxLayout7; - $vboxLayout7->setSpacing( 0 ); - $vboxLayout7->setMargin( 0 ); - $vboxLayout7->setObjectName( "vboxLayout7" ); - $vboxLayout7->setContentsMargins(0, 0, 0, 0 ); + my $vboxLayout4 = Qt::VBoxLayout( $layout18_2 ); + $self->{vboxLayout4} = $vboxLayout4; + $vboxLayout4->setSpacing( 0 ); + $vboxLayout4->setMargin( 0 ); + $vboxLayout4->setObjectName( "vboxLayout4" ); + $vboxLayout4->setContentsMargins(0, 0, 0, 0 ); my $t02 = Qt::LineEdit( $layout18_2 ); $self->{t02} = $t02; $t02->setObjectName( "t02" ); - $vboxLayout7->addWidget( $t02 ); + $vboxLayout4->addWidget( $t02 ); my $bg12 = Qt::LineEdit( $layout18_2 ); $self->{bg12} = $bg12; $bg12->setObjectName( "bg12" ); - $vboxLayout7->addWidget( $bg12 ); + $vboxLayout4->addWidget( $bg12 ); my $bg22 = Qt::LineEdit( $layout18_2 ); $self->{bg22} = $bg22; $bg22->setObjectName( "bg22" ); - $vboxLayout7->addWidget( $bg22 ); + $vboxLayout4->addWidget( $bg22 ); my $data12 = Qt::LineEdit( $layout18_2 ); $self->{data12} = $data12; $data12->setObjectName( "data12" ); - $vboxLayout7->addWidget( $data12 ); + $vboxLayout4->addWidget( $data12 ); my $data22 = Qt::LineEdit( $layout18_2 ); $self->{data22} = $data22; $data22->setObjectName( "data22" ); - $vboxLayout7->addWidget( $data22 ); + $vboxLayout4->addWidget( $data22 ); $hboxLayout1->addWidget( $groupHist2 ); @@ -2482,41 +2565,41 @@ sub setupUi { $self->{layout18_3} = $layout18_3; $layout18_3->setObjectName( "layout18_3" ); $layout18_3->setGeometry( Qt::Rect(8, 17, 75, 150) ); - my $vboxLayout8 = Qt::VBoxLayout( $layout18_3 ); - $self->{vboxLayout8} = $vboxLayout8; - $vboxLayout8->setSpacing( 0 ); - $vboxLayout8->setMargin( 0 ); - $vboxLayout8->setObjectName( "vboxLayout8" ); - $vboxLayout8->setContentsMargins(0, 0, 0, 0 ); + my $vboxLayout5 = Qt::VBoxLayout( $layout18_3 ); + $self->{vboxLayout5} = $vboxLayout5; + $vboxLayout5->setSpacing( 0 ); + $vboxLayout5->setMargin( 0 ); + $vboxLayout5->setObjectName( "vboxLayout5" ); + $vboxLayout5->setContentsMargins(0, 0, 0, 0 ); my $t03 = Qt::LineEdit( $layout18_3 ); $self->{t03} = $t03; $t03->setObjectName( "t03" ); - $vboxLayout8->addWidget( $t03 ); + $vboxLayout5->addWidget( $t03 ); my $bg13 = Qt::LineEdit( $layout18_3 ); $self->{bg13} = $bg13; $bg13->setObjectName( "bg13" ); - $vboxLayout8->addWidget( $bg13 ); + $vboxLayout5->addWidget( $bg13 ); my $bg23 = Qt::LineEdit( $layout18_3 ); $self->{bg23} = $bg23; $bg23->setObjectName( "bg23" ); - $vboxLayout8->addWidget( $bg23 ); + $vboxLayout5->addWidget( $bg23 ); my $data13 = Qt::LineEdit( $layout18_3 ); $self->{data13} = $data13; $data13->setObjectName( "data13" ); - $vboxLayout8->addWidget( $data13 ); + $vboxLayout5->addWidget( $data13 ); my $data23 = Qt::LineEdit( $layout18_3 ); $self->{data23} = $data23; $data23->setObjectName( "data23" ); - $vboxLayout8->addWidget( $data23 ); + $vboxLayout5->addWidget( $data23 ); $hboxLayout1->addWidget( $groupHist3 ); @@ -2531,41 +2614,41 @@ sub setupUi { $self->{layout18_4} = $layout18_4; $layout18_4->setObjectName( "layout18_4" ); $layout18_4->setGeometry( Qt::Rect(8, 17, 75, 150) ); - my $vboxLayout9 = Qt::VBoxLayout( $layout18_4 ); - $self->{vboxLayout9} = $vboxLayout9; - $vboxLayout9->setSpacing( 0 ); - $vboxLayout9->setMargin( 0 ); - $vboxLayout9->setObjectName( "vboxLayout9" ); - $vboxLayout9->setContentsMargins(0, 0, 0, 0 ); + my $vboxLayout6 = Qt::VBoxLayout( $layout18_4 ); + $self->{vboxLayout6} = $vboxLayout6; + $vboxLayout6->setSpacing( 0 ); + $vboxLayout6->setMargin( 0 ); + $vboxLayout6->setObjectName( "vboxLayout6" ); + $vboxLayout6->setContentsMargins(0, 0, 0, 0 ); my $t04 = Qt::LineEdit( $layout18_4 ); $self->{t04} = $t04; $t04->setObjectName( "t04" ); - $vboxLayout9->addWidget( $t04 ); + $vboxLayout6->addWidget( $t04 ); my $bg14 = Qt::LineEdit( $layout18_4 ); $self->{bg14} = $bg14; $bg14->setObjectName( "bg14" ); - $vboxLayout9->addWidget( $bg14 ); + $vboxLayout6->addWidget( $bg14 ); my $bg24 = Qt::LineEdit( $layout18_4 ); $self->{bg24} = $bg24; $bg24->setObjectName( "bg24" ); - $vboxLayout9->addWidget( $bg24 ); + $vboxLayout6->addWidget( $bg24 ); my $data14 = Qt::LineEdit( $layout18_4 ); $self->{data14} = $data14; $data14->setObjectName( "data14" ); - $vboxLayout9->addWidget( $data14 ); + $vboxLayout6->addWidget( $data14 ); my $data24 = Qt::LineEdit( $layout18_4 ); $self->{data24} = $data24; $data24->setObjectName( "data24" ); - $vboxLayout9->addWidget( $data24 ); + $vboxLayout6->addWidget( $data24 ); $hboxLayout1->addWidget( $groupHist4 ); @@ -2606,10 +2689,10 @@ sub setupUi { $gridLayout10->setSpacing( 6 ); $gridLayout10->setMargin( 11 ); $gridLayout10->setObjectName( "gridLayout10" ); - my $vboxLayout10 = Qt::VBoxLayout( ); - $self->{vboxLayout10} = $vboxLayout10; - $vboxLayout10->setSpacing( 6 ); - $vboxLayout10->setObjectName( "vboxLayout10" ); + my $vboxLayout7 = Qt::VBoxLayout( ); + $self->{vboxLayout7} = $vboxLayout7; + $vboxLayout7->setSpacing( 6 ); + $vboxLayout7->setObjectName( "vboxLayout7" ); my $gridLayout11 = Qt::GridLayout( ); $self->{gridLayout11} = $gridLayout11; $gridLayout11->setSpacing( 6 ); @@ -2743,7 +2826,7 @@ sub setupUi { $gridLayout11->addWidget( $parametersList, 1, 1, 1, 1 ); - $vboxLayout10->addLayout( $gridLayout11 ); + $vboxLayout7->addLayout( $gridLayout11 ); my $hboxLayout3 = Qt::HBoxLayout( ); $self->{hboxLayout3} = $hboxLayout3; @@ -2769,8 +2852,8 @@ sub setupUi { my $constraintLine = Qt::LineEdit( $tabPage ); $self->{constraintLine} = $constraintLine; $constraintLine->setObjectName( "constraintLine" ); - $sizePolicy5->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); - $constraintLine->setSizePolicy( $sizePolicy5 ); + $sizePolicy1->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); + $constraintLine->setSizePolicy( $sizePolicy1 ); $constraintLine->setMinimumSize( Qt::Size(0, 25) ); $hboxLayout3->addWidget( $constraintLine ); @@ -2784,7 +2867,7 @@ sub setupUi { $hboxLayout3->addWidget( $addConstraint ); - $vboxLayout10->addLayout( $hboxLayout3 ); + $vboxLayout7->addLayout( $hboxLayout3 ); my $textLabel2_2_3_4 = Qt::Label( $tabPage ); $self->{textLabel2_2_3_4} = $textLabel2_2_3_4; @@ -2841,13 +2924,13 @@ sub setupUi { $textLabel2_2_3_4->setPalette( $palette5 ); $textLabel2_2_3_4->setWordWrap( 0 ); - $vboxLayout10->addWidget( $textLabel2_2_3_4 ); + $vboxLayout7->addWidget( $textLabel2_2_3_4 ); my $functionsBlock = Qt::TextEdit( $tabPage ); $self->{functionsBlock} = $functionsBlock; $functionsBlock->setObjectName( "functionsBlock" ); - $vboxLayout10->addWidget( $functionsBlock ); + $vboxLayout7->addWidget( $functionsBlock ); my $hboxLayout4 = Qt::HBoxLayout( ); $self->{hboxLayout4} = $hboxLayout4; @@ -2868,21 +2951,21 @@ sub setupUi { $hboxLayout4->addWidget( $resetFunc ); - $vboxLayout10->addLayout( $hboxLayout4 ); + $vboxLayout7->addLayout( $hboxLayout4 ); - $gridLayout10->addLayout( $vboxLayout10, 0, 0, 1, 1 ); + $gridLayout10->addLayout( $vboxLayout7, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $tabPage, Qt::Application::translate( 'MuSRFit4', "Constraints", undef, Qt::Application::UnicodeUTF8() ) ); - $gridLayout->addWidget( $musrfit_tabs, 1, 0, 1, 1 ); + $gridLayout->addWidget( $musrfit_tabs, 0, 0, 1, 1 ); $muSRFit4->setCentralWidget( $widget ); my $menuBar = Qt::MenuBar( $muSRFit4 ); $self->{menuBar} = $menuBar; $menuBar->setObjectName( "menuBar" ); $menuBar->setEnabled( 1 ); - $menuBar->setGeometry( Qt::Rect(0, 0, 830, 20) ); + $menuBar->setGeometry( Qt::Rect(0, 0, 600, 20) ); my $fileMenu = Qt::Menu( $menuBar ); $self->{fileMenu} = $fileMenu; $fileMenu->setObjectName( "fileMenu" ); @@ -2906,13 +2989,14 @@ sub setupUi { my $actionsToolBar = Qt::ToolBar( $muSRFit4 ); $self->{actionsToolBar} = $actionsToolBar; $actionsToolBar->setObjectName( "actionsToolBar" ); + $actionsToolBar->setMinimumSize( Qt::Size(0, 0) ); $muSRFit4->addToolBar( Qt::TopToolBarArea(), $actionsToolBar ); - $tfsLabel->setBuddy( $tfs ); - $comp3Label->setBuddy( $fitType1 ); $comp1Label->setBuddy( $fitType1 ); - $binsLabel->setBuddy( $bins ); - $tisLabel->setBuddy( $tis ); $comp2Label->setBuddy( $fitType1 ); + $comp3Label->setBuddy( $fitType1 ); + $tisLabel->setBuddy( $tis ); + $tfsLabel->setBuddy( $tfs ); + $binsLabel->setBuddy( $bins ); $titleLabel->setBuddy( $title ); $fileNameLabel->setBuddy( $fileName ); Qt::Widget::setTabOrder( $musrfit_tabs, $runNumbers ); @@ -2921,22 +3005,16 @@ sub setupUi { Qt::Widget::setTabOrder( $year, $runFiles ); Qt::Widget::setTabOrder( $runFiles, $browse ); Qt::Widget::setTabOrder( $browse, $fitType1 ); - Qt::Widget::setTabOrder( $fitType1, $tis ); - Qt::Widget::setTabOrder( $tis, $fitType2 ); - Qt::Widget::setTabOrder( $fitType2, $tfs ); - Qt::Widget::setTabOrder( $tfs, $fitType3 ); - Qt::Widget::setTabOrder( $fitType3, $bins ); + Qt::Widget::setTabOrder( $fitType1, $fitType2 ); + Qt::Widget::setTabOrder( $fitType2, $fitType3 ); + Qt::Widget::setTabOrder( $fitType3, $tis ); + Qt::Widget::setTabOrder( $tis, $tfs ); + Qt::Widget::setTabOrder( $tfs, $bins ); Qt::Widget::setTabOrder( $bins, $fitAsyType ); Qt::Widget::setTabOrder( $fitAsyType, $histsLRBF ); Qt::Widget::setTabOrder( $histsLRBF, $minimization ); Qt::Widget::setTabOrder( $minimization, $errorCalc ); - Qt::Widget::setTabOrder( $errorCalc, $ltc ); - Qt::Widget::setTabOrder( $ltc, $xi ); - Qt::Widget::setTabOrder( $xi, $yi ); - Qt::Widget::setTabOrder( $yi, $xf ); - Qt::Widget::setTabOrder( $xf, $yf ); - Qt::Widget::setTabOrder( $yf, $viewBin ); - Qt::Widget::setTabOrder( $viewBin, $fitTextOutput ); + Qt::Widget::setTabOrder( $errorCalc, $fitTextOutput ); Qt::Widget::setTabOrder( $fitTextOutput, $buttonGroupSharing ); Qt::Widget::setTabOrder( $buttonGroupSharing, $shParam_1_1 ); Qt::Widget::setTabOrder( $shParam_1_1, $shParam_1_2 ); @@ -2969,9 +3047,12 @@ sub setupUi { Qt::Widget::setTabOrder( $initParamTable, $title ); Qt::Widget::setTabOrder( $title, $fileName ); Qt::Widget::setTabOrder( $fileName, $textMSROutput ); - Qt::Widget::setTabOrder( $textMSROutput, $fapodization ); + Qt::Widget::setTabOrder( $textMSROutput, $funits ); + Qt::Widget::setTabOrder( $funits, $fapodization ); Qt::Widget::setTabOrder( $fapodization, $fplot ); - Qt::Widget::setTabOrder( $fplot, $fphase ); + Qt::Widget::setTabOrder( $fplot, $frqMin ); + Qt::Widget::setTabOrder( $frqMin, $frqMax ); + Qt::Widget::setTabOrder( $frqMax, $fphase ); Qt::Widget::setTabOrder( $fphase, $rrfFrq ); Qt::Widget::setTabOrder( $rrfFrq, $rrfUnits ); Qt::Widget::setTabOrder( $rrfUnits, $rrfPack ); @@ -2996,14 +3077,14 @@ sub setupUi { Qt::Widget::setTabOrder( $bg14, $bg24 ); Qt::Widget::setTabOrder( $bg24, $data14 ); Qt::Widget::setTabOrder( $data14, $data24 ); - Qt::Widget::setTabOrder( $data24, $theoryBlock ); + Qt::Widget::setTabOrder( $data24, $t0Update ); + Qt::Widget::setTabOrder( $t0Update, $theoryBlock ); Qt::Widget::setTabOrder( $theoryBlock, $parametersList ); Qt::Widget::setTabOrder( $parametersList, $cParamsCombo ); Qt::Widget::setTabOrder( $cParamsCombo, $constraintLine ); Qt::Widget::setTabOrder( $constraintLine, $addConstraint ); Qt::Widget::setTabOrder( $addConstraint, $functionsBlock ); Qt::Widget::setTabOrder( $functionsBlock, $resetFunc ); - Qt::Widget::setTabOrder( $resetFunc, $t0Update ); $menuBar->addAction( $fileMenu->menuAction() ); $menuBar->addAction( $actions->menuAction() ); @@ -3105,6 +3186,12 @@ sub retranslateUi { $self->{optionsFourier}->setIconText( Qt::Application::translate( 'MuSRFit4', "Fourier", undef, Qt::Application::UnicodeUTF8() ) ); $self->{optionsT0}->setText( Qt::Application::translate( 'MuSRFit4', "T0 and Bg bins", undef, Qt::Application::UnicodeUTF8() ) ); $self->{optionsT0}->setIconText( Qt::Application::translate( 'MuSRFit4', "T0 and Bg bins", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runsMan}->setTitle( Qt::Application::translate( 'MuSRFit4', "RUN Files", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runFiles}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runFiles}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{browse}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{browse}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); + $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() )]); @@ -3120,13 +3207,29 @@ sub retranslateUi { 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->{runsMan}->setTitle( Qt::Application::translate( 'MuSRFit4', "RUN Files", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{runFiles}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{runFiles}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{browse}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{browse}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{browse}->setText( Qt::Application::translate( 'MuSRFit4', "Browse", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runNumbers}->setText( '' ); $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() ) ); + $self->{comp3Label}->setText( Qt::Application::translate( 'MuSRFit4', "Third Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fitType1}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Exponential Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Cos", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Background", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "MolMag", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() )]); $self->{fitType2}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), @@ -3146,32 +3249,6 @@ sub retranslateUi { Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "None", undef, Qt::Application::UnicodeUTF8() )]); - $self->{tfsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Final Time", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{fitType1}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Exponential Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Background", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "MolMag", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() )]); - $self->{bins}->setText( Qt::Application::translate( 'MuSRFit4', "100", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{comp3Label}->setText( Qt::Application::translate( 'MuSRFit4', "Third Component", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{tis}->setText( Qt::Application::translate( 'MuSRFit4', "0", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{tfs}->setText( Qt::Application::translate( 'MuSRFit4', "8", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{comp1Label}->setText( Qt::Application::translate( 'MuSRFit4', "First Component", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{binsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{tisLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Initial Time", undef, Qt::Application::UnicodeUTF8() ) ); $self->{fitType3}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), @@ -3191,14 +3268,22 @@ sub retranslateUi { Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "None", undef, Qt::Application::UnicodeUTF8() )]); - $self->{comp2Label}->setText( Qt::Application::translate( 'MuSRFit4', "Second Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tisLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Initial Fit Time", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tfsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Final Fit Time", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{binsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Fit Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tis}->setText( Qt::Application::translate( 'MuSRFit4', "0", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tfs}->setText( Qt::Application::translate( 'MuSRFit4', "8", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{bins}->setText( Qt::Application::translate( 'MuSRFit4', "100", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4}->setText( Qt::Application::translate( 'MuSRFit4', "Min X", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Max X", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "View Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_2}->setText( Qt::Application::translate( 'MuSRFit4', "Min Y", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_3}->setText( Qt::Application::translate( 'MuSRFit4', "Max Y", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_4}->setText( '' ); + $self->{ltc}->setText( Qt::Application::translate( 'MuSRFit4', "Life time correction", undef, Qt::Application::UnicodeUTF8() ) ); $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{runsPage}), Qt::Application::translate( 'MuSRFit4', "RUNS", undef, Qt::Application::UnicodeUTF8() ) ); $self->{errorCalc}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "HESSE", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "MINOS", undef, Qt::Application::UnicodeUTF8() )]); - $self->{ltc}->setText( Qt::Application::translate( 'MuSRFit4', "Life time correction", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_4}->setText( Qt::Application::translate( 'MuSRFit4', "X Range", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_4_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "View Binning", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_4_2}->setText( Qt::Application::translate( 'MuSRFit4', "Y Range", undef, Qt::Application::UnicodeUTF8() ) ); $self->{minimization}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "MINIMIZE", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "MIGRAD", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "SIMPLEX", undef, Qt::Application::UnicodeUTF8() )]); @@ -3206,6 +3291,17 @@ sub retranslateUi { $self->{textLabel1_5_2}->setText( Qt::Application::translate( 'MuSRFit4', "Error estimation", undef, Qt::Application::UnicodeUTF8() ) ); $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{fittingPage}), Qt::Application::translate( 'MuSRFit4', "Fitting", undef, Qt::Application::UnicodeUTF8() ) ); $self->{buttonGroupSharing}->setTitle( Qt::Application::translate( 'MuSRFit4', "Shared parameters among different runs", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{sharingComp1}->setTitle( Qt::Application::translate( 'MuSRFit4', "1st Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_4}->setText( Qt::Application::translate( 'MuSRFit4', "Param4", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_5}->setText( Qt::Application::translate( 'MuSRFit4', "Param5", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_6}->setText( Qt::Application::translate( 'MuSRFit4', "Param6", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{comp1ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType1", undef, Qt::Application::UnicodeUTF8() ) ); $self->{sharingComp2}->setTitle( Qt::Application::translate( 'MuSRFit4', "2nd Component", undef, Qt::Application::UnicodeUTF8() ) ); $self->{comp2ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType2", undef, Qt::Application::UnicodeUTF8() ) ); $self->{shParam_2_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); @@ -3228,17 +3324,6 @@ sub retranslateUi { $self->{shParam_3_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); $self->{shParam_3_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); $self->{shParam_3_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{sharingComp1}->setTitle( Qt::Application::translate( 'MuSRFit4', "1st Component", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_4}->setText( Qt::Application::translate( 'MuSRFit4', "Param4", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_5}->setText( Qt::Application::translate( 'MuSRFit4', "Param5", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_6}->setText( Qt::Application::translate( 'MuSRFit4', "Param6", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{comp1ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType1", undef, Qt::Application::UnicodeUTF8() ) ); $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{sharingPage}), Qt::Application::translate( 'MuSRFit4', "Sharing", undef, Qt::Application::UnicodeUTF8() ) ); my $initParamTable = $self->{initParamTable}; if ( $initParamTable->columnCount < 4 ) { From 4a9b767f7f783010d58827461ec0a2598e331bd7 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Thu, 23 Mar 2017 17:00:28 +0100 Subject: [PATCH 11/87] Complete porting og MuSRFit GUI to qt4 --- src/external/MuSRFitGUI/MuSRFit4.pm | 123 +++++++++++++------------ src/external/MuSRFitGUI/MuSRFit4.ui | 77 +++++++++------- src/external/MuSRFitGUI/Ui_MuSRFit4.pm | 28 +++--- 3 files changed, 126 insertions(+), 102 deletions(-) diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm index fc614e85..2bb46742 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.pm +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -34,7 +34,7 @@ use QtCore4::slots GoFit => [], GoPlot => [], ShowMuSRT0 => [], - T0Update => [], + t0Update => [], RunSelectionToggle => [], fileBrowse => [], AppendToFunctions => [], @@ -89,12 +89,10 @@ sub fileSave() my %All=CreateAllInput(); my $FILENAME=$All{"FILENAME"}.".msr"; my $file=Qt::FileDialog::getSaveFileName( - "$FILENAME", - "MSR Files (*.msr *.mlog)", - this, - - "save file dialog", - "Choose a filename to save under"); + this, + "Save file", + "$FILENAME", + "MSR Files (*.msr *.mlog)"); # If the user gave a filename the copy to it if ($file ne "") { @@ -114,11 +112,10 @@ sub fileSave() sub fileChangeDir() { my $newdir=Qt::FileDialog::getExistingDirectory( - "", - this, - "get existing directory", - "Choose a directory", - 1); + this, + "Change work directory", + "./", + ""); chdir ("$newdir"); } @@ -140,16 +137,17 @@ sub fileExit() sub parametersExport() { +# Exports the fit parameters for a table format file +# This works only after a fit call, i.e. a plot call is not sufficient! my %All=CreateAllInput(); # Add also a flag for header $All{"Header"}=1; my $FILENAME=$All{"FILENAME"}.".dat"; my $file=Qt::FileDialog::getSaveFileName( - "$FILENAME", - "Data Files (*.dat)", - this, - "export file dialog", - "Choose a filename to export to"); + this, + "Export parameters to file", + "$FILENAME", + "Data Files (*.dat)"); # If the user gave a filename the copy to it if ($file ne "") { @@ -163,16 +161,17 @@ sub parametersExport() sub parametersAppend() { +# Appends the fit parameters for a table format file +# This works only after a fit call, i.e. a plot call is not sufficient! my %All=CreateAllInput(); # Add also a flag for header $All{"Header"}=0; my $FILENAME=$All{"FILENAME"}.".dat"; my $file=Qt::FileDialog::getOpenFileName( - "./", - "Data Files (*.dat)", - this, - "append file dialog", - "Choose a filename to append to"); + this, + "Append parameters to file", + "./", + "Data Files (*.dat)"); # If the user gave a filename the copy to it if ($file ne "") { @@ -228,25 +227,28 @@ sub helpContents() sub helpAbout() { my $AboutText=" - This is a GUI that uses the musrfit binary, developed by Andreas Suter, - to fit muSR spectra. +This is a GUI that uses the musrfit binary 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 +. - 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 . - - Copyright 2009 by Zaher Salman and the LEM Group. - - "; +Copyright 2009-2017 by Zaher Salman +. +"; my $AboutWindow = Qt::MessageBox::information( this, "About MuSRFit GUI",$AboutText); } @@ -471,7 +473,7 @@ sub CreateAllInput() my %PTable=MSR::PrepParamTable(\%All); # Setup the table with the right size - my $NParam=scalar keys( %PTable ); + my $NParam=keys( %PTable ); # Read initial values of paramets from tabel my $erradd = "d"; @@ -482,11 +484,12 @@ sub CreateAllInput() if ($NParam > 0) { # Set appropriate number of rows $QTable->setRowCount($NParam); - for (my $i=0;$i<$NParam;$i++) { -# Take label of row, i.e. name of parameter - if (defined($QTable->verticalHeaderItem($i)) && defined($QTable->item($i,1)) && defined($QTable->item($i,2)) && defined($QTable->item($i,3)) && defined($QTable->item($i,4))) { + for (my $i=0;$i<=$NParam;$i++) { + # Make sure the row items exist/defined + if (defined($QTable->verticalHeaderItem($i)) && defined($QTable->item($i,0)) && defined($QTable->item($i,1)) && defined($QTable->item($i,2)) && defined($QTable->item($i,3))) { + # Take label of row, i.e. name of parameter my $Param=$QTable->verticalHeaderItem($i)->text(); -# Then take the value, error, max and min (as numbers) + # Then take the value, error, max and min (as numbers) $All{"$Param"}=1.0*$QTable->item($i,0)->text(); $All{"$erradd$Param"}=1.0*$QTable->item($i,1)->text(); $All{"$Param$minadd"}=1.0*$QTable->item($i,2)->text(); @@ -773,15 +776,17 @@ sub InitializeTab() if ($error eq "nan") { $error=0.1;} # Make sure items exist before addressing them $QTable->setVerticalHeaderItem($PCount,Qt::TableWidgetItem()); - $QTable->verticalHeaderItem($PCount)->setText($Param); + # Make sure that the row exists $QTable->showRow($PCount); $QTable->setItem($PCount,0,Qt::TableWidgetItem()); - $QTable->item($PCount,0)->setText($value); $QTable->setItem($PCount,1,Qt::TableWidgetItem()); - $QTable->item($PCount,1)->setText($error); $QTable->setItem($PCount,2,Qt::TableWidgetItem()); - $QTable->item($PCount,2)->setText($minvalue); $QTable->setItem($PCount,3,Qt::TableWidgetItem()); + # Fill in the values... + $QTable->verticalHeaderItem($PCount)->setText($Param); + $QTable->item($PCount,0)->setText($value); + $QTable->item($PCount,1)->setText($error); + $QTable->item($PCount,2)->setText($minvalue); $QTable->item($PCount,3)->setText($maxvalue); } } @@ -870,8 +875,9 @@ sub GoPlot() sub ShowMuSRT0() { +# Open musrt0 to check and adjust t0 , Bg and Data bins my %All=CreateAllInput(); - this->{ui}->musrfit_tabs->setCurrentPage(6); + this->{ui}->musrfit_tabs->setCurrentIndex(6); # Create MSR file and then run musrt0 my $Answer=CallMSRCreate(); @@ -889,7 +895,7 @@ sub ShowMuSRT0() } -sub T0Update() +sub t0Update() { my %All = CreateAllInput(); my @Hists = split(/,/, $All{"LRBF"} ); @@ -900,11 +906,12 @@ sub T0Update() foreach ("t0","Bg1","Bg2","Data1","Data2") { my $Name = "$_$NHist"; my $tmp=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); - child("Qt::Widget",$Name)->setText($tmp); + if (defined(child("Qt::Widget",$Name))) { + child("Qt::Widget",$Name)->setText($tmp); + } } $NHist++ - } - + } } @@ -958,14 +965,16 @@ sub AppendToFunctions() if (defined(this->{ui}->theoryBlock->toPlainText)) { $Full_T_Block=this->{ui}->theoryBlock->toPlainText; } - if (defined(this->{ui}->constraintLine->toPlainText)) { - $Constraint=this->{ui}->constraintLine->toPlainText; + if (defined(this->{ui}->constraintLine->text)) { + $Constraint=this->{ui}->constraintLine->text; } # Then clear the text this->{ui}->constraintLine->setText(""); # Check how many constraints (lines) in FUNCTIONS Block - my $i=this->{ui}->functionsBlock->lines(); +# my $i=this->{ui}->functionsBlock->blockCount(); + my $fun_lines=this->{ui}->functionsBlock->toPlainText(); + my $i= ($fun_lines =~ tr/\n//)+1; my $ConstLine="fun$i = $Constraint\n"; this->{ui}->functionsBlock->insertPlainText($ConstLine); diff --git a/src/external/MuSRFitGUI/MuSRFit4.ui b/src/external/MuSRFitGUI/MuSRFit4.ui index e65f78dc..d6b8805e 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.ui +++ b/src/external/MuSRFitGUI/MuSRFit4.ui @@ -986,9 +986,6 @@ false - - fitType1 - @@ -1441,9 +1438,6 @@ false - - fitType1 - @@ -1896,9 +1890,6 @@ false - - fitType1 - @@ -2273,9 +2264,6 @@ false - - tis - @@ -2292,9 +2280,6 @@ false - - tfs - @@ -2311,9 +2296,6 @@ false - - bins - @@ -3149,9 +3131,6 @@ false - - title - @@ -3183,9 +3162,6 @@ false - - fileName - @@ -5572,16 +5548,16 @@ false - Overwrite MSR File + No Overwrite Overwrite MSR File - Enable overwriting MSR files + Enable overwriting MSR files - Enable/Disable checking for MSR files. + Enable/Disable checking for MSR files. @@ -5724,6 +5700,12 @@ tis tfs bins + xi + xf + viewBin + yi + yf + ltc fitAsyType histsLRBF minimization @@ -5765,8 +5747,8 @@ fapodization fplot frqMin - frqMax fphase + frqMax rrfFrq rrfUnits rrfPack @@ -5953,7 +5935,7 @@ InitializeFunctions() - 608 + 593 489 @@ -5969,7 +5951,7 @@ AppendToFunctions() - 608 + 593 284 @@ -6017,7 +5999,7 @@ t0UpdateClicked() - 609 + 594 490 @@ -6058,6 +6040,38 @@ + + fitType1 + currentIndexChanged(int) + MuSRFit4 + InitializeFunctions() + + + 79 + 304 + + + 601 + 323 + + + + + beamLine + currentIndexChanged(int) + MuSRFit4 + t0Update() + + + 416 + 144 + + + 603 + 191 + + + t0UpdateClicked() @@ -6077,5 +6091,6 @@ AppendToFunctions() ActivateShComp() TabChanged() + t0Update() diff --git a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm index b9eea50e..8a0fe95f 100644 --- a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm +++ b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm @@ -5,7 +5,7 @@ ################################################################################# ## Form generated from reading UI file 'MuSRFit4.ui' ## -## Created: Wed Mar 22 17:10:29 2017 +## Created: Thu Mar 23 16:58:52 2017 ## by: Qt User Interface Compiler version 4.8.6 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! @@ -2991,14 +2991,6 @@ sub setupUi { $actionsToolBar->setObjectName( "actionsToolBar" ); $actionsToolBar->setMinimumSize( Qt::Size(0, 0) ); $muSRFit4->addToolBar( Qt::TopToolBarArea(), $actionsToolBar ); - $comp1Label->setBuddy( $fitType1 ); - $comp2Label->setBuddy( $fitType1 ); - $comp3Label->setBuddy( $fitType1 ); - $tisLabel->setBuddy( $tis ); - $tfsLabel->setBuddy( $tfs ); - $binsLabel->setBuddy( $bins ); - $titleLabel->setBuddy( $title ); - $fileNameLabel->setBuddy( $fileName ); Qt::Widget::setTabOrder( $musrfit_tabs, $runNumbers ); Qt::Widget::setTabOrder( $runNumbers, $beamLine ); Qt::Widget::setTabOrder( $beamLine, $year ); @@ -3010,7 +3002,13 @@ sub setupUi { Qt::Widget::setTabOrder( $fitType3, $tis ); Qt::Widget::setTabOrder( $tis, $tfs ); Qt::Widget::setTabOrder( $tfs, $bins ); - Qt::Widget::setTabOrder( $bins, $fitAsyType ); + Qt::Widget::setTabOrder( $bins, $xi ); + Qt::Widget::setTabOrder( $xi, $xf ); + Qt::Widget::setTabOrder( $xf, $viewBin ); + Qt::Widget::setTabOrder( $viewBin, $yi ); + Qt::Widget::setTabOrder( $yi, $yf ); + Qt::Widget::setTabOrder( $yf, $ltc ); + Qt::Widget::setTabOrder( $ltc, $fitAsyType ); Qt::Widget::setTabOrder( $fitAsyType, $histsLRBF ); Qt::Widget::setTabOrder( $histsLRBF, $minimization ); Qt::Widget::setTabOrder( $minimization, $errorCalc ); @@ -3051,9 +3049,9 @@ sub setupUi { Qt::Widget::setTabOrder( $funits, $fapodization ); Qt::Widget::setTabOrder( $fapodization, $fplot ); Qt::Widget::setTabOrder( $fplot, $frqMin ); - Qt::Widget::setTabOrder( $frqMin, $frqMax ); - Qt::Widget::setTabOrder( $frqMax, $fphase ); - Qt::Widget::setTabOrder( $fphase, $rrfFrq ); + Qt::Widget::setTabOrder( $frqMin, $fphase ); + Qt::Widget::setTabOrder( $fphase, $frqMax ); + Qt::Widget::setTabOrder( $frqMax, $rrfFrq ); Qt::Widget::setTabOrder( $rrfFrq, $rrfUnits ); Qt::Widget::setTabOrder( $rrfUnits, $rrfPack ); Qt::Widget::setTabOrder( $rrfPack, $rrfPhase ); @@ -3130,6 +3128,8 @@ sub setupUi { Qt::Object::connect($t0Update, SIGNAL 'clicked()' , $muSRFit4, SLOT 't0UpdateClicked()' ); Qt::Object::connect($buttonGroupSharing, SIGNAL 'toggled(bool)' , $muSRFit4, SLOT 'ActivateShComp()' ); Qt::Object::connect($menuBar, SIGNAL 'triggered(QAction*)' , $muSRFit4, SLOT 'RunSelectionToggle()' ); + Qt::Object::connect($fitType1, SIGNAL 'currentIndexChanged(int)' , $muSRFit4, SLOT 'InitializeFunctions()' ); + Qt::Object::connect($beamLine, SIGNAL 'currentIndexChanged(int)' , $muSRFit4, SLOT 't0Update()' ); $musrfit_tabs->setCurrentIndex( 0 ); $fitType2->setCurrentIndex( 18 ); @@ -3159,7 +3159,7 @@ sub retranslateUi { $self->{helpAboutAction}->setText( Qt::Application::translate( 'MuSRFit4', "&About", undef, Qt::Application::UnicodeUTF8() ) ); $self->{helpAboutAction}->setIconText( Qt::Application::translate( 'MuSRFit4', "About", undef, Qt::Application::UnicodeUTF8() ) ); $self->{helpAboutAction}->setShortcut( Qt::KeySequence( '' ) ); - $self->{fileExistCheck}->setText( Qt::Application::translate( 'MuSRFit4', "Overwrite MSR File", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{fileExistCheck}->setText( Qt::Application::translate( 'MuSRFit4', "No Overwrite", undef, Qt::Application::UnicodeUTF8() ) ); $self->{fileExistCheck}->setIconText( Qt::Application::translate( 'MuSRFit4', "Overwrite MSR File", undef, Qt::Application::UnicodeUTF8() ) ); $self->{fileExistCheck}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Enable overwriting MSR files", undef, Qt::Application::UnicodeUTF8() ) ); $self->{fileExistCheck}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Enable/Disable checking for MSR files.", undef, Qt::Application::UnicodeUTF8() ) ); From 0c3cc452d2202a3d33d0cd35b11e15fe803c6845 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Thu, 23 Mar 2017 21:53:45 +0100 Subject: [PATCH 12/87] Cleanup --- src/external/MuSRFitGUI/devel/MSR.pm | 1833 ------- src/external/MuSRFitGUI/devel/MuSRFit.pl | 4492 --------------- src/external/MuSRFitGUI/devel/MuSRFit.ui | 5742 -------------------- src/external/MuSRFitGUI/devel/MuSRFit.ui.h | 991 ---- 4 files changed, 13058 deletions(-) delete mode 100755 src/external/MuSRFitGUI/devel/MSR.pm delete mode 100755 src/external/MuSRFitGUI/devel/MuSRFit.pl delete mode 100755 src/external/MuSRFitGUI/devel/MuSRFit.ui delete mode 100755 src/external/MuSRFitGUI/devel/MuSRFit.ui.h diff --git a/src/external/MuSRFitGUI/devel/MSR.pm b/src/external/MuSRFitGUI/devel/MSR.pm deleted file mode 100755 index 99233d8c..00000000 --- a/src/external/MuSRFitGUI/devel/MSR.pm +++ /dev/null @@ -1,1833 +0,0 @@ -#use strict; -package MSR; - -# This module provides some tools to create, manipulate and extract information from MSR files - -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", "LEM (PPC)", "MUE4", "GPS", "PIM3", "LTF", "PIM3", "Dolly", "PIE1", "GPD", "PIE1" ); - -my %Def_Format = - ( "LEM", "ROOT-NPP", "LEM (PPC)", "ROOT-PPC", "GPS", "PSI-BIN", "LTF", "PSI-BIN", "Dolly", "PSI-BIN" , "GPD", "PSI-BIN"); - -# Additional information to extract run properties from database -# For LEM use summary files -$SUMM_DIR="/afs/psi.ch/project/nemu/data/summ/"; -# For Bulok use list files -%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/", - "ALC","/afs/psi.ch/project/bulkmusr/olddata/list/", - "LTF","/afs/psi.ch/project/bulkmusr/olddata/list/"); - -# Information available since -%MinYears=("LEM","2001", - "GPS","1993", - "Dolly","1998", - "GPD","1993", - "ALC","1993", - "LTF","1995"); - -# And to deal with old names of bulk muons -%AltArea=("GPS","PIM3","LTF","PIM3","ALC","PIE3","Dolly","PIE1","GPD","MUE1"); - - -# 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]}; - - # Start with empty array - my @FitTypes = (); - - foreach ($All{"FitType1"},$All{"FitType2"},$All{"FitType3"}) { - if ($_ ne "None") { - @FitTypes=(@FitTypes,$_); - } - } - - my @Hists = split( /,/, $All{"LRBF"} ); - # TODO - # 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 for RUNS - my $iRun = 1; - - # 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; - 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 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 - 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 ) - { - ++$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[ $iRun - 1 ]; - - if ($All{"RUNSType"}) { - $RUN_Line = MSR::RUNFileNameMan($RUN); - } 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."\n".$T0_Line; - } - if ($Bg_Line ne "background") { - $T0DataBg = $T0DataBg."\n".$Bg_Line; - } - if ($Data_Line ne "data") { - $T0DataBg = $T0DataBg."\n".$Data_Line; - } - - $FRANGE_Line = "fit TINI TFIN"; - $PAC_Line = "packing BINNING"; - - $Single_RUN = -"$RUN_Line\n$Type_Line\n$Alpha_Line$Hist_Lines\n$T0DataBg\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; } - - $RUNS_Line = "$RUNS_Line " . $Range_Order; - ++$k; - ++$Range_Order; - } - ++$iRun; - } - - # The number of runs is - $NRUNS = $iRun - 1; - -# Start constructing all blocks - my $TitleLine = $All{"TITLE"}."\n# Run Numbers: ".$All{"RunNumbers"}; -# $TitleLine =~ s/,/:/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 ($Yi != $Yf) { - $PRANGE_Line = "range ".$All{"Xi"}." ".$All{"Xf"}." ".$All{"Yi"}." ".$All{"Yf"}; - - # } else { - # $PRANGE_Line = "range $Xi $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";} - - - $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; - - # 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"; - -# Open output file FILENAME.msr - open( OUTF,q{>},"$FILENAME.msr" ); - print OUTF ("$FullMSRFile"); - close(OUTF); - return($Full_T_Block,\@Paramcomp); -} - -########################################################################## -# CreateMSRSingleHist -########################################################################## -sub CreateMSRSingleHist { - 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"} ); - 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 - $Full_T_Block =~ s/_\d\b//g; - } - - # Counter for RUNS - my $iRun = 1; - - # 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; - } - - # Until here identical to sub CreateMSR - # $shcount is a counter for shared parameters - if ( $#RUNS == 0 && $#Hists == 0) { - my $shcount = 1; - } else { - if ( $All{"Sh_No"} == 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; - my $iHist = 0; - foreach my $RUN (@RUNS) { -####################################################################### -# 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 $Param (@Params) { - $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 - if ( $#RUNS == 0 && $#Hists == 0 ) { - $Shared = 1; - } - # Otherwise check input if it was marked as shared - else { - $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 -####################################################################### - - # 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 ]; - - if ($All{"RUNSType"}) { - $RUN_Line = MSR::RUNFileNameMan($RUN); - } 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"}; - } - - # $MAP_Line = "map 0 0 0 0 0 0 0 0 0 0"; - $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"; - - # 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 block - my $TitleLine = $All{"TITLE"}."\n# Run Numbers: ".$All{"RunNumbers"}; - $TitleLine =~ s/,/:/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 ($Yi != $Yf) { - $PRANGE_Line = "range ".$All{"Xi"}." ".$All{"Xf"}." ".$All{"Yi"}." ".$All{"Yf"}; - - # } else { - # $PRANGE_Line = "range $Xi $Xf"; - # } - } - - my $RRFBlock=MSR::CreateRRFBlock(\%All); - $PLOT_Block = - "############################################################### -PLOT $PLT -runs $RUNS_Line -$PRANGE_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";} - - - $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; - - # 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"; - -# Open output file FILENAME.msr - open( OUTF,q{>},"$FILENAME.msr" ); - print OUTF ("$FullMSRFile"); - close(OUTF); - return($Full_T_Block,\@Paramcomp); -} - -########################################################################## -# CreateMSRGLB -# -# Uses CreateMSR to produce a template and then msr2data to globalize it -# -# Input in %All -# -# Output -# $Full_T_Block - Full theory block -# @Paramcomp - Space separated list of parameters for each component -# 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"} ); - } else { - @RUNS = split( /,/, $All{"RunNumbers"} ); - } - -# 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 - - -# Return as usual - my @Paramcomp = @$Paramcomp_ref; - 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", "Frqg Sgm", - "dynGssKTLF", "Frql 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'} ); - } - - # Lorentzian or Gaussian KT LF multiplied by stretched exponential - elsif ( $FitType eq "MolMag" ) { - $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'} ); - $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 - -######################## -# ExtractBlks -######################## -sub ExtractBlks { -# 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 =$EMPTY; - 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(\@TBlock,\@FPBlock); -} - - -######################## -# T0BgData -# Function return the defaul value of t0, Bg and Data bin -# input should be -# $Name is t0,Bg1,Bg2,Data1,Data2 -# $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) = @_; - -# These are the default values, ordered by beamline -# Comma at the beginning means take default t0 from file -# The order is pairs of "HistNumber","t0,Bg1,Bg2,Data1,Data2" - my %LEM=("1",",66000,66500,3419,63000", - "2",",66000,66500,3419,63000", - "3",",66000,66500,3419,63000", - "4",",66000,66500,3419,63000"); - -# my %GPS=("1",",40,120,135,8000", -# "2",",40,120,135,8000", -# "3",",40,120,135,8000", -# "4",",40,120,135,8000"); - -# my %Dolly=("1",",50,250,297,8000", -# "2",",50,250,297,8000", -# "3",",50,250,297,8000", -# "4",",50,250,297,8000"); - - my %RV=(); - -# If multiple histograms (sum or difference) take the first histogram only - my @Hists=split(/ /,$Hist); - - if ($BeamLine eq "LEM") { - my $HistParams=$LEM{$Hists[0]}; - ($RV{"t0"},$RV{"Bg1"},$RV{"Bg2"},$RV{"Data1"},$RV{"Data2"})=split(/,/,$HistParams); - } - elsif ($BeamLine eq "Dolly") { - my $HistParams=$Dolly{$Hists[0]}; - ($RV{"t0"},$RV{"Bg1"},$RV{"Bg2"},$RV{"Data1"},$RV{"Data2"})=split(/,/,$HistParams); - } - elsif ($BeamLine eq "GPS") { - my $HistParams=$GPS{$Hists[0]}; - ($RV{"t0"},$RV{"Bg1"},$RV{"Bg2"},$RV{"Data1"},$RV{"Data2"})=split(/,/,$HistParams); - } - return $RV{$Name}; - -} - -######################## -# 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_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"} ); - } - 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 $iRun =0; - my $value =0; - my $error = 0; - my $minvalue = 0; - my $maxvalue = 0; - my $Component=1; - - foreach my $RUN (@RUNS) { - $iRun++; - $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"}; - if ( $Shared!=1 || $iRun == 1 ) { -# 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 ?? - - -# We have two options here, either take default values or take values of previous -# run if available -# $ParamPrev =~ s/$iRun-1/$iRun/g; - $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"}; - if ( $Shared!=1 || $iRun == 1 ) { -# 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; -} - - -######################## -# 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"; - -# First assume nothing is shared - my $Shared = 0; - - my $TABLE=$EMPTY; - my $HEADER="RUN"; - - my %All = %{$_[0]}; - my @RUNS = (); - if ($All{"RUNSType"}) { - @RUNS = split( /,/, $All{"RunFiles"} ); - } else { - @RUNS = split( /,/, $All{"RunNumbers"} ); - } - 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"}; - -# 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; - my $value =0; - my $error = 0; - my $minvalue = 0; - my $maxvalue = 0; - my $Component=1; - - foreach my $RUN (@RUNS) { - my $line="$RUN"; - $iRun++; - $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" ); - } - # $All{"Header"} - 0/1 for with/without header - if ($All{"Header"} && $iRun == 1) { - $HEADER=join("\t",$HEADER,$Param,"$erradd$Param"); - } - - $Shared = $All{"Sh_$Param"}; - if ( $Shared!=1 || $iRun == 1 ) { -# If 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. (should be) - $value = $All{"$Param"}; - $error = $All{"$erradd$Param"}; - - $line=join("\t",$line,$value,$error); - $PCount++; - } - elsif ($Shared==1) { -# The parameter is shared, take the value from the first run - $Param=$Param; - $value = $All{"$Param"}; - $error = $All{"$erradd$Param"}; - $line=join("\t",$line,$value,$error); - } - $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; - $Param=$Param.$Hist; - if ( $#FitTypes != 0 && ( $Param_ORG ne "No" && $Param_ORG ne "NBg" ) ){ - $Param = join( $EMPTY, $Param, "_", "$Component" ); - } - - $Shared = $All{"Sh_$Param"}; - if ( $Shared!=1 || $iRun == 1 ) { -# If 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. (should be) - $value = $All{"$Param"}; - $error = $All{"$erradd$Param"}; - $minvalue = $All{"$Param$minadd"}; - $maxvalue = $All{"$Param$maxadd"}; - - $values=join("\t",$Param,$value,$error,$minvalue,$maxvalue,$RUN); - $ParTable{$PCount}=$values; - $PCount++; - } - $NP++; - } - $Component++; - } - } - } - $TABLE=$TABLE."$line\n" - } - if ($All{"Header"}) { - $TABLE=$HEADER."\n".$TABLE; - } - - return $TABLE; -} - -######################## -# 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=@_; - - # Extract PRAMETERS and THEORY Blocks - (my $TBlock_ref, my $FPBlock_ref)=MSR::ExtractBlks(@file); - my @FPBlock = @$FPBlock_ref; - my @TBlock = @$TBlock_ref; - -# Get shared parameters - foreach $TLine (@TBlock) { - # Then split it to find numbers of shared parameters - @tmp=split(/\s+/,$TLine); - foreach (@tmp) { - if ($_ eq $_+0 ) { - # This is a number, keep it in the Shared arry - @Shared=(@Shared,$_); - } - } - } - -# Nice trick, make a hash for unique RUN lines -# Find spectrum lines - my @MAPS = grep {/map /} @file; - my @RUNS = grep {/RUN/} @file; - my $counter=0; - foreach $key (@RUNS){ - # This gets rid of duplicates - $RUN{$key}=$counter; - $MAP{$key}=$MAPS[$counter]; - $counter++; - } - -# Number of runs (or independent sets of parameters) in this file - my $NRuns=1; - foreach (sort { $RUN{$a} <=> $RUN{$b}} keys %RUN ) { - @RunParams=(); - $NP=0; - @tmp=split(/\s+/,$MAP{$_}); - # Remove first element (map) - shift(@tmp); - foreach (@tmp) { - if ($_ ne $EMPTY && $_>0 ) { - @RunParams=(@RunParams,$_); - $NP++; - } - } - if ($NP>0) { - $orders=join(",",@RunParams); - $RUNParams[$NRuns]=$orders; - $NRuns++; - } - } - -# Split parameter's line to extract values and errors - foreach $line (@FPBlock) { - @Param=split(/\s+/,$line); - # Create a hash with the parameter order as a key - # and the value and error as value - $P{$Param[1]}=$Param[3].",".$Param[4]; - $PName{$Param[1]}=$Param[2]; - } - -# Now we have everything. Lets start ordering - # First lines is names - @Pnum=split(/,/,$RUNParams[1]); - foreach (@Pnum,@Shared) { - $DatFile=join("\t",$DatFile,$PName{$_},"d".$PName{$_}); - } - $DatFile=$DatFile."\n"; - - # For the values from all the files. - # I am not checking if all the files have the same theory function - for ($i=1;$i<=$NRuns-1;$i++) { - @Pnum=split(/,/,$RUNParams[$i]); - # First go for the shared parameters - foreach (@Pnum,@Shared) { - ($value,$err)=split(/,/,$P{$_}); - $DatFile=join("\t",$DatFile,$value,$err); - } - $DatFile=$DatFile."\n"; - } - return $DatFile; -} - - -######################## -# RUNFileNameAuto -# Function return the RUN_Line for a given RUN -# input should be -# $RUN is the run number -# $YEAR is the year -# $BeamLine in the name of beamline -######################## -sub RUNFileNameAuto { -# Take this information as input arguments - (my $RUN, my $YEAR, my $BeamLine) = @_; - - my $DATADIR = $DATADIRS{$BeamLine}; - my $RUNtmp=sprintf("%04d",$RUN); - - # Get current year - my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = - localtime( time() ); - my $current_year = $year + 1900; - - if ( $BeamLine eq "LEM" || $BeamLine eq "LEM (PPC)") { - $RUN_File_Name = "lem" . substr( $YEAR, 2 ) . "_his_" . $RUNtmp; - $RUNFILE = "$DATADIR/$YEAR/$RUN_File_Name"; - } - elsif ( $BeamLine eq "GPS" ) { - $RUN_File_Name = "deltat_tdc_gps_" . $RUNtmp; - $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; - } - elsif ( $BeamLine eq "LTF" ) { - $RUN_File_Name = "deltat_tdc_ltf_" . $RUNtmp; - $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; - } - elsif ( $BeamLine eq "Dolly" ) { - $RUN_File_Name = "deltat_tdc_dolly_" . $RUNtmp; - $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; - } - elsif ( $BeamLine eq "GPD" ) { - $RUN_File_Name = "deltat_tdc_gpd_" . $RUNtmp; - $RUNFILE = "$DATADIR/d$YEAR/tdc/$RUN_File_Name"; - } - my $RUN_Line = join( $SPACE, - "RUN", $RUNFILE, $BeamLines{$BeamLine}, "PSI", - $Def_Format{$BeamLine} ); - return $RUN_Line; -} - -######################## -# RUNFileNameMan -# Function return the RUN_Line for a given RUN -# input should be -# $RUN is the run number -# $YEAR is the year -# $BeamLine in the name of beamline -######################## -sub RUNFileNameMan { - my %EXTs = ("root","ROOT-NPP", - "bin","PSI-BIN", - "msr","MUD"); - -# Take this information as input arguments - (my $RUN) = @_; - my @tmp = split(/\./,$RUN); - my $EXT = @tmp[$#tmp]; - - $RUN =~ s/\.[^.]+$//; - - my $RUN_Line = join( $SPACE, - "RUN", $RUN, "MUE4", "PSI",$EXTs{$EXT}); - - return $RUN_Line; -} - -######################## -# ExtractInfoLEM -######################## -# This creates the RRF related lines, these are the same always -sub CreateRRFBlock { - - my %All = %{$_[0]}; - - $RRFBlock=""; - if ($All{"RRFFrq"}!= 0) { - if ($All{"RRFPhase"} eq $EMPTY) {$All{"RRFPhase"}=0;} - if ($All{"RRFPack"} eq $EMPTY) {$All{"RRFPack"}=1;} - $RRFBlock="rrf_freq ".$All{"RRFFrq"}." ".$All{"RRFUnits"}."\n"; - $RRFBlock=$RRFBlock."rrf_phase ".$All{"RRFPhase"}."\n"; - $RRFBlock=$RRFBlock."rrf_packing ".$All{"RRFPack"}."\n"; - } - return $RRFBlock; -} - - - - -######################## -# ExtractInfoLEM -######################## -# Uset to extract information from summary files -sub ExtractInfoLEM { - my ($RUN,$YEAR,$Arg) = @_; - my $Summ_File_Name = "lem" . substr( $YEAR, 2 ) . "_" . $RUN . ".summ"; - my $SummFile = "$SUMM_DIR/$YEAR/$Summ_File_Name"; - - open( SFILE,q{<}, "$SummFile" ); - my @lines = ; - close(SFILE); - - if ( $Arg eq "TITLE" ) { - $RTRN_Val = $lines[3]; - $RTRN_Val =~ s/\n//g; - } - elsif ( $Arg eq "Temp" ) { - foreach my $line (@lines) { - if ( $line =~ /Mean Sample_CF1/ ) { - ( my $tmp, my $T ) = split( /=/, $line ); - ( $T, $tmp ) = split( /\(/, $T ); - $RTRN_Val = $T; - } - } - - } - elsif ( $Arg eq "Field" ) { - foreach my $line (@lines) { - if ( $line =~ /Mean B field/ ) { - ( $tmp, my $B ) = split( /=/, $line ); - ( $B, $tmp ) = split( /\(/, $B ); - $RTRN_Val = $B; - } - } - } - elsif ( $Arg eq "Energy" ) { - foreach my $line (@lines) { - if ( $line =~ /implantation energy/ ) { - ( my $tmp1, my $tmp2, my $E ) = split( /=/, $line ); - ( $E, $tmp ) = split( /keV/, $E ); - $RTRN_Val = $E; - } - } - - } - # $RTRN_Val =~ s/[\.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]//g; - return $RTRN_Val; -} - -# Uset to extract information from log files -sub ExtractInfoBulk { - my ($RUN,$AREA,$YEAR,$Arg) = @_; - my $RUNtmp=sprintf("%04d",$RUN); - $RUN=$RUNtmp; - -# Information may be found in these file - my $DBFILE=$DBDIR{$AREA}.$YEAR."/*.runs"; - my @Lines =`cat $DBFILE`; - -# Select intries with the right area - my $area=lc $AREA; - my @Lines1 = grep { /$area/ } @Lines; - my @Lines2 = grep { /$AltArea{$AREA}/ } @Lines; - @Lines=(@Lines1,@Lines2); -# Select intries with the right run number - @Lines = grep { /$RUN/ } @Lines; - @Words=split(/\s+/,$Lines[0]); - - if ( $Arg eq "TITLE" ) { - $RTRN_Val = substr($Lines[0],104); - } - elsif ( $Arg eq "Temp" ) { - $RTRN_Val = $Words[6]; - } - elsif ( $Arg eq "Field" ) { - $RTRN_Val = $Words[7]; - } - - return $RTRN_Val; -} - - - - -1; diff --git a/src/external/MuSRFitGUI/devel/MuSRFit.pl b/src/external/MuSRFitGUI/devel/MuSRFit.pl deleted file mode 100755 index fff4ab13..00000000 --- a/src/external/MuSRFitGUI/devel/MuSRFit.pl +++ /dev/null @@ -1,4492 +0,0 @@ -# Form implementation generated from reading ui file 'MuSRFit.ui' -# -# Created: Mon Aug 29 15:52:41 2011 -# by: The PerlQt User Interface Compiler (puic) -# -# WARNING! All changes made in this file will be lost! - - -use strict; -use utf8; - - -package MuSRFitform; -use Qt; -use Qt::isa qw(Qt::MainWindow); -use Qt::slots - fileOpen => [], - fileSave => [], - fileChangeDir => [], - filePrint => [], - fileExit => [], - parametersExport => [], - parametersAppend => [], - editUndo => [], - editRedo => [], - editCut => [], - editCopy => [], - editPaste => [], - helpIndex => [], - helpContents => [], - helpAbout => [], - CreateAllInput => [], - CallMSRCreate => [], - UpdateMSRFileInitTable => [], - ActivateT0Hists => [], - ActivateShComp => [], - InitializeTab => [], - TabChanged => [], - GoFit => [], - GoPlot => [], - ShowMuSRT0 => [], - T0Update => [], - RunSelectionToggle => [], - fileBrowse => [], - AppendToFunctions => [], - InitializeFunctions => [], - optionConfigure => [], - t0UpdateClicked => []; -use Qt::attributes qw( - musrfit_tabs - RUNSPage - RUNSAuto - RunNumbers - BeamLine - BeamLineLabel - YEAR - YEARLabel - RUNSMan - RunFiles - Browse - groupBox7 - FitType2 - TfsLabel - FitType1 - BINS - Comp3Label - Tis - Tfs - Comp1Label - BINSLabel - TisLabel - FitType3 - Comp2Label - FitAsyTypeLabel - FitAsyType - LRBFLabel - LRBF - FittingPage - Yi - Minimization - Xi - textLabel1_4_2_2 - Xf - textLabel1_5 - textLabel1_4_2 - ViewBin - Yf - ErrorCalc - ltc - textLabel1_5_2 - textLabel1_4 - FitTextOutput - SharingPage - buttonGroupSharing - SharingComp2 - Comp2ShLabel - ShParam_2_1 - ShParam_2_2 - ShParam_2_3 - ShParam_2_4 - ShParam_2_5 - ShParam_2_6 - ShParam_2_7 - ShParam_2_8 - ShParam_2_9 - SharingComp3 - Comp3ShLabel - ShParam_3_1 - ShParam_3_2 - ShParam_3_3 - ShParam_3_4 - ShParam_3_5 - ShParam_3_6 - ShParam_3_7 - ShParam_3_8 - ShParam_3_9 - SharingComp1 - ShParam_1_1 - ShParam_1_2 - ShParam_1_3 - ShParam_1_4 - ShParam_1_5 - ShParam_1_6 - ShParam_1_7 - ShParam_1_8 - ShParam_1_9 - Comp1ShLabel - InitializationPage - InitParamTable - MSRPage - groupTitle - TITLELabel - TITLE - FILENAMELabel - FILENAME - textMSROutput - FourierPage - FourierBox - FrqMin - textLabel1_3_4 - textLabel1_7 - textLabel1_3_5 - FUnits - textLabel1_3_6 - FApodization - FrqMax - FPlot - FUnitsLabel - textLabel1_3_8 - textLabel1_3_7 - FPlotLabel - textLabel1_2 - FApodizationLabel - textLabel1_3_3 - FPHASE - textLabel1 - RRFBox - textLabel1_6_2_2 - textLabel1_6 - textLabel1_6_2_4 - RRFFrq - textLabel1_6_2_3 - RRFPack - textLabel1_6_2 - RRFUnits - RRFPhase - T0Page - groupHist0 - textLabel2 - textLabel2_2_2_3 - textLabel2_2_2 - textLabel2_2_2_2 - textLabel2_2_2_2_2 - groupHist1 - t01 - Bg11 - Bg21 - Data11 - Data21 - groupHist2 - t02 - Bg12 - Bg22 - Data12 - Data22 - groupHist3 - t03 - Bg13 - Bg23 - Data13 - Data23 - groupHist4 - t04 - Bg14 - Bg24 - Data14 - Data24 - t0Update - TabPage - TheoryBlock_Label - TheoryBlock - ParametersList_Label - ParametersList - CParamsCombo - textLabel1_4_6 - ConstraintLine - AddConstraint - textLabel2_2_3_4 - FunctionsBlock - textLabel1_6_3 - ResetFunc - MenuBar - fileMenu - Edit - Actions - Parameters - Options - helpMenu - FileToolBar - ActionsToolBar - fileNewAction - fileOpenAction - fileSaveAction - fileSaveAsAction - filePrintAction - fileExitAction - editUndoAction - editRedoAction - editCutAction - editCopyAction - editPasteAction - editFindAction - helpContentsAction - helpIndexAction - helpAboutAction - separatorAction - FileExistCheck - ManualFile - fileChangeDirAction - optionsnew_itemAction - parametersExport_AsAction - parametersAppend_ToAction - Fit - Plot - T0 - optionsFourier - optionsT0 - optionsConfigure -); - - -our $image0; -our $image0_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x01, - 0x11, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xa5, 0x54, 0xcb, 0x12, 0xc2, - 0x20, 0x0c, 0xdc, 0xe0, 0x63, 0xc6, 0xbb, 0x07, 0x3c, 0xfa, 0xff, 0x3f, - 0xe6, 0x57, 0xb8, 0x1e, 0x5a, 0x68, 0x58, 0x42, 0x8b, 0x9a, 0x19, 0xa6, - 0x34, 0x24, 0x9b, 0xcd, 0x03, 0x0c, 0x81, 0xd0, 0xed, 0x2d, 0x32, 0x98, - 0x92, 0x4c, 0x1e, 0x1b, 0x81, 0xb2, 0x20, 0xdf, 0xee, 0x3c, 0x45, 0x2c, - 0x01, 0x24, 0xf6, 0xba, 0xfb, 0x6a, 0x7f, 0x95, 0xa0, 0x09, 0xc0, 0xd3, - 0xed, 0x6f, 0x95, 0x31, 0x01, 0x2a, 0x90, 0xd0, 0x8a, 0xd2, 0x52, 0x55, - 0xf3, 0x6f, 0x94, 0x92, 0x6a, 0x4d, 0x09, 0xc0, 0xe2, 0xb2, 0x13, 0x6d, - 0x0b, 0x9a, 0xff, 0x84, 0xb1, 0x98, 0x47, 0x01, 0x70, 0x02, 0x70, 0x01, - 0x70, 0xde, 0xf1, 0xa9, 0xd2, 0x18, 0x09, 0x5b, 0x4d, 0xf5, 0xbd, 0xae, - 0x29, 0x49, 0xb6, 0x31, 0xfb, 0x7d, 0xb2, 0x86, 0xbe, 0x7d, 0x03, 0xb5, - 0x44, 0x06, 0xf4, 0x93, 0x73, 0x18, 0x6e, 0x05, 0xad, 0xe0, 0x00, 0x1e, - 0x81, 0x4d, 0x57, 0x1b, 0x27, 0x77, 0x55, 0x14, 0x26, 0xbb, 0x93, 0xe1, - 0xd9, 0x8e, 0xea, 0xa5, 0x23, 0xd2, 0xa5, 0xe3, 0x67, 0x29, 0x62, 0x39, - 0x73, 0x4d, 0x2b, 0xf0, 0x64, 0x03, 0xe9, 0x03, 0x47, 0xc1, 0xe2, 0x37, - 0x66, 0x7d, 0x33, 0xf8, 0x32, 0xd8, 0x72, 0x71, 0x46, 0x44, 0x4d, 0x37, - 0xd1, 0x61, 0x43, 0xc0, 0xd7, 0xda, 0xb3, 0xd7, 0x1e, 0x78, 0x17, 0x25, - 0x51, 0x0e, 0x8f, 0x47, 0x46, 0xc4, 0x32, 0x69, 0x79, 0x9b, 0x4c, 0x2e, - 0xe0, 0x15, 0xb4, 0x90, 0xd8, 0x05, 0x2e, 0x46, 0x96, 0xb7, 0x44, 0xf8, - 0xea, 0x87, 0x46, 0x27, 0xa2, 0x03, 0xf6, 0x4d, 0xa4, 0x63, 0x54, 0x74, - 0x56, 0x00, 0x04, 0xdc, 0x32, 0x59, 0x2e, 0x99, 0xf7, 0x69, 0xc5, 0x19, - 0x95, 0xb5, 0x97, 0x51, 0xad, 0xc9, 0x94, 0xcf, 0x24, 0xf0, 0x20, 0xd0, - 0xb1, 0xcf, 0x37, 0xa0, 0xff, 0xf8, 0x7c, 0x05, 0xfc, 0x01, 0x1a, 0xec, - 0x94, 0x3b, 0x34, 0xe2, 0x89, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, - 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image1; -our $image1_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x00, - 0xce, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xd5, 0x53, 0xc9, 0x11, 0xc3, - 0x20, 0x0c, 0x5c, 0x31, 0xf9, 0xb8, 0x24, 0x28, 0xc5, 0x8d, 0xb8, 0x06, - 0x37, 0xe2, 0x52, 0xe4, 0x92, 0xfc, 0x54, 0x1e, 0x19, 0x65, 0x98, 0x8d, - 0x15, 0x98, 0xd8, 0x3c, 0xb2, 0x2f, 0x21, 0xc1, 0x6a, 0xd1, 0x21, 0xaa, - 0x8a, 0x11, 0x48, 0x6e, 0x2c, 0xf3, 0x64, 0x1c, 0x5c, 0xe6, 0xc9, 0x6a, - 0x3f, 0xdf, 0xf1, 0xf3, 0x99, 0x3f, 0xb9, 0xb1, 0x6e, 0x87, 0x30, 0xc9, - 0xba, 0x1d, 0xc2, 0xfe, 0x08, 0x9c, 0x24, 0x39, 0x01, 0x00, 0x44, 0x24, - 0x67, 0xf1, 0xfa, 0x5d, 0x1d, 0x73, 0x5f, 0x62, 0x12, 0xbe, 0xc8, 0x89, - 0x98, 0x20, 0xc2, 0xa3, 0x96, 0x1f, 0x29, 0xed, 0x21, 0xaa, 0xef, 0xbf, - 0x15, 0x7b, 0x2d, 0xeb, 0x40, 0x4f, 0x5d, 0x9b, 0x8a, 0xa3, 0xec, 0x4e, - 0xde, 0xa3, 0x96, 0x21, 0x43, 0xe7, 0x38, 0x97, 0x62, 0xb9, 0x94, 0x4b, - 0x5f, 0x67, 0x88, 0x01, 0xb6, 0xab, 0x8a, 0x27, 0x70, 0xfb, 0x32, 0x31, - 0x97, 0xe2, 0x2e, 0xf2, 0x8f, 0x39, 0xde, 0x55, 0xe5, 0x8e, 0xb2, 0x84, - 0x0b, 0x32, 0x84, 0xb8, 0x47, 0x75, 0xab, 0xe1, 0x3f, 0x29, 0xf6, 0x3e, - 0x44, 0x02, 0x72, 0x29, 0x26, 0x00, 0xc2, 0xac, 0x06, 0x80, 0xbb, 0xd8, - 0xf2, 0x19, 0x5e, 0x3f, 0x6e, 0x2e, 0x48, 0x3d, 0x25, 0xdf, 0x26, 0xc6, - 0x95, 0x7b, 0xbc, 0x6b, 0xf3, 0xf8, 0x51, 0x0f, 0xc6, 0xae, 0xf4, 0x5f, - 0x11, 0x3f, 0x01, 0xc3, 0xec, 0xa5, 0x79, 0xcd, 0xbc, 0x94, 0xf7, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image2; -our $image2_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x00, - 0xd7, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xbd, 0x54, 0xc1, 0x0d, 0x83, - 0x30, 0x0c, 0x3c, 0x47, 0x7c, 0xba, 0x05, 0x6b, 0xc4, 0x52, 0x3b, 0x08, - 0x8b, 0x74, 0x06, 0x16, 0x61, 0x14, 0xf3, 0xcc, 0x38, 0x3c, 0xd3, 0x47, - 0xe5, 0x2a, 0x4a, 0x13, 0x48, 0x2c, 0xe0, 0x3e, 0x90, 0x93, 0x7c, 0x9c, - 0xcf, 0xc1, 0x24, 0x22, 0xb8, 0x02, 0xf4, 0x1c, 0x43, 0x9c, 0x97, 0x8d, - 0x94, 0x78, 0x4f, 0x8f, 0x38, 0x2f, 0x1b, 0xe9, 0x53, 0x39, 0x00, 0x50, - 0x3e, 0x17, 0xc9, 0xf9, 0x79, 0xd9, 0x68, 0x00, 0x00, 0xcf, 0x1c, 0x01, - 0x60, 0x15, 0xa1, 0xbc, 0x28, 0xff, 0xc0, 0xd1, 0xbb, 0x9e, 0x5d, 0x4d, - 0xb0, 0x84, 0xb4, 0xf8, 0x08, 0xc3, 0xaf, 0xd5, 0x31, 0x00, 0x13, 0x76, - 0xdb, 0xec, 0x16, 0xd6, 0x02, 0xcf, 0x1c, 0x5f, 0x63, 0xa8, 0x3a, 0xcd, - 0x5b, 0xde, 0x83, 0x4b, 0x0f, 0xb5, 0x8c, 0x5b, 0x5d, 0xa6, 0x18, 0x4a, - 0xa4, 0x67, 0xfe, 0x46, 0x83, 0xb6, 0x28, 0x4a, 0xb7, 0x82, 0x00, 0x44, - 0xc9, 0x9c, 0x7a, 0xe6, 0xd8, 0x3a, 0xd0, 0x1a, 0x5c, 0x89, 0x5c, 0x45, - 0x48, 0xaf, 0xe0, 0xa9, 0xc2, 0x67, 0xa0, 0x2a, 0xac, 0xae, 0xad, 0xce, - 0x77, 0x1d, 0xaf, 0x22, 0x64, 0x8d, 0xa5, 0x29, 0x0a, 0x8b, 0xf8, 0xfd, - 0x19, 0xdf, 0x26, 0xdc, 0x3b, 0xcc, 0x2e, 0xc7, 0x3d, 0xc3, 0x34, 0x45, - 0xd1, 0xe2, 0xde, 0x9c, 0xb1, 0xfe, 0xf2, 0x35, 0xf1, 0xe2, 0x12, 0xb2, - 0x8a, 0xa7, 0xfb, 0x85, 0x80, 0xff, 0xe5, 0x6e, 0x45, 0x2a, 0xf4, 0x01, - 0x19, 0x04, 0x97, 0x00, 0x1e, 0x10, 0xdf, 0x32, 0x00, 0x00, 0x00, 0x00, - 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image3; -our $image3_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x02, - 0xc9, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xb5, 0x93, 0x4b, 0x48, 0x54, - 0x51, 0x1c, 0xc6, 0x7f, 0xe7, 0xdc, 0x73, 0xc7, 0x99, 0x9c, 0xb4, 0x1a, - 0xcb, 0x6a, 0x2a, 0x22, 0xd2, 0x8a, 0xa2, 0x27, 0xf6, 0x44, 0x88, 0x08, - 0xa3, 0x82, 0x48, 0x90, 0x5a, 0xb8, 0x0a, 0x5a, 0xb4, 0x6a, 0x51, 0x54, - 0xeb, 0x20, 0xda, 0xb4, 0x69, 0x15, 0x91, 0x46, 0x08, 0x15, 0xd4, 0x22, - 0x83, 0xa0, 0x50, 0x8a, 0x08, 0x83, 0x28, 0x91, 0x1e, 0x58, 0x49, 0x32, - 0xa5, 0xe3, 0x18, 0x44, 0x8e, 0x36, 0x33, 0x77, 0x66, 0x1c, 0xef, 0xcc, - 0x3d, 0x2d, 0x46, 0xf1, 0x75, 0x29, 0x1d, 0xea, 0x83, 0x03, 0xf7, 0x7e, - 0x17, 0x7e, 0xf7, 0x3b, 0xff, 0x87, 0xd0, 0x5a, 0x33, 0xa6, 0xfb, 0x0f, - 0x9e, 0x8c, 0xbf, 0xcc, 0x40, 0xa6, 0xbf, 0x6c, 0x45, 0x6d, 0x4d, 0x55, - 0x9f, 0xdb, 0x37, 0x35, 0xd5, 0x38, 0x74, 0x70, 0x3f, 0x7e, 0x9f, 0x39, - 0xc9, 0xb3, 0x6d, 0x48, 0xa7, 0x21, 0x95, 0x82, 0x54, 0x1a, 0x52, 0x29, - 0x4d, 0x2c, 0xf9, 0x89, 0xfe, 0x48, 0x38, 0xdc, 0xdc, 0xda, 0x5e, 0x59, - 0x5b, 0x53, 0xd5, 0x3d, 0x95, 0x23, 0x67, 0x94, 0xcc, 0x04, 0xaf, 0x77, - 0xc2, 0x29, 0xca, 0xfb, 0x6b, 0x2a, 0xf7, 0x62, 0x5b, 0x03, 0x5f, 0x9a, - 0x5b, 0xdb, 0x37, 0x16, 0x04, 0x06, 0xf0, 0x78, 0xc6, 0xa1, 0x45, 0xde, - 0xbc, 0x57, 0xb6, 0xc0, 0xc7, 0xaa, 0x95, 0xfb, 0xb0, 0xad, 0x81, 0xf7, - 0xcd, 0xad, 0xed, 0x3b, 0x0b, 0x02, 0xc3, 0x78, 0xe2, 0x31, 0xb0, 0x96, - 0x69, 0x3c, 0x45, 0x0e, 0x81, 0xb2, 0x3d, 0xd8, 0xd6, 0xc0, 0xab, 0xbb, - 0x8f, 0xde, 0xd4, 0x17, 0x04, 0x1e, 0x83, 0xfb, 0x46, 0x4b, 0xd1, 0x1b, - 0xfe, 0x4a, 0x22, 0xf9, 0x15, 0xaf, 0xb7, 0x8f, 0xe0, 0xb2, 0x15, 0x28, - 0x3b, 0x7a, 0xbb, 0xa9, 0xa9, 0x69, 0x2d, 0xb8, 0x34, 0xef, 0x6f, 0x92, - 0x12, 0x7c, 0x3e, 0xc1, 0x8e, 0xad, 0xeb, 0x49, 0xa5, 0x20, 0x14, 0xd2, - 0xda, 0xd1, 0x42, 0x68, 0x0d, 0xdf, 0x87, 0xfa, 0xa2, 0xf3, 0x15, 0x6b, - 0x81, 0xae, 0x59, 0x27, 0x06, 0x50, 0x0a, 0x86, 0x87, 0x21, 0x12, 0x81, - 0xa2, 0xd0, 0x7d, 0x61, 0x76, 0x5e, 0x43, 0x29, 0x10, 0x62, 0x42, 0x80, - 0x42, 0xc0, 0xbf, 0x42, 0xdd, 0x44, 0xda, 0x5a, 0x31, 0x14, 0x2c, 0x2f, - 0x7b, 0x44, 0xc5, 0xba, 0x0e, 0x0c, 0xc3, 0x61, 0xfe, 0xe0, 0x07, 0xb5, - 0xe0, 0xdb, 0xd3, 0x95, 0xae, 0xe0, 0x91, 0x4c, 0xd6, 0xd6, 0x7f, 0x58, - 0x93, 0x78, 0x1c, 0x92, 0xaf, 0x2f, 0x52, 0xb9, 0xeb, 0x25, 0x74, 0x5c, - 0x46, 0x2a, 0x89, 0x30, 0x15, 0x9e, 0xcf, 0x37, 0xa9, 0x3f, 0xfe, 0xab, - 0x74, 0xdb, 0xe2, 0x9e, 0xf3, 0xee, 0x60, 0x5b, 0x99, 0xb1, 0x18, 0xc4, - 0x62, 0x10, 0x4f, 0x80, 0x65, 0x41, 0x32, 0x09, 0x09, 0x0b, 0x86, 0x86, - 0xc0, 0x4a, 0xc2, 0xc8, 0xea, 0x73, 0x64, 0x7a, 0xc2, 0x54, 0x1c, 0xce, - 0x61, 0xf8, 0x34, 0xd2, 0x14, 0x54, 0x54, 0x87, 0xc9, 0x46, 0x87, 0x68, - 0xeb, 0x2e, 0xb9, 0x01, 0x2e, 0xcd, 0x53, 0x2a, 0xbf, 0x10, 0x8e, 0x03, - 0x5a, 0x43, 0xce, 0x19, 0x7f, 0x76, 0x34, 0x38, 0x5d, 0x0f, 0xf1, 0x44, - 0xdb, 0x88, 0x46, 0xe3, 0x94, 0x17, 0x87, 0xf1, 0x6e, 0xaa, 0x02, 0x04, - 0xb9, 0xde, 0x10, 0x5f, 0x9a, 0xdf, 0x66, 0x37, 0x95, 0xd8, 0xd5, 0x9d, - 0x27, 0xe6, 0x9e, 0x74, 0x05, 0x2b, 0x95, 0x07, 0x69, 0x3d, 0x19, 0xaa, - 0x1d, 0x30, 0x12, 0x8d, 0xcc, 0x3b, 0x52, 0x0d, 0x7a, 0x11, 0x68, 0x01, - 0x46, 0x7e, 0xf6, 0xe4, 0xe2, 0x20, 0x1b, 0xce, 0xd4, 0x2a, 0x34, 0xfb, - 0xac, 0x96, 0xe7, 0xbb, 0xa7, 0x83, 0x8d, 0xc9, 0x89, 0x27, 0xc2, 0xb5, - 0x86, 0xd4, 0xe6, 0x06, 0xc2, 0xaf, 0x3f, 0x20, 0x3e, 0xde, 0x23, 0x58, - 0xb7, 0x14, 0xa9, 0x35, 0x38, 0xa0, 0x33, 0x23, 0xbc, 0xb9, 0xd2, 0x92, - 0x8d, 0xa4, 0xfd, 0x97, 0x7f, 0x76, 0xb4, 0xdc, 0x9e, 0x3e, 0xc7, 0x22, - 0x3f, 0xab, 0x72, 0xb4, 0xfa, 0x53, 0x13, 0xcf, 0x2d, 0x5f, 0x82, 0xec, - 0x7d, 0x4a, 0xe9, 0xb1, 0xa5, 0xe4, 0x06, 0x06, 0xc9, 0x74, 0x85, 0x30, - 0xfc, 0x7e, 0x74, 0x26, 0xc7, 0xf6, 0xb3, 0x07, 0x94, 0xbc, 0xfa, 0xa4, - 0xa2, 0xae, 0x4d, 0x77, 0xff, 0x75, 0xdc, 0xa4, 0x04, 0xc3, 0x00, 0x73, - 0xb4, 0xf6, 0x4a, 0x41, 0xb6, 0xff, 0x19, 0x23, 0x3d, 0x7d, 0xfc, 0x18, - 0x3c, 0x0a, 0xd2, 0x44, 0x0b, 0x49, 0xcc, 0x7f, 0x9a, 0xe4, 0xbb, 0xcf, - 0xba, 0x7c, 0xa1, 0xde, 0xed, 0xda, 0xbc, 0x3f, 0x49, 0x88, 0xfc, 0x4f, - 0x02, 0x75, 0x8d, 0x64, 0xac, 0x18, 0xc1, 0x92, 0x00, 0x89, 0xc7, 0x0d, - 0xc8, 0x64, 0x86, 0xd2, 0xea, 0x8d, 0x5c, 0x7f, 0x51, 0x23, 0xbc, 0x62, - 0xf0, 0xc2, 0xa9, 0xd9, 0x82, 0xc7, 0x64, 0x28, 0xc5, 0x9c, 0x79, 0x01, - 0x00, 0xd4, 0x96, 0x4b, 0x0c, 0x5b, 0x71, 0x8a, 0x3d, 0xf9, 0xcb, 0xfb, - 0x4a, 0x03, 0x99, 0x59, 0x27, 0x76, 0x53, 0x71, 0x70, 0x0d, 0xc5, 0x2e, - 0x7e, 0x41, 0x2b, 0x3d, 0x13, 0xfd, 0x37, 0xf0, 0xb4, 0x52, 0x34, 0xde, - 0xba, 0xf3, 0x4f, 0xc0, 0xbf, 0x01, 0xfe, 0x53, 0x21, 0x19, 0xee, 0x8d, - 0x4b, 0x59, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, - 0x60, 0x82; - -our $image4; -our $image4_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x03, - 0xf7, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xb5, 0x95, 0x5f, 0x68, 0xd5, - 0x65, 0x18, 0xc7, 0x3f, 0xe7, 0x77, 0x7e, 0xd3, 0x33, 0xdd, 0x3f, 0x67, - 0xfe, 0xcb, 0x74, 0xc7, 0x22, 0xed, 0x62, 0xf9, 0x07, 0x12, 0x23, 0x33, - 0x2c, 0x56, 0x20, 0x06, 0x2d, 0x09, 0x82, 0xa8, 0x8b, 0xec, 0x22, 0x88, - 0x8a, 0xea, 0xc2, 0x42, 0x32, 0x2d, 0x2b, 0x28, 0x08, 0xb1, 0x2e, 0x02, - 0x2f, 0xb4, 0xa0, 0xee, 0xa2, 0x16, 0x15, 0x5d, 0xe4, 0x68, 0x66, 0x64, - 0x1b, 0xca, 0xcc, 0xd4, 0xe2, 0xb4, 0x64, 0x73, 0x6e, 0xce, 0xf3, 0x6f, - 0x67, 0x3b, 0xe7, 0xfc, 0xfe, 0xbc, 0x7f, 0x9e, 0xb7, 0x8b, 0x6d, 0xce, - 0x95, 0x12, 0x5e, 0xf8, 0xc2, 0xc3, 0xfb, 0xc0, 0xfb, 0x3c, 0x9f, 0xf7, - 0xe1, 0x79, 0xbf, 0x0f, 0x6f, 0xc2, 0x39, 0xc7, 0x8d, 0x58, 0xde, 0x0d, - 0xa1, 0x02, 0x89, 0xeb, 0x4d, 0x78, 0xf5, 0xcd, 0xee, 0xb4, 0x18, 0x77, - 0xa8, 0x66, 0x96, 0xb7, 0xb6, 0x5c, 0xd6, 0x2b, 0x3e, 0x7a, 0x7f, 0x63, - 0xe9, 0x6a, 0x71, 0xd7, 0x55, 0xf1, 0x6b, 0x6f, 0x75, 0xbf, 0xd4, 0xdc, - 0x98, 0xea, 0xdd, 0xfe, 0x54, 0xeb, 0xe6, 0xed, 0x4f, 0xb6, 0x36, 0x59, - 0x91, 0x43, 0xd7, 0x0c, 0x76, 0xce, 0x5d, 0xd3, 0xa6, 0xd6, 0xae, 0x77, - 0x7a, 0xd6, 0xee, 0xdc, 0xdb, 0xd3, 0xdb, 0xd9, 0x35, 0xe2, 0xaa, 0x55, - 0xe7, 0xb2, 0x59, 0xed, 0x46, 0x47, 0xad, 0xfb, 0xf8, 0x60, 0xc6, 0x3d, - 0xf3, 0xc2, 0x4f, 0xed, 0x57, 0xe3, 0x26, 0x5a, 0x9e, 0xfe, 0xc3, 0xb5, - 0x6f, 0x5e, 0x88, 0x08, 0x28, 0x0b, 0xda, 0x08, 0xca, 0xc0, 0x17, 0xdf, - 0x0f, 0x95, 0xc2, 0x6f, 0xd7, 0xcc, 0xdb, 0xf3, 0xde, 0xf1, 0x3d, 0xe9, - 0x5b, 0x9a, 0x76, 0x3f, 0xf8, 0x40, 0x0b, 0x8d, 0xf5, 0x35, 0x18, 0xe3, - 0xd0, 0xda, 0x62, 0x8c, 0x23, 0x95, 0x4a, 0xf2, 0xfa, 0xbb, 0xdd, 0xa5, - 0xb1, 0xf1, 0x78, 0xc5, 0xe7, 0x07, 0xee, 0x9f, 0xd1, 0x92, 0xc4, 0xa6, - 0x1d, 0xe7, 0xdc, 0xbe, 0xdd, 0x2b, 0x50, 0x06, 0x22, 0x0b, 0xca, 0x40, - 0xac, 0x61, 0xa8, 0x2f, 0x64, 0xe0, 0x58, 0x86, 0x6d, 0x6d, 0xcb, 0xb8, - 0x6b, 0x5d, 0x33, 0x5a, 0x83, 0x52, 0x60, 0xed, 0x34, 0xd8, 0x39, 0xc7, - 0xdf, 0x83, 0x15, 0xf6, 0x7e, 0x78, 0xaa, 0xe3, 0x87, 0xd3, 0x89, 0x97, - 0x39, 0xb5, 0xb9, 0x7f, 0x0a, 0xec, 0xff, 0x5b, 0x6e, 0x46, 0xc1, 0x70, - 0xcf, 0x10, 0xf5, 0x26, 0xe2, 0x8d, 0x17, 0xd7, 0x30, 0xa7, 0x16, 0xac, - 0xbd, 0x7a, 0x1b, 0x45, 0x1c, 0xad, 0x2b, 0x9b, 0xd8, 0xb4, 0xae, 0xb9, - 0x5d, 0xa4, 0xf0, 0x69, 0xe7, 0x29, 0xa6, 0xc1, 0x56, 0xa6, 0xc1, 0xa5, - 0xf3, 0x21, 0x43, 0x27, 0xfa, 0x79, 0xb8, 0x2d, 0x4d, 0x7a, 0x79, 0xed, - 0x35, 0xdf, 0x05, 0x60, 0xb4, 0x62, 0xd8, 0xdf, 0x71, 0x09, 0x9c, 0x43, - 0xeb, 0xb9, 0x64, 0x8a, 0xa3, 0xfb, 0x58, 0x73, 0x64, 0x2d, 0x22, 0xe0, - 0x1c, 0xfe, 0x95, 0xd5, 0x8c, 0x8f, 0x8c, 0x73, 0xcf, 0xfa, 0x25, 0xff, - 0x0b, 0x2d, 0x55, 0x85, 0xad, 0xbb, 0x32, 0xb4, 0xdd, 0x7b, 0x33, 0xb7, - 0x2e, 0xab, 0x43, 0x04, 0xd2, 0xab, 0x16, 0xa7, 0xcb, 0x55, 0xfb, 0x8a, - 0x36, 0x94, 0xf6, 0x7f, 0x70, 0xbc, 0xde, 0xb7, 0x32, 0x9d, 0xe0, 0x2d, - 0x5d, 0xc8, 0xce, 0x83, 0xa7, 0xd9, 0xb0, 0x5e, 0x70, 0x16, 0xac, 0x58, - 0xac, 0x15, 0xc4, 0x38, 0xc4, 0x3a, 0xcc, 0xa4, 0xff, 0xdd, 0xaf, 0x45, - 0x1e, 0xdb, 0xd2, 0xc2, 0xac, 0x05, 0x4d, 0x1c, 0x19, 0x00, 0x11, 0x98, - 0x9d, 0x82, 0xdf, 0x7a, 0xc7, 0xea, 0x07, 0x3b, 0xfb, 0xb2, 0x40, 0xd7, - 0x8c, 0x56, 0x7c, 0x75, 0x38, 0x47, 0xfa, 0xf6, 0x05, 0xac, 0x5e, 0xea, - 0x33, 0xef, 0xa6, 0x39, 0x04, 0xe2, 0x08, 0x95, 0x23, 0x54, 0x10, 0x44, - 0x8e, 0x40, 0x0b, 0x51, 0x04, 0xcf, 0xae, 0x5c, 0x4c, 0x5c, 0xe3, 0xd3, - 0x73, 0x6e, 0x02, 0x9a, 0xf0, 0xa0, 0x30, 0x10, 0x92, 0x3d, 0xd6, 0x6f, - 0x91, 0x4a, 0x9a, 0x84, 0x7b, 0x7b, 0x06, 0xf8, 0xf0, 0xd1, 0x2c, 0x99, - 0xcf, 0x5a, 0x29, 0x64, 0x35, 0x8d, 0xf3, 0x7d, 0xa4, 0x0e, 0x72, 0x65, - 0xc8, 0x97, 0x61, 0xe0, 0x22, 0x54, 0x46, 0x21, 0x1f, 0x43, 0x3e, 0x0b, - 0xc5, 0x92, 0x25, 0x9f, 0x8b, 0x09, 0x0a, 0x15, 0x2e, 0x9e, 0xc9, 0x52, - 0x1a, 0xae, 0x96, 0x88, 0x12, 0x83, 0xd4, 0xdb, 0x55, 0x78, 0xae, 0xcb, - 0x37, 0x66, 0x02, 0xfa, 0x63, 0x4f, 0xc8, 0xa6, 0x3b, 0x1b, 0xa8, 0x4d, - 0x41, 0xcd, 0xc2, 0x1a, 0x7a, 0x33, 0xe3, 0x2c, 0x58, 0xde, 0x40, 0xe6, - 0x02, 0xf4, 0x0d, 0xc0, 0x48, 0xce, 0x90, 0xcb, 0x5b, 0x2e, 0xe5, 0x0d, - 0xb9, 0xbc, 0x21, 0x28, 0x85, 0x84, 0xa5, 0x2a, 0xa5, 0xe1, 0x51, 0x9c, - 0x72, 0x10, 0x90, 0xc5, 0xb7, 0x3e, 0xd8, 0xb3, 0x64, 0x1e, 0xea, 0xf7, - 0x65, 0x52, 0x6e, 0x47, 0xba, 0x8b, 0x6c, 0xdb, 0xd8, 0x4c, 0x55, 0xe0, - 0x52, 0x0c, 0x59, 0xaf, 0x81, 0x3f, 0x4f, 0x5a, 0xc4, 0x25, 0x09, 0x22, - 0x87, 0x52, 0x10, 0x29, 0x21, 0x56, 0x8e, 0x28, 0x16, 0xf2, 0xb9, 0x00, - 0x1d, 0x68, 0x98, 0x3b, 0x17, 0x6c, 0x0c, 0xc4, 0x90, 0x54, 0x4d, 0x38, - 0x39, 0x00, 0xe0, 0x89, 0x15, 0xc6, 0xab, 0xf0, 0xfb, 0xd9, 0x12, 0x8f, - 0xb7, 0xd5, 0x91, 0x29, 0xc2, 0x85, 0x22, 0x44, 0x40, 0xb1, 0x2c, 0x8c, - 0x55, 0x84, 0x58, 0x3b, 0x22, 0xe5, 0x50, 0x1a, 0x4a, 0x63, 0x9a, 0x91, - 0x91, 0x00, 0xeb, 0xcf, 0xc6, 0x4b, 0xcd, 0x9e, 0x29, 0x97, 0xa4, 0x69, - 0xc4, 0xd2, 0x31, 0xa9, 0x63, 0x38, 0x7c, 0xac, 0xcc, 0x7d, 0xab, 0x1b, - 0x19, 0xa9, 0x40, 0x9d, 0x0f, 0x4b, 0x52, 0x50, 0x67, 0xa1, 0x61, 0x89, - 0xcf, 0x58, 0x51, 0x61, 0xfc, 0x04, 0xcd, 0x62, 0x68, 0xd0, 0x11, 0xf5, - 0x8b, 0x14, 0xb7, 0x35, 0x25, 0x91, 0x38, 0x46, 0x82, 0x18, 0x13, 0x6b, - 0xc2, 0xc0, 0x90, 0x2b, 0xc8, 0xfc, 0x81, 0x41, 0x9d, 0xa5, 0x7f, 0xcb, - 0x49, 0x00, 0xdf, 0x58, 0x47, 0xd7, 0x2f, 0x05, 0x76, 0x3c, 0xba, 0x88, - 0x3b, 0xea, 0x27, 0x6f, 0x9e, 0x07, 0x5a, 0x43, 0x14, 0x39, 0xb4, 0xf6, - 0x88, 0x63, 0x43, 0x1c, 0x5b, 0x94, 0xf2, 0x50, 0xca, 0x27, 0x8a, 0x0c, - 0x5a, 0xfb, 0x44, 0x51, 0x2d, 0x4a, 0xd5, 0xa0, 0x54, 0x8a, 0x2f, 0x8f, - 0x8e, 0xcd, 0xff, 0xe4, 0xbc, 0xfb, 0xe6, 0xb2, 0x74, 0xab, 0x81, 0xa1, - 0x7f, 0xa0, 0xcc, 0x23, 0x1b, 0x66, 0x0e, 0x85, 0xe7, 0x81, 0xef, 0x7b, - 0x24, 0x93, 0x09, 0x3c, 0xcf, 0x9b, 0xf4, 0xbd, 0xcb, 0xbe, 0xe7, 0x4d, - 0x9c, 0x4d, 0xf9, 0x3f, 0x9f, 0x09, 0x41, 0xdc, 0xd7, 0x53, 0xf9, 0x7e, - 0x61, 0xb8, 0xca, 0x73, 0x4f, 0xb4, 0xfc, 0x67, 0xba, 0x92, 0xc9, 0x09, - 0x73, 0x38, 0x44, 0x0c, 0xb1, 0xd2, 0x84, 0x51, 0x4c, 0x18, 0x6a, 0x82, - 0x40, 0x11, 0xc5, 0x31, 0x51, 0xa8, 0xd1, 0x5a, 0x88, 0xb5, 0xa1, 0xef, - 0xaf, 0x00, 0x2e, 0x6c, 0xed, 0xb8, 0x0c, 0xc6, 0x4b, 0xd0, 0x79, 0xa2, - 0xc8, 0xdd, 0xcf, 0x8f, 0xe1, 0xc4, 0x21, 0x02, 0x88, 0x43, 0x44, 0xb0, - 0x56, 0xb0, 0x5a, 0x30, 0xc6, 0x60, 0x8d, 0x60, 0x8d, 0xc1, 0x18, 0x8b, - 0xd1, 0x16, 0x31, 0x32, 0xb1, 0x8b, 0xa5, 0x1a, 0x38, 0x08, 0x5c, 0xc7, - 0x95, 0x85, 0x25, 0x6e, 0xd4, 0x67, 0xfa, 0x0f, 0x0f, 0x45, 0x7a, 0xf9, - 0x30, 0x7a, 0xb8, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, - 0xae, 0x42, 0x60, 0x82; - -our $image5; -our $image5_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x02, - 0xc2, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xd5, 0x94, 0x3d, 0x8f, 0x1c, - 0x45, 0x10, 0x86, 0x9f, 0xd9, 0x9d, 0x35, 0x77, 0x3e, 0xf0, 0xc7, 0x05, - 0xc8, 0x32, 0x92, 0x03, 0x02, 0x10, 0x01, 0x82, 0x7f, 0x80, 0x90, 0x90, - 0x08, 0x10, 0x88, 0x3f, 0x00, 0x31, 0x11, 0x22, 0x75, 0x06, 0xd1, 0x45, - 0x04, 0xfc, 0x03, 0x62, 0x48, 0x40, 0x20, 0x41, 0x82, 0x21, 0x73, 0x00, - 0x42, 0x32, 0x10, 0xfa, 0x64, 0x19, 0x64, 0xc9, 0xbe, 0x15, 0x77, 0xbb, - 0x33, 0xbb, 0xd3, 0xdd, 0x55, 0xd5, 0xd5, 0x04, 0x33, 0x3b, 0xc7, 0xc9, - 0x6b, 0x3b, 0x76, 0x4b, 0xad, 0xaa, 0xee, 0x19, 0xbd, 0xfd, 0xf4, 0xdb, - 0xd5, 0x0d, 0x4f, 0x5b, 0xab, 0x36, 0xc9, 0x0f, 0x3f, 0xfe, 0xfa, 0x51, - 0x5d, 0x4f, 0x0f, 0x54, 0x33, 0xb3, 0x7a, 0x42, 0xd3, 0x76, 0xc4, 0xa4, - 0x64, 0xcb, 0xcc, 0xea, 0x29, 0x66, 0x19, 0x11, 0xc5, 0x2c, 0xa3, 0x6a, - 0xa8, 0x6e, 0xa2, 0x71, 0xe7, 0x9f, 0x39, 0xf3, 0xa3, 0xc5, 0x77, 0xcd, - 0x62, 0xf5, 0xf1, 0xcf, 0x37, 0x3e, 0x5f, 0x00, 0xd4, 0x1b, 0xe1, 0xba, - 0x9e, 0x1e, 0xbc, 0xf4, 0xca, 0xb5, 0x4b, 0x50, 0x71, 0xed, 0xea, 0x3e, - 0x9f, 0x7e, 0xf1, 0x0d, 0xcb, 0x26, 0x70, 0xe1, 0xb9, 0x5d, 0x3e, 0xfb, - 0xe4, 0xfd, 0xc7, 0xd2, 0x7d, 0x7f, 0xe3, 0x16, 0x7f, 0xde, 0xba, 0xfd, - 0xc1, 0xb7, 0x5f, 0xfd, 0x02, 0xf0, 0xe1, 0x19, 0xe1, 0x94, 0x94, 0x2e, - 0x0a, 0xd5, 0xb0, 0x89, 0x9b, 0xbf, 0x1f, 0x72, 0xf9, 0xc2, 0x79, 0xea, - 0x7a, 0xf2, 0xc4, 0x6d, 0x2f, 0x9a, 0x0e, 0x07, 0xdc, 0xf3, 0xbb, 0x23, - 0xe8, 0x26, 0x91, 0x61, 0x7b, 0x55, 0xd5, 0x0b, 0xef, 0x5f, 0xdc, 0xe3, - 0xe5, 0x17, 0xaf, 0xf0, 0xc2, 0x95, 0xcb, 0x4f, 0x14, 0x16, 0x31, 0x96, - 0xcb, 0x15, 0x29, 0xc9, 0x38, 0x77, 0x2a, 0x2c, 0x8a, 0xa8, 0x31, 0xa9, - 0x7a, 0xc2, 0xb7, 0xdf, 0x78, 0x95, 0xab, 0xcf, 0x5f, 0x64, 0xff, 0xd2, - 0xb3, 0x8f, 0x15, 0x75, 0x2f, 0x2c, 0x9b, 0x96, 0xe5, 0xa2, 0xc1, 0x2c, - 0x3f, 0x2c, 0x9c, 0xc4, 0x10, 0xcd, 0x94, 0x62, 0x9c, 0x34, 0x1d, 0xef, - 0xbd, 0xf5, 0x3a, 0xa5, 0x14, 0x4a, 0x81, 0xf9, 0x71, 0x3b, 0xe4, 0xfd, - 0x78, 0x13, 0xcd, 0x8c, 0x93, 0x93, 0x96, 0xa3, 0x07, 0xc7, 0x74, 0x21, - 0x62, 0x66, 0xdb, 0x88, 0x7b, 0x2b, 0xba, 0x98, 0xf8, 0xed, 0x8f, 0x3b, - 0xa8, 0x65, 0xcc, 0x32, 0x96, 0x7d, 0xc8, 0xbd, 0xaf, 0x88, 0x9c, 0x11, - 0x31, 0x62, 0x48, 0x34, 0xcb, 0x96, 0xf5, 0x3a, 0x70, 0x7c, 0xd2, 0x12, - 0xa3, 0x3c, 0x8a, 0x58, 0x11, 0x55, 0x42, 0x1c, 0x4a, 0xca, 0x72, 0x5f, - 0x52, 0x96, 0x07, 0xff, 0x8d, 0x98, 0x94, 0x18, 0x85, 0xb6, 0x5d, 0x11, - 0xba, 0x48, 0x4a, 0x42, 0x4a, 0x8a, 0x88, 0x10, 0x63, 0x24, 0xe7, 0x2d, - 0xc2, 0x3a, 0x58, 0xe1, 0xee, 0x9c, 0xdf, 0x3d, 0x87, 0x65, 0x1f, 0x6a, - 0xd7, 0xa8, 0x8a, 0xe3, 0x06, 0x93, 0x92, 0x99, 0x96, 0xcc, 0xce, 0x6c, - 0xca, 0x64, 0xf7, 0x1c, 0xb3, 0x49, 0xc5, 0x6c, 0x3a, 0xe1, 0x28, 0x04, - 0x52, 0x12, 0x72, 0xf6, 0x47, 0x11, 0x1b, 0x3b, 0xcf, 0xcc, 0x78, 0xe7, - 0xcd, 0xd7, 0x70, 0x77, 0x42, 0x10, 0x42, 0x48, 0xa4, 0xa4, 0xa8, 0xda, - 0x60, 0x97, 0xf5, 0x07, 0x2d, 0x36, 0xf6, 0x2f, 0xbf, 0xfe, 0x89, 0x79, - 0x48, 0x8f, 0xf7, 0x18, 0xc0, 0x2c, 0x13, 0x42, 0x22, 0x04, 0x41, 0xd5, - 0xb6, 0x08, 0x9f, 0x5d, 0x20, 0x89, 0x20, 0xa2, 0xdb, 0xad, 0x48, 0x49, - 0x11, 0xcd, 0x98, 0x1a, 0x77, 0xef, 0xfe, 0xcb, 0xfd, 0xfb, 0x0d, 0xaa, - 0x36, 0x5c, 0x61, 0x1d, 0xae, 0xb0, 0x8e, 0xf6, 0x98, 0xf5, 0xe2, 0x3b, - 0x3b, 0x35, 0x29, 0x0a, 0x49, 0xd2, 0x76, 0x61, 0x19, 0xc8, 0x4c, 0x95, - 0xaa, 0x2a, 0xec, 0xed, 0xd5, 0x88, 0x80, 0x2a, 0xd4, 0x75, 0xa1, 0xae, - 0x61, 0x3a, 0x2d, 0x98, 0xc1, 0x64, 0x52, 0x50, 0x2d, 0x54, 0x55, 0x01, - 0x1c, 0x19, 0x88, 0xdd, 0xb7, 0x79, 0x9c, 0x94, 0xd5, 0xba, 0x23, 0x9b, - 0xb1, 0x5a, 0x45, 0x16, 0x8b, 0x6e, 0xa4, 0xea, 0x09, 0x4f, 0x1f, 0x21, - 0x11, 0x1d, 0x1f, 0xa1, 0xd9, 0xac, 0x1a, 0xac, 0x90, 0xed, 0xc4, 0x31, - 0x24, 0xd6, 0xeb, 0x40, 0x71, 0x47, 0xd5, 0x70, 0xcf, 0xe4, 0xfc, 0x70, - 0x37, 0xeb, 0xa3, 0xbb, 0x8d, 0x42, 0xfd, 0x42, 0xb2, 0x9d, 0x38, 0xc4, - 0x44, 0x08, 0x09, 0xbc, 0x60, 0x66, 0x94, 0xe2, 0xb8, 0xf7, 0xbd, 0xcf, - 0xf3, 0x30, 0xee, 0x63, 0xce, 0x9b, 0xbc, 0xa0, 0x22, 0xa8, 0x28, 0xee, - 0x5b, 0x88, 0xc3, 0x3a, 0xb2, 0x5e, 0xb4, 0xe4, 0x6c, 0xac, 0x56, 0xcb, - 0xf1, 0xe4, 0x4f, 0xab, 0xe0, 0xec, 0x21, 0xaa, 0xe6, 0xf1, 0x9f, 0x75, - 0xdb, 0x90, 0xba, 0x35, 0xbe, 0xad, 0x8e, 0x8f, 0xe7, 0x8b, 0xeb, 0xf7, - 0xfe, 0x7e, 0x70, 0x10, 0x53, 0xe2, 0xf6, 0x5f, 0x87, 0xe4, 0x5c, 0x46, - 0xe2, 0x9c, 0x0b, 0xa5, 0xf8, 0xff, 0xe6, 0x4e, 0xbf, 0xb9, 0x17, 0xee, - 0x1d, 0xce, 0xe9, 0x82, 0xe2, 0xce, 0x75, 0x9e, 0xda, 0xf6, 0x1f, 0x12, - 0x1a, 0xe0, 0xff, 0x0b, 0x36, 0xcf, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image6; -our $image6_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x03, - 0xfe, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xd5, 0x93, 0xcb, 0x6b, 0x5d, - 0x55, 0x14, 0x87, 0xbf, 0x73, 0xee, 0x39, 0x37, 0x8f, 0x9b, 0xf7, 0xa3, - 0xa6, 0xe9, 0x4b, 0x69, 0x4b, 0x2b, 0xb6, 0x5a, 0x11, 0x11, 0xa1, 0x3a, - 0x10, 0x2b, 0x82, 0xed, 0xc0, 0xfe, 0x0d, 0x0a, 0x82, 0xe0, 0xd0, 0x06, - 0x67, 0x0e, 0x04, 0x1d, 0x8a, 0xa8, 0xd3, 0x82, 0x38, 0xd1, 0x81, 0x20, - 0x52, 0x2c, 0xad, 0x52, 0x07, 0xc5, 0x96, 0xda, 0x12, 0x1f, 0x55, 0xaa, - 0xd6, 0x9b, 0x3e, 0xd2, 0xa4, 0x49, 0x9a, 0x9b, 0x7b, 0xef, 0x39, 0x67, - 0x9f, 0xbd, 0xd7, 0x7e, 0x38, 0x48, 0x4c, 0x93, 0xb6, 0x0a, 0x1d, 0xba, - 0x26, 0x6b, 0xb3, 0xf8, 0xf1, 0xb1, 0xd6, 0x6f, 0xed, 0x15, 0x71, 0x1f, - 0xb1, 0xf0, 0x3e, 0xd5, 0x64, 0x3c, 0xfd, 0xc0, 0x0d, 0xbc, 0xf9, 0x6a, - 0x73, 0xaa, 0x7d, 0xb5, 0x3d, 0x75, 0xe9, 0xa3, 0xb9, 0xb3, 0xc7, 0x8f, - 0x1e, 0x38, 0xc9, 0xdc, 0x9d, 0xda, 0xe4, 0x7e, 0xc0, 0x71, 0x37, 0xbb, - 0xba, 0x76, 0x86, 0xfd, 0xd5, 0x91, 0xeb, 0xd1, 0xe0, 0xde, 0x57, 0xb6, - 0x35, 0xeb, 0xd3, 0x6f, 0x07, 0x67, 0xfb, 0x4e, 0xf0, 0xcd, 0x3b, 0x07, - 0x4e, 0xa2, 0xd6, 0x81, 0xbf, 0x3e, 0x7e, 0xee, 0x48, 0x5c, 0x89, 0x27, - 0xac, 0x78, 0xd2, 0x24, 0xa6, 0xd9, 0xca, 0xd1, 0xc6, 0xe2, 0xac, 0x23, - 0x4d, 0x2a, 0x58, 0x6b, 0x31, 0xc6, 0x62, 0xad, 0xe3, 0xd7, 0x8e, 0x0f, - 0x93, 0xa7, 0xfb, 0x8f, 0xd7, 0xb8, 0xf6, 0x29, 0x51, 0xfb, 0x04, 0x5d, - 0x0b, 0x8f, 0x76, 0xde, 0xca, 0x8b, 0x87, 0x3f, 0x0b, 0x2f, 0x77, 0xc2, - 0x17, 0xeb, 0xc1, 0x69, 0x35, 0x7d, 0x77, 0xc7, 0xce, 0xcd, 0xc4, 0x95, - 0x98, 0xcd, 0x63, 0x83, 0x1c, 0x79, 0xef, 0x73, 0x8c, 0xb1, 0x3c, 0x30, - 0xda, 0xc7, 0xc4, 0x6b, 0x2f, 0xad, 0x0a, 0x83, 0x64, 0x98, 0x5f, 0x5e, - 0x27, 0xf6, 0x31, 0x94, 0x40, 0xd3, 0xb3, 0x78, 0x75, 0x96, 0x1f, 0xd2, - 0x83, 0x87, 0xcf, 0x37, 0x16, 0xa6, 0x81, 0x37, 0xd6, 0x4d, 0xa7, 0xb5, - 0x50, 0x94, 0x86, 0x52, 0x1b, 0x00, 0x4e, 0x9f, 0xff, 0x83, 0xd9, 0xf9, - 0x26, 0xaa, 0x34, 0x6b, 0x64, 0x01, 0x5b, 0x3f, 0x4a, 0x75, 0x64, 0x06, - 0x5a, 0xdd, 0x20, 0xfd, 0xf8, 0x76, 0x2f, 0xbf, 0x15, 0xdb, 0x31, 0x1b, - 0xf7, 0xe0, 0xbd, 0x3b, 0x74, 0x97, 0xc7, 0x46, 0x2c, 0x46, 0x1c, 0x61, - 0xa5, 0x30, 0x32, 0xd8, 0xc3, 0xee, 0xed, 0x1b, 0x79, 0x68, 0xeb, 0xe8, - 0xaa, 0xc8, 0xe7, 0x37, 0x20, 0x1c, 0x23, 0x0a, 0x03, 0xa0, 0x3b, 0xa0, - 0xec, 0xa2, 0xb9, 0x50, 0xe5, 0xf7, 0xae, 0xa7, 0x68, 0xb6, 0x0a, 0x8c, - 0xc8, 0x5d, 0xfb, 0x48, 0x8c, 0xb1, 0x18, 0xb1, 0x44, 0xd1, 0x72, 0xe1, - 0xe0, 0x73, 0xfb, 0xd8, 0x3a, 0x3e, 0xcc, 0x86, 0xe1, 0xde, 0x95, 0x66, - 0x03, 0xbe, 0x71, 0x8a, 0xb8, 0xa3, 0x0e, 0xd9, 0x10, 0xf8, 0x0a, 0x2e, - 0xeb, 0xc3, 0x6e, 0x7a, 0x9c, 0xf9, 0xeb, 0x63, 0x34, 0x9b, 0x0d, 0xac, - 0x75, 0xf7, 0x02, 0x0b, 0x46, 0x2c, 0xce, 0x7b, 0x1a, 0xad, 0x82, 0xc3, - 0x2f, 0x3e, 0x41, 0x08, 0x81, 0x10, 0x02, 0xf3, 0x8b, 0x6d, 0x70, 0x8a, - 0xfe, 0xf6, 0x57, 0x54, 0x07, 0x7b, 0x60, 0xb1, 0x02, 0xba, 0x83, 0x76, - 0x5e, 0xe5, 0x72, 0x6d, 0x2f, 0x4b, 0xb9, 0x43, 0x15, 0xe5, 0xbf, 0x81, - 0x2d, 0x22, 0x8e, 0x56, 0x56, 0x72, 0xee, 0xa7, 0x3a, 0xd6, 0x3a, 0xac, - 0x75, 0x88, 0xf5, 0x58, 0xe7, 0x18, 0xf5, 0x17, 0x78, 0x76, 0xcf, 0x34, - 0xa8, 0x41, 0x20, 0x80, 0xd4, 0xb8, 0x38, 0x2d, 0x7c, 0xa9, 0x2d, 0x8b, - 0x79, 0x9b, 0x52, 0x6b, 0x9c, 0xfb, 0x8f, 0x8e, 0x55, 0x69, 0x10, 0xeb, - 0x10, 0x71, 0xcb, 0xd9, 0x3a, 0x82, 0xe4, 0x3c, 0x36, 0x76, 0x86, 0xa4, - 0x6f, 0x1c, 0x16, 0x04, 0x5c, 0x42, 0xd1, 0x70, 0x9c, 0xba, 0xb9, 0x91, - 0x1b, 0x91, 0xc3, 0x18, 0x83, 0x52, 0x6b, 0xc1, 0xfb, 0x60, 0xf9, 0x36, - 0x5c, 0x62, 0xc4, 0x61, 0xc4, 0xe1, 0x7d, 0xa0, 0xd6, 0x55, 0xc5, 0xa6, - 0xcb, 0x9d, 0x6a, 0x6d, 0xe9, 0xe3, 0x47, 0x36, 0x6d, 0x0b, 0x60, 0x7a, - 0x00, 0x03, 0xb6, 0x87, 0xbf, 0xae, 0xcd, 0xd0, 0xec, 0xdb, 0x4d, 0x8f, - 0x4b, 0xb9, 0x99, 0x17, 0x68, 0x6d, 0x70, 0xce, 0x03, 0xfb, 0x52, 0xa0, - 0x0b, 0xa8, 0x02, 0x26, 0xd1, 0x5a, 0x30, 0x22, 0xf4, 0xf6, 0x74, 0xf2, - 0xc2, 0xfe, 0x47, 0x70, 0xce, 0x53, 0x96, 0x06, 0x95, 0x35, 0xe9, 0x6c, - 0x9e, 0xa6, 0x36, 0x34, 0x0a, 0x6d, 0x03, 0xa1, 0x46, 0xde, 0x70, 0xc8, - 0x96, 0xe7, 0x39, 0xf4, 0xe4, 0x33, 0x18, 0x71, 0x7c, 0xfc, 0xc9, 0x31, - 0x8a, 0x42, 0x21, 0x62, 0x2a, 0xc0, 0xc8, 0x1a, 0x27, 0xd2, 0x58, 0x56, - 0xbe, 0xdb, 0x3f, 0xde, 0xe6, 0xb9, 0x22, 0xcf, 0x4b, 0xa4, 0x5c, 0xa2, - 0x23, 0xaa, 0x13, 0x45, 0x03, 0x40, 0x37, 0xf8, 0x21, 0x6e, 0x35, 0x22, - 0xda, 0xe9, 0x16, 0x54, 0x69, 0x68, 0xb5, 0x32, 0xf2, 0xbc, 0x40, 0x15, - 0xea, 0xde, 0x1e, 0x6b, 0x2d, 0x88, 0x38, 0x8a, 0x42, 0x53, 0xaf, 0x2f, - 0x30, 0x37, 0xd7, 0x46, 0xc4, 0x52, 0xb1, 0x0d, 0x86, 0xc7, 0xc7, 0x40, - 0x86, 0x21, 0xaa, 0xe2, 0x6c, 0xcc, 0xcf, 0xd7, 0x14, 0x53, 0x3d, 0x31, - 0xaa, 0x9c, 0xa2, 0xb3, 0x33, 0x41, 0xa9, 0x12, 0x63, 0x0c, 0xde, 0xf9, - 0x3b, 0xb9, 0x3e, 0x31, 0x62, 0x29, 0xb5, 0xc1, 0x1a, 0x43, 0x1c, 0x07, - 0xba, 0xbb, 0x13, 0x44, 0x02, 0x49, 0xd6, 0xc2, 0xfb, 0xed, 0x50, 0xdd, - 0x85, 0x93, 0x19, 0xea, 0x93, 0xdf, 0x32, 0xdb, 0xb1, 0x17, 0x22, 0x4f, - 0x9a, 0xc6, 0x84, 0xe0, 0x11, 0x23, 0x88, 0x11, 0xbc, 0x5f, 0x05, 0x3b, - 0x96, 0x0f, 0x5e, 0x27, 0x5a, 0x0b, 0xed, 0xac, 0xa0, 0x5a, 0x89, 0xc9, - 0xb2, 0x92, 0x66, 0xb3, 0x40, 0xc4, 0xd2, 0xb1, 0x34, 0x4f, 0x36, 0x34, - 0x40, 0x54, 0x44, 0x5c, 0x3e, 0x53, 0xe7, 0xec, 0xcc, 0x83, 0x2c, 0x25, - 0xbd, 0xd8, 0x4c, 0x61, 0xad, 0x23, 0x4d, 0x63, 0x8c, 0x11, 0x8c, 0x15, - 0xbc, 0xf7, 0x01, 0x68, 0xad, 0x40, 0x3d, 0x4c, 0x86, 0x44, 0x29, 0x4d, - 0x91, 0x2b, 0x7c, 0x9a, 0x20, 0x62, 0x71, 0xce, 0xe1, 0xbd, 0x23, 0xcb, - 0x0c, 0xdf, 0x7f, 0x77, 0x9e, 0xee, 0xca, 0x24, 0x7f, 0xb6, 0x06, 0x50, - 0xdd, 0x9b, 0xf0, 0x62, 0xf1, 0xde, 0xe1, 0x9c, 0x23, 0x8a, 0x02, 0xce, - 0x59, 0xbc, 0xb3, 0x04, 0x82, 0x87, 0xc9, 0x7c, 0xad, 0x17, 0xb1, 0x52, - 0x1a, 0xa5, 0x0c, 0x65, 0x69, 0xb0, 0xd6, 0x12, 0x82, 0xc7, 0x7b, 0x8f, - 0x37, 0x96, 0x72, 0xfa, 0x0a, 0x57, 0xcc, 0x18, 0xa6, 0x77, 0x33, 0x21, - 0x84, 0xd5, 0x91, 0x93, 0xa4, 0x42, 0xb5, 0x9a, 0xe2, 0xbc, 0x47, 0xac, - 0x5b, 0x6b, 0xc5, 0xed, 0xe5, 0xa9, 0xa2, 0x24, 0x5b, 0x6a, 0x61, 0x92, - 0x98, 0x3c, 0x6f, 0x21, 0x62, 0x11, 0xb1, 0x98, 0xda, 0x06, 0xf4, 0x8e, - 0x03, 0x84, 0x4a, 0x8d, 0x54, 0x2c, 0xb0, 0x3c, 0x49, 0x08, 0x60, 0xad, - 0x43, 0x29, 0x8d, 0x6a, 0xb7, 0xd0, 0x45, 0x7e, 0xaf, 0xe5, 0x91, 0xcc, - 0xcf, 0x2e, 0x4e, 0x4c, 0x5d, 0x9e, 0x9e, 0x10, 0x11, 0x2e, 0x5e, 0xb8, - 0x84, 0xf7, 0xcb, 0x9d, 0x39, 0xe7, 0x57, 0xdf, 0xb7, 0xf3, 0xfa, 0xda, - 0xec, 0x95, 0x06, 0x5a, 0x5b, 0xbc, 0x8f, 0xde, 0xba, 0x8b, 0xfc, 0xbf, - 0x8b, 0xbf, 0x01, 0xe8, 0x70, 0xcb, 0xc9, 0xb3, 0x58, 0x58, 0xb9, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image7; -our $image7_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x03, - 0xb2, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0x95, 0x94, 0xdb, 0x6f, 0xd4, - 0x45, 0x14, 0xc7, 0x3f, 0xf3, 0xbb, 0x75, 0xdb, 0xdd, 0xa5, 0x5d, 0x8c, - 0xdb, 0xb4, 0x20, 0x0a, 0x4d, 0x4b, 0x5b, 0xd3, 0x28, 0x44, 0x14, 0xa3, - 0x08, 0x45, 0x68, 0xda, 0xd8, 0x10, 0x62, 0xa4, 0x12, 0x0d, 0xbe, 0xf2, - 0x37, 0xc0, 0x83, 0xc4, 0x57, 0x5f, 0x89, 0xa4, 0x0f, 0x3e, 0x61, 0xa2, - 0x31, 0xa2, 0x4f, 0x3e, 0xd9, 0x12, 0xde, 0x08, 0xac, 0xb4, 0x84, 0xb2, - 0x81, 0xa4, 0x2c, 0x50, 0xed, 0x65, 0xd3, 0xd2, 0xad, 0x2c, 0xdd, 0xcb, - 0xef, 0xd7, 0xdf, 0x5c, 0x7c, 0xe8, 0x05, 0xb6, 0xed, 0x72, 0xf9, 0x26, - 0x93, 0xc9, 0x9c, 0x73, 0xe6, 0x33, 0x27, 0x33, 0x67, 0x8e, 0xa0, 0x8a, - 0x86, 0x87, 0x53, 0xd9, 0x64, 0x32, 0x91, 0xa8, 0xe6, 0x07, 0xb8, 0x73, - 0x27, 0x93, 0x3a, 0x79, 0xb2, 0xef, 0x93, 0xcd, 0x7c, 0x4e, 0xb5, 0x4d, - 0xdb, 0xb6, 0x25, 0x93, 0xed, 0xed, 0x6f, 0x5a, 0xeb, 0xed, 0x4a, 0x1b, - 0xb4, 0x31, 0x18, 0x03, 0x73, 0x73, 0xb9, 0x9d, 0x80, 0x00, 0xcc, 0x4b, - 0x83, 0x8d, 0xd9, 0x10, 0x8b, 0xd2, 0x06, 0xa5, 0x0d, 0x52, 0x69, 0x84, - 0x10, 0x68, 0xad, 0xaa, 0x6d, 0xaf, 0x0e, 0x56, 0x4a, 0x56, 0x85, 0x2a, - 0x6d, 0x10, 0x16, 0x84, 0x61, 0xf8, 0xea, 0x60, 0x29, 0x9f, 0x82, 0xd7, - 0x43, 0xa5, 0x32, 0xd8, 0xa6, 0x32, 0xe6, 0x15, 0x32, 0x56, 0x55, 0xa1, - 0x4a, 0x6b, 0xb4, 0x36, 0x48, 0xb9, 0x54, 0x15, 0xbc, 0xe1, 0x71, 0x00, - 0x7a, 0x7a, 0x7a, 0xda, 0xa5, 0x0c, 0xab, 0x42, 0x7d, 0x3f, 0x44, 0x4b, - 0x85, 0xef, 0xfb, 0xd1, 0xce, 0xce, 0xce, 0xba, 0xe7, 0x66, 0xdc, 0xdb, - 0xdb, 0xfb, 0x99, 0x52, 0xea, 0xc3, 0xe3, 0xc7, 0x4f, 0x7c, 0xde, 0xdc, - 0xdc, 0xdc, 0xa6, 0xb5, 0xb6, 0x56, 0xa1, 0xf2, 0x19, 0x68, 0xe0, 0x87, - 0x28, 0x29, 0x51, 0xc2, 0xc6, 0xf3, 0xdc, 0xc4, 0xd9, 0xb3, 0xe7, 0xe6, - 0x6f, 0xdd, 0x1a, 0xbd, 0x31, 0x32, 0xf2, 0xf7, 0x5f, 0x96, 0x65, 0xfd, - 0x3e, 0x3c, 0x3c, 0x7c, 0x07, 0x40, 0xf4, 0xf7, 0xf7, 0xdb, 0xfb, 0xf7, - 0x7f, 0x34, 0x3e, 0x30, 0xf0, 0xf5, 0x2e, 0xcf, 0xf3, 0x00, 0x98, 0x99, - 0xf9, 0x87, 0xa2, 0x0f, 0x7b, 0xde, 0x7b, 0x87, 0x50, 0xad, 0x42, 0x0d, - 0x7e, 0xb0, 0x02, 0x0d, 0x15, 0xb5, 0x9e, 0xc3, 0x95, 0xcb, 0x43, 0x1c, - 0x3d, 0x7c, 0x00, 0x21, 0x6c, 0x8c, 0x31, 0xe4, 0xf3, 0x79, 0x06, 0x07, - 0xcf, 0xff, 0x32, 0x38, 0xf8, 0xc3, 0x57, 0x76, 0x4b, 0x4b, 0xcb, 0xe9, - 0x33, 0x67, 0xbe, 0x3d, 0x15, 0x89, 0xd4, 0x60, 0x59, 0x16, 0x96, 0x65, - 0x71, 0xef, 0xe1, 0x04, 0xbb, 0x3a, 0xde, 0xa5, 0xbc, 0xa4, 0x09, 0x42, - 0x4d, 0x28, 0x35, 0x4a, 0x19, 0x84, 0x10, 0x58, 0xb6, 0x8d, 0xe3, 0xba, - 0x28, 0x2c, 0x88, 0x37, 0xa3, 0x0b, 0xb3, 0x04, 0x81, 0x61, 0xb1, 0x54, - 0xc2, 0xb5, 0x3d, 0xda, 0xda, 0x3a, 0xba, 0xc6, 0xc6, 0x46, 0x86, 0x9c, - 0x03, 0x07, 0xba, 0x4f, 0x47, 0x22, 0x35, 0x15, 0xf7, 0xf3, 0xb0, 0x10, - 0xa1, 0xd1, 0x8d, 0xae, 0xad, 0xa5, 0x86, 0x62, 0x68, 0x28, 0x49, 0xf0, - 0x95, 0x41, 0xea, 0x65, 0x7b, 0xe0, 0x7a, 0x88, 0xff, 0xee, 0xd3, 0xf8, - 0xfa, 0x16, 0xae, 0x67, 0xef, 0xf1, 0x7e, 0x63, 0x07, 0x0d, 0x0d, 0x0d, - 0x44, 0xa3, 0xd1, 0x2f, 0x9c, 0xae, 0xae, 0xae, 0xb7, 0x1c, 0xc7, 0x5e, - 0xa9, 0x04, 0x4d, 0xb9, 0xec, 0x93, 0x09, 0x13, 0x38, 0xf3, 0x16, 0xc5, - 0x10, 0xc6, 0xf3, 0x86, 0xd9, 0x12, 0x2c, 0x7f, 0xb0, 0xf5, 0xb2, 0xd9, - 0xbf, 0x60, 0x38, 0xf1, 0x86, 0xc7, 0xe1, 0x9d, 0x7b, 0xd6, 0xac, 0xdb, - 0xb7, 0xef, 0xd8, 0xed, 0x04, 0xc1, 0x92, 0xe7, 0xba, 0x0e, 0x52, 0x4a, - 0x82, 0x60, 0x09, 0xcf, 0x73, 0x99, 0xd0, 0xaf, 0x71, 0xe3, 0x9e, 0xe0, - 0xfa, 0x5c, 0x35, 0xe0, 0x53, 0x15, 0x0a, 0x31, 0x4e, 0x45, 0xdc, 0xb5, - 0xb5, 0xeb, 0xda, 0x24, 0x93, 0xc9, 0x46, 0x27, 0x95, 0x1a, 0x09, 0x23, - 0x91, 0x24, 0x4d, 0x4d, 0x09, 0x92, 0xc9, 0x04, 0x8e, 0x03, 0xff, 0xce, - 0xd7, 0x71, 0xfb, 0xfe, 0x73, 0x79, 0x6b, 0x9a, 0xb7, 0xb7, 0x10, 0x8d, - 0x46, 0x28, 0x14, 0xca, 0xcc, 0xcc, 0x2c, 0x90, 0xcb, 0x3d, 0x61, 0x6e, - 0x6e, 0x5e, 0x39, 0x42, 0x50, 0x54, 0x4a, 0xd7, 0x4f, 0x4d, 0xe5, 0x98, - 0x9a, 0xca, 0x21, 0x84, 0xe0, 0xfc, 0xbe, 0x38, 0x81, 0x3d, 0x4f, 0x51, - 0x3a, 0x3c, 0xf6, 0x05, 0xb9, 0x92, 0x21, 0xf3, 0x48, 0x13, 0xab, 0x11, - 0xec, 0x48, 0x08, 0x12, 0xb5, 0x50, 0x1f, 0x81, 0x5a, 0x11, 0xe2, 0xa9, - 0x12, 0x57, 0xaf, 0xce, 0x56, 0x1c, 0xa6, 0xb5, 0x7a, 0xec, 0x04, 0x41, - 0x39, 0x17, 0x8d, 0x46, 0x9a, 0x97, 0x4d, 0x86, 0xa1, 0xa1, 0x3f, 0x37, - 0xcd, 0xac, 0x61, 0x65, 0x9e, 0x59, 0x19, 0x15, 0xbe, 0x86, 0x04, 0xfb, - 0xf6, 0x7d, 0xbc, 0x4c, 0x30, 0x9a, 0x7c, 0x7e, 0x61, 0xc6, 0x29, 0x16, - 0x9f, 0x4c, 0x45, 0xa3, 0xb5, 0x5d, 0x00, 0x4b, 0x4b, 0x3e, 0xd7, 0xae, - 0x5d, 0xa1, 0xb5, 0xb5, 0x95, 0xd6, 0xd6, 0xd6, 0x97, 0xba, 0x8a, 0x54, - 0x2a, 0x45, 0x5d, 0x5d, 0x9c, 0x43, 0x87, 0x8e, 0x02, 0xb0, 0xb8, 0xf8, - 0x04, 0xdf, 0xf7, 0x27, 0x9d, 0x5c, 0xee, 0xd1, 0xcf, 0x42, 0xa8, 0xbe, - 0x58, 0x2c, 0x8e, 0xef, 0x1b, 0xfa, 0xfa, 0xfa, 0x39, 0x72, 0xe4, 0x53, - 0xb6, 0x6e, 0x6d, 0x78, 0x01, 0x72, 0x59, 0x1d, 0x1d, 0x5d, 0x64, 0xb3, - 0x59, 0xe2, 0xf1, 0x08, 0x60, 0x31, 0x3d, 0xfd, 0xc0, 0x4c, 0x4e, 0x4e, - 0xfe, 0xe1, 0xc4, 0x62, 0xb1, 0x5f, 0xc7, 0xc7, 0x6f, 0xff, 0xd8, 0xdd, - 0x7d, 0xb4, 0xa6, 0xbe, 0x3e, 0xca, 0xc1, 0x83, 0x7d, 0xec, 0xdd, 0xfb, - 0x36, 0xe2, 0xf9, 0xc5, 0x00, 0x80, 0x94, 0x8a, 0x64, 0xb2, 0x89, 0xbb, - 0x77, 0x27, 0xa8, 0xaf, 0x8f, 0x03, 0x90, 0x4e, 0x8f, 0x66, 0x32, 0x99, - 0x4c, 0xda, 0xb9, 0x78, 0xf1, 0x62, 0x98, 0x4e, 0xa7, 0xdb, 0x6e, 0xde, - 0x1c, 0xfd, 0x2e, 0x16, 0x8b, 0xed, 0x3e, 0x76, 0x6c, 0xe0, 0x03, 0x21, - 0x36, 0x6f, 0x4e, 0xeb, 0xa1, 0x52, 0x2a, 0x1c, 0xc7, 0xe6, 0xc1, 0x83, - 0xfb, 0xfe, 0xa5, 0x4b, 0x3f, 0x5d, 0xcf, 0x66, 0xa7, 0xc7, 0x2e, 0x5f, - 0x1e, 0xfe, 0x1e, 0xa8, 0xec, 0xa7, 0x17, 0x2e, 0xfc, 0xd6, 0xbb, 0xb8, - 0x58, 0x32, 0x2f, 0x52, 0x18, 0x4a, 0x53, 0x2e, 0x07, 0xa6, 0x50, 0x28, - 0x9b, 0x7c, 0xbe, 0x68, 0xd2, 0xe9, 0x71, 0xd3, 0xdd, 0xdd, 0xdf, 0xf9, - 0x2c, 0xab, 0xa2, 0x1f, 0xd7, 0xd5, 0x79, 0xdf, 0xcc, 0xce, 0x2e, 0x30, - 0x5b, 0x59, 0x3d, 0x1b, 0x64, 0x8c, 0x41, 0x4a, 0x89, 0x52, 0xcb, 0x23, - 0x0c, 0x43, 0x5c, 0xd7, 0xfd, 0x12, 0x38, 0xb7, 0x1a, 0xf3, 0x3f, 0x85, - 0xd7, 0x1e, 0x86, 0xe2, 0x2f, 0xe4, 0xea, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image8; -our $image8_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x04, - 0x57, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xa5, 0x95, 0xcd, 0x4f, 0x54, - 0x57, 0x18, 0xc6, 0x7f, 0xe7, 0x9c, 0x3b, 0x77, 0x60, 0x66, 0x98, 0x96, - 0xf1, 0x62, 0x43, 0x05, 0x04, 0x43, 0x94, 0x88, 0x2c, 0x2c, 0x28, 0x92, - 0x58, 0xa3, 0x12, 0x35, 0x36, 0x71, 0x61, 0xe2, 0x8a, 0x85, 0xd1, 0xa5, - 0x0b, 0x57, 0xa6, 0x4b, 0x57, 0xea, 0xae, 0x24, 0xea, 0xc2, 0x85, 0x5b, - 0x13, 0xfa, 0x07, 0x88, 0x64, 0xec, 0xc6, 0x84, 0xb8, 0x82, 0x51, 0x3a, - 0x52, 0xc5, 0x54, 0x8b, 0x16, 0xac, 0x7c, 0x88, 0xc0, 0xcc, 0xbd, 0xcc, - 0x17, 0x33, 0xe7, 0x74, 0x71, 0xef, 0x8c, 0xd8, 0x36, 0xdd, 0xf8, 0x26, - 0x27, 0xe7, 0x4d, 0xee, 0xb9, 0xcf, 0x79, 0xce, 0xf3, 0x7e, 0x89, 0x1f, - 0xa1, 0x25, 0xa4, 0xd4, 0xb5, 0x5d, 0x8e, 0x33, 0x64, 0x29, 0x65, 0xf3, - 0x05, 0x56, 0xae, 0x54, 0x4a, 0xb3, 0x2b, 0x2b, 0x23, 0x9b, 0x95, 0xca, - 0x55, 0x2b, 0xa4, 0xd4, 0xb5, 0x2b, 0x27, 0x4f, 0x5e, 0xc8, 0xe7, 0xf3, - 0xac, 0xb8, 0x2e, 0x18, 0xf3, 0xd9, 0x61, 0x29, 0x04, 0x52, 0x4a, 0xa4, - 0x10, 0xa8, 0x60, 0x97, 0xff, 0xdc, 0x03, 0x3f, 0x5a, 0x57, 0x67, 0x97, - 0xe1, 0xc2, 0x4f, 0x0f, 0x1f, 0x62, 0x75, 0x38, 0xce, 0xd0, 0x46, 0x2e, - 0xc7, 0xc2, 0xee, 0xdd, 0x24, 0x7a, 0x7b, 0x3f, 0x03, 0x15, 0xd5, 0x9f, - 0x84, 0x40, 0x85, 0xc3, 0x08, 0x21, 0x10, 0xe5, 0x32, 0x52, 0x08, 0xdf, - 0x0f, 0xbe, 0x55, 0xfd, 0x8d, 0xe7, 0xcf, 0x89, 0xa6, 0xd3, 0x74, 0x38, - 0xce, 0x90, 0x65, 0x49, 0x69, 0xaf, 0xb8, 0x2e, 0x0d, 0x9d, 0x9d, 0xe8, - 0x72, 0xf9, 0x33, 0xa6, 0xd1, 0x8e, 0x0e, 0xec, 0x8e, 0x0e, 0xc2, 0x4d, - 0x4d, 0x44, 0x12, 0x09, 0x00, 0x36, 0x3e, 0x7e, 0x64, 0x63, 0x69, 0x89, - 0xdc, 0xab, 0x57, 0xc4, 0xd6, 0xd7, 0x61, 0x0b, 0x70, 0xb8, 0xbd, 0x9d, - 0x52, 0x2a, 0x85, 0x25, 0xa5, 0x6d, 0x19, 0xc0, 0x18, 0xc3, 0x66, 0x36, - 0x8b, 0xde, 0xdc, 0x04, 0xc0, 0xaa, 0xaf, 0x67, 0xdb, 0x89, 0x13, 0x34, - 0xf6, 0xf4, 0xfc, 0x4b, 0xc7, 0x98, 0xe3, 0x10, 0x73, 0x1c, 0xe8, 0xee, - 0xe6, 0xcf, 0x89, 0x09, 0x54, 0x2a, 0x45, 0xbd, 0x31, 0x20, 0x25, 0xa2, - 0x58, 0x44, 0x08, 0x81, 0x01, 0x2c, 0x8c, 0x01, 0x63, 0x28, 0x65, 0x32, - 0xa8, 0x62, 0x11, 0x3b, 0x12, 0x61, 0xe7, 0xa5, 0x4b, 0xd4, 0x05, 0x0c, - 0x7f, 0x7b, 0xf4, 0x88, 0x0f, 0xcf, 0x9e, 0x51, 0x59, 0x5a, 0x22, 0x1e, - 0x0e, 0x63, 0x35, 0x37, 0x93, 0xe8, 0xe9, 0xa1, 0x7d, 0x60, 0x80, 0x9d, - 0x07, 0x0f, 0xe2, 0xee, 0xda, 0xc5, 0xfb, 0xbb, 0x77, 0x69, 0xb2, 0x2c, - 0xd8, 0xdc, 0x44, 0x00, 0x18, 0x83, 0xa5, 0x8d, 0x41, 0x1b, 0xc3, 0xea, - 0xe4, 0x24, 0x89, 0x7d, 0xfb, 0xf8, 0xe6, 0xdc, 0x39, 0xea, 0x12, 0x09, - 0x72, 0x99, 0x0c, 0xbf, 0x0c, 0x0f, 0xb3, 0xfd, 0xfd, 0x7b, 0x5a, 0x62, - 0x31, 0x5f, 0xeb, 0x62, 0x11, 0xe9, 0xba, 0xc8, 0xd7, 0xaf, 0x79, 0x93, - 0x4e, 0xd3, 0x3c, 0x34, 0x44, 0x83, 0xe3, 0xa0, 0x0e, 0x1f, 0x66, 0x33, - 0x99, 0xc4, 0x36, 0x06, 0x03, 0x68, 0x63, 0x90, 0xc6, 0x18, 0x5f, 0x8a, - 0x85, 0x05, 0x42, 0xd1, 0x28, 0x4e, 0x7f, 0x3f, 0x00, 0x63, 0x37, 0x6e, - 0xd0, 0x3e, 0x3b, 0x4b, 0x63, 0xa5, 0x82, 0xf1, 0x3c, 0xbe, 0x3a, 0x79, - 0x12, 0x75, 0xf4, 0x28, 0x85, 0x4c, 0x06, 0x3c, 0x0f, 0x7b, 0x7a, 0x9a, - 0xcc, 0xbd, 0x7b, 0x00, 0x74, 0x1e, 0x39, 0xc2, 0xbb, 0xc6, 0x46, 0xc8, - 0xe5, 0x10, 0x81, 0xb4, 0xb2, 0x9a, 0x5c, 0x4a, 0x29, 0x9a, 0x4e, 0x9d, - 0x02, 0xe0, 0xd7, 0xfb, 0xf7, 0x89, 0xa7, 0xd3, 0x58, 0xf9, 0x3c, 0xc6, - 0x75, 0xa9, 0x6f, 0x6f, 0xc7, 0x39, 0x7d, 0x9a, 0xb6, 0x33, 0x67, 0x7c, - 0x00, 0xd7, 0x05, 0xcf, 0xc3, 0xa4, 0x52, 0xac, 0x8e, 0x8f, 0x03, 0x10, - 0xef, 0xeb, 0x23, 0xb7, 0xb4, 0x84, 0x01, 0x0c, 0xf8, 0x8c, 0xa5, 0x10, - 0x58, 0x4a, 0x11, 0xef, 0xee, 0x06, 0x60, 0x76, 0x74, 0x94, 0x6d, 0xd9, - 0x2c, 0x3a, 0x9b, 0xc5, 0xb8, 0x2e, 0x52, 0xa9, 0x5a, 0xf0, 0x74, 0x28, - 0x04, 0x9e, 0x07, 0xae, 0x8b, 0xf0, 0x3c, 0x54, 0x2a, 0x05, 0xc0, 0xf6, - 0xce, 0x4e, 0x56, 0x17, 0x17, 0x6b, 0x8c, 0x2d, 0x13, 0xe8, 0x12, 0x8e, - 0xc7, 0x89, 0xb6, 0xb5, 0x01, 0x90, 0x7f, 0xf9, 0x12, 0x51, 0x28, 0x60, - 0x4a, 0x25, 0x4c, 0x28, 0x04, 0xc5, 0xe2, 0xa7, 0xb4, 0x28, 0x95, 0xc0, - 0xf3, 0xfc, 0xcb, 0x8c, 0xa1, 0x9c, 0x4e, 0xfb, 0x8c, 0x5b, 0x5a, 0xc8, - 0xd8, 0x36, 0x3b, 0xaa, 0xc0, 0xda, 0x18, 0x44, 0xc0, 0xb8, 0x6a, 0xf5, - 0x4a, 0xa1, 0xa4, 0xf4, 0x17, 0x20, 0xb5, 0xfe, 0x94, 0xdf, 0xc6, 0x60, - 0x69, 0x8d, 0x34, 0xc6, 0xaf, 0xbc, 0x2d, 0x95, 0x5a, 0x0c, 0xfc, 0x5a, - 0xf0, 0x30, 0x06, 0x91, 0xcb, 0xe1, 0xcd, 0xcf, 0x03, 0x10, 0xd9, 0xbb, - 0xd7, 0x07, 0x55, 0x0a, 0x2b, 0x28, 0xdb, 0xad, 0x85, 0xb3, 0xb5, 0x9c, - 0xed, 0x3d, 0x7b, 0x00, 0xc8, 0xbe, 0x7b, 0xc7, 0xd7, 0xe5, 0x32, 0x46, - 0xeb, 0x20, 0x78, 0x81, 0xc6, 0x4a, 0x29, 0x72, 0x33, 0x33, 0x00, 0xb4, - 0x0c, 0x0e, 0x82, 0x94, 0x58, 0x01, 0xeb, 0xad, 0x8c, 0x8d, 0xd6, 0x48, - 0x29, 0x51, 0x41, 0xef, 0xb0, 0x0e, 0x1d, 0x02, 0x60, 0x65, 0x66, 0x86, - 0xed, 0xe1, 0x30, 0xd5, 0x82, 0x93, 0x3a, 0xd0, 0x58, 0x49, 0x89, 0x97, - 0x4c, 0x02, 0xb0, 0xef, 0xec, 0x59, 0xd6, 0x7b, 0x7b, 0x6b, 0x72, 0x94, - 0xa6, 0xa6, 0xf0, 0xe6, 0xe6, 0x58, 0x7b, 0xfb, 0x96, 0xfc, 0x93, 0x27, - 0xa8, 0x80, 0xb1, 0x7d, 0xe0, 0x00, 0xe1, 0xc1, 0x41, 0x00, 0xe6, 0x92, - 0x49, 0x9c, 0x00, 0x58, 0x57, 0x81, 0x09, 0x80, 0x0b, 0x8f, 0x1f, 0xb3, - 0x38, 0x36, 0x06, 0xc0, 0x77, 0xd7, 0xaf, 0x93, 0xef, 0xeb, 0xf3, 0x19, - 0xe7, 0xf3, 0x64, 0x2f, 0x5e, 0x64, 0xfe, 0xfc, 0x79, 0x0e, 0x84, 0x42, - 0x3e, 0x68, 0x7f, 0x3f, 0xf6, 0x95, 0x2b, 0x00, 0xbc, 0x1e, 0x1b, 0xe3, - 0xdb, 0xe9, 0x69, 0x2c, 0x29, 0x31, 0x5a, 0xa3, 0xab, 0x59, 0x21, 0xc0, - 0x7f, 0xb6, 0x52, 0x6c, 0xdc, 0xba, 0xc5, 0xc6, 0xfe, 0xfd, 0x44, 0x9b, - 0x9b, 0xe9, 0xbe, 0x79, 0x93, 0xb9, 0x07, 0x0f, 0x08, 0x4d, 0x4c, 0x60, - 0xbd, 0x79, 0x43, 0x1b, 0x10, 0xea, 0xea, 0x42, 0x0c, 0x0c, 0x10, 0x39, - 0x76, 0x0c, 0x00, 0x6f, 0x61, 0x81, 0xb9, 0xdb, 0xb7, 0xf9, 0x3e, 0x16, - 0x43, 0x08, 0x81, 0x0e, 0xa4, 0x10, 0xc3, 0xb1, 0x98, 0x39, 0xda, 0xd9, - 0x49, 0x24, 0x1c, 0xae, 0x3d, 0x9d, 0x86, 0x06, 0x42, 0x97, 0x2f, 0xd3, - 0xfa, 0xc3, 0x0f, 0xfc, 0x9f, 0xfd, 0x3e, 0x3a, 0xca, 0xd2, 0x9d, 0x3b, - 0xf4, 0x86, 0x42, 0xd8, 0x4a, 0x21, 0x84, 0x60, 0x79, 0x6d, 0x8d, 0x9f, - 0x27, 0x27, 0xfd, 0x74, 0xab, 0x6a, 0x5c, 0x5b, 0xf9, 0x3c, 0x6a, 0x78, - 0x98, 0x3f, 0xc6, 0xc7, 0x91, 0xc7, 0x8f, 0x93, 0xe8, 0xea, 0x22, 0xde, - 0xda, 0xea, 0x47, 0x7f, 0x7e, 0x9e, 0x95, 0x99, 0x19, 0xfe, 0x4a, 0x26, - 0xd9, 0xf1, 0xe2, 0x05, 0x87, 0x22, 0x91, 0x5a, 0xdb, 0xac, 0x32, 0xd6, - 0xc6, 0x60, 0x55, 0xb4, 0x2e, 0xe5, 0x0b, 0x05, 0xbb, 0x31, 0x1a, 0xad, - 0xa5, 0x58, 0x75, 0x52, 0xc4, 0x9f, 0x3e, 0x45, 0x4d, 0x4d, 0x51, 0x00, - 0x96, 0xc3, 0x61, 0x36, 0xca, 0x65, 0x1a, 0xca, 0x65, 0x9a, 0x6c, 0x9b, - 0x56, 0xcb, 0x42, 0x6c, 0x01, 0xad, 0x36, 0xfc, 0x0f, 0xeb, 0xeb, 0x54, - 0xb4, 0x2e, 0x59, 0x6b, 0x85, 0xc2, 0xc8, 0x62, 0x26, 0x73, 0x41, 0x03, - 0x0d, 0xf5, 0xf5, 0xff, 0x39, 0x1d, 0xaa, 0x7b, 0x34, 0xe8, 0xb5, 0xcb, - 0xd5, 0x33, 0xe0, 0x37, 0x7a, 0xfc, 0x69, 0xb3, 0x92, 0xcd, 0xf2, 0x76, - 0x79, 0x99, 0xb5, 0x42, 0x61, 0xc4, 0xd2, 0xc6, 0x5c, 0x4d, 0x2d, 0x2e, - 0x12, 0x5f, 0x5d, 0x1d, 0x92, 0x42, 0x7c, 0xd1, 0x30, 0xd5, 0xc6, 0x94, - 0xb2, 0xa5, 0xd2, 0x88, 0x36, 0xe6, 0xea, 0xdf, 0x44, 0xcb, 0xf0, 0x2c, - 0x06, 0x86, 0x58, 0x55, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, - 0xae, 0x42, 0x60, 0x82; - -our $image9; -our $image9_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x02, - 0x3b, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xed, 0xd5, 0x4f, 0x68, 0xd3, - 0x00, 0x14, 0xc7, 0xf1, 0x6f, 0xd2, 0xac, 0x71, 0xeb, 0x56, 0x2b, 0x1b, - 0x76, 0xb0, 0x21, 0xab, 0x0c, 0x64, 0x0c, 0x59, 0x87, 0x20, 0x88, 0x1e, - 0x36, 0xf0, 0x22, 0x44, 0xd8, 0x40, 0x3d, 0x88, 0x48, 0x7a, 0xf5, 0xe0, - 0x9f, 0xb1, 0x83, 0xf7, 0x1d, 0x15, 0xc7, 0x44, 0xc4, 0x83, 0x90, 0x9d, - 0x77, 0xb1, 0xd0, 0xc0, 0xf0, 0x30, 0xea, 0xc5, 0x9b, 0x87, 0xce, 0x8b, - 0x30, 0xd0, 0x66, 0x9b, 0x75, 0xd3, 0x55, 0x17, 0xd7, 0xd4, 0xa6, 0x6d, - 0xfe, 0x78, 0xa8, 0x74, 0x1b, 0x5d, 0xd5, 0x29, 0x3b, 0x08, 0x06, 0xde, - 0xe5, 0xc7, 0xcb, 0x87, 0xe4, 0xe5, 0x25, 0x11, 0x7c, 0xdf, 0xe7, 0x20, - 0x0e, 0xf1, 0x40, 0xd4, 0x7f, 0x12, 0x16, 0x14, 0x45, 0x69, 0x08, 0x5f, - 0x0e, 0xa5, 0x54, 0x51, 0x46, 0xf3, 0xca, 0xcc, 0x9e, 0x5d, 0xbc, 0x98, - 0xf8, 0x13, 0xb8, 0xe1, 0x8a, 0x17, 0xba, 0x52, 0xaa, 0x9d, 0x43, 0x9b, - 0x3a, 0x99, 0x25, 0x5a, 0xd8, 0x54, 0x17, 0xba, 0x52, 0xea, 0x5f, 0xc3, - 0xf3, 0x91, 0xd4, 0x88, 0xe3, 0xa2, 0xdd, 0x1b, 0xcb, 0x31, 0x34, 0x18, - 0x63, 0xea, 0x4a, 0x80, 0x4e, 0xb9, 0xa0, 0xcd, 0x47, 0xf6, 0x8f, 0xd7, - 0x61, 0xbd, 0x23, 0x19, 0x77, 0x3d, 0xff, 0xd9, 0xdd, 0xf3, 0xef, 0x09, - 0x1d, 0xe9, 0x61, 0x69, 0x0d, 0x2c, 0x37, 0xcc, 0x9d, 0x0b, 0x3e, 0x87, - 0xe5, 0x92, 0xa6, 0x77, 0x24, 0xf7, 0x85, 0x8b, 0x00, 0x7a, 0x68, 0x2e, - 0x8e, 0xef, 0xa4, 0x13, 0xa7, 0xd7, 0x22, 0x8e, 0xdc, 0xcb, 0xd2, 0x1a, - 0xf5, 0xca, 0xdb, 0x61, 0xae, 0x9d, 0xa9, 0x10, 0x0c, 0x78, 0x9a, 0x1e, - 0x9a, 0xfb, 0x6d, 0x5c, 0xe0, 0xf2, 0x56, 0x1c, 0x41, 0x4c, 0x9f, 0xea, - 0x97, 0x23, 0xc7, 0xa3, 0x52, 0xd3, 0xc6, 0xad, 0x62, 0x85, 0xe7, 0xaf, - 0x05, 0x70, 0xed, 0x84, 0x52, 0xba, 0x3a, 0xfb, 0x6b, 0xf8, 0xd2, 0x97, - 0x4d, 0xc4, 0x60, 0xa4, 0x45, 0x0e, 0x01, 0x20, 0x05, 0xe0, 0xdc, 0x89, - 0xed, 0x06, 0x63, 0xa3, 0x56, 0x00, 0xd5, 0x6a, 0x15, 0x1c, 0x0b, 0x60, - 0x58, 0xb1, 0xaf, 0x67, 0x7e, 0x06, 0x4b, 0xf8, 0xde, 0x38, 0xae, 0x4d, - 0xf5, 0x9b, 0x5d, 0x3b, 0xd9, 0x77, 0xa6, 0x3f, 0x7d, 0x8d, 0xc6, 0xc3, - 0xad, 0xb5, 0x06, 0xcf, 0x87, 0x6a, 0xf1, 0xa3, 0x89, 0x20, 0x26, 0x40, - 0x34, 0x01, 0x94, 0xb2, 0xda, 0x14, 0xd5, 0x83, 0x4f, 0xe3, 0x40, 0xba, - 0x61, 0x8f, 0x75, 0xe9, 0x89, 0xd6, 0x79, 0xb4, 0x47, 0xed, 0xef, 0xde, - 0xce, 0x5e, 0xbd, 0x03, 0xd7, 0x5a, 0xcd, 0x00, 0xa3, 0x8a, 0x73, 0xc3, - 0x6c, 0x8a, 0x4a, 0x8f, 0x6f, 0x83, 0x38, 0x0d, 0x24, 0x1b, 0xe1, 0xc0, - 0xa3, 0x11, 0x02, 0x87, 0xd2, 0x83, 0xfd, 0x51, 0xa4, 0x1d, 0xcb, 0xb8, - 0xb8, 0xec, 0x42, 0x71, 0xc5, 0x04, 0x66, 0x80, 0x59, 0xc5, 0xbb, 0x69, - 0x00, 0xe8, 0xe2, 0xc3, 0x3e, 0x60, 0x0c, 0xb8, 0x05, 0xf4, 0x01, 0x26, - 0x82, 0x18, 0xdb, 0xf3, 0xcd, 0xd3, 0x85, 0x07, 0x69, 0xda, 0x7a, 0x47, - 0x06, 0x8e, 0xb5, 0xee, 0xca, 0xf3, 0x05, 0xd8, 0xd8, 0x2c, 0x41, 0x69, - 0x1d, 0xbc, 0x4a, 0x2d, 0x94, 0xda, 0xa0, 0x25, 0x0c, 0x88, 0x50, 0xfa, - 0x60, 0x22, 0x88, 0xa3, 0x8a, 0x3f, 0x91, 0xd9, 0x7b, 0x0d, 0x7c, 0x6f, - 0x9c, 0xe2, 0x4a, 0xf6, 0xcd, 0x6a, 0x5f, 0x24, 0x16, 0x95, 0xeb, 0x71, - 0xbb, 0x0c, 0xed, 0xdd, 0xad, 0x40, 0xac, 0x9e, 0x55, 0x1c, 0xc8, 0x7d, - 0x2e, 0x83, 0x65, 0x98, 0xc0, 0xa8, 0xe2, 0x4f, 0x64, 0xa0, 0xc9, 0x47, - 0x48, 0x61, 0xd2, 0x04, 0x86, 0xb1, 0x8c, 0x4c, 0x76, 0x39, 0x87, 0x91, - 0x07, 0xab, 0x0c, 0x76, 0x75, 0xbb, 0xf2, 0x05, 0xc8, 0xae, 0x97, 0xc8, - 0xad, 0xbe, 0x05, 0xcb, 0x48, 0x02, 0x31, 0x85, 0xc9, 0xfa, 0x43, 0xdd, - 0x73, 0x14, 0xbb, 0xc6, 0xc2, 0x7d, 0xf5, 0xc7, 0xfc, 0xe2, 0x88, 0xc1, - 0xda, 0xad, 0x57, 0x4c, 0x00, 0x03, 0x78, 0x01, 0xcc, 0xec, 0x04, 0xeb, - 0xf0, 0xff, 0x3f, 0xc8, 0x81, 0xc3, 0xdf, 0x01, 0x22, 0xe6, 0xe0, 0xf1, - 0x6d, 0x71, 0x21, 0x14, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, - 0xae, 0x42, 0x60, 0x82; - -our $image10; -our $image10_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x02, - 0x72, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xed, 0x95, 0xdf, 0x4b, 0x93, - 0x61, 0x14, 0xc7, 0x3f, 0xef, 0xeb, 0xfc, 0x91, 0xad, 0x7c, 0xd7, 0x2f, - 0x35, 0xa2, 0xe6, 0xaf, 0x69, 0x76, 0xb3, 0x82, 0x10, 0x02, 0xc9, 0x5d, - 0x54, 0x17, 0x3d, 0x92, 0x8a, 0x65, 0x17, 0x11, 0x2d, 0x22, 0x08, 0x04, - 0x51, 0xbc, 0xe8, 0x4f, 0xe8, 0x32, 0xaf, 0x03, 0xdd, 0x45, 0x57, 0x51, - 0x29, 0x4c, 0x08, 0xea, 0x62, 0x0b, 0xaa, 0x9b, 0x88, 0xd6, 0x8d, 0x69, - 0x39, 0xb7, 0xa0, 0x5a, 0x3a, 0xe7, 0x5e, 0xdd, 0x66, 0x73, 0x7b, 0xf7, - 0xbe, 0x5d, 0xcc, 0xa6, 0x53, 0x34, 0x0d, 0xbc, 0x08, 0x7a, 0xe0, 0xc0, - 0xc3, 0x39, 0xe7, 0xfb, 0xe1, 0x1c, 0x78, 0xce, 0x79, 0x24, 0xc3, 0x30, - 0xd8, 0x89, 0x23, 0xef, 0x08, 0xf5, 0x9f, 0x04, 0x4b, 0x42, 0x88, 0x75, - 0xce, 0x97, 0xf5, 0x6e, 0xbb, 0xa9, 0x84, 0x1e, 0xb9, 0x98, 0x16, 0xc0, - 0x7a, 0xbb, 0x76, 0x8c, 0xb1, 0x79, 0x33, 0xaf, 0xc2, 0x47, 0x01, 0x7c, - 0x5a, 0x8c, 0x81, 0xe6, 0x8f, 0xad, 0xae, 0x2d, 0x83, 0x5f, 0xec, 0x77, - 0x2b, 0xb2, 0xc4, 0xd0, 0xb1, 0xbd, 0xd1, 0xb6, 0x5b, 0x67, 0x66, 0x69, - 0x3e, 0x59, 0x49, 0x75, 0xa5, 0x39, 0x4f, 0xe0, 0x79, 0x17, 0xe2, 0xf1, - 0x9b, 0x38, 0xee, 0xcf, 0x75, 0x3e, 0xdd, 0xa0, 0xfd, 0x5c, 0xa4, 0x35, - 0xb8, 0x29, 0xf8, 0x99, 0xe2, 0xb6, 0xcb, 0x12, 0x9e, 0xbb, 0x2d, 0xe3, - 0xca, 0xd9, 0xd3, 0x35, 0x14, 0x17, 0x15, 0x6e, 0xda, 0xea, 0xf3, 0xd7, - 0xe3, 0xdc, 0xf3, 0x36, 0xa8, 0x9a, 0x4e, 0xd5, 0xc5, 0xf9, 0x56, 0x75, - 0x6d, 0xdc, 0x04, 0x30, 0xba, 0x67, 0xc4, 0x8e, 0x6e, 0x78, 0x3a, 0x1a, - 0xfd, 0x8a, 0x7f, 0x5a, 0xe2, 0xc9, 0x83, 0x39, 0xc6, 0x22, 0x87, 0x00, - 0x28, 0x2f, 0x8d, 0x71, 0xa9, 0xf1, 0x1b, 0xf5, 0xd6, 0x83, 0x28, 0xfb, - 0x0e, 0xe4, 0x84, 0xd6, 0x9a, 0x06, 0xba, 0x66, 0xfd, 0xca, 0xc3, 0x0f, - 0xd5, 0xc3, 0x80, 0x63, 0x5d, 0xc5, 0x74, 0x2d, 0x2a, 0x48, 0x72, 0x00, - 0x50, 0x80, 0x20, 0xc8, 0x03, 0xc0, 0x88, 0x88, 0x77, 0x04, 0x01, 0x46, - 0xcd, 0x4f, 0xad, 0xc0, 0x0d, 0xd0, 0x7b, 0x2e, 0xd8, 0xc2, 0x8a, 0xfd, - 0xf8, 0x91, 0x9c, 0x38, 0xa3, 0xa5, 0x19, 0xf4, 0x6a, 0xcc, 0x25, 0x64, - 0x87, 0x88, 0x77, 0x7a, 0xf3, 0xc1, 0x97, 0x17, 0x86, 0x91, 0xe4, 0x36, - 0x24, 0xb9, 0x57, 0x24, 0xae, 0xdc, 0xdf, 0xa8, 0xf5, 0xd1, 0xdd, 0x8f, - 0x14, 0x0c, 0xdd, 0x53, 0x57, 0x21, 0xd9, 0xed, 0x35, 0xa5, 0x39, 0xff, - 0x64, 0x28, 0xc5, 0xfb, 0xa9, 0xb4, 0x4b, 0x2c, 0x5e, 0x75, 0xe6, 0x83, - 0x3b, 0xe7, 0xa2, 0x48, 0xb2, 0x43, 0xfc, 0xbc, 0xe6, 0xdb, 0x10, 0x5a, - 0xec, 0x6a, 0x59, 0xbe, 0x2a, 0x48, 0xf2, 0xd0, 0x89, 0x6a, 0x8b, 0x72, - 0xd8, 0x92, 0x75, 0xa8, 0x09, 0x78, 0x3b, 0x1e, 0xf5, 0x61, 0xe8, 0xbd, - 0xab, 0x35, 0x26, 0x91, 0xbc, 0x6e, 0xd9, 0x08, 0x98, 0x85, 0x0e, 0xda, - 0x31, 0x34, 0x0f, 0x26, 0x33, 0x98, 0xb2, 0x95, 0xc6, 0x93, 0x90, 0x4c, - 0x65, 0xe3, 0x25, 0x85, 0x50, 0xb8, 0xcb, 0x62, 0x4f, 0x67, 0x0c, 0x0f, - 0x00, 0x29, 0x15, 0xf4, 0x94, 0xfa, 0xc7, 0x01, 0x11, 0x4b, 0x37, 0x7d, - 0x18, 0xba, 0x13, 0x2d, 0x4e, 0x7d, 0xa5, 0x44, 0x53, 0xad, 0x44, 0x85, - 0x02, 0xa9, 0xcc, 0x8a, 0x9d, 0xaa, 0x82, 0xa6, 0x5a, 0x89, 0xf2, 0x32, - 0x09, 0xb4, 0x45, 0x15, 0x43, 0x77, 0x14, 0xd8, 0x6c, 0xb6, 0x3f, 0xb1, - 0xb1, 0xe9, 0x6e, 0xdf, 0x27, 0xce, 0x7f, 0x89, 0x44, 0x63, 0x6d, 0x45, - 0x25, 0x65, 0x14, 0xc8, 0xa0, 0x65, 0xf2, 0x2d, 0x18, 0x86, 0x70, 0x28, - 0xa0, 0x82, 0xe1, 0x10, 0xda, 0x1d, 0xdf, 0x96, 0x47, 0x5a, 0x64, 0xba, - 0x5d, 0x64, 0x92, 0xce, 0x40, 0x20, 0xc0, 0xcc, 0x02, 0x24, 0xd3, 0x2b, - 0x36, 0x39, 0x0d, 0x91, 0xef, 0x13, 0x2a, 0x86, 0xe6, 0x10, 0x99, 0x6e, - 0x1f, 0x6c, 0x73, 0x57, 0x08, 0xa3, 0xcf, 0x85, 0x9e, 0x72, 0x86, 0xbe, - 0xfa, 0x99, 0x8d, 0x41, 0x4a, 0x83, 0xa9, 0x19, 0x48, 0x84, 0x27, 0x00, - 0xda, 0x85, 0xd1, 0x97, 0x7b, 0x00, 0xdb, 0x5e, 0x42, 0x82, 0x7e, 0x17, - 0xba, 0xe6, 0x8c, 0xfc, 0xf0, 0x13, 0x98, 0x5e, 0x22, 0x1d, 0x9d, 0x00, - 0x70, 0x0a, 0xfa, 0xbd, 0xab, 0xf3, 0xfe, 0x6a, 0xbb, 0x2d, 0xc3, 0x5d, - 0xc4, 0x83, 0xbf, 0xa1, 0xae, 0xb5, 0x39, 0xd2, 0xff, 0x1f, 0x64, 0xc7, - 0xc1, 0xbf, 0x00, 0x24, 0x91, 0x01, 0xa1, 0xf6, 0x94, 0xe3, 0xca, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image11; -our $image11_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x03, - 0xd0, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0x9d, 0x95, 0x5b, 0x48, 0x5b, - 0x77, 0x1c, 0xc7, 0xbf, 0xe7, 0xe4, 0xe4, 0x66, 0x6d, 0x76, 0xcc, 0x6c, - 0x35, 0x31, 0x6a, 0x64, 0x93, 0xd4, 0x3a, 0xf1, 0x34, 0xba, 0xd9, 0xd5, - 0x87, 0x1a, 0x68, 0x67, 0x65, 0x94, 0x5a, 0x3a, 0x18, 0x65, 0x83, 0x45, - 0x28, 0x7b, 0xf0, 0x65, 0x4b, 0x61, 0x4c, 0xf6, 0x52, 0x2a, 0xac, 0x0f, - 0x9b, 0xad, 0xb5, 0xb0, 0xbe, 0x6c, 0x6b, 0xf2, 0x30, 0xf2, 0xd2, 0x32, - 0x53, 0xac, 0x50, 0x68, 0x69, 0xed, 0x98, 0x2d, 0xbd, 0xe1, 0xd9, 0xc6, - 0xd8, 0x4a, 0xcd, 0x92, 0x9a, 0xe8, 0xb4, 0x71, 0xe6, 0xe4, 0x5c, 0x73, - 0x39, 0xc9, 0xd9, 0xc3, 0x16, 0xeb, 0xad, 0x78, 0xf9, 0xc1, 0x1f, 0xfe, - 0xfc, 0xfe, 0xdf, 0xff, 0x87, 0xdf, 0xe5, 0x7f, 0x21, 0x34, 0x4d, 0x03, - 0x00, 0x10, 0x04, 0x81, 0xf5, 0x6c, 0x74, 0xf4, 0x2e, 0x6d, 0xb5, 0x5a, - 0x6e, 0x17, 0x0a, 0x1a, 0xd3, 0xde, 0xde, 0xb4, 0xe6, 0x86, 0x22, 0x8f, - 0x5c, 0x97, 0xb6, 0xdc, 0xfc, 0x6d, 0x6d, 0x8d, 0x4c, 0xa1, 0xa0, 0xad, - 0x2b, 0xa4, 0x36, 0x43, 0xb5, 0x5a, 0x2d, 0xdd, 0x04, 0x01, 0x48, 0x92, - 0xb2, 0x6a, 0xed, 0xda, 0xb5, 0x71, 0xaf, 0xc9, 0x64, 0x3c, 0x05, 0xa0, - 0x6e, 0xd3, 0x60, 0x92, 0xfc, 0x2f, 0x41, 0x51, 0x5c, 0x0e, 0xf6, 0xfb, - 0x47, 0xbd, 0x36, 0xdb, 0x0e, 0xbf, 0xd5, 0x6a, 0x79, 0xa1, 0xdd, 0x0c, - 0x58, 0x14, 0x65, 0x64, 0xb3, 0x79, 0x08, 0x82, 0xb4, 0xe8, 0x1b, 0x18, - 0x08, 0x7a, 0xeb, 0xea, 0xec, 0x7e, 0xb7, 0xbb, 0x1e, 0x1c, 0x27, 0x6c, - 0x15, 0xac, 0x40, 0x96, 0x15, 0x88, 0xa2, 0x0c, 0x00, 0xe8, 0xeb, 0xbb, - 0xe8, 0xdd, 0xb3, 0xc7, 0xe5, 0xdf, 0xbf, 0x9f, 0x01, 0xcf, 0x2b, 0x98, - 0x98, 0x78, 0x12, 0x28, 0x6a, 0x37, 0x55, 0x0a, 0x41, 0x50, 0x20, 0x49, - 0x69, 0xf0, 0xbc, 0x84, 0x13, 0x27, 0xce, 0x78, 0x0f, 0x1c, 0x78, 0xd3, - 0xdf, 0xda, 0xba, 0x0b, 0xf1, 0x78, 0x02, 0x57, 0xaf, 0xfe, 0xc4, 0x92, - 0x24, 0xe1, 0xdb, 0x62, 0xc4, 0x32, 0x64, 0x39, 0x03, 0x9e, 0x97, 0xd0, - 0xd9, 0xf9, 0xb6, 0xdf, 0xe5, 0xaa, 0xc5, 0xd4, 0xd4, 0x1c, 0x2e, 0x5d, - 0x1a, 0x61, 0x17, 0x16, 0x78, 0x4f, 0x6f, 0xef, 0x31, 0x6e, 0x4b, 0x11, - 0xcb, 0x72, 0x1a, 0xe3, 0xe3, 0xbf, 0xc0, 0xe5, 0xaa, 0xc5, 0xee, 0xdd, - 0x4e, 0x44, 0xa3, 0xb3, 0xb8, 0x7c, 0xf9, 0x26, 0x0b, 0xc0, 0x73, 0xe1, - 0xc2, 0x49, 0x6e, 0xa9, 0x76, 0x4d, 0xf0, 0xad, 0x3e, 0x47, 0xb7, 0x51, - 0x4f, 0x30, 0x06, 0x3d, 0x60, 0xa0, 0x10, 0x6d, 0xfe, 0x22, 0x16, 0x00, - 0x80, 0xe9, 0xc8, 0x24, 0x52, 0xa9, 0x4a, 0x1c, 0x3a, 0xb4, 0x17, 0xd1, - 0xe8, 0x2c, 0x82, 0xc1, 0xeb, 0xac, 0xa6, 0xc1, 0x13, 0x0c, 0x9e, 0xe6, - 0x56, 0x32, 0x96, 0x81, 0xaf, 0xf4, 0x3a, 0x9c, 0x96, 0x52, 0x0c, 0x37, - 0xed, 0x03, 0x53, 0xbe, 0x4b, 0x0f, 0xbc, 0x42, 0x41, 0x8c, 0x00, 0x7f, - 0x9c, 0xaf, 0xf9, 0x44, 0x97, 0xc7, 0xd0, 0x03, 0x33, 0x89, 0xfa, 0x96, - 0x7d, 0x08, 0x85, 0xee, 0x20, 0x1c, 0x8e, 0xb3, 0x8a, 0x92, 0xf1, 0x8c, - 0x8c, 0x0c, 0xac, 0x82, 0x02, 0x00, 0x51, 0xbc, 0x82, 0x81, 0x1e, 0x07, - 0x5d, 0xb5, 0xb3, 0x10, 0x39, 0xd8, 0x95, 0xa3, 0x13, 0x09, 0x03, 0x64, - 0x5e, 0x87, 0x32, 0x9b, 0x0e, 0x96, 0x66, 0x03, 0xc4, 0x38, 0x40, 0x9a, - 0x74, 0xb8, 0x33, 0xd5, 0x82, 0x47, 0x0f, 0xdf, 0x42, 0x32, 0xfa, 0x18, - 0x93, 0xdc, 0x8e, 0xb2, 0xb5, 0xa0, 0x8b, 0x4f, 0x44, 0x71, 0xf2, 0xed, - 0x87, 0x0e, 0xff, 0x07, 0x9d, 0xbc, 0xf7, 0xcf, 0x78, 0x09, 0x9e, 0xff, - 0xa3, 0xef, 0xe9, 0x3a, 0x1b, 0x0f, 0x3c, 0x3d, 0x57, 0xd3, 0x51, 0xc5, - 0x90, 0xb7, 0xcd, 0x8d, 0x06, 0xc0, 0x6c, 0x00, 0x44, 0x02, 0x7f, 0xff, - 0x2c, 0x23, 0xab, 0x68, 0x10, 0x67, 0x73, 0x3e, 0x00, 0x9c, 0x06, 0x84, - 0x9a, 0x3e, 0x8f, 0x71, 0x2b, 0xc1, 0x8b, 0xa7, 0xa2, 0xda, 0xaa, 0x78, - 0xf5, 0x6a, 0x16, 0x8f, 0x7e, 0xa7, 0xce, 0x77, 0x9d, 0x8d, 0x07, 0x00, - 0x20, 0xc1, 0x69, 0xac, 0xc2, 0xe7, 0x01, 0x59, 0x45, 0x21, 0x96, 0x41, - 0xf8, 0xba, 0x00, 0x9b, 0xc7, 0x88, 0xca, 0x66, 0x0a, 0xae, 0xc3, 0x25, - 0x83, 0xaf, 0x77, 0x9a, 0xfd, 0x46, 0x9a, 0x8c, 0x3c, 0xec, 0xaf, 0x66, - 0x56, 0x46, 0xbe, 0x08, 0x7e, 0xd5, 0x98, 0xc1, 0xc2, 0xbc, 0x06, 0x4e, - 0xd0, 0x9e, 0x15, 0x7d, 0x29, 0x49, 0x1b, 0xdc, 0x56, 0xa2, 0x22, 0x17, - 0xcf, 0xe1, 0xfe, 0x95, 0x34, 0xbb, 0xad, 0x1c, 0x40, 0x2e, 0x07, 0xe3, - 0x4e, 0x0d, 0x54, 0x3e, 0x0f, 0x63, 0xa9, 0x86, 0xfa, 0x77, 0xf4, 0x34, - 0x65, 0x26, 0x86, 0x5f, 0xda, 0x3c, 0x51, 0x06, 0x2a, 0xb6, 0x67, 0x51, - 0x5d, 0x96, 0x3e, 0xf5, 0xd5, 0x11, 0x7b, 0xad, 0xbd, 0x1c, 0x4c, 0x73, - 0x83, 0xd2, 0x81, 0x2c, 0x89, 0xb1, 0x9b, 0x3a, 0x16, 0x1a, 0x3c, 0xaa, - 0x9c, 0x4f, 0x42, 0x2c, 0x60, 0xe6, 0x1e, 0xb8, 0x74, 0x12, 0xbe, 0x7c, - 0x01, 0x47, 0x6a, 0x5b, 0xd0, 0x5d, 0xd3, 0xa0, 0x39, 0x6f, 0x7c, 0xe6, - 0xe8, 0x3e, 0xf8, 0x75, 0x3c, 0xb4, 0x0a, 0xfc, 0x38, 0x56, 0x3a, 0xe6, - 0xae, 0x94, 0x3a, 0x8e, 0xef, 0x5d, 0xa0, 0x61, 0xc6, 0xa7, 0x30, 0xeb, - 0x31, 0x39, 0x5d, 0x8a, 0x07, 0xbf, 0x1a, 0x03, 0xaa, 0x0a, 0xdf, 0x7b, - 0x17, 0xe3, 0xdc, 0x5f, 0xdf, 0xdb, 0x91, 0x8f, 0x69, 0x88, 0x86, 0xa9, - 0xd3, 0xed, 0xfd, 0xb1, 0x00, 0x80, 0xc0, 0x6f, 0xe7, 0x1c, 0x91, 0x46, - 0xb7, 0xea, 0x54, 0x32, 0x14, 0x03, 0x60, 0x35, 0x58, 0x48, 0xeb, 0x8e, - 0x0e, 0x8d, 0xdb, 0x07, 0x19, 0x87, 0xd4, 0x5d, 0x62, 0x02, 0x3d, 0xa7, - 0x98, 0x58, 0x39, 0x4b, 0x0d, 0x7d, 0xfc, 0xc3, 0x74, 0xa0, 0xa8, 0x91, - 0x52, 0x79, 0x28, 0x0b, 0x2a, 0x12, 0x49, 0x1d, 0x5b, 0xf4, 0x85, 0x23, - 0x88, 0xbe, 0xe1, 0xce, 0x38, 0x95, 0x8c, 0x6e, 0xed, 0x52, 0xf4, 0xdf, - 0x98, 0xe1, 0x00, 0xf4, 0xfc, 0x3f, 0x00, 0xa4, 0x56, 0x96, 0x0d, 0x89, - 0xe7, 0x88, 0x36, 0xd8, 0xd3, 0xce, 0xf9, 0xa4, 0xe9, 0x23, 0x00, 0x63, - 0xdf, 0xbc, 0x5f, 0x45, 0xd3, 0xa5, 0x19, 0x46, 0x8e, 0xa9, 0x50, 0x32, - 0x2f, 0x69, 0xde, 0x46, 0xec, 0xc9, 0x33, 0x6a, 0x4c, 0x13, 0x73, 0x68, - 0x7b, 0x8d, 0xf7, 0x7e, 0xf9, 0xae, 0x7d, 0x58, 0x4f, 0xaa, 0x13, 0x6e, - 0x07, 0x4f, 0x3f, 0x9d, 0x24, 0xa1, 0x64, 0x5f, 0x94, 0x01, 0x58, 0x72, - 0x8e, 0x37, 0xf2, 0xe7, 0x0d, 0x1e, 0xb3, 0x3b, 0x2b, 0x2c, 0xd9, 0x89, - 0xe3, 0xad, 0xf3, 0x74, 0x31, 0x57, 0x41, 0x20, 0xf0, 0xdd, 0x5d, 0x5b, - 0xe8, 0xe4, 0x8f, 0x33, 0x47, 0x81, 0x35, 0x2e, 0xc8, 0x46, 0xc0, 0x00, - 0x70, 0xe6, 0xb0, 0x9d, 0x29, 0x33, 0xe5, 0x86, 0x9b, 0x2b, 0x04, 0x67, - 0x52, 0xd1, 0x83, 0x9d, 0xdb, 0x1e, 0xd0, 0x11, 0xf0, 0xf5, 0x8d, 0xcc, - 0x70, 0x4b, 0xc1, 0xff, 0x02, 0x75, 0x5c, 0xb4, 0x48, 0xa1, 0x80, 0x33, - 0xc4, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, - 0x82; - -our $image12; -our $image12_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x01, - 0x95, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xa5, 0x94, 0xcd, 0x6e, 0x82, - 0x40, 0x14, 0x85, 0xcf, 0x1d, 0xc6, 0xf8, 0x20, 0x5d, 0x1a, 0x9b, 0x98, - 0xb8, 0xee, 0xd2, 0x75, 0x1f, 0xc0, 0xb7, 0xd3, 0x7d, 0x7d, 0x10, 0x13, - 0x92, 0x8a, 0x8b, 0x26, 0xf6, 0x0d, 0x8c, 0x69, 0xb4, 0x48, 0xc9, 0x0c, - 0x73, 0xba, 0xa0, 0xa0, 0xc0, 0xf0, 0x63, 0x7a, 0x12, 0x02, 0x84, 0xe1, - 0xdc, 0x73, 0xef, 0x7c, 0x20, 0x24, 0xb1, 0xdf, 0x7f, 0x12, 0x1d, 0x0a, - 0xc3, 0x1d, 0x96, 0xcb, 0x57, 0xe9, 0x5a, 0xd3, 0x10, 0x49, 0x44, 0xd1, - 0x81, 0xf7, 0x32, 0x26, 0x63, 0x92, 0x18, 0x1e, 0x8f, 0x5f, 0x3c, 0x9d, - 0xce, 0x8c, 0xa2, 0x03, 0x57, 0xab, 0x37, 0x92, 0xc4, 0xd0, 0x43, 0xf9, - 0x8a, 0x05, 0x81, 0x20, 0x08, 0x04, 0x4a, 0xdd, 0x1e, 0xcf, 0xe7, 0xcf, - 0x58, 0xaf, 0x37, 0x9d, 0x9d, 0xdd, 0xcb, 0x6b, 0x0c, 0x00, 0x22, 0x82, - 0x20, 0x08, 0x00, 0xe4, 0xa3, 0xd8, 0x6e, 0xdf, 0x01, 0x60, 0xb0, 0xb9, - 0xee, 0xac, 0xaa, 0x14, 0xb2, 0x2c, 0xc3, 0x62, 0xf1, 0x82, 0xf3, 0xf9, - 0x1b, 0x97, 0x4b, 0x8c, 0xfd, 0xfe, 0x63, 0x50, 0x62, 0xaf, 0x71, 0x9e, - 0x36, 0x3f, 0x2b, 0xa5, 0x10, 0xc7, 0x09, 0x92, 0x24, 0xad, 0x8c, 0xe6, - 0x5f, 0x89, 0x45, 0x08, 0xe7, 0x1c, 0xae, 0xd7, 0x1f, 0x28, 0xa5, 0xa0, - 0x94, 0xc2, 0x6c, 0x36, 0x6d, 0x50, 0xe4, 0xa3, 0xc6, 0x6b, 0x6c, 0xad, - 0x83, 0xb5, 0x0e, 0x71, 0x9c, 0x20, 0x4d, 0x0d, 0x00, 0x60, 0x32, 0x79, - 0xf2, 0x3c, 0x8f, 0xff, 0xba, 0x98, 0x62, 0xbd, 0xde, 0xf0, 0xde, 0xbc, - 0xd1, 0x1b, 0x99, 0xa7, 0x4c, 0xd3, 0x14, 0x24, 0x31, 0x1a, 0x05, 0x8d, - 0xc2, 0x43, 0xa8, 0x69, 0x18, 0x67, 0x19, 0xcb, 0x94, 0x5a, 0xeb, 0x92, - 0x8c, 0xba, 0xfa, 0xa8, 0xa9, 0x8c, 0x82, 0x24, 0x8c, 0x31, 0x10, 0x91, - 0xf2, 0xe8, 0xda, 0xb0, 0x2e, 0x6a, 0x2a, 0xc6, 0xce, 0xe5, 0xe6, 0x7d, - 0x1a, 0x42, 0x4d, 0x25, 0x8e, 0x31, 0x59, 0xe5, 0xe5, 0x3e, 0xbc, 0x0a, - 0x6a, 0x8c, 0xc9, 0xa0, 0xb5, 0x82, 0xd6, 0xb7, 0x9c, 0xb5, 0xc4, 0x16, - 0xa4, 0x80, 0x74, 0xe5, 0x26, 0xfa, 0x54, 0xa7, 0x66, 0x3c, 0x1e, 0x81, - 0xd4, 0xb0, 0xf6, 0xb6, 0xbe, 0x34, 0x2e, 0x46, 0x20, 0x42, 0x88, 0x48, - 0xeb, 0x48, 0xda, 0xa8, 0x21, 0xf3, 0xf7, 0x2a, 0xc6, 0x61, 0xb8, 0x43, - 0x18, 0xee, 0x5a, 0x5b, 0x9e, 0xcd, 0xa6, 0xe5, 0x75, 0x9d, 0x9a, 0xa2, - 0x2b, 0x6b, 0x5d, 0xd3, 0xb8, 0xef, 0x5f, 0x5b, 0x7c, 0x69, 0x6d, 0xd4, - 0x38, 0xe7, 0x4a, 0x42, 0x0a, 0x0d, 0xff, 0xf8, 0xd1, 0x4e, 0x4d, 0x5e, - 0x00, 0x95, 0xc4, 0x0f, 0x19, 0x3f, 0x42, 0xcd, 0x83, 0x89, 0x0b, 0x6a, - 0x58, 0xa1, 0xc6, 0xd7, 0xc5, 0x60, 0xe3, 0x3a, 0x35, 0xf7, 0xaa, 0xdf, - 0x03, 0x3d, 0xbf, 0xcd, 0x42, 0x7d, 0xd4, 0xf8, 0xf4, 0x0b, 0xcc, 0x2c, - 0x55, 0x03, 0x46, 0xd4, 0xfe, 0x54, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, - 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image13; -our $image13_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x02, - 0xab, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0x8d, 0x95, 0x3b, 0x68, 0x54, - 0x41, 0x14, 0x86, 0xbf, 0xb9, 0xf7, 0x86, 0x80, 0xc6, 0x20, 0x42, 0x02, - 0xe2, 0x83, 0x58, 0x88, 0x45, 0x44, 0x57, 0x04, 0x25, 0x4a, 0xcc, 0x8a, - 0x36, 0xa6, 0xb2, 0xb7, 0xb0, 0x48, 0x6d, 0x21, 0x04, 0xb1, 0x30, 0xb1, - 0xb1, 0x51, 0x10, 0xb1, 0x4a, 0x9a, 0x28, 0x82, 0xa5, 0x16, 0x5a, 0x24, - 0x85, 0x88, 0x2f, 0x10, 0x84, 0x55, 0x22, 0x1a, 0xe3, 0xab, 0x30, 0x18, - 0x11, 0x82, 0x1a, 0x13, 0xb3, 0x77, 0xef, 0x6b, 0xce, 0xb1, 0xb8, 0xfb, - 0xca, 0x66, 0x77, 0xb3, 0x3f, 0x1c, 0xb8, 0xcc, 0x9c, 0xfb, 0xcd, 0x7f, - 0xce, 0x0c, 0x33, 0x86, 0x3a, 0xba, 0x7a, 0xf5, 0xce, 0x0d, 0x20, 0x53, - 0x3d, 0xa6, 0xca, 0xf4, 0xc5, 0x8b, 0x67, 0xcf, 0xd7, 0xe6, 0xaa, 0x6a, - 0x3d, 0xc4, 0x5a, 0x8d, 0x8e, 0x8e, 0xdf, 0x1e, 0x1f, 0xbf, 0xaf, 0xb5, - 0x1a, 0x1b, 0xbb, 0xa7, 0x23, 0x23, 0x63, 0xb7, 0x6b, 0xa1, 0x8d, 0xc2, - 0x7c, 0xb8, 0xd9, 0xbb, 0xd9, 0x31, 0x5c, 0x36, 0x86, 0xcc, 0xb3, 0x5f, - 0xc7, 0x36, 0x2f, 0x75, 0x1c, 0xcd, 0x0c, 0x0f, 0x9f, 0xc1, 0xf7, 0x83, - 0x55, 0x0b, 0x06, 0x41, 0xc8, 0xad, 0x5b, 0x0f, 0xe9, 0xfc, 0xf7, 0x72, - 0x3a, 0xdb, 0xf5, 0xe2, 0xaf, 0x2a, 0xd3, 0x7b, 0xce, 0xbd, 0x5f, 0x53, - 0x41, 0x49, 0x9e, 0x1f, 0xe8, 0x93, 0xed, 0xfd, 0xc7, 0x33, 0x1d, 0x3b, - 0x76, 0xb2, 0x74, 0x57, 0xe9, 0xeb, 0xdb, 0xcb, 0xfc, 0xfc, 0x42, 0xdd, - 0xe4, 0xbe, 0xbe, 0x7d, 0xbc, 0x7c, 0xfe, 0x23, 0xb3, 0xed, 0xf4, 0x2e, - 0x56, 0xbe, 0x7f, 0xca, 0xbe, 0xbe, 0xd6, 0x9b, 0x3d, 0x78, 0x61, 0xe6, - 0x40, 0x5d, 0x30, 0x9d, 0x5b, 0x32, 0xdd, 0x87, 0x7a, 0x00, 0x88, 0xac, - 0x0f, 0xc0, 0xdc, 0xdc, 0xcf, 0x86, 0xad, 0x8a, 0x6c, 0xc8, 0x86, 0xad, - 0x1b, 0xd9, 0xd0, 0xbd, 0x87, 0xf9, 0x37, 0x1f, 0x33, 0x8d, 0xf2, 0xbc, - 0x48, 0x3d, 0x34, 0x4a, 0xcb, 0x3e, 0x31, 0x20, 0x3c, 0x7e, 0xfa, 0xa0, - 0x21, 0x14, 0xe0, 0x64, 0x56, 0xd3, 0xfc, 0x30, 0x26, 0x4a, 0x9c, 0x86, - 0x79, 0xe6, 0xd1, 0xf5, 0x7e, 0xcd, 0x0e, 0x0d, 0x34, 0x85, 0xcd, 0x7c, - 0x1b, 0x6a, 0x3a, 0x9f, 0xcb, 0xcd, 0x32, 0x34, 0x74, 0xca, 0xac, 0x72, - 0xec, 0xfb, 0x82, 0xc4, 0x41, 0xa3, 0x7f, 0xca, 0xda, 0xbf, 0xbf, 0xa7, - 0xfc, 0x1d, 0x45, 0x4a, 0x92, 0x08, 0x2b, 0x2b, 0x3e, 0x8e, 0x93, 0xba, - 0x9e, 0x98, 0x98, 0xd2, 0x6a, 0xb8, 0xe3, 0x17, 0x2c, 0x1a, 0x05, 0x4d, - 0xa3, 0x56, 0xae, 0x6b, 0x70, 0x5d, 0x07, 0xd7, 0xad, 0xb4, 0xe2, 0xf0, - 0xe1, 0x5e, 0x26, 0x26, 0xa6, 0xb4, 0x0a, 0x2c, 0x48, 0x14, 0x34, 0x8d, - 0x7a, 0x32, 0x86, 0x32, 0x38, 0x97, 0x9b, 0xe5, 0xd5, 0xab, 0x99, 0xb2, - 0x73, 0x00, 0x2f, 0x08, 0x5b, 0x6b, 0x45, 0x2d, 0x14, 0x28, 0xb6, 0x41, - 0x18, 0x1c, 0x3c, 0xc2, 0xd2, 0x52, 0x9e, 0xe5, 0xe5, 0x3c, 0xef, 0xde, - 0x7d, 0x05, 0xc0, 0x53, 0x91, 0x55, 0xe5, 0x6a, 0x21, 0x06, 0x3f, 0x86, - 0xc4, 0x82, 0x14, 0x2b, 0xeb, 0xaa, 0xe7, 0xd6, 0x60, 0x8c, 0xc1, 0x75, - 0x0d, 0x8b, 0x8b, 0x05, 0x0a, 0x85, 0x00, 0xd7, 0xad, 0xec, 0x9f, 0xa7, - 0x2a, 0x48, 0x14, 0x82, 0x28, 0xfa, 0x27, 0x0f, 0xb1, 0xb4, 0xec, 0xd8, - 0x18, 0xb0, 0x56, 0x89, 0x63, 0x8b, 0xe7, 0xb9, 0x88, 0x54, 0x7a, 0xee, - 0x21, 0x82, 0x84, 0x05, 0xf4, 0xb7, 0x0f, 0xb1, 0x5d, 0x17, 0xaa, 0x0a, - 0x71, 0x5c, 0x3a, 0x15, 0x05, 0xc2, 0x30, 0xa1, 0xbd, 0xbd, 0x0d, 0x55, - 0x0f, 0x6b, 0x2b, 0xa6, 0x52, 0xc7, 0x8b, 0xcb, 0x68, 0x3e, 0x6c, 0x09, - 0xaa, 0x9a, 0xba, 0x0c, 0xc3, 0x10, 0x55, 0x68, 0x6b, 0x73, 0x01, 0x10, - 0x51, 0x8c, 0xa9, 0x6a, 0x05, 0xd6, 0x22, 0xbf, 0x97, 0xd7, 0x85, 0x96, - 0x4a, 0x8f, 0x63, 0x25, 0x8a, 0xa2, 0xf4, 0x67, 0xcf, 0x45, 0x24, 0x75, - 0x99, 0x24, 0x82, 0xe3, 0x54, 0xf7, 0x38, 0x4c, 0x90, 0x28, 0x6e, 0x09, - 0x2c, 0x02, 0x71, 0x9c, 0x60, 0x8c, 0x29, 0x87, 0xe3, 0x38, 0x88, 0x28, - 0xae, 0x6b, 0x48, 0x92, 0xca, 0xdd, 0xec, 0x51, 0xda, 0xbc, 0x16, 0x64, - 0x6d, 0xfd, 0x8b, 0xdd, 0x18, 0xca, 0x0b, 0x95, 0xc1, 0x0b, 0x7f, 0x1d, - 0x0a, 0xf9, 0x88, 0xf6, 0xb6, 0xf5, 0x4f, 0x43, 0x5c, 0xb5, 0xb9, 0xa5, - 0xa3, 0x56, 0xed, 0xb2, 0x5a, 0xde, 0x95, 0xc9, 0xcf, 0xe6, 0xd2, 0xe0, - 0x6e, 0xed, 0xda, 0x94, 0x34, 0x04, 0x66, 0x8b, 0x77, 0x94, 0x88, 0x2d, - 0x6e, 0x60, 0xfa, 0x4a, 0x48, 0xf1, 0x9c, 0xd7, 0x7b, 0x9d, 0x3c, 0x80, - 0x2b, 0x93, 0x5f, 0xcc, 0xda, 0xa9, 0x8a, 0xde, 0xbe, 0xfd, 0xa6, 0xd6, - 0x96, 0x9c, 0xa6, 0x6e, 0x53, 0x78, 0x65, 0xac, 0x16, 0xee, 0x35, 0x03, - 0x96, 0x94, 0xcb, 0xcd, 0x92, 0xcb, 0xcd, 0xb6, 0x92, 0x5a, 0xd6, 0x7f, - 0x25, 0x79, 0xad, 0xb1, 0x85, 0x0a, 0xbe, 0x46, 0x00, 0x00, 0x00, 0x00, - 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image14; -our $image14_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x04, - 0x91, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0x95, 0x95, 0x5b, 0x6c, 0x94, - 0x45, 0x18, 0x86, 0x9f, 0x99, 0xff, 0xb4, 0x87, 0xee, 0xf6, 0x6f, 0x69, - 0xcb, 0x96, 0x7a, 0xd1, 0x0a, 0x36, 0xf1, 0x80, 0x16, 0x14, 0x88, 0x31, - 0x26, 0x60, 0x82, 0x31, 0x31, 0x20, 0x6a, 0x88, 0x88, 0x44, 0xb6, 0x95, - 0x3b, 0x1b, 0x09, 0x91, 0x18, 0x2f, 0x38, 0x08, 0x5c, 0x34, 0x48, 0x4c, - 0x41, 0x89, 0x18, 0x0e, 0x6d, 0x49, 0x40, 0xb8, 0x30, 0x42, 0xd1, 0x10, - 0xa0, 0x31, 0x56, 0x08, 0x34, 0x48, 0xa2, 0xe5, 0x86, 0x82, 0x94, 0x16, - 0x6a, 0x0b, 0x2d, 0x14, 0xda, 0x6e, 0x77, 0x97, 0x3d, 0xfc, 0xff, 0x3f, - 0x5e, 0xd0, 0x36, 0xb4, 0x84, 0xaa, 0x6f, 0x32, 0x37, 0x33, 0x93, 0x27, - 0xef, 0x7c, 0xdf, 0x97, 0x77, 0x04, 0x0f, 0xe9, 0xd0, 0xa1, 0x13, 0xa5, - 0x86, 0xe1, 0x6d, 0xcc, 0x22, 0x96, 0x08, 0xa9, 0x6c, 0x81, 0x42, 0xd7, - 0x04, 0xca, 0xa5, 0x55, 0xb9, 0x6a, 0xff, 0xd2, 0xa5, 0x6f, 0x6e, 0xe7, - 0x31, 0xda, 0x5c, 0xd7, 0xa2, 0xce, 0x9c, 0x6b, 0xa3, 0x69, 0x6f, 0x95, - 0x00, 0x10, 0xa3, 0x07, 0x0d, 0x0d, 0x3f, 0x46, 0x5d, 0x5d, 0xd4, 0x06, - 0x82, 0x3e, 0x3b, 0x90, 0x93, 0x83, 0xdf, 0x6f, 0x21, 0xa5, 0x04, 0xc0, - 0x71, 0x1c, 0x52, 0xf1, 0x38, 0x89, 0x58, 0xac, 0x35, 0x9d, 0xa4, 0xb2, - 0xaa, 0xea, 0x9d, 0xd6, 0x89, 0xe0, 0x85, 0xab, 0xea, 0x54, 0x77, 0x57, - 0x0f, 0x6d, 0xa7, 0xd6, 0x8b, 0xcd, 0x75, 0x2d, 0x4a, 0x00, 0xec, 0xdc, - 0x79, 0x30, 0x6a, 0x04, 0x64, 0x7d, 0x41, 0x71, 0x84, 0x50, 0x28, 0x88, - 0x69, 0xea, 0x68, 0x9a, 0x06, 0x80, 0xeb, 0xb8, 0x18, 0xa6, 0x81, 0xa6, - 0x69, 0x24, 0xe2, 0x09, 0x6e, 0x76, 0x76, 0x0c, 0x0e, 0x0d, 0x38, 0xb3, - 0xaa, 0xab, 0x3f, 0xb8, 0xfe, 0x38, 0xf7, 0x0b, 0x57, 0xd5, 0x29, 0x59, - 0x53, 0x53, 0x5f, 0xea, 0x48, 0xb7, 0xb6, 0xa0, 0x38, 0x82, 0x6d, 0x87, - 0xb1, 0x73, 0x73, 0xc8, 0xcf, 0x0b, 0x93, 0x67, 0x87, 0x08, 0x85, 0x82, - 0x18, 0xa6, 0x81, 0x93, 0x75, 0x00, 0x98, 0x52, 0x90, 0x47, 0x49, 0x59, - 0x99, 0x2d, 0xb4, 0x4c, 0xfd, 0x44, 0xd8, 0xda, 0x1d, 0xcd, 0x2a, 0xba, - 0xf1, 0x98, 0x02, 0x68, 0xda, 0x5b, 0x25, 0xa4, 0xeb, 0x26, 0x56, 0xdb, - 0xf9, 0x61, 0x3b, 0x18, 0xf4, 0x13, 0x0c, 0xfa, 0x09, 0x87, 0x73, 0xc8, - 0x0d, 0x87, 0xb0, 0x43, 0x39, 0xb8, 0x8e, 0x4b, 0x61, 0x41, 0x1e, 0x81, - 0x80, 0x0f, 0xd3, 0xd4, 0x01, 0x88, 0x14, 0x17, 0x91, 0x5f, 0x60, 0xcf, - 0xdf, 0xb2, 0xe5, 0x9b, 0x8a, 0x51, 0xe8, 0xc7, 0x5b, 0x4f, 0xaa, 0xae, - 0xee, 0x3b, 0xf4, 0xf4, 0xf4, 0xf3, 0xd2, 0xbb, 0xb5, 0x0a, 0x40, 0xa6, - 0xdd, 0xcc, 0x12, 0x7b, 0x4a, 0x3e, 0x86, 0x61, 0xe0, 0xf3, 0x99, 0xf8, - 0x7d, 0x16, 0x21, 0xbf, 0x9f, 0xdc, 0x60, 0x10, 0xcf, 0xf3, 0x30, 0x75, - 0x9d, 0x40, 0xc0, 0x47, 0x30, 0xe0, 0xc7, 0xef, 0xb3, 0x30, 0x0d, 0x9d, - 0xd2, 0xe9, 0xa5, 0x64, 0xb3, 0xc3, 0x2b, 0x47, 0xc1, 0x43, 0xb1, 0x24, - 0x03, 0x03, 0xc3, 0xa4, 0x52, 0x69, 0x94, 0x52, 0x00, 0xe8, 0x52, 0xaa, - 0x52, 0xcb, 0x34, 0xd0, 0x75, 0x89, 0x14, 0x20, 0x10, 0x68, 0x9a, 0x46, - 0x2c, 0x91, 0xc4, 0xf2, 0x59, 0x58, 0xa6, 0x81, 0xa7, 0x3c, 0xa4, 0x94, - 0x08, 0x21, 0x50, 0x4a, 0x11, 0x29, 0x8e, 0x90, 0x4a, 0x25, 0xc7, 0x1c, - 0x5f, 0xbb, 0xd6, 0x83, 0xe3, 0x38, 0x64, 0xd3, 0x59, 0xe2, 0xb1, 0x18, - 0x00, 0xd2, 0x30, 0x35, 0x34, 0x4d, 0x43, 0x08, 0xc1, 0x50, 0x2c, 0x41, - 0xf7, 0xad, 0xdb, 0x74, 0xfc, 0x7d, 0x93, 0xbb, 0x43, 0x43, 0x84, 0x73, - 0x02, 0x18, 0x9a, 0x86, 0xa9, 0xeb, 0x63, 0xcb, 0x32, 0x0c, 0x4c, 0x5d, - 0x27, 0x9d, 0xbe, 0x3f, 0x56, 0xdf, 0x96, 0xc3, 0xd5, 0x65, 0x4e, 0xd6, - 0x21, 0x1e, 0x8b, 0xd1, 0xfe, 0xdb, 0x16, 0x01, 0xa0, 0x0f, 0xc7, 0x12, - 0x08, 0xf1, 0x60, 0xea, 0xfc, 0x3e, 0x0b, 0xdd, 0xd0, 0x91, 0x40, 0x38, - 0x27, 0x87, 0xa0, 0x65, 0x91, 0xca, 0x64, 0xd0, 0x75, 0x1d, 0x5d, 0x4a, - 0xa4, 0x94, 0x28, 0xa5, 0x70, 0x3c, 0x8f, 0x64, 0x32, 0xf5, 0x70, 0xef, - 0xae, 0xff, 0xd9, 0xb8, 0x56, 0x3c, 0xbc, 0x21, 0xfb, 0xfa, 0xee, 0x5e, - 0x77, 0x5d, 0x17, 0x29, 0x25, 0x03, 0x83, 0xc3, 0x64, 0x33, 0x59, 0x34, - 0x5d, 0xc3, 0xf5, 0x5c, 0x92, 0x99, 0x0c, 0x9a, 0xa6, 0x61, 0x68, 0x1a, - 0xc6, 0x88, 0x53, 0x53, 0xd7, 0xe9, 0xed, 0xb9, 0x49, 0x3c, 0x9e, 0x79, - 0x64, 0x96, 0xc7, 0x81, 0xfb, 0x7b, 0x07, 0x8f, 0xde, 0xe8, 0xe8, 0x04, - 0xc0, 0xb2, 0x0c, 0x1c, 0xd7, 0xc3, 0xf5, 0x1e, 0x34, 0x40, 0x20, 0x90, - 0x23, 0x4e, 0x0d, 0x4d, 0xc3, 0x32, 0x0c, 0x74, 0x5d, 0xa7, 0xe9, 0x64, - 0x13, 0xc3, 0xc3, 0xee, 0xfe, 0x49, 0xc1, 0xf1, 0xb8, 0xd8, 0x74, 0xfa, - 0xd7, 0xb3, 0x83, 0xe9, 0x74, 0x16, 0xbf, 0xcf, 0x42, 0x93, 0x62, 0xb2, - 0xfb, 0x74, 0x76, 0x74, 0x72, 0xb1, 0xb5, 0x8d, 0x92, 0x92, 0x27, 0x07, - 0x27, 0x05, 0x37, 0x37, 0xef, 0x1b, 0xec, 0xed, 0x8e, 0x57, 0xfe, 0x7c, - 0xe4, 0x18, 0xe9, 0x4c, 0x16, 0x9f, 0xcf, 0x04, 0xc0, 0xf5, 0x14, 0x0a, - 0x85, 0xe7, 0x79, 0x78, 0x9e, 0x47, 0xd6, 0x75, 0xb9, 0xfc, 0x57, 0x3b, - 0x5f, 0xef, 0xf8, 0x96, 0xf2, 0xf2, 0x0a, 0xc2, 0xe1, 0x60, 0xc5, 0x64, - 0x60, 0x0d, 0xa0, 0xb3, 0xb3, 0xf5, 0x72, 0xd0, 0x57, 0x76, 0xb1, 0xfd, - 0xea, 0xa5, 0x37, 0xec, 0xdc, 0x90, 0xaf, 0x70, 0x6a, 0x11, 0xba, 0xae, - 0x21, 0x85, 0x78, 0x10, 0x26, 0x42, 0x70, 0xf2, 0xf8, 0x09, 0xbe, 0x3f, - 0xf0, 0x03, 0x33, 0x66, 0xbc, 0x40, 0x49, 0xc9, 0x34, 0x0a, 0xad, 0x7b, - 0xcb, 0x3e, 0x99, 0x79, 0xe5, 0x8b, 0xf7, 0x66, 0x07, 0x4a, 0x0f, 0xfe, - 0x3e, 0xdc, 0x38, 0x11, 0x3c, 0xee, 0xdd, 0xf3, 0xe7, 0x7f, 0x64, 0x9b, - 0x66, 0x76, 0x63, 0x61, 0x24, 0xb4, 0x24, 0x3f, 0x2f, 0x50, 0xaa, 0x69, - 0x02, 0x90, 0x5c, 0xbd, 0x72, 0xa3, 0x39, 0x9b, 0x35, 0xf6, 0xcf, 0x99, - 0x33, 0xaf, 0x35, 0x9d, 0x4e, 0xdb, 0xb6, 0xbc, 0x5d, 0x5f, 0x9e, 0x3c, - 0x52, 0x3a, 0xb7, 0x22, 0xc4, 0x40, 0x67, 0x3b, 0x6d, 0xb7, 0xfc, 0x0d, - 0xcb, 0xeb, 0x6e, 0x55, 0x3e, 0x62, 0x7b, 0xc3, 0x9e, 0xb3, 0xea, 0xd5, - 0x15, 0xbb, 0x14, 0xe0, 0x9b, 0xb4, 0xc0, 0x23, 0xfa, 0xee, 0xfd, 0xe2, - 0x81, 0x3b, 0x17, 0xd6, 0xa9, 0x64, 0xdb, 0x36, 0xd5, 0x7f, 0xf8, 0x65, - 0x75, 0xfe, 0x33, 0x5b, 0xed, 0x5a, 0x56, 0x3c, 0x2e, 0x3f, 0x24, 0x40, - 0xcb, 0xf9, 0x2b, 0xdc, 0xee, 0xbd, 0x0d, 0x90, 0xaa, 0xfe, 0xf2, 0x94, - 0xaa, 0x58, 0xb4, 0x4d, 0x4d, 0x06, 0x4e, 0xdc, 0x67, 0x4d, 0xcb, 0x91, - 0x46, 0xac, 0x3c, 0x9b, 0xc0, 0xf3, 0x6f, 0x31, 0x7d, 0xf6, 0xd3, 0x3c, - 0x37, 0x2d, 0x19, 0xad, 0x59, 0x54, 0xfc, 0x48, 0x38, 0x8d, 0xea, 0x89, - 0x05, 0xd1, 0xdd, 0xaa, 0x7c, 0xc1, 0xc6, 0x49, 0xc1, 0x00, 0xeb, 0x5f, - 0x8f, 0x44, 0x0f, 0x7f, 0x3a, 0x53, 0xb9, 0x7d, 0x75, 0x2a, 0x79, 0xa9, - 0x46, 0xf5, 0x1f, 0x9a, 0xa7, 0x7e, 0xa9, 0x0e, 0xab, 0xcf, 0x5f, 0x8b, - 0xd4, 0x03, 0x88, 0xad, 0x07, 0x2e, 0xa8, 0x3b, 0x77, 0x13, 0xf4, 0xdf, - 0x8b, 0xd1, 0xb0, 0x69, 0xf1, 0xe4, 0xb3, 0x36, 0x41, 0xab, 0x5f, 0x89, - 0x44, 0x2b, 0x66, 0x15, 0xd5, 0x7f, 0xb8, 0x7e, 0x0d, 0xe9, 0xfe, 0x9b, - 0x24, 0x2f, 0x36, 0x72, 0xe1, 0x74, 0x1b, 0x3f, 0xb5, 0x06, 0x1b, 0x64, - 0x57, 0xcf, 0x3d, 0x46, 0x23, 0xef, 0xc5, 0xb7, 0xbf, 0x52, 0xf0, 0xe0, - 0x9b, 0x59, 0xb8, 0xaa, 0xee, 0x5f, 0x5d, 0xef, 0x38, 0xdb, 0xdb, 0x70, - 0xfa, 0x5c, 0x5f, 0xe5, 0x9e, 0x0d, 0xdb, 0xb1, 0x8a, 0x4a, 0x08, 0xcc, - 0x5c, 0xcc, 0xb3, 0x73, 0x9f, 0x42, 0x49, 0x23, 0x2a, 0x13, 0xc9, 0xf4, - 0x58, 0xe4, 0x31, 0x92, 0x19, 0x67, 0xce, 0xb5, 0xd1, 0xdd, 0xd5, 0xf3, - 0x9f, 0x5c, 0xd7, 0xff, 0xd1, 0xd7, 0xd0, 0x72, 0xbe, 0xb7, 0x72, 0xf7, - 0xba, 0x5a, 0x1c, 0x7f, 0x3e, 0xfb, 0x8e, 0x43, 0xb0, 0x62, 0x05, 0x62, - 0x41, 0x74, 0xb7, 0x4a, 0x26, 0x53, 0xa4, 0xef, 0xa7, 0xc7, 0xa5, 0xd3, - 0xff, 0xd5, 0xca, 0x8a, 0xa9, 0xf5, 0x7e, 0xbf, 0x8c, 0xea, 0xcf, 0x2c, - 0xa7, 0xb3, 0x37, 0x75, 0xf4, 0x1f, 0x56, 0x87, 0xe4, 0x18, 0x1c, 0x28, - 0xb9, 0x61, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, - 0x60, 0x82; - -our $image15; -our $image15_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x04, - 0x31, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0x8d, 0x95, 0x4d, 0x6c, 0x54, - 0x55, 0x14, 0xc7, 0x7f, 0xf7, 0xbe, 0xef, 0x99, 0x29, 0x53, 0xa0, 0x48, - 0x29, 0x69, 0x19, 0x52, 0x40, 0x1a, 0x44, 0x89, 0x09, 0x44, 0xd2, 0xf8, - 0xd5, 0x84, 0xa5, 0xa1, 0x89, 0xbb, 0x26, 0xee, 0x20, 0x2a, 0x31, 0x6e, - 0xba, 0x92, 0x60, 0x08, 0x89, 0x2b, 0x62, 0x63, 0xa2, 0x0b, 0x17, 0xcc, - 0xd2, 0x54, 0x37, 0x26, 0x8d, 0x6b, 0x53, 0x35, 0x41, 0x8d, 0x29, 0x21, - 0xf8, 0x01, 0xa1, 0x22, 0x52, 0x5b, 0x18, 0xa1, 0x4c, 0x69, 0xa7, 0xd3, - 0x99, 0x79, 0xf3, 0xde, 0xbc, 0x7b, 0x5c, 0xbc, 0x69, 0x2d, 0x20, 0xc8, - 0x49, 0xce, 0xe6, 0xdc, 0xff, 0xf9, 0xdf, 0xff, 0xbd, 0xf7, 0x9c, 0x73, - 0x15, 0xff, 0x63, 0x87, 0x4f, 0x8a, 0x2f, 0x42, 0x17, 0x90, 0x13, 0xc0, - 0x18, 0x56, 0x12, 0xa1, 0x7c, 0xf1, 0xac, 0x0a, 0x1f, 0x97, 0xa7, 0x1e, - 0xb5, 0x30, 0x78, 0x4a, 0x3a, 0x81, 0x61, 0x63, 0x18, 0x12, 0xa1, 0x0f, - 0xc8, 0x1b, 0x81, 0xc4, 0x50, 0x11, 0x98, 0x15, 0x98, 0x14, 0xc3, 0xc4, - 0xa5, 0x0f, 0xd5, 0xd2, 0x13, 0x11, 0x0f, 0x9e, 0x92, 0x1c, 0x30, 0xa2, - 0x14, 0xa3, 0x39, 0x4f, 0x0a, 0x3d, 0x1b, 0x71, 0x0a, 0x5b, 0x8c, 0xda, - 0x96, 0x4f, 0xd0, 0x1a, 0x4a, 0x4b, 0x16, 0x37, 0xe6, 0xb5, 0x94, 0xee, - 0x99, 0x78, 0x7e, 0x59, 0xcf, 0x44, 0x89, 0x1a, 0x13, 0x61, 0xfc, 0xf2, - 0x47, 0x6a, 0xe5, 0x91, 0xc4, 0x2f, 0xbe, 0x2f, 0x79, 0x23, 0x9c, 0xb1, - 0x35, 0xc7, 0x07, 0xb6, 0x9b, 0xcc, 0x91, 0xe7, 0x60, 0x60, 0x3b, 0x6c, - 0x08, 0x84, 0xe5, 0x5a, 0x8c, 0x91, 0x14, 0x1e, 0xf8, 0x2e, 0x73, 0x77, - 0x5b, 0x7c, 0x75, 0x41, 0xf1, 0xc3, 0x34, 0xf5, 0xe5, 0xd0, 0x3e, 0x97, - 0x18, 0x4e, 0x4f, 0x7f, 0xac, 0x2a, 0x0f, 0x11, 0xb7, 0x95, 0x7e, 0x90, - 0xf5, 0xe4, 0xed, 0x23, 0xfb, 0x5b, 0xee, 0xab, 0xfb, 0x6d, 0x02, 0xc7, - 0x10, 0x36, 0x63, 0xf2, 0x19, 0xcd, 0xf6, 0x2e, 0x1b, 0x69, 0x63, 0xa7, - 0xe7, 0x22, 0x1c, 0xc7, 0xc2, 0x60, 0x33, 0x35, 0x1d, 0xf2, 0xd9, 0x79, - 0x2b, 0x2a, 0x2d, 0xb9, 0x9f, 0x8a, 0x70, 0xea, 0xf7, 0x4f, 0x52, 0xe5, - 0x7a, 0x9d, 0xe0, 0x11, 0x5b, 0x73, 0xec, 0xf0, 0x1e, 0x71, 0x5f, 0x79, - 0xc6, 0x46, 0x21, 0xac, 0xd4, 0x23, 0x06, 0x7a, 0x5d, 0xfa, 0x7b, 0x5c, - 0x7c, 0x57, 0x13, 0xb4, 0xfd, 0x40, 0xbf, 0xcf, 0xd6, 0x4e, 0x45, 0x14, - 0xb7, 0x78, 0x7e, 0x77, 0xc0, 0xeb, 0x87, 0x12, 0x37, 0xe3, 0x26, 0xc7, - 0x44, 0x18, 0x59, 0x25, 0xd3, 0xab, 0x0f, 0xa5, 0x14, 0xa3, 0x85, 0x2d, - 0x26, 0x7b, 0x70, 0x97, 0xa2, 0x11, 0x2b, 0xca, 0x95, 0x88, 0x67, 0x77, - 0x7a, 0x04, 0x9e, 0xa6, 0xd6, 0x84, 0xcb, 0x73, 0x70, 0xf1, 0x06, 0xcc, - 0x96, 0xc1, 0x08, 0x74, 0x6d, 0xb0, 0xe9, 0xd9, 0x64, 0x51, 0x0d, 0x61, - 0x77, 0xaf, 0xcf, 0xc1, 0x7e, 0xb2, 0x4a, 0x31, 0xba, 0xf3, 0x84, 0x74, - 0xae, 0x57, 0x3c, 0x1c, 0x38, 0x52, 0xd8, 0xd7, 0x0b, 0xad, 0x44, 0xb1, - 0x58, 0x85, 0xac, 0xa7, 0xf0, 0x5d, 0x8d, 0x11, 0xf8, 0xe3, 0x36, 0x5c, - 0xbf, 0x03, 0x37, 0xcb, 0x30, 0x75, 0xad, 0x45, 0xb9, 0x12, 0x01, 0xd0, - 0x11, 0x68, 0x6a, 0x21, 0xdc, 0xab, 0x42, 0xef, 0xe6, 0x84, 0x0e, 0x3f, - 0x29, 0x18, 0x61, 0x18, 0xc0, 0x3e, 0x7c, 0x52, 0x7c, 0x63, 0x18, 0xca, - 0x67, 0x70, 0x72, 0xbe, 0x62, 0xb9, 0x9e, 0xee, 0x94, 0xf5, 0x6c, 0x5a, - 0x09, 0x34, 0x22, 0x98, 0xbe, 0x05, 0xcd, 0x38, 0x8d, 0xc7, 0xcd, 0x3a, - 0x81, 0x9b, 0x01, 0xa0, 0x16, 0x0a, 0x3f, 0x5e, 0x35, 0xdc, 0xae, 0x68, - 0xea, 0x91, 0x43, 0xe0, 0x29, 0x47, 0xaa, 0x0c, 0xf5, 0xbd, 0x25, 0x5f, - 0xd8, 0xed, 0xe2, 0xef, 0xcb, 0x78, 0xa8, 0xa8, 0xa5, 0x58, 0xac, 0xa5, - 0x04, 0x95, 0x86, 0xc5, 0xbd, 0x1a, 0xac, 0x84, 0x50, 0x6d, 0xa4, 0xb1, - 0x0e, 0xa7, 0xc6, 0xe0, 0x80, 0x4d, 0x2e, 0xb0, 0x31, 0x02, 0xdf, 0x5e, - 0x36, 0x5c, 0x29, 0x59, 0x6b, 0x8f, 0x94, 0xf5, 0x51, 0x22, 0xf4, 0x89, - 0xd0, 0x65, 0x03, 0x39, 0x11, 0xf2, 0xbe, 0x63, 0x58, 0x0e, 0xff, 0x05, - 0x01, 0x6b, 0x9b, 0x00, 0x58, 0x49, 0x85, 0xa3, 0x2f, 0xfb, 0xf4, 0x3d, - 0xe5, 0x21, 0xc0, 0xd4, 0xb5, 0x84, 0xaf, 0x7f, 0xbd, 0xbf, 0x0d, 0x7c, - 0x07, 0x8c, 0x90, 0x17, 0x91, 0x9c, 0x9d, 0x98, 0x34, 0xd8, 0x8c, 0x61, - 0xa1, 0x0a, 0x6b, 0x35, 0xb5, 0x3e, 0xc1, 0x6a, 0xf0, 0xc6, 0x4b, 0x2e, - 0x3b, 0xb6, 0x7a, 0xb4, 0x12, 0xf8, 0xe6, 0xb7, 0x84, 0xcf, 0xbf, 0x57, - 0xac, 0x84, 0xfa, 0xa1, 0x0e, 0x13, 0x49, 0x09, 0x6c, 0x11, 0xaa, 0x02, - 0x95, 0x6a, 0x68, 0x61, 0x59, 0x0f, 0x80, 0x00, 0x31, 0xc2, 0xd6, 0x6e, - 0x4d, 0xcf, 0xa6, 0x94, 0xe2, 0xc2, 0x75, 0xc3, 0x97, 0x3f, 0x29, 0xc2, - 0x58, 0xaf, 0xe1, 0x55, 0x1b, 0xdb, 0x0c, 0x01, 0x91, 0x0a, 0x8a, 0xaa, - 0x6d, 0x60, 0x01, 0x98, 0xad, 0x35, 0x91, 0xac, 0x87, 0x52, 0x4a, 0x10, - 0x51, 0xa9, 0x70, 0x49, 0xd3, 0xb4, 0xd2, 0x58, 0x96, 0xa2, 0xda, 0x80, - 0xf3, 0x57, 0xd3, 0x4a, 0xd0, 0xff, 0x31, 0x65, 0x2a, 0x35, 0x04, 0xcc, - 0x2c, 0xc2, 0x82, 0xbe, 0x78, 0x56, 0x85, 0xc6, 0x30, 0x59, 0x6b, 0x48, - 0x2c, 0x22, 0x68, 0xa5, 0xb0, 0x34, 0xd8, 0x1a, 0x6c, 0x2b, 0xf5, 0xbb, - 0x55, 0x8b, 0xa9, 0x3f, 0x35, 0xdf, 0x5d, 0x81, 0xb9, 0x72, 0x1a, 0x73, - 0x1e, 0x70, 0x11, 0xa1, 0x52, 0x33, 0x31, 0x30, 0x59, 0x2a, 0x3a, 0xa1, - 0x9d, 0xde, 0x0b, 0x13, 0xb5, 0x26, 0xef, 0xd5, 0x9b, 0xb2, 0xa7, 0x7b, - 0xa3, 0x42, 0xad, 0x57, 0x23, 0x90, 0x24, 0x31, 0x95, 0x6a, 0x0b, 0xad, - 0x34, 0x59, 0xdf, 0x27, 0x91, 0xfb, 0xe5, 0x8a, 0xc0, 0x9d, 0x25, 0xc3, - 0x4a, 0x28, 0x33, 0xc0, 0x04, 0xb4, 0x1b, 0xe4, 0xe7, 0x31, 0xb5, 0x14, - 0x27, 0x6a, 0xac, 0xb4, 0x68, 0x6a, 0xca, 0x34, 0xc9, 0x78, 0x90, 0x6d, - 0x7b, 0xc6, 0x13, 0x0e, 0xf4, 0xc5, 0xbc, 0x76, 0x28, 0xe0, 0xe8, 0x0b, - 0x01, 0x83, 0x7b, 0x15, 0x39, 0x7f, 0xfd, 0x3a, 0x24, 0x71, 0xc8, 0x5f, - 0xf3, 0xad, 0x5a, 0x2b, 0x91, 0xb1, 0x52, 0xd1, 0x59, 0x5a, 0x23, 0x6e, - 0x0b, 0x1b, 0x5f, 0x6e, 0xd8, 0xc5, 0x5f, 0x66, 0x75, 0x94, 0xc4, 0x0d, - 0x7c, 0x57, 0x08, 0xda, 0x89, 0xae, 0xeb, 0xd1, 0x32, 0x9a, 0x38, 0x49, - 0xef, 0x36, 0xf0, 0x52, 0xf7, 0x5d, 0x21, 0x8e, 0x1a, 0x4c, 0x5d, 0x97, - 0x68, 0xa9, 0xae, 0x8a, 0x20, 0xe3, 0xab, 0x7c, 0xf7, 0x9d, 0xe9, 0xe9, - 0x77, 0x25, 0x2f, 0xc2, 0x99, 0xcd, 0xd9, 0xe8, 0xf8, 0xbe, 0x5e, 0xc9, - 0xf4, 0x77, 0x6b, 0x1c, 0xc7, 0xc1, 0xb6, 0x60, 0x47, 0x17, 0x38, 0x36, - 0xcc, 0xcc, 0x43, 0x18, 0x43, 0x1c, 0x35, 0x99, 0x2e, 0x09, 0x97, 0x6e, - 0x24, 0xf5, 0xf9, 0xaa, 0x73, 0x0e, 0x38, 0x5d, 0x2a, 0x7a, 0x0f, 0x8f, - 0xcd, 0x55, 0xdb, 0xf5, 0x8e, 0xe4, 0x04, 0x46, 0x3c, 0x2b, 0x19, 0xed, - 0xce, 0xb7, 0x0a, 0x7b, 0xbb, 0x1b, 0xce, 0xb6, 0x8d, 0xb6, 0xf2, 0x83, - 0x00, 0x80, 0x46, 0xa3, 0xce, 0xad, 0x72, 0x2c, 0x57, 0xfe, 0xf6, 0xe3, - 0x5b, 0x8b, 0xd6, 0x4c, 0x18, 0xeb, 0x31, 0x90, 0xf1, 0x52, 0xd1, 0x7b, - 0xf4, 0xa0, 0x5f, 0x6f, 0x85, 0x13, 0xd2, 0x29, 0xc2, 0xb0, 0x08, 0x43, - 0x26, 0x6d, 0xd3, 0xbc, 0x88, 0xa4, 0x75, 0x8a, 0x99, 0x05, 0x26, 0x41, - 0x26, 0x4a, 0x45, 0xf7, 0xc9, 0xbe, 0xa6, 0x07, 0xad, 0xf7, 0x4d, 0xf1, - 0x45, 0xd8, 0x6c, 0x44, 0x3a, 0x40, 0x40, 0xa4, 0x0a, 0xb2, 0x50, 0x2a, - 0x3a, 0x8f, 0xfd, 0x4c, 0xff, 0x01, 0xb1, 0xe1, 0x0a, 0x72, 0x93, 0xd9, - 0x9f, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, - 0x60, 0x82; - -our $image16; -our $image16_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x02, - 0x30, 0x49, 0x44, 0x41, 0x54, 0x48, 0x89, 0x9d, 0xd5, 0xcb, 0x4e, 0x54, - 0x41, 0x10, 0x06, 0xe0, 0x6f, 0x86, 0x51, 0x14, 0xaf, 0x31, 0x31, 0x02, - 0x1a, 0x16, 0x06, 0x71, 0xe3, 0x65, 0xa1, 0x6f, 0x60, 0x74, 0xe9, 0xd2, - 0xb8, 0xd5, 0x20, 0x89, 0xf1, 0x25, 0xe6, 0x39, 0x7c, 0x09, 0x9f, 0xc1, - 0x57, 0xd0, 0x95, 0x18, 0x13, 0x15, 0x50, 0x8c, 0x17, 0x08, 0xa0, 0x03, - 0x83, 0x30, 0x2e, 0xba, 0x8e, 0xf4, 0xf4, 0x1c, 0x06, 0xb4, 0x92, 0x93, - 0x99, 0xae, 0xae, 0xfa, 0xeb, 0xef, 0xfa, 0xeb, 0xf4, 0xe1, 0xf0, 0xd6, - 0x44, 0x6f, 0xc8, 0x33, 0x8e, 0x13, 0x68, 0xa1, 0x91, 0x27, 0x36, 0x22, - 0xb9, 0xcf, 0x59, 0x0f, 0xde, 0x8e, 0x27, 0x07, 0x1e, 0xf0, 0x4d, 0x60, - 0x2c, 0x72, 0x34, 0xc2, 0x79, 0x16, 0x5d, 0x6c, 0x61, 0xb7, 0x00, 0x6f, - 0x24, 0x5f, 0x3b, 0x96, 0x6d, 0x78, 0x8c, 0x0d, 0x6c, 0xe3, 0xc5, 0xde, - 0xde, 0xdf, 0xfd, 0x19, 0x2c, 0xa1, 0xd3, 0x0c, 0xef, 0x6a, 0x59, 0xb9, - 0x60, 0x9f, 0x27, 0xcf, 0xe1, 0x3b, 0xe6, 0xf1, 0x1a, 0x37, 0xfb, 0x0b, - 0x80, 0x29, 0x9c, 0x46, 0x33, 0x07, 0x7b, 0x87, 0xc9, 0x9a, 0x22, 0x59, - 0xeb, 0xda, 0xf0, 0x3c, 0x08, 0x7d, 0x09, 0x96, 0x1f, 0x4a, 0x74, 0x9c, - 0xc2, 0x51, 0x34, 0x4a, 0xb6, 0x6f, 0x6a, 0x8a, 0x44, 0x5f, 0x2b, 0x96, - 0x6d, 0x78, 0x19, 0x20, 0x4d, 0x6c, 0xd6, 0x14, 0xe8, 0xb3, 0xba, 0x89, - 0x98, 0xc1, 0x49, 0x7b, 0xe2, 0x8f, 0x85, 0xaf, 0xda, 0x7f, 0x88, 0xdb, - 0x38, 0x67, 0x50, 0xe8, 0x59, 0xdc, 0x91, 0xa6, 0x6a, 0xa4, 0x12, 0xb9, - 0xce, 0xae, 0xe2, 0x13, 0x7e, 0xc5, 0x7a, 0x2c, 0x4e, 0x77, 0x31, 0x72, - 0x96, 0x30, 0x5f, 0x9c, 0xec, 0x09, 0x3e, 0xe3, 0x2d, 0x16, 0xd1, 0x19, - 0x56, 0xa0, 0xae, 0xc8, 0xb1, 0x38, 0xd9, 0x48, 0xf2, 0xf7, 0x81, 0xcf, - 0x62, 0x39, 0xc0, 0xab, 0x9c, 0xdd, 0x83, 0x0a, 0x94, 0x45, 0x7a, 0x01, - 0xbe, 0x5d, 0x80, 0xcf, 0x65, 0xcc, 0x97, 0x2a, 0x70, 0x06, 0x47, 0xb2, - 0xce, 0x72, 0xe1, 0xf7, 0x23, 0xb4, 0x81, 0x8f, 0x39, 0xf3, 0x6a, 0xe3, - 0x30, 0x05, 0xca, 0x22, 0x23, 0x35, 0xfb, 0x9b, 0x58, 0x8b, 0xdf, 0xf2, - 0x45, 0x1d, 0x7a, 0xbf, 0x94, 0xcf, 0x65, 0x69, 0x3c, 0x27, 0x32, 0xdf, - 0x23, 0xd9, 0xd4, 0x94, 0xe0, 0xad, 0x21, 0xac, 0x9f, 0x61, 0x1d, 0x1d, - 0xfc, 0xc6, 0xcf, 0xec, 0x04, 0x1b, 0x92, 0x36, 0x53, 0x11, 0xbb, 0x10, - 0xb1, 0x03, 0xec, 0x0f, 0x12, 0xf9, 0xae, 0xbd, 0xbe, 0xee, 0x48, 0x2d, - 0x58, 0x8f, 0xff, 0xdd, 0x88, 0xb9, 0x21, 0x4d, 0xcf, 0x4a, 0x10, 0xe9, - 0xb3, 0x52, 0x83, 0xa7, 0xc5, 0xba, 0x15, 0x6c, 0x97, 0xa5, 0x29, 0xf9, - 0x11, 0xc0, 0xdd, 0x34, 0x3d, 0x6d, 0x78, 0x85, 0x33, 0xe2, 0x6a, 0xa8, - 0x63, 0x99, 0xf7, 0xf2, 0xbe, 0xc1, 0xbe, 0x5f, 0x93, 0x66, 0xbf, 0x4a, - 0x6e, 0x4a, 0xb7, 0x6f, 0xb5, 0xff, 0x00, 0xb7, 0xc2, 0x37, 0x30, 0x34, - 0x95, 0x06, 0xf7, 0x02, 0x60, 0x11, 0x57, 0xa4, 0x79, 0xae, 0x6c, 0x42, - 0xba, 0x3d, 0x37, 0xa5, 0x16, 0xf4, 0xa4, 0x6b, 0x7d, 0x1a, 0x97, 0x22, - 0x66, 0x35, 0x7c, 0x03, 0xed, 0x6e, 0xe0, 0x3c, 0x2e, 0x48, 0x7d, 0xfe, - 0x1a, 0xfe, 0xb5, 0x22, 0xee, 0x3a, 0xde, 0x4b, 0x42, 0xf7, 0x82, 0x69, - 0xf5, 0x56, 0x93, 0xda, 0x58, 0x3b, 0xa2, 0x2d, 0x49, 0xb4, 0xe8, 0xab, - 0xad, 0x48, 0x9e, 0x94, 0xc4, 0xad, 0x6c, 0x1c, 0xdf, 0xa4, 0x89, 0xda, - 0x09, 0xa0, 0x4e, 0xc4, 0x8b, 0x75, 0xed, 0xb0, 0xb4, 0x22, 0xa8, 0xab, - 0xbf, 0xef, 0xe5, 0x09, 0x8e, 0xe3, 0x88, 0x7e, 0x11, 0x7b, 0x51, 0x6c, - 0xa8, 0xb5, 0x32, 0xd0, 0x3c, 0x71, 0x4b, 0xea, 0xfd, 0xb4, 0x24, 0xde, - 0x4a, 0x46, 0xe2, 0x9f, 0x6c, 0xbf, 0x0f, 0x7d, 0x03, 0xa3, 0xd2, 0x67, - 0x6f, 0x34, 0x0a, 0xae, 0xd9, 0x47, 0xc8, 0xff, 0x29, 0x50, 0xed, 0x55, - 0x1f, 0x9c, 0x9e, 0x21, 0x7d, 0x1e, 0x66, 0x7f, 0x00, 0x45, 0xac, 0xd1, - 0xdd, 0x3e, 0xbd, 0xd4, 0x13, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, - 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image17; -our $image17_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x03, - 0x82, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xb5, 0x95, 0xcf, 0x6b, 0x5c, - 0x55, 0x14, 0xc7, 0x3f, 0xef, 0x47, 0x66, 0xd2, 0x26, 0x4d, 0xa6, 0x31, - 0x05, 0x0b, 0x46, 0xa2, 0x55, 0x8a, 0x22, 0x94, 0x04, 0xb1, 0x56, 0xba, - 0x70, 0xe1, 0x42, 0xdd, 0x98, 0x2c, 0x44, 0x11, 0x17, 0x4a, 0x0b, 0x5d, - 0x36, 0x0b, 0x85, 0x66, 0x51, 0x5c, 0x28, 0xd1, 0xaa, 0xc5, 0xa6, 0x2e, - 0x14, 0x2b, 0xe4, 0x4f, 0x50, 0x2c, 0x2e, 0x24, 0x96, 0x16, 0xab, 0x06, - 0x29, 0x48, 0xb4, 0x85, 0x9a, 0xa8, 0x4d, 0x69, 0x68, 0xda, 0x24, 0xf3, - 0x26, 0x6f, 0x66, 0x32, 0xef, 0xcd, 0x7b, 0xe7, 0xbe, 0x7b, 0x5c, 0x4c, - 0x7e, 0x27, 0x82, 0x05, 0x73, 0xe1, 0x72, 0xe0, 0x72, 0xce, 0xe7, 0x9e, - 0xfb, 0xbd, 0xf7, 0x9e, 0xe3, 0xa8, 0x2a, 0xdb, 0x31, 0xdc, 0x6d, 0xa1, - 0x02, 0xce, 0xbd, 0x38, 0xbf, 0xfb, 0xe1, 0x68, 0x21, 0xb3, 0x3a, 0x92, - 0xcb, 0x79, 0x7d, 0x8b, 0x35, 0xe9, 0x19, 0x3a, 0xf9, 0xfc, 0xf8, 0x46, - 0x9f, 0x65, 0x05, 0xfe, 0x73, 0xc6, 0xef, 0x9d, 0x1e, 0xed, 0x6b, 0xde, - 0xd1, 0x34, 0xf5, 0x4a, 0x7f, 0x6f, 0xdf, 0x91, 0xd7, 0x0f, 0x21, 0xc6, - 0x8e, 0xdc, 0x4b, 0x52, 0x9b, 0xc6, 0xa9, 0xe1, 0x0b, 0xdd, 0x43, 0x9f, - 0x7c, 0x7f, 0xf1, 0xdb, 0xef, 0xfe, 0xd0, 0xea, 0xa2, 0x68, 0xa9, 0x94, - 0x68, 0x18, 0xa6, 0x7a, 0xe1, 0x87, 0x29, 0x1d, 0x18, 0x3c, 0x3f, 0xb0, - 0x55, 0xc6, 0xaa, 0x8a, 0xa3, 0xaa, 0x3c, 0x33, 0xf8, 0xdb, 0xa6, 0x1b, - 0xfc, 0xf9, 0xfd, 0x03, 0xce, 0xc7, 0x9f, 0x5e, 0x1a, 0x68, 0x6b, 0x6f, - 0x7e, 0xe7, 0xc5, 0xe7, 0x9e, 0x28, 0x74, 0x76, 0xb4, 0x20, 0x92, 0x61, - 0x8c, 0xc5, 0x18, 0x8b, 0xdf, 0xe4, 0x72, 0xf6, 0x8b, 0x1f, 0xc3, 0xbb, - 0x73, 0x8b, 0x3d, 0x9f, 0x9f, 0x7e, 0xe9, 0xe6, 0x5a, 0x30, 0x80, 0x73, - 0xe8, 0xc4, 0xb8, 0xbe, 0xfd, 0xda, 0x7e, 0x52, 0x0b, 0x92, 0x41, 0x22, - 0x50, 0x29, 0x55, 0x98, 0xbb, 0x3e, 0xc9, 0x0b, 0x4f, 0x3f, 0xc0, 0xc1, - 0x27, 0xbb, 0x71, 0x80, 0x2c, 0x53, 0x8c, 0x59, 0x05, 0x1b, 0x63, 0x89, - 0x12, 0xe1, 0xd4, 0xf0, 0xc5, 0xaf, 0xcf, 0x9d, 0xe9, 0xef, 0xdf, 0x08, - 0xf6, 0x0b, 0xcd, 0x3e, 0x8f, 0x3c, 0xda, 0x8c, 0xd8, 0x06, 0xf4, 0xd6, - 0xd5, 0xdb, 0xec, 0x88, 0x66, 0x79, 0xf3, 0xc8, 0x53, 0x14, 0xda, 0x73, - 0xa8, 0x82, 0x48, 0x23, 0xe8, 0xc4, 0xc8, 0x9f, 0xfc, 0x7e, 0xa3, 0x42, - 0x96, 0x29, 0x6a, 0x15, 0xdf, 0x77, 0x98, 0xfc, 0xcb, 0xeb, 0xe3, 0xf0, - 0x37, 0x8a, 0xd8, 0x90, 0x5f, 0xfa, 0x76, 0x2f, 0x6f, 0xe0, 0xdb, 0x25, - 0x11, 0xa2, 0x05, 0xc3, 0xc4, 0x4f, 0xd7, 0xe8, 0xd9, 0xbf, 0x87, 0xde, - 0xc3, 0xbd, 0x9b, 0xb4, 0x3e, 0x76, 0xf6, 0x1a, 0x8b, 0x99, 0xcf, 0x07, - 0x6f, 0x1d, 0xa4, 0x1a, 0x43, 0x2c, 0x50, 0x17, 0x70, 0x1c, 0xf8, 0x75, - 0x6c, 0x86, 0x8f, 0x3e, 0x1b, 0x2b, 0xac, 0xf5, 0x77, 0xf6, 0xbe, 0x31, - 0xa6, 0xfb, 0xba, 0xda, 0xa8, 0x04, 0x65, 0x76, 0xe6, 0x7d, 0xda, 0x77, - 0xe5, 0x51, 0x0b, 0x6a, 0x2d, 0x99, 0x55, 0x34, 0x53, 0x4a, 0xd5, 0x84, - 0x7d, 0x0f, 0x16, 0x38, 0xf6, 0xea, 0x63, 0x5c, 0xfe, 0x1b, 0xc2, 0x1a, - 0x94, 0x23, 0xa8, 0xd5, 0x21, 0xb8, 0x59, 0x64, 0xf2, 0xf2, 0x04, 0x77, - 0x8a, 0x77, 0xe0, 0xea, 0xcb, 0xce, 0x8a, 0x14, 0x07, 0x1e, 0x6e, 0xe3, - 0xfc, 0xc9, 0xc7, 0x11, 0xa0, 0x58, 0x4a, 0xd8, 0xd3, 0x91, 0x27, 0x02, - 0x6a, 0x06, 0x6a, 0x49, 0x23, 0xb8, 0x56, 0x87, 0x30, 0x82, 0x2b, 0xd3, - 0x8d, 0x2c, 0x13, 0x03, 0x95, 0xb2, 0x30, 0x3d, 0x7e, 0x8b, 0x60, 0x6a, - 0x8e, 0xe6, 0xbc, 0x07, 0x0a, 0x47, 0x8f, 0x7f, 0xf5, 0x2c, 0x70, 0x09, - 0xc0, 0x57, 0xab, 0x08, 0x50, 0x03, 0x82, 0xcc, 0xa1, 0x58, 0x4c, 0x69, - 0x69, 0xcf, 0x31, 0x5f, 0x81, 0xbb, 0x25, 0x98, 0x99, 0x87, 0xb0, 0xaa, - 0x04, 0x65, 0x43, 0x50, 0xce, 0x28, 0x57, 0x0d, 0x33, 0x53, 0x21, 0xc1, - 0xd4, 0x1c, 0x2a, 0xc9, 0xea, 0xd9, 0xad, 0x05, 0x38, 0xbe, 0x06, 0x6c, - 0x51, 0xa0, 0x0e, 0x78, 0xbb, 0x73, 0x4c, 0x5c, 0x5f, 0xa4, 0xa9, 0x9c, - 0x63, 0x76, 0x01, 0x4a, 0xa1, 0x12, 0x84, 0x42, 0xb1, 0x64, 0x98, 0x2f, - 0x09, 0xf3, 0x81, 0x50, 0x0d, 0x63, 0x92, 0xb0, 0x06, 0x6a, 0x01, 0xc8, - 0x8c, 0x12, 0x54, 0x63, 0x50, 0xe5, 0xcb, 0xe1, 0xfe, 0xfe, 0x73, 0x67, - 0x96, 0x7e, 0x9e, 0xaa, 0x92, 0x02, 0xb1, 0x85, 0x99, 0x05, 0x88, 0xfc, - 0x56, 0xa6, 0x6e, 0x27, 0xa4, 0x02, 0x62, 0x14, 0x91, 0xf5, 0xd3, 0x88, - 0xc5, 0x5a, 0x0b, 0xaa, 0xd4, 0x22, 0x61, 0xae, 0x5c, 0xc7, 0xe4, 0x5b, - 0x60, 0x43, 0x31, 0xf3, 0x33, 0x0b, 0x31, 0x30, 0x1d, 0x36, 0xb4, 0xcc, - 0x1c, 0xa8, 0x5b, 0x17, 0x29, 0xa7, 0xa4, 0xe2, 0x92, 0x98, 0x86, 0xa6, - 0x89, 0x40, 0x2a, 0x4a, 0x96, 0x29, 0x99, 0x08, 0x41, 0xb1, 0x8a, 0xf5, - 0x72, 0x78, 0xad, 0x6d, 0x0d, 0x66, 0xb6, 0x01, 0xec, 0xa0, 0x98, 0x14, - 0x3a, 0x73, 0xb0, 0x4b, 0xa1, 0xc3, 0x81, 0xfb, 0xee, 0x6f, 0x22, 0x2c, - 0xc6, 0x58, 0x94, 0x4e, 0x4f, 0x08, 0x7d, 0x21, 0xcc, 0x0b, 0x95, 0x96, - 0x94, 0xa8, 0x52, 0x67, 0x31, 0x88, 0x61, 0x6f, 0x33, 0x56, 0x21, 0xcb, - 0x12, 0xac, 0xb5, 0x8c, 0xce, 0xae, 0x7f, 0x9e, 0xbe, 0xab, 0x4a, 0x57, - 0x0e, 0xba, 0x72, 0x40, 0xeb, 0xea, 0x3d, 0xa4, 0xdd, 0x4d, 0x24, 0x89, - 0x41, 0x04, 0x92, 0x04, 0x44, 0x1c, 0xd2, 0xd4, 0x25, 0x49, 0x76, 0x22, - 0xd2, 0x44, 0x92, 0x08, 0x69, 0x2a, 0xa4, 0xa9, 0x41, 0xc4, 0x30, 0x7a, - 0x65, 0x7d, 0xa1, 0x74, 0xed, 0x16, 0x85, 0xde, 0x75, 0xc1, 0xf3, 0x3c, - 0x7c, 0xdf, 0xc5, 0xf3, 0xdc, 0x15, 0xeb, 0xba, 0x8d, 0xb5, 0x65, 0xeb, - 0x79, 0xde, 0xd2, 0xba, 0x0b, 0x76, 0x3d, 0xc7, 0xe5, 0x5f, 0x1a, 0x88, - 0xe7, 0x39, 0x2b, 0x41, 0x9e, 0xe7, 0xe1, 0xba, 0xee, 0x12, 0xd4, 0xc5, - 0xf3, 0x9c, 0x25, 0xbb, 0x3a, 0x37, 0x82, 0x7d, 0xb5, 0x5b, 0x93, 0x5d, - 0x17, 0x5c, 0xd7, 0x45, 0x35, 0x23, 0x95, 0x3a, 0x71, 0xbd, 0x4e, 0x14, - 0xc5, 0xc4, 0xf5, 0x98, 0x38, 0x4a, 0x88, 0xe2, 0x98, 0x7a, 0x9c, 0x20, - 0x59, 0x86, 0x11, 0xb3, 0x09, 0xec, 0xf0, 0xd0, 0xd0, 0xff, 0xd6, 0xf4, - 0xf4, 0xc6, 0xe0, 0x8a, 0xd0, 0xce, 0x76, 0x35, 0xd3, 0x7f, 0x00, 0xf4, - 0xb8, 0x19, 0xf9, 0xe3, 0xb0, 0xa8, 0x92, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image18; -our $image18_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x00, - 0xdd, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xbd, 0x55, 0xed, 0x0e, 0x84, - 0x30, 0x08, 0x2b, 0x89, 0x2f, 0x35, 0xde, 0x3f, 0xf5, 0xb1, 0xb8, 0x1f, - 0x8a, 0xc1, 0xc9, 0x3e, 0xd4, 0xbb, 0x6b, 0x62, 0xdc, 0x26, 0x94, 0x52, - 0x49, 0x26, 0x24, 0xd1, 0x83, 0xaa, 0x5a, 0xdc, 0x93, 0x14, 0x55, 0x35, - 0x7f, 0xd7, 0xf1, 0x24, 0x05, 0x00, 0x96, 0x2c, 0xb1, 0x15, 0xdc, 0x3a, - 0xf7, 0x42, 0xf1, 0xdb, 0xd2, 0x4a, 0x7a, 0x8b, 0x29, 0xc5, 0x1e, 0x73, - 0x47, 0xc4, 0x94, 0xe2, 0x27, 0x5d, 0x5d, 0x14, 0xbf, 0x25, 0x3c, 0x88, - 0x7f, 0xe5, 0xb1, 0x00, 0x18, 0x7a, 0xfc, 0x88, 0x78, 0x34, 0xc7, 0x19, - 0x8a, 0xaa, 0xad, 0x03, 0x01, 0x27, 0x8f, 0xbf, 0x69, 0xcb, 0xff, 0xe6, - 0xd8, 0x91, 0x15, 0xac, 0x2d, 0xe8, 0x59, 0x72, 0xdb, 0xe3, 0x12, 0x84, - 0xf4, 0x7c, 0x7e, 0x34, 0x15, 0x33, 0x3f, 0xaf, 0xa9, 0xb8, 0x54, 0x16, - 0xd5, 0x44, 0x45, 0xd5, 0x64, 0xcf, 0xaf, 0x63, 0x1d, 0x16, 0x1f, 0x92, - 0x20, 0x09, 0xdb, 0xd7, 0x7b, 0x80, 0x59, 0xe8, 0xcc, 0xd7, 0x56, 0x75, - 0x6b, 0x21, 0x7f, 0x6a, 0x2a, 0x04, 0x90, 0x48, 0x26, 0x9b, 0x85, 0xc7, - 0xb9, 0xef, 0x23, 0xd2, 0xa9, 0x88, 0xc5, 0x48, 0x42, 0x55, 0xbb, 0x85, - 0xb3, 0x98, 0xa1, 0xe2, 0x8c, 0xb4, 0xb6, 0x20, 0x8b, 0xb9, 0x4c, 0x45, - 0x48, 0x86, 0xb7, 0xe8, 0x44, 0x59, 0xeb, 0x06, 0xd8, 0xba, 0x5d, 0x53, - 0xc7, 0xba, 0xaf, 0x58, 0xf5, 0xf4, 0xc3, 0x32, 0x1f, 0x6f, 0x29, 0x0e, - 0xf7, 0x58, 0x8b, 0x67, 0x0a, 0x1f, 0xe9, 0x23, 0xb3, 0x6c, 0x6e, 0x54, - 0xb0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, - 0x60, 0x82; - -our $image19; -our $image19_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x00, - 0xf0, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xbd, 0x92, 0x6b, 0x12, 0x83, - 0x30, 0x08, 0x84, 0x97, 0x8e, 0x97, 0x0a, 0xf7, 0x9f, 0xf5, 0x58, 0xf4, - 0x87, 0xa2, 0x48, 0x13, 0x13, 0xb5, 0x2d, 0x33, 0x4e, 0x1e, 0xc2, 0x02, - 0x5f, 0x10, 0x92, 0x38, 0x33, 0x55, 0xb5, 0x78, 0x26, 0x29, 0xaa, 0x6a, - 0xbe, 0x66, 0x7f, 0x92, 0x02, 0x00, 0x53, 0x2d, 0xb0, 0xe5, 0xdc, 0xba, - 0xf7, 0x44, 0xf1, 0xdf, 0xd4, 0x0a, 0x7a, 0x6a, 0x43, 0x15, 0xbb, 0xcf, - 0x95, 0x22, 0x86, 0x2a, 0xbe, 0xd3, 0xd5, 0x47, 0xc5, 0x4f, 0x05, 0x37, - 0xe1, 0x5f, 0x31, 0x16, 0x00, 0x5d, 0xc6, 0xb7, 0x84, 0x7b, 0x73, 0x5c, - 0xb3, 0xa2, 0x6a, 0x73, 0xa7, 0x80, 0x03, 0xe3, 0x6f, 0x62, 0xf9, 0xdf, - 0x1c, 0xbb, 0xd5, 0x12, 0x66, 0x04, 0x67, 0x48, 0x2e, 0x33, 0x2e, 0xa1, - 0x90, 0x33, 0xce, 0xb7, 0xa6, 0x62, 0xe4, 0xf1, 0x9a, 0x15, 0x97, 0x84, - 0x28, 0x0b, 0x15, 0x55, 0x93, 0x35, 0x3e, 0xfb, 0xba, 0x59, 0xfc, 0x48, - 0x82, 0x24, 0x6c, 0xdd, 0xaf, 0x0e, 0x66, 0xa1, 0x33, 0xdf, 0x5b, 0xea, - 0xd6, 0x42, 0xfc, 0xd0, 0x54, 0x08, 0x20, 0x51, 0x4c, 0x16, 0x84, 0xdb, - 0xbd, 0x9f, 0xa3, 0x4d, 0xaa, 0xea, 0xf9, 0x0c, 0x10, 0x01, 0x80, 0x88, - 0x87, 0x24, 0x76, 0x9f, 0xba, 0xd5, 0x7c, 0x5e, 0x8b, 0x88, 0x99, 0x8b, - 0x67, 0xe6, 0x35, 0x51, 0x47, 0xe3, 0x5d, 0x34, 0x12, 0xef, 0xa2, 0x71, - 0xcd, 0x4c, 0x7b, 0x5c, 0xe3, 0x9e, 0xe4, 0x3e, 0x15, 0xaa, 0xc5, 0xc8, - 0xf9, 0x30, 0xfc, 0x51, 0xc0, 0x39, 0xee, 0x4c, 0x17, 0x74, 0x91, 0xb1, - 0x01, 0xdb, 0x18, 0x06, 0xe8, 0x76, 0x10, 0x1a, 0x33, 0x69, 0x3e, 0xfc, - 0x1b, 0x78, 0x58, 0xd2, 0x1f, 0x6a, 0x6c, 0x70, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image20; -our $image20_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x01, - 0x09, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xa5, 0x54, 0x41, 0x0e, 0xc3, - 0x20, 0x0c, 0xb3, 0xd1, 0xf6, 0x83, 0x1d, 0xd8, 0xff, 0x3f, 0xb7, 0x57, - 0xcc, 0x3b, 0x8c, 0xd0, 0x34, 0xa4, 0x94, 0x6e, 0x91, 0x90, 0x20, 0xc4, - 0x8e, 0x49, 0x00, 0x22, 0x31, 0xb9, 0x39, 0xb3, 0x80, 0x25, 0xab, 0xd2, - 0x79, 0xd0, 0x25, 0x23, 0x00, 0xdc, 0x6c, 0x25, 0xec, 0xd4, 0x15, 0x01, - 0x6f, 0x6c, 0xbe, 0x98, 0x9c, 0x0e, 0x92, 0x09, 0x63, 0x69, 0x28, 0x05, - 0x74, 0x27, 0x35, 0x9f, 0xbe, 0x4b, 0x1b, 0x31, 0x09, 0x87, 0xb9, 0x00, - 0xb9, 0x31, 0x58, 0xf3, 0x65, 0x7b, 0xd1, 0xb5, 0x5b, 0x97, 0x84, 0xcb, - 0x2b, 0xf1, 0x52, 0xd4, 0xc0, 0xf7, 0x09, 0xa6, 0xdb, 0xcd, 0x2f, 0xc2, - 0x19, 0xb3, 0xba, 0x2e, 0x5b, 0xe1, 0xa6, 0xec, 0xf7, 0x9b, 0x95, 0x60, - 0x0b, 0x00, 0xb0, 0xca, 0x6a, 0x6d, 0x32, 0xd3, 0x12, 0x4d, 0xee, 0x65, - 0xbe, 0x95, 0x34, 0xf0, 0x99, 0x21, 0x27, 0xc4, 0x8f, 0xe8, 0xa0, 0x11, - 0x7b, 0x5f, 0x56, 0x13, 0x0b, 0x38, 0xaa, 0x57, 0x78, 0x07, 0xe3, 0x91, - 0xe9, 0x02, 0x33, 0x95, 0xab, 0xcf, 0xb4, 0x34, 0xb2, 0x95, 0x06, 0xca, - 0x27, 0xce, 0x92, 0xe5, 0x7f, 0x4c, 0xfb, 0x33, 0xf4, 0x22, 0x08, 0x30, - 0x28, 0x4b, 0x31, 0x9c, 0x6c, 0xee, 0x04, 0xf8, 0x5a, 0x7b, 0xf5, 0xb1, - 0x07, 0x1e, 0x12, 0x45, 0xd8, 0xe6, 0xec, 0xe5, 0xa5, 0xc6, 0x2a, 0xb1, - 0x6e, 0x37, 0x53, 0x5f, 0xf2, 0x4e, 0x6a, 0x22, 0xa6, 0xc4, 0x16, 0xc4, - 0xba, 0x1d, 0x44, 0xaf, 0xf1, 0xd2, 0xc4, 0x1b, 0x31, 0x10, 0xfb, 0x26, - 0xba, 0x1f, 0xcf, 0x9a, 0xc6, 0xfe, 0x75, 0x05, 0x72, 0x56, 0x09, 0x55, - 0x8a, 0x98, 0xbd, 0xb9, 0x20, 0x1b, 0xb3, 0x13, 0xf5, 0x9a, 0x2c, 0x61, - 0x16, 0x89, 0x0f, 0x12, 0x9d, 0x63, 0xae, 0x90, 0xfe, 0x83, 0xb9, 0x44, - 0xfc, 0x01, 0x52, 0x03, 0x8c, 0xe6, 0xe0, 0x98, 0x60, 0xab, 0x00, 0x00, - 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image21; -our $image21_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x01, - 0x41, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xa5, 0x54, 0x41, 0x4e, 0xc4, - 0x30, 0x0c, 0x9c, 0xa9, 0x58, 0xa4, 0x15, 0x12, 0x02, 0xb1, 0x08, 0x1f, - 0xf7, 0x77, 0xbc, 0x83, 0xe7, 0xf0, 0x2a, 0xae, 0x3d, 0x70, 0x42, 0xe2, - 0x80, 0x84, 0x34, 0x1c, 0x1a, 0xb7, 0x8e, 0x9b, 0xb6, 0xdb, 0xc5, 0x52, - 0xd4, 0xc4, 0x71, 0xc6, 0x33, 0x8e, 0x53, 0xa2, 0x61, 0x0a, 0x73, 0xb6, - 0x02, 0x2e, 0x32, 0x53, 0x17, 0xf0, 0x7c, 0xb4, 0x72, 0xe4, 0xdc, 0x39, - 0xae, 0x1a, 0x1d, 0x80, 0xbb, 0x44, 0x90, 0x65, 0xf3, 0xb0, 0x02, 0x4a, - 0x00, 0x5d, 0x00, 0x67, 0xc0, 0xb9, 0x1d, 0xd6, 0x26, 0xa9, 0x64, 0x29, - 0x51, 0x87, 0x70, 0x40, 0x0a, 0x68, 0x0d, 0x15, 0x59, 0x91, 0xe2, 0x6c, - 0x04, 0x6e, 0x49, 0xbc, 0x16, 0xb8, 0x4b, 0x5e, 0x02, 0x38, 0x46, 0x1f, - 0xd3, 0x77, 0xc5, 0x6e, 0xe2, 0xa2, 0x02, 0x66, 0xc3, 0xb7, 0xc3, 0x7e, - 0xab, 0x2c, 0x04, 0x28, 0x97, 0x60, 0x45, 0x79, 0xcf, 0x48, 0x30, 0x77, - 0x1f, 0x51, 0x5f, 0x9a, 0xdb, 0x69, 0x9e, 0xcb, 0xe4, 0xb5, 0x1e, 0xc0, - 0x4d, 0xb9, 0x76, 0xbb, 0xdb, 0x99, 0x85, 0x52, 0xc5, 0x8a, 0x11, 0xb8, - 0xb0, 0x6f, 0x51, 0x4c, 0x6c, 0x3f, 0xb7, 0x81, 0x9d, 0x79, 0x32, 0xf5, - 0xe4, 0x12, 0x75, 0x6f, 0xee, 0x45, 0x60, 0x4e, 0xbe, 0x61, 0x6d, 0x7a, - 0x01, 0xf0, 0x06, 0xe0, 0xb5, 0x89, 0x18, 0x14, 0x35, 0x93, 0x0a, 0x78, - 0xcf, 0x0c, 0xc6, 0xa6, 0x36, 0x3d, 0x29, 0xf4, 0xf4, 0x68, 0x7e, 0x1f, - 0x79, 0x54, 0x49, 0x4c, 0x00, 0x70, 0x56, 0xcf, 0x8f, 0xd2, 0x29, 0x39, - 0x4f, 0xa5, 0x32, 0x4e, 0xaa, 0xcd, 0x46, 0x09, 0xc7, 0x57, 0x98, 0x6a, - 0x5e, 0xfb, 0x4d, 0xf7, 0x41, 0x8d, 0x66, 0xea, 0x8a, 0x5d, 0xf3, 0x18, - 0xbe, 0x68, 0x7a, 0xc6, 0x04, 0xaa, 0xf8, 0x3a, 0x3d, 0xd9, 0x2a, 0xb0, - 0x07, 0x71, 0xfa, 0xb5, 0x52, 0x3d, 0x01, 0xe0, 0x3b, 0xc5, 0x6d, 0x37, - 0x7a, 0x90, 0xe7, 0xf2, 0x7f, 0x60, 0x9a, 0x9d, 0x4b, 0xe5, 0x01, 0x4c, - 0xc7, 0xa5, 0x52, 0x0e, 0x66, 0xea, 0x60, 0x7a, 0x5c, 0x0f, 0xaa, 0xc0, - 0xbd, 0x73, 0x4e, 0xdb, 0x67, 0x4c, 0x0f, 0x97, 0x00, 0xaf, 0xaa, 0xd8, - 0x0a, 0xbc, 0x14, 0xf4, 0x3f, 0x67, 0x76, 0x01, 0xff, 0x01, 0x44, 0x83, - 0xce, 0xde, 0x45, 0xa9, 0xc1, 0x38, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, - 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - -our $image22; -our $image22_data = pack 'C*', -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xc4, 0xb4, 0x6c, 0x3b, 0x00, 0x00, 0x01, - 0x5b, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0x8d, 0x55, 0x41, 0x72, 0xc3, - 0x30, 0x08, 0x5c, 0x14, 0x27, 0x39, 0xf4, 0x9a, 0x83, 0x7a, 0xeb, 0xff, - 0x3f, 0xd6, 0x7c, 0xa0, 0x97, 0xb6, 0xd3, 0xed, 0xc1, 0x20, 0x23, 0x40, - 0x49, 0x98, 0xd1, 0xc8, 0xb6, 0x60, 0x59, 0x2f, 0x48, 0x02, 0x0a, 0xa3, - 0x0e, 0x74, 0xb2, 0x5a, 0x7f, 0xc5, 0x1a, 0x3a, 0x5b, 0xf8, 0x26, 0x72, - 0xe0, 0x57, 0x39, 0x01, 0x40, 0x9e, 0xe0, 0xbe, 0x37, 0x00, 0x7f, 0x31, - 0x98, 0x35, 0xa8, 0xd9, 0x69, 0x91, 0xf4, 0x02, 0xe0, 0xac, 0x49, 0x3f, - 0x9b, 0xa3, 0xd1, 0x1c, 0x9d, 0xc1, 0x88, 0xc7, 0x64, 0xcb, 0xbf, 0x0b, - 0xe0, 0x6f, 0x00, 0xd7, 0xb1, 0xa6, 0x11, 0xe7, 0xe8, 0x45, 0x80, 0xe8, - 0x1c, 0x22, 0x73, 0x9a, 0x86, 0x5d, 0xeb, 0x9f, 0x02, 0x9a, 0x52, 0xff, - 0xf1, 0x8c, 0xbd, 0x49, 0x98, 0x83, 0x9d, 0xdc, 0xf3, 0xa6, 0x63, 0x50, - 0x90, 0x45, 0x95, 0xc8, 0xac, 0xf7, 0xea, 0xd9, 0x13, 0x2d, 0x3c, 0x3a, - 0x05, 0x7d, 0x48, 0x64, 0x52, 0x44, 0x00, 0xd3, 0x5b, 0xc2, 0xfb, 0xe4, - 0xd7, 0x00, 0x40, 0x3a, 0xf7, 0x95, 0xbb, 0x92, 0xef, 0x65, 0x53, 0x7c, - 0xe8, 0x2c, 0x3a, 0xbc, 0x53, 0xad, 0x14, 0xc3, 0xc0, 0x9e, 0x68, 0x30, - 0x36, 0xd6, 0x8b, 0x1e, 0x2c, 0x19, 0x6f, 0xa5, 0xeb, 0xfd, 0x59, 0xff, - 0x4f, 0x26, 0x86, 0xee, 0xa3, 0x0c, 0x78, 0x6c, 0x94, 0x47, 0x90, 0x02, - 0x64, 0x99, 0x16, 0x24, 0xa6, 0x8d, 0xe0, 0x5d, 0x08, 0x50, 0x3a, 0x41, - 0x17, 0x28, 0x31, 0x6f, 0xae, 0xc5, 0xae, 0xfd, 0x94, 0xac, 0xd3, 0xb4, - 0x1d, 0xc0, 0xbe, 0x2b, 0x5c, 0xfb, 0x25, 0x8b, 0xf5, 0x49, 0x09, 0x43, - 0x11, 0xe9, 0x4e, 0x37, 0xd3, 0x91, 0x21, 0x79, 0x06, 0x56, 0x8b, 0x27, - 0x5b, 0xf9, 0xcd, 0xf7, 0x32, 0xef, 0x42, 0x6b, 0xcf, 0xb8, 0x2b, 0x7d, - 0x0f, 0x46, 0x90, 0x37, 0xe4, 0xd3, 0x0e, 0x0e, 0x68, 0xc7, 0x50, 0x0d, - 0x3d, 0xe3, 0x58, 0x42, 0x03, 0xbe, 0x69, 0xc6, 0x2f, 0x01, 0x6e, 0xa1, - 0x88, 0x13, 0x2b, 0xfb, 0x03, 0x41, 0x66, 0x1c, 0x25, 0xea, 0x3a, 0x5f, - 0xa0, 0xed, 0x37, 0x36, 0x85, 0x3b, 0xdd, 0xbc, 0x15, 0x67, 0x48, 0x6d, - 0x93, 0x86, 0x47, 0x81, 0xf6, 0xe2, 0xe5, 0x1b, 0x66, 0x02, 0x0f, 0xb1, - 0x47, 0x11, 0xbd, 0x43, 0x1c, 0xaf, 0xdc, 0x79, 0x45, 0x1c, 0x00, 0x60, - 0x4b, 0x4d, 0x9f, 0xe2, 0x1e, 0x5b, 0xb8, 0x6d, 0x08, 0x05, 0xff, 0x07, - 0x3e, 0x4c, 0xd2, 0xff, 0x1f, 0x38, 0x0e, 0x92, 0x00, 0x00, 0x00, 0x00, - 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82; - - -sub NEW -{ - shift->SUPER::NEW(@_[0..2]); - statusBar(); - - $image0 = Qt::Pixmap(); - $image0->loadFromData($image0_data, length ($image0_data), "PNG"); - $image1 = Qt::Pixmap(); - $image1->loadFromData($image1_data, length ($image1_data), "PNG"); - $image2 = Qt::Pixmap(); - $image2->loadFromData($image2_data, length ($image2_data), "PNG"); - $image3 = Qt::Pixmap(); - $image3->loadFromData($image3_data, length ($image3_data), "PNG"); - $image4 = Qt::Pixmap(); - $image4->loadFromData($image4_data, length ($image4_data), "PNG"); - $image5 = Qt::Pixmap(); - $image5->loadFromData($image5_data, length ($image5_data), "PNG"); - $image6 = Qt::Pixmap(); - $image6->loadFromData($image6_data, length ($image6_data), "PNG"); - $image7 = Qt::Pixmap(); - $image7->loadFromData($image7_data, length ($image7_data), "PNG"); - $image8 = Qt::Pixmap(); - $image8->loadFromData($image8_data, length ($image8_data), "PNG"); - $image9 = Qt::Pixmap(); - $image9->loadFromData($image9_data, length ($image9_data), "PNG"); - $image10 = Qt::Pixmap(); - $image10->loadFromData($image10_data, length ($image10_data), "PNG"); - $image11 = Qt::Pixmap(); - $image11->loadFromData($image11_data, length ($image11_data), "PNG"); - $image12 = Qt::Pixmap(); - $image12->loadFromData($image12_data, length ($image12_data), "PNG"); - $image13 = Qt::Pixmap(); - $image13->loadFromData($image13_data, length ($image13_data), "PNG"); - $image14 = Qt::Pixmap(); - $image14->loadFromData($image14_data, length ($image14_data), "PNG"); - $image15 = Qt::Pixmap(); - $image15->loadFromData($image15_data, length ($image15_data), "PNG"); - $image16 = Qt::Pixmap(); - $image16->loadFromData($image16_data, length ($image16_data), "PNG"); - $image17 = Qt::Pixmap(); - $image17->loadFromData($image17_data, length ($image17_data), "PNG"); - $image18 = Qt::Pixmap(); - $image18->loadFromData($image18_data, length ($image18_data), "PNG"); - $image19 = Qt::Pixmap(); - $image19->loadFromData($image19_data, length ($image19_data), "PNG"); - $image20 = Qt::Pixmap(); - $image20->loadFromData($image20_data, length ($image20_data), "PNG"); - $image21 = Qt::Pixmap(); - $image21->loadFromData($image21_data, length ($image21_data), "PNG"); - $image22 = Qt::Pixmap(); - $image22->loadFromData($image22_data, length ($image22_data), "PNG"); - - if ( name() eq "unnamed" ) - { - setName("MuSRFitform" ); - } - setSizePolicy(Qt::SizePolicy(7, 7, 1, 1, this->sizePolicy()->hasHeightForWidth()) ); - setMinimumSize(Qt::Size(582, 502) ); - setIcon($image0 ); - - setCentralWidget(Qt::Widget(this, "qt_central_widget")); - my $MuSRFitformLayout = Qt::GridLayout(centralWidget(), 1, 1, 11, 6, '$MuSRFitformLayout'); - - musrfit_tabs = Qt::TabWidget(centralWidget(), "musrfit_tabs"); - musrfit_tabs->setEnabled( 1 ); - musrfit_tabs->setSizePolicy( Qt::SizePolicy(7, 7, 1, 1, musrfit_tabs->sizePolicy()->hasHeightForWidth()) ); - musrfit_tabs->setMinimumSize( Qt::Size(560, 400) ); - musrfit_tabs->setMaximumSize( Qt::Size(32767, 32767) ); - - RUNSPage = Qt::Widget(musrfit_tabs, "RUNSPage"); - my $RUNSPageLayout = Qt::GridLayout(RUNSPage, 1, 1, 11, 6, '$RUNSPageLayout'); - - my $layout37 = Qt::VBoxLayout(undef, 0, 6, '$layout37'); - - RUNSAuto = Qt::GroupBox(RUNSPage, "RUNSAuto"); - RUNSAuto->setSizePolicy( Qt::SizePolicy(7, 7, 1, 1, RUNSAuto->sizePolicy()->hasHeightForWidth()) ); - RUNSAuto->setMargin( int(5) ); - RUNSAuto->setColumnLayout( 0, &Vertical ); - RUNSAuto->layout()->setSpacing(6); - RUNSAuto->layout()->setMargin(11); - my $RUNSAutoLayout = Qt::GridLayout(RUNSAuto->layout() ); - $RUNSAutoLayout->setAlignment( &AlignTop ); - - my $layout32 = Qt::GridLayout(undef, 1, 1, 0, 6, '$layout32'); - - RunNumbers = Qt::LineEdit(RUNSAuto, "RunNumbers"); - RunNumbers->setSizePolicy( Qt::SizePolicy(7, 0, 0, 0, RunNumbers->sizePolicy()->hasHeightForWidth()) ); - RunNumbers->setMinimumSize( Qt::Size(0, 23) ); - - $layout32->addMultiCellWidget(RunNumbers, 0, 0, 0, 4); - - BeamLine = Qt::ComboBox(0, RUNSAuto, "BeamLine"); - BeamLine->setSizePolicy( Qt::SizePolicy(0, 5, 0, 0, BeamLine->sizePolicy()->hasHeightForWidth()) ); - BeamLine->setMinimumSize( Qt::Size(0, 20) ); - - $layout32->addWidget(BeamLine, 1, 2); - - BeamLineLabel = Qt::Label(RUNSAuto, "BeamLineLabel"); - BeamLineLabel->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, BeamLineLabel->sizePolicy()->hasHeightForWidth()) ); - BeamLineLabel->setMinimumSize( Qt::Size(0, 20) ); - - $layout32->addWidget(BeamLineLabel, 1, 1); - my $spacer = Qt::SpacerItem(181, 21, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum); - $layout32->addItem($spacer, 1, 0); - - YEAR = Qt::ComboBox(0, RUNSAuto, "YEAR"); - YEAR->setSizePolicy( Qt::SizePolicy(0, 5, 0, 0, YEAR->sizePolicy()->hasHeightForWidth()) ); - YEAR->setMinimumSize( Qt::Size(0, 20) ); - YEAR->setEditable( 0 ); - YEAR->setSizeLimit( int(16) ); - YEAR->setInsertionPolicy( &Qt::ComboBox::AtTop() ); - YEAR->setAutoCompletion( 1 ); - YEAR->setDuplicatesEnabled( 0 ); - - $layout32->addWidget(YEAR, 1, 4); - - YEARLabel = Qt::Label(RUNSAuto, "YEARLabel"); - YEARLabel->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, YEARLabel->sizePolicy()->hasHeightForWidth()) ); - YEARLabel->setMinimumSize( Qt::Size(0, 20) ); - - $layout32->addWidget(YEARLabel, 1, 3); - - $RUNSAutoLayout->addLayout($layout32, 0, 0); - $layout37->addWidget(RUNSAuto); - - RUNSMan = Qt::GroupBox(RUNSPage, "RUNSMan"); - RUNSMan->setEnabled( 1 ); - RUNSMan->setSizePolicy( Qt::SizePolicy(7, 7, 1, 1, RUNSMan->sizePolicy()->hasHeightForWidth()) ); - RUNSMan->setMargin( int(5) ); - RUNSMan->setColumnLayout( 0, &Vertical ); - RUNSMan->layout()->setSpacing(6); - RUNSMan->layout()->setMargin(11); - my $RUNSManLayout = Qt::GridLayout(RUNSMan->layout() ); - $RUNSManLayout->setAlignment( &AlignTop ); - - my $layout33 = Qt::GridLayout(undef, 1, 1, 0, 6, '$layout33'); - my $spacer_2 = Qt::SpacerItem(411, 21, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum); - $layout33->addItem($spacer_2, 1, 0); - - RunFiles = Qt::LineEdit(RUNSMan, "RunFiles"); - RunFiles->setEnabled( 1 ); - RunFiles->setSizePolicy( Qt::SizePolicy(7, 0, 0, 0, RunFiles->sizePolicy()->hasHeightForWidth()) ); - RunFiles->setMinimumSize( Qt::Size(0, 23) ); - - $layout33->addMultiCellWidget(RunFiles, 0, 0, 0, 1); - - Browse = Qt::PushButton(RUNSMan, "Browse"); - Browse->setEnabled( 1 ); - Browse->setSizePolicy( Qt::SizePolicy(0, 5, 0, 0, Browse->sizePolicy()->hasHeightForWidth()) ); - Browse->setMinimumSize( Qt::Size(0, 20) ); - - $layout33->addWidget(Browse, 1, 1); - - $RUNSManLayout->addLayout($layout33, 0, 0); - $layout37->addWidget(RUNSMan); - - groupBox7 = Qt::GroupBox(RUNSPage, "groupBox7"); - groupBox7->setSizePolicy( Qt::SizePolicy(7, 7, 1, 1, groupBox7->sizePolicy()->hasHeightForWidth()) ); - my $pal = Qt::Palette(); - my $cg = Qt::ColorGroup(); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(239,243,247)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, Qt::Color(247,249,251)); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(119,121,123)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(159,161,164)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(173,176,179)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, &black); - $cg->setColor(&Qt::ColorGroup::LinkVisited, &black); - $pal->setActive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(239,243,247)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(119,121,123)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(159,161,164)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(173,176,179)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,192)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(128,0,128)); - $pal->setInactive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(239,243,247)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(119,121,123)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(159,161,164)); - $cg->setColor(&Qt::ColorGroup::Text, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(173,176,179)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,192)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(128,0,128)); - $pal->setDisabled($cg); - groupBox7->setPalette( $pal ); - groupBox7->setBackgroundOrigin( &Qt::GroupBox::AncestorOrigin() ); - groupBox7->setFrameShape( &Qt::GroupBox::GroupBoxPanel() ); - groupBox7->setFrameShadow( &Qt::GroupBox::Sunken() ); - groupBox7->setLineWidth( int(1) ); - groupBox7->setMargin( int(3) ); - groupBox7->setAlignment( int(&Qt::GroupBox::AlignTop) ); - groupBox7->setColumnLayout( 0, &Vertical ); - groupBox7->layout()->setSpacing(6); - groupBox7->layout()->setMargin(11); - my $groupBox7Layout = Qt::GridLayout(groupBox7->layout() ); - $groupBox7Layout->setAlignment( &AlignTop ); - - my $layout42 = Qt::GridLayout(undef, 1, 1, 5, 6, '$layout42'); - - FitType2 = Qt::ComboBox(0, groupBox7, "FitType2"); - FitType2->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, FitType2->sizePolicy()->hasHeightForWidth()) ); - - $layout42->addWidget(FitType2, 1, 1); - - TfsLabel = Qt::Label(groupBox7, "TfsLabel"); - TfsLabel->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, TfsLabel->sizePolicy()->hasHeightForWidth()) ); - - $layout42->addWidget(TfsLabel, 2, 1); - - FitType1 = Qt::ComboBox(0, groupBox7, "FitType1"); - FitType1->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, FitType1->sizePolicy()->hasHeightForWidth()) ); - FitType1->setSizeLimit( int(20) ); - FitType1->setAutoCompletion( 0 ); - FitType1->setDuplicatesEnabled( 0 ); - - $layout42->addWidget(FitType1, 1, 0); - - BINS = Qt::LineEdit(groupBox7, "BINS"); - BINS->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, BINS->sizePolicy()->hasHeightForWidth()) ); - - $layout42->addWidget(BINS, 3, 2); - - Comp3Label = Qt::Label(groupBox7, "Comp3Label"); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, Qt::Color(242,247,252)); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, &black); - $cg->setColor(&Qt::ColorGroup::LinkVisited, &black); - $pal->setActive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setInactive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setDisabled($cg); - Comp3Label->setPalette( $pal ); - - $layout42->addWidget(Comp3Label, 0, 2); - - Tis = Qt::LineEdit(groupBox7, "Tis"); - Tis->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, Tis->sizePolicy()->hasHeightForWidth()) ); - - $layout42->addWidget(Tis, 3, 0); - - Tfs = Qt::LineEdit(groupBox7, "Tfs"); - Tfs->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, Tfs->sizePolicy()->hasHeightForWidth()) ); - - $layout42->addWidget(Tfs, 3, 1); - - Comp1Label = Qt::Label(groupBox7, "Comp1Label"); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, Qt::Color(242,247,252)); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, &black); - $cg->setColor(&Qt::ColorGroup::LinkVisited, &black); - $pal->setActive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setInactive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setDisabled($cg); - Comp1Label->setPalette( $pal ); - - $layout42->addWidget(Comp1Label, 0, 0); - - BINSLabel = Qt::Label(groupBox7, "BINSLabel"); - BINSLabel->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, BINSLabel->sizePolicy()->hasHeightForWidth()) ); - - $layout42->addWidget(BINSLabel, 2, 2); - - TisLabel = Qt::Label(groupBox7, "TisLabel"); - TisLabel->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, TisLabel->sizePolicy()->hasHeightForWidth()) ); - - $layout42->addWidget(TisLabel, 2, 0); - - FitType3 = Qt::ComboBox(0, groupBox7, "FitType3"); - FitType3->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, FitType3->sizePolicy()->hasHeightForWidth()) ); - - $layout42->addWidget(FitType3, 1, 2); - - Comp2Label = Qt::Label(groupBox7, "Comp2Label"); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, Qt::Color(242,247,252)); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, &black); - $cg->setColor(&Qt::ColorGroup::LinkVisited, &black); - $pal->setActive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setInactive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setDisabled($cg); - Comp2Label->setPalette( $pal ); - - $layout42->addWidget(Comp2Label, 0, 1); - - $groupBox7Layout->addLayout($layout42, 0, 0); - $layout37->addWidget(groupBox7); - - my $layout34 = Qt::HBoxLayout(undef, 0, 6, '$layout34'); - my $spacer_3 = Qt::SpacerItem(81, 21, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum); - $layout34->addItem($spacer_3); - - FitAsyTypeLabel = Qt::Label(RUNSPage, "FitAsyTypeLabel"); - FitAsyTypeLabel->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, FitAsyTypeLabel->sizePolicy()->hasHeightForWidth()) ); - $layout34->addWidget(FitAsyTypeLabel); - - FitAsyType = Qt::ComboBox(0, RUNSPage, "FitAsyType"); - FitAsyType->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, FitAsyType->sizePolicy()->hasHeightForWidth()) ); - $layout34->addWidget(FitAsyType); - - LRBFLabel = Qt::Label(RUNSPage, "LRBFLabel"); - LRBFLabel->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, LRBFLabel->sizePolicy()->hasHeightForWidth()) ); - $layout34->addWidget(LRBFLabel); - - LRBF = Qt::LineEdit(RUNSPage, "LRBF"); - LRBF->setSizePolicy( Qt::SizePolicy(5, 0, 0, 0, LRBF->sizePolicy()->hasHeightForWidth()) ); - $layout34->addWidget(LRBF); - $layout37->addLayout($layout34); - - $RUNSPageLayout->addLayout($layout37, 0, 0); - musrfit_tabs->insertTab( RUNSPage, "" ); - - FittingPage = Qt::Widget(musrfit_tabs, "FittingPage"); - my $FittingPageLayout = Qt::GridLayout(FittingPage, 1, 1, 11, 6, '$FittingPageLayout'); - - my $layout28 = Qt::VBoxLayout(undef, 0, 6, '$layout28'); - - my $layout27 = Qt::GridLayout(undef, 1, 1, 0, 6, '$layout27'); - - Yi = Qt::LineEdit(FittingPage, "Yi"); - - $layout27->addWidget(Yi, 1, 3); - - Minimization = Qt::ComboBox(0, FittingPage, "Minimization"); - - $layout27->addWidget(Minimization, 0, 1); - - Xi = Qt::LineEdit(FittingPage, "Xi"); - - $layout27->addWidget(Xi, 0, 3); - - textLabel1_4_2_2 = Qt::Label(FittingPage, "textLabel1_4_2_2"); - - $layout27->addWidget(textLabel1_4_2_2, 2, 3); - - Xf = Qt::LineEdit(FittingPage, "Xf"); - - $layout27->addWidget(Xf, 0, 4); - - textLabel1_5 = Qt::Label(FittingPage, "textLabel1_5"); - - $layout27->addWidget(textLabel1_5, 0, 0); - - textLabel1_4_2 = Qt::Label(FittingPage, "textLabel1_4_2"); - - $layout27->addWidget(textLabel1_4_2, 1, 2); - - ViewBin = Qt::LineEdit(FittingPage, "ViewBin"); - - $layout27->addWidget(ViewBin, 2, 4); - - Yf = Qt::LineEdit(FittingPage, "Yf"); - - $layout27->addWidget(Yf, 1, 4); - - ErrorCalc = Qt::ComboBox(0, FittingPage, "ErrorCalc"); - - $layout27->addWidget(ErrorCalc, 1, 1); - - ltc = Qt::CheckBox(FittingPage, "ltc"); - ltc->setChecked( 1 ); - - $layout27->addMultiCellWidget(ltc, 2, 2, 0, 1); - - textLabel1_5_2 = Qt::Label(FittingPage, "textLabel1_5_2"); - - $layout27->addWidget(textLabel1_5_2, 1, 0); - - textLabel1_4 = Qt::Label(FittingPage, "textLabel1_4"); - - $layout27->addWidget(textLabel1_4, 0, 2); - $layout28->addLayout($layout27); - - FitTextOutput = Qt::TextEdit(FittingPage, "FitTextOutput"); - FitTextOutput->setOverwriteMode( 1 ); - $layout28->addWidget(FitTextOutput); - - $FittingPageLayout->addLayout($layout28, 0, 0); - musrfit_tabs->insertTab( FittingPage, "" ); - - SharingPage = Qt::Widget(musrfit_tabs, "SharingPage"); - my $SharingPageLayout = Qt::GridLayout(SharingPage, 1, 1, 11, 6, '$SharingPageLayout'); - - buttonGroupSharing = Qt::ButtonGroup(SharingPage, "buttonGroupSharing"); - buttonGroupSharing->setSizePolicy( Qt::SizePolicy(7, 7, 0, 0, buttonGroupSharing->sizePolicy()->hasHeightForWidth()) ); - buttonGroupSharing->setAlignment( int(&Qt::ButtonGroup::AlignLeft) ); - buttonGroupSharing->setCheckable( 1 ); - buttonGroupSharing->setChecked( 0 ); - - SharingComp2 = Qt::ButtonGroup(buttonGroupSharing, "SharingComp2"); - SharingComp2->setEnabled( 0 ); - SharingComp2->setGeometry( Qt::Rect(199, 20, 162, 330) ); - SharingComp2->setSizePolicy( Qt::SizePolicy(5, 3, 0, 0, SharingComp2->sizePolicy()->hasHeightForWidth()) ); - - Comp2ShLabel = Qt::Label(SharingComp2, "Comp2ShLabel"); - Comp2ShLabel->setGeometry( Qt::Rect(2, 30, 185, 20) ); - Comp2ShLabel->setPaletteBackgroundColor( Qt::Color(255, 255, 127) ); - - my $LayoutWidget = Qt::Widget(SharingComp2, '$LayoutWidget'); - $LayoutWidget->setGeometry( Qt::Rect(40, 60, 81, 266) ); - my $layout13 = Qt::VBoxLayout($LayoutWidget, 0, 0, '$layout13'); - - ShParam_2_1 = Qt::CheckBox($LayoutWidget, "ShParam_2_1"); - $layout13->addWidget(ShParam_2_1); - - ShParam_2_2 = Qt::CheckBox($LayoutWidget, "ShParam_2_2"); - $layout13->addWidget(ShParam_2_2); - - ShParam_2_3 = Qt::CheckBox($LayoutWidget, "ShParam_2_3"); - $layout13->addWidget(ShParam_2_3); - - ShParam_2_4 = Qt::CheckBox($LayoutWidget, "ShParam_2_4"); - $layout13->addWidget(ShParam_2_4); - - ShParam_2_5 = Qt::CheckBox($LayoutWidget, "ShParam_2_5"); - $layout13->addWidget(ShParam_2_5); - - ShParam_2_6 = Qt::CheckBox($LayoutWidget, "ShParam_2_6"); - ShParam_2_6->setEnabled( 0 ); - ShParam_2_6->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_2_6->setTristate( 0 ); - $layout13->addWidget(ShParam_2_6); - - ShParam_2_7 = Qt::CheckBox($LayoutWidget, "ShParam_2_7"); - ShParam_2_7->setEnabled( 0 ); - ShParam_2_7->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_2_7->setTristate( 0 ); - $layout13->addWidget(ShParam_2_7); - - ShParam_2_8 = Qt::CheckBox($LayoutWidget, "ShParam_2_8"); - ShParam_2_8->setEnabled( 0 ); - ShParam_2_8->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_2_8->setTristate( 0 ); - $layout13->addWidget(ShParam_2_8); - - ShParam_2_9 = Qt::CheckBox($LayoutWidget, "ShParam_2_9"); - ShParam_2_9->setEnabled( 0 ); - ShParam_2_9->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_2_9->setTristate( 0 ); - $layout13->addWidget(ShParam_2_9); - - SharingComp3 = Qt::ButtonGroup(buttonGroupSharing, "SharingComp3"); - SharingComp3->setEnabled( 0 ); - SharingComp3->setGeometry( Qt::Rect(367, 20, 162, 330) ); - SharingComp3->setSizePolicy( Qt::SizePolicy(5, 3, 0, 0, SharingComp3->sizePolicy()->hasHeightForWidth()) ); - SharingComp3->setAlignment( int(&Qt::ButtonGroup::AlignJustify | &Qt::ButtonGroup::AlignVCenter) ); - - Comp3ShLabel = Qt::Label(SharingComp3, "Comp3ShLabel"); - Comp3ShLabel->setGeometry( Qt::Rect(2, 30, 185, 20) ); - Comp3ShLabel->setPaletteBackgroundColor( Qt::Color(255, 255, 127) ); - - my $LayoutWidget_2 = Qt::Widget(SharingComp3, '$LayoutWidget_2'); - $LayoutWidget_2->setGeometry( Qt::Rect(41, 58, 81, 266) ); - my $layout15 = Qt::VBoxLayout($LayoutWidget_2, 11, 6, '$layout15'); - - ShParam_3_1 = Qt::CheckBox($LayoutWidget_2, "ShParam_3_1"); - $layout15->addWidget(ShParam_3_1); - - ShParam_3_2 = Qt::CheckBox($LayoutWidget_2, "ShParam_3_2"); - $layout15->addWidget(ShParam_3_2); - - ShParam_3_3 = Qt::CheckBox($LayoutWidget_2, "ShParam_3_3"); - $layout15->addWidget(ShParam_3_3); - - ShParam_3_4 = Qt::CheckBox($LayoutWidget_2, "ShParam_3_4"); - $layout15->addWidget(ShParam_3_4); - - ShParam_3_5 = Qt::CheckBox($LayoutWidget_2, "ShParam_3_5"); - $layout15->addWidget(ShParam_3_5); - - ShParam_3_6 = Qt::CheckBox($LayoutWidget_2, "ShParam_3_6"); - ShParam_3_6->setEnabled( 0 ); - ShParam_3_6->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_3_6->setTristate( 0 ); - $layout15->addWidget(ShParam_3_6); - - ShParam_3_7 = Qt::CheckBox($LayoutWidget_2, "ShParam_3_7"); - ShParam_3_7->setEnabled( 0 ); - ShParam_3_7->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_3_7->setTristate( 0 ); - $layout15->addWidget(ShParam_3_7); - - ShParam_3_8 = Qt::CheckBox($LayoutWidget_2, "ShParam_3_8"); - ShParam_3_8->setEnabled( 0 ); - ShParam_3_8->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_3_8->setTristate( 0 ); - $layout15->addWidget(ShParam_3_8); - - ShParam_3_9 = Qt::CheckBox($LayoutWidget_2, "ShParam_3_9"); - ShParam_3_9->setEnabled( 0 ); - ShParam_3_9->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_3_9->setTristate( 0 ); - $layout15->addWidget(ShParam_3_9); - - SharingComp1 = Qt::ButtonGroup(buttonGroupSharing, "SharingComp1"); - SharingComp1->setEnabled( 0 ); - SharingComp1->setGeometry( Qt::Rect(31, 20, 162, 330) ); - SharingComp1->setSizePolicy( Qt::SizePolicy(5, 3, 0, 0, SharingComp1->sizePolicy()->hasHeightForWidth()) ); - SharingComp1->setAlignment( int(&Qt::ButtonGroup::AlignLeft) ); - - my $LayoutWidget_3 = Qt::Widget(SharingComp1, '$LayoutWidget_3'); - $LayoutWidget_3->setGeometry( Qt::Rect(40, 60, 81, 266) ); - my $layout14 = Qt::VBoxLayout($LayoutWidget_3, 0, 0, '$layout14'); - - ShParam_1_1 = Qt::CheckBox($LayoutWidget_3, "ShParam_1_1"); - $layout14->addWidget(ShParam_1_1); - - ShParam_1_2 = Qt::CheckBox($LayoutWidget_3, "ShParam_1_2"); - $layout14->addWidget(ShParam_1_2); - - ShParam_1_3 = Qt::CheckBox($LayoutWidget_3, "ShParam_1_3"); - $layout14->addWidget(ShParam_1_3); - - ShParam_1_4 = Qt::CheckBox($LayoutWidget_3, "ShParam_1_4"); - $layout14->addWidget(ShParam_1_4); - - ShParam_1_5 = Qt::CheckBox($LayoutWidget_3, "ShParam_1_5"); - ShParam_1_5->setEnabled( 0 ); - ShParam_1_5->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_1_5->setTristate( 0 ); - $layout14->addWidget(ShParam_1_5); - - ShParam_1_6 = Qt::CheckBox($LayoutWidget_3, "ShParam_1_6"); - ShParam_1_6->setEnabled( 0 ); - ShParam_1_6->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_1_6->setTristate( 0 ); - $layout14->addWidget(ShParam_1_6); - - ShParam_1_7 = Qt::CheckBox($LayoutWidget_3, "ShParam_1_7"); - ShParam_1_7->setEnabled( 0 ); - ShParam_1_7->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_1_7->setTristate( 0 ); - $layout14->addWidget(ShParam_1_7); - - ShParam_1_8 = Qt::CheckBox($LayoutWidget_3, "ShParam_1_8"); - ShParam_1_8->setEnabled( 0 ); - ShParam_1_8->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_1_8->setTristate( 0 ); - $layout14->addWidget(ShParam_1_8); - - ShParam_1_9 = Qt::CheckBox($LayoutWidget_3, "ShParam_1_9"); - ShParam_1_9->setEnabled( 0 ); - ShParam_1_9->setPaletteBackgroundColor( Qt::Color(234, 233, 232) ); - ShParam_1_9->setTristate( 0 ); - $layout14->addWidget(ShParam_1_9); - - Comp1ShLabel = Qt::Label(SharingComp1, "Comp1ShLabel"); - Comp1ShLabel->setGeometry( Qt::Rect(2, 30, 185, 20) ); - Comp1ShLabel->setPaletteBackgroundColor( Qt::Color(255, 255, 127) ); - - $SharingPageLayout->addWidget(buttonGroupSharing, 0, 0); - musrfit_tabs->insertTab( SharingPage, "" ); - - InitializationPage = Qt::Widget(musrfit_tabs, "InitializationPage"); - my $InitializationPageLayout = Qt::GridLayout(InitializationPage, 1, 1, 11, 6, '$InitializationPageLayout'); - - InitParamTable = Qt::Table(InitializationPage, "InitParamTable"); - InitParamTable->setNumCols(InitParamTable->numCols() + 1); - InitParamTable->horizontalHeader()->setLabel(InitParamTable->numCols() - 1, trUtf8("Value")); - InitParamTable->setNumCols(InitParamTable->numCols() + 1); - InitParamTable->horizontalHeader()->setLabel(InitParamTable->numCols() - 1, trUtf8("Error")); - InitParamTable->setNumCols(InitParamTable->numCols() + 1); - InitParamTable->horizontalHeader()->setLabel(InitParamTable->numCols() - 1, trUtf8("Min")); - InitParamTable->setNumCols(InitParamTable->numCols() + 1); - InitParamTable->horizontalHeader()->setLabel(InitParamTable->numCols() - 1, trUtf8("Max")); - InitParamTable->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, InitParamTable->sizePolicy()->hasHeightForWidth()) ); - InitParamTable->setMaximumSize( Qt::Size(32767, 32767) ); - InitParamTable->setFocusPolicy( &Qt::Table::TabFocus() ); - InitParamTable->setFrameShape( &Qt::Table::PopupPanel() ); - InitParamTable->setLineWidth( int(2) ); - InitParamTable->setMargin( int(0) ); - InitParamTable->setMidLineWidth( int(0) ); - InitParamTable->setResizePolicy( &Qt::Table::Default() ); - InitParamTable->setVScrollBarMode( &Qt::Table::Auto() ); - InitParamTable->setDragAutoScroll( 0 ); - InitParamTable->setNumRows( int(0) ); - InitParamTable->setNumCols( int(4) ); - InitParamTable->setShowGrid( 1 ); - InitParamTable->setRowMovingEnabled( 0 ); - InitParamTable->setFocusStyle( &Qt::Table::SpreadSheet() ); - - $InitializationPageLayout->addWidget(InitParamTable, 0, 0); - musrfit_tabs->insertTab( InitializationPage, "" ); - - MSRPage = Qt::Widget(musrfit_tabs, "MSRPage"); - my $MSRPageLayout = Qt::GridLayout(MSRPage, 1, 1, 11, 6, '$MSRPageLayout'); - - my $layout25 = Qt::VBoxLayout(undef, 0, 6, '$layout25'); - - groupTitle = Qt::GroupBox(MSRPage, "groupTitle"); - groupTitle->setSizePolicy( Qt::SizePolicy(7, 0, 0, 0, groupTitle->sizePolicy()->hasHeightForWidth()) ); - groupTitle->setMargin( int(5) ); - groupTitle->setColumnLayout( 0, &Vertical ); - groupTitle->layout()->setSpacing(6); - groupTitle->layout()->setMargin(11); - my $groupTitleLayout = Qt::GridLayout(groupTitle->layout() ); - $groupTitleLayout->setAlignment( &AlignTop ); - - my $layout25_2 = Qt::VBoxLayout(undef, 0, 6, '$layout25_2'); - - TITLELabel = Qt::Label(groupTitle, "TITLELabel"); - TITLELabel->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, TITLELabel->sizePolicy()->hasHeightForWidth()) ); - $layout25_2->addWidget(TITLELabel); - - TITLE = Qt::LineEdit(groupTitle, "TITLE"); - TITLE->setSizePolicy( Qt::SizePolicy(7, 0, 1, 1, TITLE->sizePolicy()->hasHeightForWidth()) ); - $layout25_2->addWidget(TITLE); - - my $layout17 = Qt::HBoxLayout(undef, 0, 6, '$layout17'); - - FILENAMELabel = Qt::Label(groupTitle, "FILENAMELabel"); - $layout17->addWidget(FILENAMELabel); - - FILENAME = Qt::LineEdit(groupTitle, "FILENAME"); - FILENAME->setSizePolicy( Qt::SizePolicy(7, 0, 0, 0, FILENAME->sizePolicy()->hasHeightForWidth()) ); - $layout17->addWidget(FILENAME); - $layout25_2->addLayout($layout17); - - $groupTitleLayout->addLayout($layout25_2, 0, 0); - $layout25->addWidget(groupTitle); - - textMSROutput = Qt::TextEdit(MSRPage, "textMSROutput"); - textMSROutput->setOverwriteMode( 1 ); - $layout25->addWidget(textMSROutput); - - $MSRPageLayout->addLayout($layout25, 0, 0); - musrfit_tabs->insertTab( MSRPage, "" ); - - FourierPage = Qt::Widget(musrfit_tabs, "FourierPage"); - my $FourierPageLayout = Qt::GridLayout(FourierPage, 1, 1, 11, 6, '$FourierPageLayout'); - - FourierBox = Qt::GroupBox(FourierPage, "FourierBox"); - FourierBox->setSizePolicy( Qt::SizePolicy(7, 0, 0, 0, FourierBox->sizePolicy()->hasHeightForWidth()) ); - - my $LayoutWidget_4 = Qt::Widget(FourierBox, '$LayoutWidget_4'); - $LayoutWidget_4->setGeometry( Qt::Rect(12, 19, 510, 100) ); - my $layout34_2 = Qt::GridLayout($LayoutWidget_4, 1, 1, 5, 5, '$layout34_2'); - - FrqMin = Qt::LineEdit($LayoutWidget_4, "FrqMin"); - FrqMin->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, FrqMin->sizePolicy()->hasHeightForWidth()) ); - - $layout34_2->addWidget(FrqMin, 0, 3); - - textLabel1_3_4 = Qt::Label($LayoutWidget_4, "textLabel1_3_4"); - - $layout34_2->addWidget(textLabel1_3_4, 1, 5); - - textLabel1_7 = Qt::Label($LayoutWidget_4, "textLabel1_7"); - - $layout34_2->addWidget(textLabel1_7, 1, 2); - - textLabel1_3_5 = Qt::Label($LayoutWidget_4, "textLabel1_3_5"); - - $layout34_2->addWidget(textLabel1_3_5, 2, 2); - - FUnits = Qt::ComboBox(0, $LayoutWidget_4, "FUnits"); - FUnits->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, FUnits->sizePolicy()->hasHeightForWidth()) ); - - $layout34_2->addWidget(FUnits, 0, 1); - - textLabel1_3_6 = Qt::Label($LayoutWidget_4, "textLabel1_3_6"); - - $layout34_2->addWidget(textLabel1_3_6, 2, 3); - - FApodization = Qt::ComboBox(0, $LayoutWidget_4, "FApodization"); - FApodization->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, FApodization->sizePolicy()->hasHeightForWidth()) ); - - $layout34_2->addWidget(FApodization, 1, 1); - - FrqMax = Qt::LineEdit($LayoutWidget_4, "FrqMax"); - FrqMax->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, FrqMax->sizePolicy()->hasHeightForWidth()) ); - - $layout34_2->addWidget(FrqMax, 0, 5); - - FPlot = Qt::ComboBox(0, $LayoutWidget_4, "FPlot"); - FPlot->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, FPlot->sizePolicy()->hasHeightForWidth()) ); - - $layout34_2->addWidget(FPlot, 2, 1); - - FUnitsLabel = Qt::Label($LayoutWidget_4, "FUnitsLabel"); - - $layout34_2->addWidget(FUnitsLabel, 0, 0); - - textLabel1_3_8 = Qt::Label($LayoutWidget_4, "textLabel1_3_8"); - - $layout34_2->addWidget(textLabel1_3_8, 2, 5); - - textLabel1_3_7 = Qt::Label($LayoutWidget_4, "textLabel1_3_7"); - - $layout34_2->addWidget(textLabel1_3_7, 2, 4); - - FPlotLabel = Qt::Label($LayoutWidget_4, "FPlotLabel"); - - $layout34_2->addWidget(FPlotLabel, 2, 0); - - textLabel1_2 = Qt::Label($LayoutWidget_4, "textLabel1_2"); - - $layout34_2->addWidget(textLabel1_2, 0, 4); - - FApodizationLabel = Qt::Label($LayoutWidget_4, "FApodizationLabel"); - - $layout34_2->addWidget(FApodizationLabel, 1, 0); - - textLabel1_3_3 = Qt::Label($LayoutWidget_4, "textLabel1_3_3"); - - $layout34_2->addWidget(textLabel1_3_3, 1, 4); - - FPHASE = Qt::LineEdit($LayoutWidget_4, "FPHASE"); - FPHASE->setSizePolicy( Qt::SizePolicy(5, 5, 0, 0, FPHASE->sizePolicy()->hasHeightForWidth()) ); - - $layout34_2->addWidget(FPHASE, 1, 3); - - textLabel1 = Qt::Label($LayoutWidget_4, "textLabel1"); - - $layout34_2->addWidget(textLabel1, 0, 2); - - $FourierPageLayout->addWidget(FourierBox, 0, 0); - - RRFBox = Qt::GroupBox(FourierPage, "RRFBox"); - RRFBox->setSizePolicy( Qt::SizePolicy(7, 0, 0, 0, RRFBox->sizePolicy()->hasHeightForWidth()) ); - - my $LayoutWidget_5 = Qt::Widget(RRFBox, '$LayoutWidget_5'); - $LayoutWidget_5->setGeometry( Qt::Rect(10, 18, 265, 100) ); - my $layout35 = Qt::GridLayout($LayoutWidget_5, 1, 1, 5, 5, '$layout35'); - - textLabel1_6_2_2 = Qt::Label($LayoutWidget_5, "textLabel1_6_2_2"); - - $layout35->addWidget(textLabel1_6_2_2, 2, 0); - - textLabel1_6 = Qt::Label($LayoutWidget_5, "textLabel1_6"); - - $layout35->addWidget(textLabel1_6, 0, 0); - - textLabel1_6_2_4 = Qt::Label($LayoutWidget_5, "textLabel1_6_2_4"); - - $layout35->addWidget(textLabel1_6_2_4, 2, 2); - - RRFFrq = Qt::LineEdit($LayoutWidget_5, "RRFFrq"); - - $layout35->addWidget(RRFFrq, 0, 1); - - textLabel1_6_2_3 = Qt::Label($LayoutWidget_5, "textLabel1_6_2_3"); - - $layout35->addWidget(textLabel1_6_2_3, 1, 2); - - RRFPack = Qt::LineEdit($LayoutWidget_5, "RRFPack"); - - $layout35->addWidget(RRFPack, 1, 1); - - textLabel1_6_2 = Qt::Label($LayoutWidget_5, "textLabel1_6_2"); - - $layout35->addWidget(textLabel1_6_2, 1, 0); - - RRFUnits = Qt::ComboBox(0, $LayoutWidget_5, "RRFUnits"); - - $layout35->addWidget(RRFUnits, 0, 2); - - RRFPhase = Qt::LineEdit($LayoutWidget_5, "RRFPhase"); - - $layout35->addWidget(RRFPhase, 2, 1); - - $FourierPageLayout->addWidget(RRFBox, 1, 0); - musrfit_tabs->insertTab( FourierPage, "" ); - - T0Page = Qt::Widget(musrfit_tabs, "T0Page"); - my $T0PageLayout = Qt::GridLayout(T0Page, 1, 1, 11, 6, '$T0PageLayout'); - - my $layout25_3 = Qt::HBoxLayout(undef, 0, 6, '$layout25_3'); - - groupHist0 = Qt::GroupBox(T0Page, "groupHist0"); - groupHist0->setSizePolicy( Qt::SizePolicy(7, 7, 1, 1, groupHist0->sizePolicy()->hasHeightForWidth()) ); - groupHist0->setMinimumSize( Qt::Size(0, 0) ); - - my $LayoutWidget_6 = Qt::Widget(groupHist0, '$LayoutWidget_6'); - $LayoutWidget_6->setGeometry( Qt::Rect(5, 18, 100, 150) ); - my $layout16_2 = Qt::VBoxLayout($LayoutWidget_6, 11, 6, '$layout16_2'); - - textLabel2 = Qt::Label($LayoutWidget_6, "textLabel2"); - $layout16_2->addWidget(textLabel2); - - textLabel2_2_2_3 = Qt::Label($LayoutWidget_6, "textLabel2_2_2_3"); - $layout16_2->addWidget(textLabel2_2_2_3); - - textLabel2_2_2 = Qt::Label($LayoutWidget_6, "textLabel2_2_2"); - $layout16_2->addWidget(textLabel2_2_2); - - textLabel2_2_2_2 = Qt::Label($LayoutWidget_6, "textLabel2_2_2_2"); - $layout16_2->addWidget(textLabel2_2_2_2); - - textLabel2_2_2_2_2 = Qt::Label($LayoutWidget_6, "textLabel2_2_2_2_2"); - $layout16_2->addWidget(textLabel2_2_2_2_2); - $layout25_3->addWidget(groupHist0); - - groupHist1 = Qt::GroupBox(T0Page, "groupHist1"); - groupHist1->setSizePolicy( Qt::SizePolicy(7, 7, 1, 1, groupHist1->sizePolicy()->hasHeightForWidth()) ); - groupHist1->setMinimumSize( Qt::Size(0, 0) ); - groupHist1->setFrameShadow( &Qt::GroupBox::Plain() ); - - my $LayoutWidget_7 = Qt::Widget(groupHist1, '$LayoutWidget_7'); - $LayoutWidget_7->setGeometry( Qt::Rect(8, 17, 75, 150) ); - my $layout18 = Qt::VBoxLayout($LayoutWidget_7, 0, 0, '$layout18'); - - t01 = Qt::LineEdit($LayoutWidget_7, "t01"); - $layout18->addWidget(t01); - - Bg11 = Qt::LineEdit($LayoutWidget_7, "Bg11"); - $layout18->addWidget(Bg11); - - Bg21 = Qt::LineEdit($LayoutWidget_7, "Bg21"); - $layout18->addWidget(Bg21); - - Data11 = Qt::LineEdit($LayoutWidget_7, "Data11"); - $layout18->addWidget(Data11); - - Data21 = Qt::LineEdit($LayoutWidget_7, "Data21"); - $layout18->addWidget(Data21); - $layout25_3->addWidget(groupHist1); - - groupHist2 = Qt::GroupBox(T0Page, "groupHist2"); - groupHist2->setEnabled( 1 ); - groupHist2->setSizePolicy( Qt::SizePolicy(7, 7, 1, 1, groupHist2->sizePolicy()->hasHeightForWidth()) ); - groupHist2->setFrameShadow( &Qt::GroupBox::Plain() ); - - my $LayoutWidget_8 = Qt::Widget(groupHist2, '$LayoutWidget_8'); - $LayoutWidget_8->setGeometry( Qt::Rect(8, 17, 75, 150) ); - my $layout18_2 = Qt::VBoxLayout($LayoutWidget_8, 0, 0, '$layout18_2'); - - t02 = Qt::LineEdit($LayoutWidget_8, "t02"); - $layout18_2->addWidget(t02); - - Bg12 = Qt::LineEdit($LayoutWidget_8, "Bg12"); - $layout18_2->addWidget(Bg12); - - Bg22 = Qt::LineEdit($LayoutWidget_8, "Bg22"); - $layout18_2->addWidget(Bg22); - - Data12 = Qt::LineEdit($LayoutWidget_8, "Data12"); - $layout18_2->addWidget(Data12); - - Data22 = Qt::LineEdit($LayoutWidget_8, "Data22"); - $layout18_2->addWidget(Data22); - $layout25_3->addWidget(groupHist2); - - groupHist3 = Qt::GroupBox(T0Page, "groupHist3"); - groupHist3->setEnabled( 1 ); - groupHist3->setSizePolicy( Qt::SizePolicy(7, 7, 1, 1, groupHist3->sizePolicy()->hasHeightForWidth()) ); - groupHist3->setFrameShadow( &Qt::GroupBox::Plain() ); - - my $LayoutWidget_9 = Qt::Widget(groupHist3, '$LayoutWidget_9'); - $LayoutWidget_9->setGeometry( Qt::Rect(8, 17, 75, 150) ); - my $layout18_3 = Qt::VBoxLayout($LayoutWidget_9, 0, 0, '$layout18_3'); - - t03 = Qt::LineEdit($LayoutWidget_9, "t03"); - $layout18_3->addWidget(t03); - - Bg13 = Qt::LineEdit($LayoutWidget_9, "Bg13"); - $layout18_3->addWidget(Bg13); - - Bg23 = Qt::LineEdit($LayoutWidget_9, "Bg23"); - $layout18_3->addWidget(Bg23); - - Data13 = Qt::LineEdit($LayoutWidget_9, "Data13"); - $layout18_3->addWidget(Data13); - - Data23 = Qt::LineEdit($LayoutWidget_9, "Data23"); - $layout18_3->addWidget(Data23); - $layout25_3->addWidget(groupHist3); - - groupHist4 = Qt::GroupBox(T0Page, "groupHist4"); - groupHist4->setEnabled( 1 ); - groupHist4->setSizePolicy( Qt::SizePolicy(7, 7, 1, 1, groupHist4->sizePolicy()->hasHeightForWidth()) ); - groupHist4->setFrameShadow( &Qt::GroupBox::Plain() ); - - my $LayoutWidget_10 = Qt::Widget(groupHist4, '$LayoutWidget_10'); - $LayoutWidget_10->setGeometry( Qt::Rect(8, 17, 75, 150) ); - my $layout18_4 = Qt::VBoxLayout($LayoutWidget_10, 0, 0, '$layout18_4'); - - t04 = Qt::LineEdit($LayoutWidget_10, "t04"); - $layout18_4->addWidget(t04); - - Bg14 = Qt::LineEdit($LayoutWidget_10, "Bg14"); - $layout18_4->addWidget(Bg14); - - Bg24 = Qt::LineEdit($LayoutWidget_10, "Bg24"); - $layout18_4->addWidget(Bg24); - - Data14 = Qt::LineEdit($LayoutWidget_10, "Data14"); - $layout18_4->addWidget(Data14); - - Data24 = Qt::LineEdit($LayoutWidget_10, "Data24"); - $layout18_4->addWidget(Data24); - $layout25_3->addWidget(groupHist4); - - $T0PageLayout->addLayout($layout25_3, 0, 0); - - my $layout29 = Qt::HBoxLayout(undef, 0, 6, '$layout29'); - my $spacer_4 = Qt::SpacerItem(461, 20, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum); - $layout29->addItem($spacer_4); - - t0Update = Qt::PushButton(T0Page, "t0Update"); - t0Update->setEnabled( 0 ); - t0Update->setSizePolicy( Qt::SizePolicy(0, 0, 0, 0, t0Update->sizePolicy()->hasHeightForWidth()) ); - $layout29->addWidget(t0Update); - - $T0PageLayout->addLayout($layout29, 1, 0); - musrfit_tabs->insertTab( T0Page, "" ); - - TabPage = Qt::Widget(musrfit_tabs, "TabPage"); - my $TabPageLayout = Qt::GridLayout(TabPage, 1, 1, 11, 6, '$TabPageLayout'); - - my $layout34_2_2 = Qt::VBoxLayout(undef, 0, 6, '$layout34_2_2'); - - my $layout33_2 = Qt::GridLayout(undef, 1, 1, 0, 6, '$layout33_2'); - - TheoryBlock_Label = Qt::Label(TabPage, "TheoryBlock_Label"); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, Qt::Color(242,247,252)); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, &black); - $cg->setColor(&Qt::ColorGroup::LinkVisited, &black); - $pal->setActive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setInactive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setDisabled($cg); - TheoryBlock_Label->setPalette( $pal ); - - $layout33_2->addWidget(TheoryBlock_Label, 0, 0); - - TheoryBlock = Qt::TextEdit(TabPage, "TheoryBlock"); - TheoryBlock->setEnabled( 1 ); - - $layout33_2->addWidget(TheoryBlock, 1, 0); - - ParametersList_Label = Qt::Label(TabPage, "ParametersList_Label"); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, Qt::Color(242,247,252)); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, &black); - $cg->setColor(&Qt::ColorGroup::LinkVisited, &black); - $pal->setActive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setInactive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setDisabled($cg); - ParametersList_Label->setPalette( $pal ); - - $layout33_2->addWidget(ParametersList_Label, 0, 1); - - ParametersList = Qt::TextEdit(TabPage, "ParametersList"); - ParametersList->setEnabled( 1 ); - - $layout33_2->addWidget(ParametersList, 1, 1); - $layout34_2_2->addLayout($layout33_2); - - my $layout25_6 = Qt::HBoxLayout(undef, 0, 6, '$layout25_6'); - - CParamsCombo = Qt::ComboBox(0, TabPage, "CParamsCombo"); - CParamsCombo->setSizePolicy( Qt::SizePolicy(0, 0, 0, 0, CParamsCombo->sizePolicy()->hasHeightForWidth()) ); - $layout25_6->addWidget(CParamsCombo); - - textLabel1_4_6 = Qt::Label(TabPage, "textLabel1_4_6"); - textLabel1_4_6->setSizePolicy( Qt::SizePolicy(0, 0, 0, 0, textLabel1_4_6->sizePolicy()->hasHeightForWidth()) ); - $layout25_6->addWidget(textLabel1_4_6); - - ConstraintLine = Qt::LineEdit(TabPage, "ConstraintLine"); - ConstraintLine->setSizePolicy( Qt::SizePolicy(7, 0, 0, 0, ConstraintLine->sizePolicy()->hasHeightForWidth()) ); - ConstraintLine->setMinimumSize( Qt::Size(0, 25) ); - $layout25_6->addWidget(ConstraintLine); - - AddConstraint = Qt::PushButton(TabPage, "AddConstraint"); - AddConstraint->setSizePolicy( Qt::SizePolicy(0, 0, 0, 0, AddConstraint->sizePolicy()->hasHeightForWidth()) ); - $layout25_6->addWidget(AddConstraint); - $layout34_2_2->addLayout($layout25_6); - - textLabel2_2_3_4 = Qt::Label(TabPage, "textLabel2_2_3_4"); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, Qt::Color(242,247,252)); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, &black); - $cg->setColor(&Qt::ColorGroup::LinkVisited, &black); - $pal->setActive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, &black); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, &black); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, &black); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setInactive($cg); - $cg->setColor(&Qt::ColorGroup::Foreground, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Button, Qt::Color(230,240,249)); - $cg->setColor(&Qt::ColorGroup::Light, &white); - $cg->setColor(&Qt::ColorGroup::Midlight, &white); - $cg->setColor(&Qt::ColorGroup::Dark, Qt::Color(115,120,124)); - $cg->setColor(&Qt::ColorGroup::Mid, Qt::Color(154,160,166)); - $cg->setColor(&Qt::ColorGroup::Text, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::BrightText, &white); - $cg->setColor(&Qt::ColorGroup::ButtonText, Qt::Color(128,128,128)); - $cg->setColor(&Qt::ColorGroup::Base, &white); - $cg->setColor(&Qt::ColorGroup::Background, Qt::Color(255,255,127)); - $cg->setColor(&Qt::ColorGroup::Shadow, &black); - $cg->setColor(&Qt::ColorGroup::Highlight, Qt::Color(0,0,128)); - $cg->setColor(&Qt::ColorGroup::HighlightedText, &white); - $cg->setColor(&Qt::ColorGroup::Link, Qt::Color(0,0,238)); - $cg->setColor(&Qt::ColorGroup::LinkVisited, Qt::Color(82,24,139)); - $pal->setDisabled($cg); - textLabel2_2_3_4->setPalette( $pal ); - $layout34_2_2->addWidget(textLabel2_2_3_4); - - FunctionsBlock = Qt::TextEdit(TabPage, "FunctionsBlock"); - $layout34_2_2->addWidget(FunctionsBlock); - - my $layout30 = Qt::HBoxLayout(undef, 0, 6, '$layout30'); - - textLabel1_6_3 = Qt::Label(TabPage, "textLabel1_6_3"); - $layout30->addWidget(textLabel1_6_3); - - ResetFunc = Qt::PushButton(TabPage, "ResetFunc"); - ResetFunc->setMaximumSize( Qt::Size(100, 32767) ); - $layout30->addWidget(ResetFunc); - $layout34_2_2->addLayout($layout30); - - $TabPageLayout->addLayout($layout34_2_2, 0, 0); - musrfit_tabs->insertTab( TabPage, "" ); - - $MuSRFitformLayout->addWidget(musrfit_tabs, 0, 0); - - fileNewAction= Qt::Action(this, "fileNewAction"); - fileNewAction->setIconSet( Qt::IconSet($image3) ); - fileOpenAction= Qt::Action(this, "fileOpenAction"); - fileOpenAction->setEnabled( 0 ); - fileOpenAction->setIconSet( Qt::IconSet($image4) ); - fileOpenAction->setVisible( 0 ); - fileSaveAction= Qt::Action(this, "fileSaveAction"); - fileSaveAction->setIconSet( Qt::IconSet($image5) ); - fileSaveAsAction= Qt::Action(this, "fileSaveAsAction"); - fileSaveAsAction->setIconSet( Qt::IconSet($image6) ); - filePrintAction= Qt::Action(this, "filePrintAction"); - filePrintAction->setEnabled( 0 ); - filePrintAction->setIconSet( Qt::IconSet($image7) ); - fileExitAction= Qt::Action(this, "fileExitAction"); - fileExitAction->setIconSet( Qt::IconSet($image8) ); - editUndoAction= Qt::Action(this, "editUndoAction"); - editUndoAction->setEnabled( 0 ); - editUndoAction->setIconSet( Qt::IconSet($image9) ); - editRedoAction= Qt::Action(this, "editRedoAction"); - editRedoAction->setEnabled( 0 ); - editRedoAction->setIconSet( Qt::IconSet($image10) ); - editCutAction= Qt::Action(this, "editCutAction"); - editCutAction->setEnabled( 0 ); - editCutAction->setIconSet( Qt::IconSet($image11) ); - editCopyAction= Qt::Action(this, "editCopyAction"); - editCopyAction->setEnabled( 0 ); - editCopyAction->setIconSet( Qt::IconSet($image12) ); - editPasteAction= Qt::Action(this, "editPasteAction"); - editPasteAction->setEnabled( 0 ); - editPasteAction->setIconSet( Qt::IconSet($image13) ); - editFindAction= Qt::Action(this, "editFindAction"); - editFindAction->setIconSet( Qt::IconSet($image14) ); - helpContentsAction= Qt::Action(this, "helpContentsAction"); - helpContentsAction->setEnabled( 0 ); - helpContentsAction->setIconSet( Qt::IconSet($image15) ); - helpIndexAction= Qt::Action(this, "helpIndexAction"); - helpIndexAction->setEnabled( 0 ); - helpIndexAction->setIconSet( Qt::IconSet($image16) ); - helpAboutAction= Qt::Action(this, "helpAboutAction"); - separatorAction= Qt::Action(this, "separatorAction"); - FileExistCheck= Qt::Action(this, "FileExistCheck"); - FileExistCheck->setToggleAction( 1 ); - FileExistCheck->setOn( 0 ); - ManualFile= Qt::Action(this, "ManualFile"); - ManualFile->setToggleAction( 1 ); - fileChangeDirAction= Qt::Action(this, "fileChangeDirAction"); - fileChangeDirAction->setIconSet( Qt::IconSet($image17) ); - optionsnew_itemAction= Qt::Action(this, "optionsnew_itemAction"); - parametersExport_AsAction= Qt::Action(this, "parametersExport_AsAction"); - parametersExport_AsAction->setIconSet( Qt::IconSet($image18) ); - parametersAppend_ToAction= Qt::Action(this, "parametersAppend_ToAction"); - parametersAppend_ToAction->setIconSet( Qt::IconSet($image19) ); - Fit= Qt::Action(this, "Fit"); - Fit->setIconSet( Qt::IconSet($image20) ); - Plot= Qt::Action(this, "Plot"); - Plot->setToggleAction( 0 ); - Plot->setIconSet( Qt::IconSet($image21) ); - T0= Qt::Action(this, "T0"); - T0->setIconSet( Qt::IconSet($image22) ); - optionsFourier= Qt::Action(this, "optionsFourier"); - optionsFourier->setToggleAction( 1 ); - optionsT0= Qt::Action(this, "optionsT0"); - optionsT0->setToggleAction( 1 ); - optionsConfigure= Qt::Action(this, "optionsConfigure"); - - - FileToolBar = Qt::ToolBar("", this, &DockTop); - - fileOpenAction->addTo(FileToolBar); - fileExitAction->addTo(FileToolBar); - fileChangeDirAction->addTo(FileToolBar); - fileSaveAction->addTo(FileToolBar); - filePrintAction->addTo(FileToolBar); - ActionsToolBar = Qt::ToolBar("", this, &DockTop); - - Fit->addTo(ActionsToolBar); - Plot->addTo(ActionsToolBar); - T0->addTo(ActionsToolBar); - parametersExport_AsAction->addTo(ActionsToolBar); - parametersAppend_ToAction->addTo(ActionsToolBar); - - - MenuBar= Qt::MenuBar( this, "MenuBar"); - - MenuBar->setEnabled( 1 ); - - fileMenu = Qt::PopupMenu( this ); - fileOpenAction->addTo( fileMenu ); - fileSaveAction->addTo( fileMenu ); - fileChangeDirAction->addTo( fileMenu ); - fileMenu->insertSeparator(); - filePrintAction->addTo( fileMenu ); - fileMenu->insertSeparator(); - fileExitAction->addTo( fileMenu ); - MenuBar->insertItem( "", fileMenu, 2 ); - - Edit = Qt::PopupMenu( this ); - editUndoAction->addTo( Edit ); - editRedoAction->addTo( Edit ); - Edit->insertSeparator(); - editCutAction->addTo( Edit ); - editCopyAction->addTo( Edit ); - editPasteAction->addTo( Edit ); - MenuBar->insertItem( "", Edit, 3 ); - - Actions = Qt::PopupMenu( this ); - Fit->addTo( Actions ); - Plot->addTo( Actions ); - T0->addTo( Actions ); - MenuBar->insertItem( "", Actions, 4 ); - - Parameters = Qt::PopupMenu( this ); - parametersExport_AsAction->addTo( Parameters ); - parametersAppend_ToAction->addTo( Parameters ); - MenuBar->insertItem( "", Parameters, 5 ); - - Options = Qt::PopupMenu( this ); - FileExistCheck->addTo( Options ); - ManualFile->addTo( Options ); - optionsFourier->addTo( Options ); - optionsT0->addTo( Options ); - optionsConfigure->addTo( Options ); - MenuBar->insertItem( "", Options, 6 ); - - helpMenu = Qt::PopupMenu( this ); - helpContentsAction->addTo( helpMenu ); - helpIndexAction->addTo( helpMenu ); - helpMenu->insertSeparator(); - helpAboutAction->addTo( helpMenu ); - MenuBar->insertItem( "", helpMenu, 7 ); - - MenuBar->insertSeparator( 8 ); - - languageChange(); - my $resize = Qt::Size(582, 502); - $resize = $resize->expandedTo(minimumSizeHint()); - resize( $resize ); - clearWState( &Qt::WState_Polished ); - - Qt::Object::connect(Fit, SIGNAL "activated()", this, SLOT "GoFit()"); - Qt::Object::connect(parametersAppend_ToAction, SIGNAL "activated()", this, SLOT "parametersAppend()"); - Qt::Object::connect(parametersExport_AsAction, SIGNAL "activated()", this, SLOT "parametersExport()"); - Qt::Object::connect(fileChangeDirAction, SIGNAL "activated()", this, SLOT "fileChangeDir()"); - Qt::Object::connect(fileOpenAction, SIGNAL "activated()", this, SLOT "fileOpen()"); - Qt::Object::connect(fileSaveAction, SIGNAL "activated()", this, SLOT "fileSave()"); - Qt::Object::connect(filePrintAction, SIGNAL "activated()", this, SLOT "filePrint()"); - Qt::Object::connect(fileExitAction, SIGNAL "activated()", this, SLOT "fileExit()"); - Qt::Object::connect(editUndoAction, SIGNAL "activated()", this, SLOT "editUndo()"); - Qt::Object::connect(editRedoAction, SIGNAL "activated()", this, SLOT "editRedo()"); - Qt::Object::connect(editCutAction, SIGNAL "activated()", this, SLOT "editCut()"); - Qt::Object::connect(editCopyAction, SIGNAL "activated()", this, SLOT "editCopy()"); - Qt::Object::connect(editPasteAction, SIGNAL "activated()", this, SLOT "editPaste()"); - Qt::Object::connect(helpIndexAction, SIGNAL "activated()", this, SLOT "helpIndex()"); - Qt::Object::connect(helpContentsAction, SIGNAL "activated()", this, SLOT "helpContents()"); - Qt::Object::connect(helpAboutAction, SIGNAL "activated()", this, SLOT "helpAbout()"); - Qt::Object::connect(T0, SIGNAL "activated()", this, SLOT "ShowMuSRT0()"); - Qt::Object::connect(Plot, SIGNAL "activated()", this, SLOT "GoPlot()"); - Qt::Object::connect(ManualFile, SIGNAL "toggled(bool)", this, SLOT "RunSelectionToggle()"); - Qt::Object::connect(ResetFunc, SIGNAL "clicked()", this, SLOT "InitializeFunctions()"); - Qt::Object::connect(AddConstraint, SIGNAL "clicked()", this, SLOT "AppendToFunctions()"); - Qt::Object::connect(InitParamTable, SIGNAL "valueChanged(int,int)", this, SLOT "CallMSRCreate()"); - Qt::Object::connect(buttonGroupSharing, SIGNAL "toggled(bool)", this, SLOT "ActivateShComp()"); - Qt::Object::connect(Browse, SIGNAL "clicked()", this, SLOT "fileBrowse()"); - Qt::Object::connect(BeamLine, SIGNAL "activated(int)", this, SLOT "T0Update()"); - Qt::Object::connect(FitType3, SIGNAL "activated(const QString&)", this, SLOT "InitializeFunctions()"); - Qt::Object::connect(FitType1, SIGNAL "activated(const QString&)", this, SLOT "InitializeFunctions()"); - Qt::Object::connect(FitType2, SIGNAL "activated(const QString&)", this, SLOT "InitializeFunctions()"); - Qt::Object::connect(musrfit_tabs, SIGNAL "selected(const QString&)", this, SLOT "TabChanged()"); - Qt::Object::connect(t0Update, SIGNAL "clicked()", this, SLOT "t0UpdateClicked()"); - Qt::Object::connect(buttonGroupSharing, SIGNAL "toggled(bool)", this, SLOT "ActivateShComp()"); - - setTabOrder(musrfit_tabs, RunNumbers); - setTabOrder(RunNumbers, BeamLine); - setTabOrder(BeamLine, YEAR); - setTabOrder(YEAR, RunFiles); - setTabOrder(RunFiles, Browse); - setTabOrder(Browse, FitType1); - setTabOrder(FitType1, FitType2); - setTabOrder(FitType2, FitType3); - setTabOrder(FitType3, Tis); - setTabOrder(Tis, Tfs); - setTabOrder(Tfs, BINS); - setTabOrder(BINS, FitAsyType); - setTabOrder(FitAsyType, LRBF); - setTabOrder(LRBF, FitTextOutput); - setTabOrder(FitTextOutput, ShParam_1_1); - setTabOrder(ShParam_1_1, ShParam_1_2); - setTabOrder(ShParam_1_2, ShParam_1_3); - setTabOrder(ShParam_1_3, ShParam_1_4); - setTabOrder(ShParam_1_4, ShParam_1_5); - setTabOrder(ShParam_1_5, ShParam_1_6); - setTabOrder(ShParam_1_6, ShParam_1_7); - setTabOrder(ShParam_1_7, ShParam_1_8); - setTabOrder(ShParam_1_8, ShParam_1_9); - setTabOrder(ShParam_1_9, ShParam_2_1); - setTabOrder(ShParam_2_1, ShParam_2_2); - setTabOrder(ShParam_2_2, ShParam_2_3); - setTabOrder(ShParam_2_3, ShParam_2_4); - setTabOrder(ShParam_2_4, ShParam_2_5); - setTabOrder(ShParam_2_5, ShParam_2_6); - setTabOrder(ShParam_2_6, ShParam_2_7); - setTabOrder(ShParam_2_7, ShParam_2_8); - setTabOrder(ShParam_2_8, ShParam_2_9); - setTabOrder(ShParam_2_9, ShParam_3_1); - setTabOrder(ShParam_3_1, ShParam_3_2); - setTabOrder(ShParam_3_2, ShParam_3_3); - setTabOrder(ShParam_3_3, ShParam_3_4); - setTabOrder(ShParam_3_4, ShParam_3_5); - setTabOrder(ShParam_3_5, ShParam_3_6); - setTabOrder(ShParam_3_6, ShParam_3_7); - setTabOrder(ShParam_3_7, ShParam_3_8); - setTabOrder(ShParam_3_8, ShParam_3_9); - setTabOrder(ShParam_3_9, InitParamTable); - setTabOrder(InitParamTable, TITLE); - setTabOrder(TITLE, FILENAME); - setTabOrder(FILENAME, textMSROutput); - setTabOrder(textMSROutput, FUnits); - setTabOrder(FUnits, FApodization); - setTabOrder(FApodization, FPlot); - setTabOrder(FPlot, FrqMin); - setTabOrder(FrqMin, FrqMax); - setTabOrder(FrqMax, t01); - setTabOrder(t01, Bg11); - setTabOrder(Bg11, Bg21); - setTabOrder(Bg21, Data11); - setTabOrder(Data11, Data21); - setTabOrder(Data21, t02); - setTabOrder(t02, Bg12); - setTabOrder(Bg12, Bg22); - setTabOrder(Bg22, Data12); - setTabOrder(Data12, Data22); - setTabOrder(Data22, t03); - setTabOrder(t03, Bg13); - setTabOrder(Bg13, Bg23); - setTabOrder(Bg23, Data13); - setTabOrder(Data13, Data23); - setTabOrder(Data23, t04); - setTabOrder(t04, Bg14); - setTabOrder(Bg14, Bg24); - setTabOrder(Bg24, Data14); - setTabOrder(Data14, Data24); - - TfsLabel->setBuddy(this->Tfs); - Comp1Label->setBuddy(this->FitType1); - BINSLabel->setBuddy(this->BINS); - TisLabel->setBuddy(this->Tis); - TITLELabel->setBuddy(this->TITLE); - FILENAMELabel->setBuddy(this->FILENAME); -} - - -# Sets the strings of the subwidgets using the current -# language. - -sub languageChange -{ - setCaption(trUtf8("MuSRFit GUI") ); - setIconText(trUtf8("MuSRFitGUI") ); - RUNSAuto->setTitle( trUtf8("RUN Numbers") ); - Qt::ToolTip::add(RunNumbers, trUtf8("Numbers of RUNs to fit. Multiple runs are comma separated.")); - Qt::WhatsThis::add(RunNumbers, trUtf8("Numbers of RUNs to fit. Multiple runs are comma separated.")); - BeamLine->clear(); - BeamLine->insertItem( trUtf8("LEM") ); - BeamLine->insertItem( trUtf8("GPS") ); - BeamLine->insertItem( trUtf8("Dolly") ); - BeamLine->insertItem( trUtf8("LTF") ); - BeamLine->insertItem( trUtf8("LEM (PPC)") ); - BeamLineLabel->setText( trUtf8("On beam line") ); - YEARLabel->setText( trUtf8("Year") ); - RUNSMan->setTitle( trUtf8("RUN Files") ); - Qt::ToolTip::add(RunFiles, trUtf8("Names of data files to be fit. Multiple data files are comma separated.")); - Qt::WhatsThis::add(RunFiles, trUtf8("Names of data files to be fit. Multiple data files are comma separated.")); - Browse->setText( trUtf8("Browse") ); - Qt::ToolTip::add(Browse, trUtf8("Browse to select data files for fitting.")); - Qt::WhatsThis::add(Browse, trUtf8("Browse to select data files for fitting.")); - groupBox7->setTitle( trUtf8("Theory Function") ); - FitType2->clear(); - FitType2->insertItem( trUtf8("Exponential") ); - FitType2->insertItem( trUtf8("Gaussian") ); - FitType2->insertItem( trUtf8("Stretch Exp.") ); - FitType2->insertItem( trUtf8("Exponential Cos") ); - FitType2->insertItem( trUtf8("Gaussian Cos") ); - FitType2->insertItem( trUtf8("Stretch Cos") ); - FitType2->insertItem( trUtf8("Lorentzian Dynamic KT") ); - FitType2->insertItem( trUtf8("Gaussian Dynamic KT") ); - FitType2->insertItem( trUtf8("Background") ); - FitType2->insertItem( trUtf8("Lorentzian Kubo-Toyabe LF x Exp") ); - FitType2->insertItem( trUtf8("Gaussian Kubo-Toyabe LF x Exp") ); - FitType2->insertItem( trUtf8("Lorentzian Kubo-Toyabe LF x Str Exp") ); - FitType2->insertItem( trUtf8("Gaussian Kubo-Toyabe LF x Str Exp") ); - FitType2->insertItem( trUtf8("MolMag") ); - FitType2->insertItem( trUtf8("Meissner State Model") ); - FitType2->insertItem( trUtf8("None") ); - FitType2->setCurrentItem( int(15) ); - TfsLabel->setText( trUtf8("Final Time") ); - FitType1->clear(); - FitType1->insertItem( trUtf8("Exponential") ); - FitType1->insertItem( trUtf8("Gaussian") ); - FitType1->insertItem( trUtf8("Stretch Exp.") ); - FitType1->insertItem( trUtf8("Exponential Cos") ); - FitType1->insertItem( trUtf8("Gaussian Cos") ); - FitType1->insertItem( trUtf8("Stretch Cos") ); - FitType1->insertItem( trUtf8("Lorentzian Dynamic KT") ); - FitType1->insertItem( trUtf8("Gaussian Dynamic KT") ); - FitType1->insertItem( trUtf8("Background") ); - FitType1->insertItem( trUtf8("Lorentzian Kubo-Toyabe LF x Exp") ); - FitType1->insertItem( trUtf8("Gaussian Kubo-Toyabe LF x Exp") ); - FitType1->insertItem( trUtf8("Lorentzian Kubo-Toyabe LF x Str Exp") ); - FitType1->insertItem( trUtf8("Gaussian Kubo-Toyabe LF x Str Exp") ); - FitType1->insertItem( trUtf8("MolMag") ); - FitType1->insertItem( trUtf8("Meissner State Model") ); - BINS->setText( trUtf8("100") ); - Comp3Label->setText( trUtf8("Third Component") ); - Tis->setText( trUtf8("0") ); - Tfs->setText( trUtf8("8") ); - Comp1Label->setText( trUtf8("First Component") ); - BINSLabel->setText( trUtf8("Binning Factor") ); - TisLabel->setText( trUtf8("Initial Time") ); - FitType3->clear(); - FitType3->insertItem( trUtf8("Exponential") ); - FitType3->insertItem( trUtf8("Gaussian") ); - FitType3->insertItem( trUtf8("Stretch Exp.") ); - FitType3->insertItem( trUtf8("Exponential Cos") ); - FitType3->insertItem( trUtf8("Gaussian Cos") ); - FitType3->insertItem( trUtf8("Stretch Cos") ); - FitType3->insertItem( trUtf8("Lorentzian Dynamic KT") ); - FitType3->insertItem( trUtf8("Gaussian Dynamic KT") ); - FitType3->insertItem( trUtf8("Background") ); - FitType3->insertItem( trUtf8("Lorentzian Kubo-Toyabe LF x Exp") ); - FitType3->insertItem( trUtf8("Gaussian Kubo-Toyabe LF x Exp") ); - FitType3->insertItem( trUtf8("Lorentzian Kubo-Toyabe LF x Str Exp") ); - FitType3->insertItem( trUtf8("Gaussian Kubo-Toyabe LF x Str Exp") ); - FitType3->insertItem( trUtf8("MolMag") ); - FitType3->insertItem( trUtf8("Meissner State Model") ); - FitType3->insertItem( trUtf8("None") ); - FitType3->setCurrentItem( int(15) ); - Comp2Label->setText( trUtf8("Second Component") ); - FitAsyTypeLabel->setText( trUtf8("Fit type") ); - FitAsyType->clear(); - FitAsyType->insertItem( $image1, trUtf8("Asymmetry") ); - FitAsyType->insertItem( $image2, trUtf8("SingleHist") ); - LRBFLabel->setText( trUtf8("Histograms list") ); - LRBF->setText( trUtf8("1,3") ); - musrfit_tabs->changeTab( RUNSPage, trUtf8("RUNS") ); - Minimization->clear(); - Minimization->insertItem( trUtf8("MINIMIZE") ); - Minimization->insertItem( trUtf8("MIGRAD") ); - Minimization->insertItem( trUtf8("SIMPLEX") ); - textLabel1_4_2_2->setText( trUtf8("View Binning") ); - textLabel1_5->setText( trUtf8("Minimization type") ); - textLabel1_4_2->setText( trUtf8("Y Range") ); - ErrorCalc->clear(); - ErrorCalc->insertItem( trUtf8("HESSE") ); - ErrorCalc->insertItem( trUtf8("MINOS") ); - ltc->setText( trUtf8("Life time correction") ); - textLabel1_5_2->setText( trUtf8("Error estimation") ); - textLabel1_4->setText( trUtf8("X Range") ); - musrfit_tabs->changeTab( FittingPage, trUtf8("Fitting") ); - buttonGroupSharing->setTitle( trUtf8("Shared parameters among different runs") ); - SharingComp2->setTitle( trUtf8("2nd Component") ); - Comp2ShLabel->setText( trUtf8("FitType2") ); - ShParam_2_1->setText( trUtf8("Param1") ); - ShParam_2_2->setText( trUtf8("Param2") ); - ShParam_2_3->setText( trUtf8("Param3") ); - ShParam_2_4->setText( trUtf8("Param4") ); - ShParam_2_5->setText( trUtf8("Param5") ); - ShParam_2_6->setText( trUtf8("Param6") ); - ShParam_2_7->setText( trUtf8("Param7") ); - ShParam_2_8->setText( trUtf8("Param8") ); - ShParam_2_9->setText( trUtf8("Param9") ); - SharingComp3->setTitle( trUtf8("3rd Component") ); - Comp3ShLabel->setText( trUtf8("FitType3") ); - ShParam_3_1->setText( trUtf8("Param1") ); - ShParam_3_2->setText( trUtf8("Param2") ); - ShParam_3_3->setText( trUtf8("Param3") ); - ShParam_3_4->setText( trUtf8("Param4") ); - ShParam_3_5->setText( trUtf8("Param5") ); - ShParam_3_6->setText( trUtf8("Param6") ); - ShParam_3_7->setText( trUtf8("Param7") ); - ShParam_3_8->setText( trUtf8("Param8") ); - ShParam_3_9->setText( trUtf8("Param9") ); - SharingComp1->setTitle( trUtf8("1st Component") ); - ShParam_1_1->setText( trUtf8("Param1") ); - ShParam_1_2->setText( trUtf8("Param2") ); - ShParam_1_3->setText( trUtf8("Param3") ); - ShParam_1_4->setText( trUtf8("Param4") ); - ShParam_1_5->setText( trUtf8("Param5") ); - ShParam_1_6->setText( trUtf8("Param6") ); - ShParam_1_7->setText( trUtf8("Param7") ); - ShParam_1_8->setText( trUtf8("Param8") ); - ShParam_1_9->setText( trUtf8("Param9") ); - Comp1ShLabel->setText( trUtf8("FitType1") ); - musrfit_tabs->changeTab( SharingPage, trUtf8("Sharing") ); - InitParamTable->horizontalHeader()->setLabel( 0, trUtf8("Value") ); - InitParamTable->horizontalHeader()->setLabel( 1, trUtf8("Error") ); - InitParamTable->horizontalHeader()->setLabel( 2, trUtf8("Min") ); - InitParamTable->horizontalHeader()->setLabel( 3, trUtf8("Max") ); - musrfit_tabs->changeTab( InitializationPage, trUtf8("Initialization") ); - groupTitle->setTitle( undef ); - TITLELabel->setText( trUtf8("Enter the label (defaul is run title from the first run)") ); - TITLE->setText( trUtf8("","Title line for MSR file (optional)") ); - Qt::ToolTip::add(TITLE, trUtf8("Title line for MSR file (optional)")); - Qt::WhatsThis::add(TITLE, trUtf8("Title line for MSR file (optional)")); - FILENAMELabel->setText( trUtf8("Enter [name] for output [name].msr file (optional)") ); - Qt::ToolTip::add(FILENAME, trUtf8("Name of the produced MSR file (optional)")); - Qt::WhatsThis::add(FILENAME, trUtf8("Name of the produced MSR file (optional)")); - musrfit_tabs->changeTab( MSRPage, trUtf8("MSR File") ); - FourierBox->setTitle( trUtf8("Fourier transform parameters") ); - textLabel1_3_4->setText( undef ); - textLabel1_7->setText( trUtf8("Phase:") ); - textLabel1_3_5->setText( undef ); - FUnits->clear(); - FUnits->insertItem( trUtf8("MHz") ); - FUnits->insertItem( trUtf8("Gauss") ); - FUnits->insertItem( trUtf8("Mc/s") ); - textLabel1_3_6->setText( undef ); - FApodization->clear(); - FApodization->insertItem( trUtf8("STRONG") ); - FApodization->insertItem( trUtf8("MEDIUM") ); - FApodization->insertItem( trUtf8("WEAK") ); - FApodization->insertItem( trUtf8("NONE") ); - FPlot->clear(); - FPlot->insertItem( trUtf8("power") ); - FPlot->insertItem( trUtf8("real") ); - FPlot->insertItem( trUtf8("imag") ); - FPlot->insertItem( trUtf8("real_and_imag") ); - FPlot->insertItem( trUtf8("phase") ); - FUnitsLabel->setText( trUtf8("Units") ); - textLabel1_3_8->setText( undef ); - textLabel1_3_7->setText( undef ); - FPlotLabel->setText( trUtf8("Plot") ); - textLabel1_2->setText( trUtf8("to") ); - FApodizationLabel->setText( trUtf8("Apodization") ); - textLabel1_3_3->setText( undef ); - textLabel1->setText( trUtf8("Range: from") ); - RRFBox->setTitle( trUtf8("Rotatting reference frame (RRF) parameters") ); - textLabel1_6_2_2->setText( trUtf8("Phase") ); - textLabel1_6->setText( trUtf8("Frequency") ); - textLabel1_6_2_4->setText( undef ); - RRFFrq->setText( undef ); - textLabel1_6_2_3->setText( undef ); - textLabel1_6_2->setText( trUtf8("Packing") ); - RRFUnits->clear(); - RRFUnits->insertItem( trUtf8("MHz") ); - RRFUnits->insertItem( trUtf8("kHz") ); - RRFUnits->insertItem( trUtf8("Mc/s") ); - RRFUnits->insertItem( trUtf8("G") ); - RRFUnits->insertItem( trUtf8("T") ); - musrfit_tabs->changeTab( FourierPage, trUtf8("FFT/RRF") ); - groupHist0->setTitle( undef ); - textLabel2->setText( trUtf8("t0") ); - textLabel2_2_2_3->setText( trUtf8("Bg1") ); - textLabel2_2_2->setText( trUtf8("Bg2") ); - textLabel2_2_2_2->setText( trUtf8("Data 1") ); - textLabel2_2_2_2_2->setText( trUtf8("Data 2") ); - groupHist1->setTitle( trUtf8("Hist1") ); - groupHist2->setTitle( trUtf8("Hist2") ); - groupHist3->setTitle( trUtf8("Hist3") ); - groupHist4->setTitle( trUtf8("Hist4") ); - t0Update->setText( trUtf8("Update") ); - Qt::ToolTip::add(t0Update, trUtf8("Use musrt0 to set values")); - musrfit_tabs->changeTab( T0Page, trUtf8("t0/Bg") ); - TheoryBlock_Label->setText( trUtf8("THEORY Block") ); - ParametersList_Label->setText( trUtf8("Parameters List") ); - textLabel1_4_6->setText( trUtf8("=") ); - AddConstraint->setText( trUtf8("Add") ); - textLabel2_2_3_4->setText( trUtf8("FUNCTIONS Block") ); - textLabel1_6_3->setText( undef ); - ResetFunc->setText( trUtf8("Reset") ); - musrfit_tabs->changeTab( TabPage, trUtf8("Constraints") ); - fileNewAction->setText( trUtf8("&New") ); - fileNewAction->setMenuText( trUtf8("&New") ); - fileNewAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+N") ) ); - fileOpenAction->setText( trUtf8("&Open MSR...") ); - fileOpenAction->setMenuText( trUtf8("&Open MSR...") ); - fileOpenAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+O") ) ); - fileSaveAction->setText( trUtf8("&Save MSR...") ); - fileSaveAction->setMenuText( trUtf8("&Save MSR...") ); - fileSaveAction->setStatusTip( trUtf8("&Save MSR") ); - fileSaveAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+S") ) ); - fileSaveAsAction->setText( trUtf8("Save MSR &As...") ); - fileSaveAsAction->setMenuText( trUtf8("Save MSR &As...") ); - fileSaveAsAction->setAccel( Qt::KeySequence( undef ) ); - filePrintAction->setText( trUtf8("Print") ); - filePrintAction->setMenuText( trUtf8("&Print...") ); - filePrintAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+P") ) ); - fileExitAction->setText( trUtf8("Exit") ); - fileExitAction->setMenuText( trUtf8("E&xit") ); - fileExitAction->setAccel( Qt::KeySequence( undef ) ); - editUndoAction->setText( trUtf8("Undo") ); - editUndoAction->setMenuText( trUtf8("&Undo") ); - editUndoAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+Z") ) ); - editRedoAction->setText( trUtf8("Redo") ); - editRedoAction->setMenuText( trUtf8("&Redo") ); - editRedoAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+Y") ) ); - editCutAction->setText( trUtf8("Cut") ); - editCutAction->setMenuText( trUtf8("Cu&t") ); - editCutAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+X") ) ); - editCopyAction->setText( trUtf8("Copy") ); - editCopyAction->setMenuText( trUtf8("&Copy") ); - editCopyAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+C") ) ); - editPasteAction->setText( trUtf8("Paste") ); - editPasteAction->setMenuText( trUtf8("&Paste") ); - editPasteAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+V") ) ); - editFindAction->setText( trUtf8("Find") ); - editFindAction->setMenuText( trUtf8("&Find...") ); - editFindAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+F") ) ); - helpContentsAction->setText( trUtf8("Contents") ); - helpContentsAction->setMenuText( trUtf8("&Contents...") ); - helpContentsAction->setAccel( Qt::KeySequence( undef ) ); - helpIndexAction->setText( trUtf8("Index") ); - helpIndexAction->setMenuText( trUtf8("&Index...") ); - helpIndexAction->setAccel( Qt::KeySequence( undef ) ); - helpAboutAction->setText( trUtf8("About") ); - helpAboutAction->setMenuText( trUtf8("&About") ); - helpAboutAction->setAccel( Qt::KeySequence( undef ) ); - separatorAction->setText( undef ); - separatorAction->setMenuText( undef ); - FileExistCheck->setText( trUtf8("Overwrite MSR File") ); - FileExistCheck->setMenuText( trUtf8("Overwrite MSR File") ); - FileExistCheck->setToolTip( trUtf8("Enable overwriting MSR files") ); - FileExistCheck->setWhatsThis( trUtf8("Enable/Disable checking for MSR files.") ); - ManualFile->setText( trUtf8("Maual file selection") ); - ManualFile->setMenuText( trUtf8("Maual file selection") ); - fileChangeDirAction->setText( trUtf8("&Change dir") ); - fileChangeDirAction->setMenuText( trUtf8("&Change dir") ); - fileChangeDirAction->setAccel( Qt::KeySequence( trUtf8("Ctrl+C") ) ); - optionsnew_itemAction->setText( trUtf8("new item") ); - optionsnew_itemAction->setMenuText( trUtf8("new item") ); - parametersExport_AsAction->setText( trUtf8("Export As...") ); - parametersExport_AsAction->setMenuText( trUtf8("&Export As...") ); - parametersExport_AsAction->setAccel( Qt::KeySequence( trUtf8("Alt+E") ) ); - parametersAppend_ToAction->setText( trUtf8("Append To...") ); - parametersAppend_ToAction->setMenuText( trUtf8("&Append To...") ); - parametersAppend_ToAction->setAccel( Qt::KeySequence( trUtf8("Alt+A") ) ); - Fit->setText( trUtf8("Fit and Plot") ); - Fit->setAccel( Qt::KeySequence( trUtf8("Ctrl+F") ) ); - Plot->setText( trUtf8("Plot") ); - Plot->setAccel( Qt::KeySequence( trUtf8("Ctrl+P") ) ); - T0->setText( trUtf8("Show t0 and Bg Bins") ); - T0->setAccel( Qt::KeySequence( trUtf8("Ctrl+T") ) ); - optionsFourier->setText( trUtf8("Fourier") ); - optionsFourier->setMenuText( trUtf8("Fourier") ); - optionsT0->setText( trUtf8("T0 and Bg bins") ); - optionsT0->setMenuText( trUtf8("T0 and Bg bins") ); - optionsConfigure->setText( trUtf8("Configure") ); - optionsConfigure->setMenuText( trUtf8("Configure") ); - FileToolBar->setLabel( trUtf8("File Menu") ); - ActionsToolBar->setLabel( trUtf8("Actions Menu") ); - MenuBar->findItem( 2 )->setText( trUtf8("&File") ); - MenuBar->findItem( 3 )->setText( trUtf8("Edit") ); - MenuBar->findItem( 4 )->setText( trUtf8("Actions") ); - MenuBar->findItem( 5 )->setText( trUtf8("Parameters") ); - MenuBar->findItem( 6 )->setText( trUtf8("Options") ); - MenuBar->findItem( 7 )->setText( trUtf8("&Help") ); -} - - -sub fileOpen -{ - - my $file=Qt::FileDialog::getOpenFileName( - ".", - "MSR Files (*.msr *.mlog)", - this, - "open file dialog", - "Choose a MSR file"); - print "Selected file: $file\n"; -# TODO: Possibly decipher the MSR file and setup the GUI accordingly -# Find run numbers, beamlines etc. -# Get theory block and understand it -# Get parameters list and update table - - -} - -sub fileSave -{ - - my %All=CreateAllInput(); - my $FILENAME=$All{"FILENAME"}.".msr"; - my $file=Qt::FileDialog::getSaveFileName( - "$FILENAME", - "MSR Files (*.msr *.mlog)", - this, - "save file dialog", - "Choose a filename to save under"); - -# If the user gave a filename the copy to it - if ($file ne "") { -# TODO: check if the extension is correct, or add it. - if (-e $FILENAME) { - 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); - } - } - } - -} - -sub fileChangeDir -{ - - my $newdir=Qt::FileDialog::getExistingDirectory( - "", - this, - "get existing directory", - "Choose a directory", - 1); - chdir ("$newdir"); - -} - -sub filePrint -{ - print "MuSRFitform->filePrint(): Not implemented yet.\n"; -} - -sub fileExit -{ - - my $Ans = Qt::MessageBox::question( this, "Quit?","Are you sure you want to quit?","&Yes","&No","",0,1); - if ($Ans==0) { -# Then quit - Qt::Application::exit( 0 ); - } -# Otherwize go back - -} - -sub parametersExport -{ - - my %All=CreateAllInput(); -# Add also a flag for header - $All{"Header"}=1; - my $FILENAME=$All{"FILENAME"}.".dat"; - my $file=Qt::FileDialog::getSaveFileName( - "$FILENAME", - "Data Files (*.dat)", - this, - "export file dialog", - "Choose a filename to export to"); - -# If the user gave a filename the copy to it - if ($file ne "") { - my $Text = MSR::ExportParams(\%All); - open( DATF,q{>},"$file" ); - print DATF $Text; - close(DATF); - } - -} - -sub parametersAppend -{ - - my %All=CreateAllInput(); -# Add also a flag for header - $All{"Header"}=0; - my $FILENAME=$All{"FILENAME"}.".dat"; - my $file=Qt::FileDialog::getOpenFileName( - "./", - "Data Files (*.dat)", - this, - "append file dialog", - "Choose a filename to append to"); - -# If the user gave a filename the copy to it - if ($file ne "") { - my $Text = MSR::ExportParams(\%All); - open( DATF,q{>>},"$file" ); - print DATF $Text; - close(DATF); - } - -} - -sub editUndo -{ - print "MuSRFitform->editUndo(): Not implemented yet.\n"; -} - -sub editRedo -{ - print "MuSRFitform->editRedo(): Not implemented yet.\n"; -} - -sub editCut -{ - print "MuSRFitform->editCut(): Not implemented yet.\n"; -} - -sub editCopy -{ - print "MuSRFitform->editCopy(): Not implemented yet.\n"; -} - -sub editPaste -{ - print "MuSRFitform->editPaste(): Not implemented yet.\n"; -} - -sub helpIndex -{ - print "MuSRFitform->helpIndex(): Not implemented yet.\n"; -} - -sub helpContents -{ - print "MuSRFitform->helpContents(): Not implemented yet.\n"; -} - -sub 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 . - - Copyright 2009 by Zaher Salman and the LEM Group. - - "; - my $AboutWindow = Qt::MessageBox::information( this, "About MuSRFit GUI",$AboutText); - -} - -sub CreateAllInput -{ - - my %All=(); - -# From RUNS Tab -# Run data file - $All{"RunNumbers"} = RunNumbers->text; - $All{"RunFiles"} = RunFiles->text; - $All{"BeamLine"} = BeamLine->currentText; - $All{"RUNSType"} = ManualFile->isOn(); - $All{"optionsFourier"} = optionsFourier->isOn(); - $All{"optionsT0"} = optionsT0->isOn(); - $All{"YEAR"} =YEAR->currentText; - if ($All{"YEAR"} eq "") { -# If year combobox is empty fill it up from 2004 up to current year - my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(); - my $current_year = 1900 + $yearOffset; - for (my $i=$current_year;$i>=2004;$i--) { - YEAR->insertItem($i,-1); - } - } -# Time range and BINS - $All{"Tis"} = Tis->text; - $All{"Tfs"} = Tfs->text; - $All{"BINS"} = BINS->text; - $All{"FitAsyType"} = FitAsyType->currentText; - $All{"LRBF"} = LRBF->text; - my @Hists = split(/,/, $All{"LRBF"} ); -# Lifetime corrections in enabled/visible only for SingleHis fits - if ( $All{"FitAsyType"} eq "Asymmetry" ) { - ltc->setHidden(1); - } - elsif ( $All{"FitAsyType"} eq "SingleHist" ) { - ltc->setHidden(0); - } - -# From Fitting Tab -# Plot range - $All{"Xi"}=Xi->text; - $All{"Xf"}=Xf->text; - $All{"Yi"}=Yi->text; - $All{"Yf"}=Yf->text; - $All{"ViewBin"}=ViewBin->text; -# Life time correction - if (ltc->isChecked()) { - $All{"ltc"}="y"; - } else { - $All{"ltc"}="n"; - } -# Minuit commands - if ( $All{"go"} eq "" ) { - $All{"go"}="PLOT"; - } -# Get minimization process - $All{"Minimization"} = Minimization->currentText(); - $All{"go"}=$All{"Minimization"}; - -# Get Error calculation process - $All{"ErrorCalc"} = ErrorCalc->currentText(); - $All{"go"}=$All{"ErrorCalc"}; - - RunSelectionToggle(); - my @RUNS = (); - if ($All{"RUNSType"} ) { - @RUNS = split( /,/, $All{"RunFiles"}); - } else { - $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; - @RUNS = split( /,/, $All{"RunNumbers"} ); - } - -# From MSR File Tab - $All{"TITLE"}= TITLE->text; - $All{"FILENAME"}= FILENAME->text; - -# From Fourier Tab - $All{"FUNITS"}= FUnits->currentText; - $All{"FAPODIZATION"}= FApodization->currentText; - $All{"FPLOT"}= FPlot->currentText; - $All{"FPHASE"}=FPHASE->text; -# Fourier range - $All{"FrqMin"}=FrqMin->text; - $All{"FrqMax"}=FrqMax->text; - -# Rotating reference frame parameters - $All{"RRFFrq"}=RRFFrq->text; - $All{"RRFPack"}=RRFPack->text; - $All{"RRFPhase"}=RRFPhase->text; - $All{"RRFUnits"}=RRFUnits->currentText; - -# Get values of t0 and Bg/Data bins if given - my $NHist = 1; - foreach my $Hist (@Hists) { - foreach ("t0","Bg1","Bg2","Data1","Data2") { - my $Name = "$_$NHist"; - $All{$Name}=child($Name)->text; -# TODO: If empty fill with defaults - if ($All{$Name} eq "") { - $All{$Name}=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); - child($Name)->setText($All{$Name}); - } - } - $NHist++; - } - -# 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,"MolMag", - 14,"Meissner", - 15,"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; - -# Functions block - $All{"FunctionsBlock"}=FunctionsBlock->text; -# and the associated theory block - $All{"Func_T_Block"}=TheoryBlock->text; - -# Shared settings are detected here - $All{"EnableSharing"} = buttonGroupSharing->isChecked(); - - 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, ( "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; -# TODO: I need to take care of single hist fits here - if ( $All{"FitAsyType"} eq "SingleHist" ) { - $Param=$Param.$Hists[0]; - } - if ( $#FitTypes != 0 && ( $Param ne "Alpha" && $Param ne "No" && $Param ne "NBg" ) ){ - $Param = join( "", $Param, "_", $Component); - } - -# Is there any point of sharing, multiple runs? - if ( $#RUNS == 0 && $All{"FitAsyType"} eq "Asymmetry") { - $Shared = 1; - } - elsif ( $#RUNS == 0 && $#Hists == 0 && $All{"FitAsyType"} eq "SingleHist" ) { - $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{"RUNSType"}) { - $All{"FILENAME"}=$RUNS[0]."_".$All{"BeamLine"}."_".$All{"YEAR"}; - if ($All{"BeamLine"} eq "LEM (PPC)") { - $All{"FILENAME"}=$RUNS[0]."_LEM_".$All{"YEAR"}; - } - } else { - $All{"FILENAME"}="TMP"; - } - - -# This has to be at the end of CreateAll - my %PTable=MSR::PrepParamTable(\%All); - -# Setup the table with the right size - my $NParam=scalar keys( %PTable ); - -# Read initial values of paramets from tabel - my $erradd = "d"; - my $minadd = "_min"; - my $maxadd = "_max"; - my $Header=InitParamTable->verticalHeader(); -# TODO: Should not go over all rows, only on parameters. - if ($NParam > 0) { - for (my $i=0;$i<$NParam;$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); - } - } - - -# Return Hash with all important values - return %All; - -} - -sub CallMSRCreate -{ - - use MSR; - my %All=CreateAllInput(); - -# Check if the option for checking for existing files is selected - my $FileExistCheck= FileExistCheck->isOn(); - my $FILENAME=$All{"FILENAME"}.".msr"; - my $Answer=0; - if ($All{"RunNumbers"} ne "" || $All{"RunFiles"} ne "") { - if ( $FileExistCheck==1 ) { - if (-e $FILENAME) { -# Warning: MSR file exists -# my $Warning = "Warning: MSR file $FILENAME Already exists!\nIf you continue it will overwriten."; - my $Warning = "Warning: MSR file $FILENAME Already exists!\nDo you want to overwrite it?"; -# my $WarningWindow = Qt::MessageBox::information( this, "Warning",$Warning); -# $Answer =1,0 for yes and no - $Answer= Qt::MessageBox::warning( this, "Warning",$Warning, "&No", "&Yes", undef, 1,1); - } - } else { -# Just overwrite file - $Answer=1; - } - - if ($Answer) { - if ( $All{"FitAsyType"} eq "Asymmetry" ) { - my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateMSR(\%All); - } - elsif ( $All{"FitAsyType"} eq "SingleHist" ) { - my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateMSRSingleHist(\%All); - } - UpdateMSRFileInitTable(); - } - } - return $Answer; - -} - -sub UpdateMSRFileInitTable -{ - - my %All=CreateAllInput(); - my $FILENAME=$All{"FILENAME"}; - open (MSRF,q{<},"$FILENAME.msr" ); - my @lines = ; - close(IFILE); - textMSROutput->setText(""); - foreach my $line (@lines) { - textMSROutput->append("$line"); - } - - (my $TBlock_ref, my $FPBlock_ref)=MSR::ExtractBlks(@lines); - my @FPBloc = @$FPBlock_ref; - - my $PCount=0; - foreach my $line (@FPBloc) { - $PCount++; - my @Param=split(/\s+/,$line); - -# Depending on how many elements in @Param determine what they mean -# 0th element is empty (always) -# 1st element is the order (always) -# 2nd element is the name (always) -# 3rd element is the value (always) -# 4th element can be taken as step/error (always) -# 5th element can be -# if it is last element or there are two more = positive error, check $#Param=5/7 -# if there is only one more = minimum, check $#Param=6 - -# To summarize, check the value of $#Param - my $value=1.0*$Param[3]; - my $error = 1.0*$Param[4]; - my $minvalue=0.0; - my $maxvalue=0.0; - if ($#Param == 4) { - $minvalue=0.0; - $maxvalue=0.0; - } - elsif ($#Param == 6) { - $minvalue=1.0*$Param[5]; - $maxvalue=1.0*$Param[6]; - } - elsif ($#Param == 5 || $#Param == 7) { - $minvalue=1.0*$Param[6]; - $maxvalue=1.0*$Param[7]; - } -# Now update the initialization tabel - InitParamTable->setText($PCount-1,0,$value); - InitParamTable->setText($PCount-1,1,$error); - InitParamTable->setText($PCount-1,2,$minvalue); - InitParamTable->setText($PCount-1,3,$maxvalue); -# Set bg color to mark different runs - } - return; - -} - -sub ActivateT0Hists -{ - - my %All=CreateAllInput(); - my @Hists = split(/,/, $All{"LRBF"} ); - my $HistBox = ""; - for (my $iHist=1; $iHist<=4; $iHist++) { - $HistBox="groupHist$iHist"; - my $HistBoxHandle = child($HistBox); - if ($iHist<=$#Hists+1) { -# Activate this histogram box - $HistBoxHandle->setHidden(0); - $HistBoxHandle->setEnabled(1); - $HistBoxHandle->setTitle("Hist # $Hists[$iHist-1]"); - } else { -# Deactivate this histogram box - $HistBoxHandle->setHidden(1); - $HistBoxHandle->setEnabled(0); - } - } - -# TODO: Set default values - - -} - -sub 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"}; - -# Possible to share only if sharing is enabled altogether - my $EnableSharing = $All{"EnableSharing"}; - if ($EnableSharing) { - 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, ( "No", "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<=9;$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++; - } - } - -} - -sub InitializeTab -{ - - my %All=CreateAllInput(); - InitParamTable->setLeftMargin(100); - 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); -# InitParamTable->removeRow($i); - } - } - - my %PTable=MSR::PrepParamTable(\%All); - -# Setup the table with the right size - my $NParam=scalar keys( %PTable ); - if ($NParam>$NRows) { - InitParamTable->setNumRows($NParam); - } - -# Fill the table with labels and values of parametr - for (my $PCount=0;$PCount<$NParam;$PCount++) { - my ($Param,$value,$error,$minvalue,$maxvalue,$RUN) = split(/,/,$PTable{$PCount}); -# Now make sure we have no nans - if ($error eq "nan") { $error=0.1;} -# If you use this then reading the parameters from the table is a problem -# You need to extract the correct parameter name from the row label -# InitParamTable->verticalHeader()->setLabel( $PCount,"$RUN: $Param"); - InitParamTable->verticalHeader()->setLabel( $PCount,"$Param"); - InitParamTable->showRow($PCount); - InitParamTable->setText($PCount,0,$value); - InitParamTable->setText($PCount,1,$error); - InitParamTable->setText($PCount,2,$minvalue); - InitParamTable->setText($PCount,3,$maxvalue); - } - -} - -sub TabChanged -{ - -# TODO: First check if there are some runs given, otherwise disbale - my %All=CreateAllInput(); - -# First make sure we have sharing initialized - ActivateShComp(); -# Here we need to apply sharing if selected... - InitializeTab(); - UpdateMSRFileInitTable(); -# And also setup T0 and Bg bins - ActivateT0Hists(); - -# Initialize FUNCTIONS block only if it has not been initialized yet - if ($All{"Func_T_Block"} eq "" ) { - InitializeFunctions(); - } - -} - -sub GoFit -{ - - my %All=CreateAllInput(); - musrfit_tabs->setCurrentPage(1); - my $Answer=CallMSRCreate(); - if ($Answer) { - my $FILENAME=$All{"FILENAME"}.".msr"; - if (-e $FILENAME) { - my $cmd="musrfit -t $FILENAME"; - my $pid = open(FTO,"$cmd 2>&1 |"); - while () { - FitTextOutput->append("$_"); - } - 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; - -} - -sub GoPlot -{ - - my %All=CreateAllInput(); - my $Answer=CallMSRCreate(); - my $FILENAME=$All{"FILENAME"}.".msr"; - - if ($Answer) { - if (-e $FILENAME) { - my $cmd="musrview $FILENAME &"; - my $pid = system($cmd); - } else { - FitTextOutput->append("Cannot find MSR file!"); - FitTextOutput->append("-----------------------------------------------------------------------------------------------------------------------------"); - } - } - return; - -} - -sub ShowMuSRT0 -{ - - my %All=CreateAllInput(); - musrfit_tabs->setCurrentPage(6); -# Create MSR file and then run musrt0 - my $Answer=CallMSRCreate(); - - if ($Answer) { - my $FILENAME=$All{"FILENAME"}.".msr"; - if (-e $FILENAME) { - my $cmd="musrt0 $FILENAME &"; - my $pid = system($cmd); - t0Update->setEnabled(1) - } else { - print STDERR "Cannot find MSR file!\n"; - } - } - return; - -} - -sub T0Update -{ - - my %All = CreateAllInput(); - my @Hists = split(/,/, $All{"LRBF"} ); - -# Get values of t0 and Bg/Data bins if given - my $NHist = 1; - foreach my $Hist (@Hists) { - foreach ("t0","Bg1","Bg2","Data1","Data2") { - my $Name = "$_$NHist"; - my $tmp=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); - child($Name)->setText($tmp); - } - $NHist++ - } - - -} - -sub RunSelectionToggle -{ - - my $ManualFile= ManualFile->isOn(); - if ($ManualFile) { -# Manual RUN selection - RUNSMan->setEnabled(1); - RUNSMan->setHidden(0); - RunNumbers->setText(""); - RUNSAuto->setEnabled(0); - RUNSAuto->setHidden(1); - } else { -# Auto RUN selection - RUNSMan->setEnabled(0); - RUNSMan->setHidden(1); - RunFiles->setText(""); - RUNSAuto->setEnabled(1); - RUNSAuto->setHidden(0); - } - -# Also use this for other options -# Fourier toggle - my $Fourier=optionsFourier->isOn(); - if ($Fourier) { -# Fourier tab visible -# musrfit_tabs->addTab(FourierPage,"Fourier"); -# musrfit_tabs->showPage(FourierPage); -# FourierPage->hide(); - } else { -# Fourier tab invisible -# musrfit_tabs->removePage(FourierPage); -# FourierPage->show(); - } - -} - -sub fileBrowse -{ - - my $RunFiles=RunFiles->text(); - print "Runs:$RunFiles\n"; - my $files_ref=Qt::FileDialog::getOpenFileNames( - "Data files (*.root *.bin)", - "./", - this, - "open files dialog", - "Select one or more files to fit"); - my @files = @$files_ref; - if ($RunFiles eq "") { -# We started with an empty list - $RunFiles=join(",",@files); - } else { -# Add files to existing list - $RunFiles=join(",",$RunFiles,@files); - } - RunFiles->setText($RunFiles); - -} - -sub AppendToFunctions -{ - - my $ParName=CParamsCombo->currentText(); - my $Full_T_Block=TheoryBlock->text; - my $Constraint=ConstraintLine->text; -# Then clear the text - ConstraintLine->setText(""); - -# Check how many constraints (lines) in FUNCTIONS Block - my $i=FunctionsBlock->lines(); - my $ConstLine="fun$i = $Constraint\n"; - FunctionsBlock->append($ConstLine); - -# Replace parameter in theory block with fun$i - $Full_T_Block=~ s/$ParName/fun$i/; - TheoryBlock->setText($Full_T_Block); - -} - -sub InitializeFunctions -{ - - 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 ); - } - } - -# Get number of parameters to determine the size of the table - my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateTheory(@FitTypes); - my @Paramcomp = @$Paramcomp_ref; - my $Full_T_Block= $All{"Full_T_Block"}; - -# Initialize Parameters List in function block (constraints). - my $ParametersList=""; - ParametersList->setText(""); -# Counter for function block (with out Alpha etc.) - my $ParCount=0; - CParamsCombo->clear(); - -# Possibly use the parameters block to axtract names for the dropdown menu -# this makes sense if we can use fun in map line. Check! - my $Component=1; - foreach my $FitType (@FitTypes) { - my $Parameters=$Paramcomp[$Component-1]; - my @Params = split( /\s+/, $Parameters ); - -# Alpha, No and NBg are counted in the parameters - if ( $Component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) { - unshift( @Params, "Alpha" ); - } - elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { - unshift( @Params, ( "No", "NBg" ) ); - } - -# Add list to the constraints drop down menu - for (my $i=1; $i<=9;$i++) { - my $CParam = $Params[$i-1]."_".$Component; - if ($Params[$i-1] ne "" ) { - if ($Params[$i-1] ne "Alpha" && $Params[$i-1] ne "No" && $Params[$i-1] ne "NBg") { - CParamsCombo->insertItem($CParam,-1); - $Full_T_Block=~ s/\b$Params[$i-1]\b/$CParam/; - } -# also enumerate the parameters as should be used in the FUNCTIONS Block - $ParCount++; - $ParametersList=$ParametersList."$CParam \t is \t par$ParCount\n"; - ParametersList->setText($ParametersList); - } - } - $Component++; - } -# Set theory block in Constraints - TheoryBlock->setText($Full_T_Block); -# Then clear the text - ConstraintLine->setText(""); - FunctionsBlock->setText(""); - -} - -sub optionConfigure -{ - - use Customize; - - my $Customize = Qt::Dialog(this); - my $w = Customize; - $w->setModal(1); - $w->exec(); -# $Customize->setMainWidget($w); -# $w->show; -# exit $Customize->exec; - - -} - -sub t0UpdateClicked -{ - -# Read MSR file and get new values of t0,Bg and Data - my %All=CreateAllInput(); - my $FILENAME=$All{"FILENAME"}; - open (MSRF,q{<},"$FILENAME.msr" ); - my @lines = ; - close(IFILE); - - my @T0s = grep {/t0 /} @lines; - my @Bgs = grep {/background /} @lines; - my @Datas = grep {/data /} @lines; - - my @Hists = split(/,/, $All{"LRBF"} ); - my $NHist = $#Hists+1; - print "Histograms: $NHist\n"; - - my $FinHist = 1; -# First T0s - while ($FinHist) { - my $counter=0; - (my $tmp,my @SplitT0) = split( /\s+/, $T0s[$counter]); - (my $tmp,my @SplitBg) = split( /\s+/, $Bgs[$counter]); - (my $tmp,my @SplitData) = split( /\s+/, $Datas[$counter]); - if ($#SplitBg>0) { - foreach (@SplitBg) { - print $_."\n"; - } - } - $counter++; - if ($counter>=$#Bgs) {$FinHist=0;} - } - -# Finally, disable the update button - t0Update->setEnabled(0); -# t0Update->setText("musrt0") - -} - -1; - - -package main; - -use Qt; -use MuSRFitform; - -my $a = Qt::Application(\@ARGV); -my $w = MuSRFitform; -$a->setMainWidget($w); -$w->show; -exit $a->exec; diff --git a/src/external/MuSRFitGUI/devel/MuSRFit.ui b/src/external/MuSRFitGUI/devel/MuSRFit.ui deleted file mode 100755 index f54bd379..00000000 --- a/src/external/MuSRFitGUI/devel/MuSRFit.ui +++ /dev/null @@ -1,5742 +0,0 @@ - -MuSRFitform - - - MuSRFitform - - - - 0 - 0 - 582 - 502 - - - - - 7 - 7 - 1 - 1 - - - - - 582 - 502 - - - - MuSRFit GUI - - - image0 - - - MuSRFitGUI - - - - unnamed - - - - musrfit_tabs - - - true - - - - 7 - 7 - 1 - 1 - - - - - 560 - 400 - - - - - 32767 - 32767 - - - - - RUNSPage - - - RUNS - - - - unnamed - - - - layout37 - - - - unnamed - - - - RUNSAuto - - - - 7 - 7 - 1 - 1 - - - - 5 - - - RUN Numbers - - - - unnamed - - - - layout32 - - - - unnamed - - - - RunNumbers - - - - 7 - 0 - 0 - 0 - - - - - 0 - 23 - - - - Numbers of RUNs to fit. Multiple runs are comma separated. - - - Numbers of RUNs to fit. Multiple runs are comma separated. - - - - - - LEM - - - - - GPS - - - - - Dolly - - - - - LTF - - - - - LEM (PPC) - - - - BeamLine - - - - 0 - 5 - 0 - 0 - - - - - 0 - 20 - - - - - - BeamLineLabel - - - - 5 - 5 - 0 - 0 - - - - - 0 - 20 - - - - On beam line - - - - - spacer2 - - - Horizontal - - - Expanding - - - - 181 - 21 - - - - - - YEAR - - - - 0 - 5 - 0 - 0 - - - - - 0 - 20 - - - - false - - - 16 - - - AtTop - - - true - - - false - - - - - YEARLabel - - - - 5 - 5 - 0 - 0 - - - - - 0 - 20 - - - - Year - - - - - - - - - RUNSMan - - - true - - - - 7 - 7 - 1 - 1 - - - - 5 - - - RUN Files - - - - unnamed - - - - layout33 - - - - unnamed - - - - spacer3 - - - Horizontal - - - Expanding - - - - 411 - 21 - - - - - - RunFiles - - - true - - - - 7 - 0 - 0 - 0 - - - - - 0 - 23 - - - - Names of data files to be fit. Multiple data files are comma separated. - - - Names of data files to be fit. Multiple data files are comma separated. - - - - - Browse - - - true - - - - 0 - 5 - 0 - 0 - - - - - 0 - 20 - - - - Browse - - - Browse to select data files for fitting. - - - Browse to select data files for fitting. - - - - - - - - - groupBox7 - - - - 7 - 7 - 1 - 1 - - - - - - - 0 - 0 - 0 - - - 239 - 243 - 247 - - - 255 - 255 - 255 - - - 247 - 249 - 251 - - - 119 - 121 - 123 - - - 159 - 161 - 164 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 173 - 176 - 179 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 239 - 243 - 247 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 119 - 121 - 123 - - - 159 - 161 - 164 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 173 - 176 - 179 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 192 - - - 128 - 0 - 128 - - - - - 0 - 0 - 0 - - - 239 - 243 - 247 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 119 - 121 - 123 - - - 159 - 161 - 164 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 173 - 176 - 179 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 192 - - - 128 - 0 - 128 - - - - - - AncestorOrigin - - - GroupBoxPanel - - - Sunken - - - 1 - - - 3 - - - Theory Function - - - AlignTop - - - - unnamed - - - - layout42 - - - - unnamed - - - 5 - - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - None - - - - FitType2 - - - - 5 - 0 - 0 - 0 - - - - 15 - - - - - TfsLabel - - - - 5 - 0 - 0 - 0 - - - - Final Time - - - Tfs - - - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - FitType1 - - - - 5 - 0 - 0 - 0 - - - - 20 - - - false - - - false - - - - - BINS - - - - 5 - 0 - 0 - 0 - - - - 100 - - - - - Comp3Label - - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 242 - 247 - 252 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - - Third Component - - - FitType1_2_2 - - - - - Tis - - - - 5 - 0 - 0 - 0 - - - - 0 - - - - - Tfs - - - - 5 - 0 - 0 - 0 - - - - 8 - - - - - Comp1Label - - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 242 - 247 - 252 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - - First Component - - - FitType1 - - - - - BINSLabel - - - - 5 - 0 - 0 - 0 - - - - Binning Factor - - - BINS - - - - - TisLabel - - - - 5 - 0 - 0 - 0 - - - - Initial Time - - - Tis - - - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - None - - - - FitType3 - - - - 5 - 0 - 0 - 0 - - - - 15 - - - - - Comp2Label - - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 242 - 247 - 252 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - - Second Component - - - FitType1_2 - - - - - - - - - layout34 - - - - unnamed - - - - spacer4 - - - Horizontal - - - Expanding - - - - 81 - 21 - - - - - - FitAsyTypeLabel - - - - 5 - 0 - 0 - 0 - - - - Fit type - - - - - - Asymmetry - - - image1 - - - - - SingleHist - - - image2 - - - - FitAsyType - - - - 5 - 0 - 0 - 0 - - - - - - LRBFLabel - - - - 5 - 0 - 0 - 0 - - - - Histograms list - - - - - LRBF - - - - 5 - 0 - 0 - 0 - - - - 1,3 - - - - - - - - - - - FittingPage - - - Fitting - - - - unnamed - - - - layout28 - - - - unnamed - - - - layout27 - - - - unnamed - - - - Yi - - - - - - MINIMIZE - - - - - MIGRAD - - - - - SIMPLEX - - - - Minimization - - - - - Xi - - - - - textLabel1_4_2_2 - - - View Binning - - - - - Xf - - - - - textLabel1_5 - - - Minimization type - - - - - textLabel1_4_2 - - - Y Range - - - - - ViewBin - - - - - Yf - - - - - - HESSE - - - - - MINOS - - - - ErrorCalc - - - - - ltc - - - Life time correction - - - true - - - - - textLabel1_5_2 - - - Error estimation - - - - - textLabel1_4 - - - X Range - - - - - - - FitTextOutput - - - true - - - - - - - - - SharingPage - - - Sharing - - - - unnamed - - - - buttonGroupSharing - - - - 7 - 7 - 0 - 0 - - - - Shared parameters among different runs - - - AlignLeft - - - true - - - false - - - - SharingComp2 - - - false - - - - 199 - 20 - 162 - 330 - - - - - 5 - 3 - 0 - 0 - - - - 2nd Component - - - - Comp2ShLabel - - - - 2 - 30 - 185 - 20 - - - - - 255 - 255 - 127 - - - - FitType2 - - - - - layout13 - - - - 40 - 60 - 81 - 266 - - - - - unnamed - - - 0 - - - 0 - - - - ShParam_2_1 - - - Param1 - - - - - ShParam_2_2 - - - Param2 - - - - - ShParam_2_3 - - - Param3 - - - - - ShParam_2_4 - - - Param4 - - - - - ShParam_2_5 - - - Param5 - - - - - ShParam_2_6 - - - false - - - - 234 - 233 - 232 - - - - Param6 - - - false - - - - - ShParam_2_7 - - - false - - - - 234 - 233 - 232 - - - - Param7 - - - false - - - - - ShParam_2_8 - - - false - - - - 234 - 233 - 232 - - - - Param8 - - - false - - - - - ShParam_2_9 - - - false - - - - 234 - 233 - 232 - - - - Param9 - - - false - - - - - - - - SharingComp3 - - - false - - - - 367 - 20 - 162 - 330 - - - - - 5 - 3 - 0 - 0 - - - - 3rd Component - - - AlignJustify|AlignVCenter - - - - Comp3ShLabel - - - - 2 - 30 - 185 - 20 - - - - - 255 - 255 - 127 - - - - FitType3 - - - - - layout15 - - - - 41 - 58 - 81 - 266 - - - - - unnamed - - - - ShParam_3_1 - - - Param1 - - - - - ShParam_3_2 - - - Param2 - - - - - ShParam_3_3 - - - Param3 - - - - - ShParam_3_4 - - - Param4 - - - - - ShParam_3_5 - - - Param5 - - - - - ShParam_3_6 - - - false - - - - 234 - 233 - 232 - - - - Param6 - - - false - - - - - ShParam_3_7 - - - false - - - - 234 - 233 - 232 - - - - Param7 - - - false - - - - - ShParam_3_8 - - - false - - - - 234 - 233 - 232 - - - - Param8 - - - false - - - - - ShParam_3_9 - - - false - - - - 234 - 233 - 232 - - - - Param9 - - - false - - - - - - - - SharingComp1 - - - false - - - - 31 - 20 - 162 - 330 - - - - - 5 - 3 - 0 - 0 - - - - 1st Component - - - AlignLeft - - - - layout14 - - - - 40 - 60 - 81 - 266 - - - - - unnamed - - - 0 - - - 0 - - - - ShParam_1_1 - - - Param1 - - - - - ShParam_1_2 - - - Param2 - - - - - ShParam_1_3 - - - Param3 - - - - - ShParam_1_4 - - - Param4 - - - - - ShParam_1_5 - - - false - - - - 234 - 233 - 232 - - - - Param5 - - - false - - - - - ShParam_1_6 - - - false - - - - 234 - 233 - 232 - - - - Param6 - - - false - - - - - ShParam_1_7 - - - false - - - - 234 - 233 - 232 - - - - Param7 - - - false - - - - - ShParam_1_8 - - - false - - - - 234 - 233 - 232 - - - - Param8 - - - false - - - - - ShParam_1_9 - - - false - - - - 234 - 233 - 232 - - - - Param9 - - - false - - - - - - - Comp1ShLabel - - - - 2 - 30 - 185 - 20 - - - - - 255 - 255 - 127 - - - - FitType1 - - - - - - - - - InitializationPage - - - Initialization - - - - unnamed - - - - - Value - - - - - Error - - - - - Min - - - - - Max - - - - InitParamTable - - - - 5 - 5 - 0 - 0 - - - - - 32767 - 32767 - - - - TabFocus - - - PopupPanel - - - 2 - - - 0 - - - 0 - - - Default - - - Auto - - - false - - - 0 - - - 4 - - - true - - - false - - - SpreadSheet - - - - - - - MSRPage - - - MSR File - - - - unnamed - - - - layout25 - - - - unnamed - - - 0 - - - - groupTitle - - - - 7 - 0 - 0 - 0 - - - - 5 - - - - - - - unnamed - - - - layout25 - - - - unnamed_2 - - - - TITLELabel - - - - 5 - 5 - 0 - 0 - - - - Enter the label (defaul is run title from the first run) - - - TITLE - - - - - TITLE - - - - 7 - 0 - 1 - 1 - - - - - Title line for MSR file (optional) - - - Title line for MSR file (optional) - - - Title line for MSR file (optional) - - - - - layout17 - - - - unnamed_2 - - - - FILENAMELabel - - - Enter [name] for output [name].msr file (optional) - - - FILENAME - - - - - FILENAME - - - - 7 - 0 - 0 - 0 - - - - Name of the produced MSR file (optional) - - - Name of the produced MSR file (optional) - - - - - - - - - - - textMSROutput - - - true - - - - - - - - - FourierPage - - - FFT/RRF - - - - unnamed - - - - FourierBox - - - - 7 - 0 - 0 - 0 - - - - Fourier transform parameters - - - - layout34 - - - - 12 - 19 - 510 - 100 - - - - - unnamed - - - 5 - - - 5 - - - - FrqMin - - - - 5 - 5 - 0 - 0 - - - - - - textLabel1_3_4 - - - - - - - - textLabel1_7 - - - Phase: - - - - - textLabel1_3_5 - - - - - - - - - MHz - - - - - Gauss - - - - - Mc/s - - - - FUnits - - - - 5 - 5 - 0 - 0 - - - - - - textLabel1_3_6 - - - - - - - - - STRONG - - - - - MEDIUM - - - - - WEAK - - - - - NONE - - - - FApodization - - - - 5 - 5 - 0 - 0 - - - - - - FrqMax - - - - 5 - 5 - 0 - 0 - - - - - - - power - - - - - real - - - - - imag - - - - - real_and_imag - - - - - phase - - - - FPlot - - - - 5 - 5 - 0 - 0 - - - - - - FUnitsLabel - - - Units - - - - - textLabel1_3_8 - - - - - - - - textLabel1_3_7 - - - - - - - - FPlotLabel - - - Plot - - - - - textLabel1_2 - - - to - - - - - FApodizationLabel - - - Apodization - - - - - textLabel1_3_3 - - - - - - - - FPHASE - - - - 5 - 5 - 0 - 0 - - - - - - textLabel1 - - - Range: from - - - - - - - - RRFBox - - - - 7 - 0 - 0 - 0 - - - - Rotatting reference frame (RRF) parameters - - - - layout35 - - - - 10 - 18 - 265 - 100 - - - - - unnamed - - - 5 - - - 5 - - - - textLabel1_6_2_2 - - - Phase - - - - - textLabel1_6 - - - Frequency - - - - - textLabel1_6_2_4 - - - - - - - - RRFFrq - - - - - - - - textLabel1_6_2_3 - - - - - - - - RRFPack - - - - - textLabel1_6_2 - - - Packing - - - - - - MHz - - - - - kHz - - - - - Mc/s - - - - - G - - - - - T - - - - RRFUnits - - - - - RRFPhase - - - - - - - - - - T0Page - - - t0/Bg - - - - unnamed - - - - layout25 - - - - unnamed - - - - groupHist0 - - - - 7 - 7 - 1 - 1 - - - - - 0 - 0 - - - - - - - - layout16_2 - - - - 5 - 18 - 100 - 150 - - - - - unnamed_2 - - - - textLabel2 - - - t0 - - - - - textLabel2_2_2_3 - - - Bg1 - - - - - textLabel2_2_2 - - - Bg2 - - - - - textLabel2_2_2_2 - - - Data 1 - - - - - textLabel2_2_2_2_2 - - - Data 2 - - - - - - - - groupHist1 - - - - 7 - 7 - 1 - 1 - - - - - 0 - 0 - - - - Plain - - - Hist1 - - - - layout18 - - - - 8 - 17 - 75 - 150 - - - - - unnamed - - - 0 - - - 0 - - - - t01 - - - - - Bg11 - - - - - Bg21 - - - - - Data11 - - - - - Data21 - - - - - - - - groupHist2 - - - true - - - - 7 - 7 - 1 - 1 - - - - Plain - - - Hist2 - - - - layout18_2 - - - - 8 - 17 - 75 - 150 - - - - - unnamed_2 - - - 0 - - - 0 - - - - t02 - - - - - Bg12 - - - - - Bg22 - - - - - Data12 - - - - - Data22 - - - - - - - - groupHist3 - - - true - - - - 7 - 7 - 1 - 1 - - - - Plain - - - Hist3 - - - - layout18_3 - - - - 8 - 17 - 75 - 150 - - - - - unnamed_2 - - - 0 - - - 0 - - - - t03 - - - - - Bg13 - - - - - Bg23 - - - - - Data13 - - - - - Data23 - - - - - - - - groupHist4 - - - true - - - - 7 - 7 - 1 - 1 - - - - Plain - - - Hist4 - - - - layout18_4 - - - - 8 - 17 - 75 - 150 - - - - - unnamed_2 - - - 0 - - - 0 - - - - t04 - - - - - Bg14 - - - - - Bg24 - - - - - Data14 - - - - - Data24 - - - - - - - - - - layout29 - - - - unnamed - - - - spacer1 - - - Horizontal - - - Expanding - - - - 461 - 20 - - - - - - t0Update - - - false - - - - 0 - 0 - 0 - 0 - - - - Update - - - Use musrt0 to set values - - - - - - - - - TabPage - - - Constraints - - - - unnamed - - - - layout34_2 - - - - unnamed_2 - - - - layout33_2 - - - - unnamed_2 - - - - TheoryBlock_Label - - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 242 - 247 - 252 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - - THEORY Block - - - - - TheoryBlock - - - true - - - - - ParametersList_Label - - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 242 - 247 - 252 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - - Parameters List - - - - - ParametersList - - - true - - - - - - - layout25_6 - - - - unnamed_2 - - - - CParamsCombo - - - - 0 - 0 - 0 - 0 - - - - - - textLabel1_4_6 - - - - 0 - 0 - 0 - 0 - - - - = - - - - - ConstraintLine - - - - 7 - 0 - 0 - 0 - - - - - 0 - 25 - - - - - - AddConstraint - - - - 0 - 0 - 0 - 0 - - - - Add - - - - - - - textLabel2_2_3_4 - - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 242 - 247 - 252 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - 0 - 0 - 0 - - - 230 - 240 - 249 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 115 - 120 - 124 - - - 154 - 160 - 166 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 127 - - - 0 - 0 - 0 - - - 0 - 0 - 128 - - - 255 - 255 - 255 - - - 0 - 0 - 238 - - - 82 - 24 - 139 - - - - - - FUNCTIONS Block - - - - - FunctionsBlock - - - - - layout30 - - - - unnamed_2 - - - - textLabel1_6_3 - - - - - - - - ResetFunc - - - - 100 - 32767 - - - - Reset - - - - - - - - - - - - - - MenuBar - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FileToolBar - - - File Menu - - - - - - - - - - ActionsToolBar - - - Actions Menu - - - - - - - - - - - - fileNewAction - - - image3 - - - &New - - - &New - - - Ctrl+N - - - - - fileOpenAction - - - false - - - image4 - - - &Open MSR... - - - &Open MSR... - - - Ctrl+O - - - false - - - - - fileSaveAction - - - image5 - - - &Save MSR... - - - &Save MSR... - - - &Save MSR - - - Ctrl+S - - - - - fileSaveAsAction - - - image6 - - - Save MSR &As... - - - Save MSR &As... - - - - - - - - filePrintAction - - - false - - - image7 - - - Print - - - &Print... - - - Ctrl+P - - - - - fileExitAction - - - image8 - - - Exit - - - E&xit - - - - - - - - editUndoAction - - - false - - - image9 - - - Undo - - - &Undo - - - Ctrl+Z - - - - - editRedoAction - - - false - - - image10 - - - Redo - - - &Redo - - - Ctrl+Y - - - - - editCutAction - - - false - - - image11 - - - Cut - - - Cu&t - - - Ctrl+X - - - - - editCopyAction - - - false - - - image12 - - - Copy - - - &Copy - - - Ctrl+C - - - - - editPasteAction - - - false - - - image13 - - - Paste - - - &Paste - - - Ctrl+V - - - - - editFindAction - - - image14 - - - Find - - - &Find... - - - Ctrl+F - - - - - helpContentsAction - - - false - - - image15 - - - Contents - - - &Contents... - - - - - - - - helpIndexAction - - - false - - - image16 - - - Index - - - &Index... - - - - - - - - helpAboutAction - - - About - - - &About - - - - - - - - separatorAction - - - - - - - - - - - FileExistCheck - - - true - - - false - - - Overwrite MSR File - - - Overwrite MSR File - - - Enable overwriting MSR files - - - Enable/Disable checking for MSR files. - - - - - ManualFile - - - true - - - Maual file selection - - - Maual file selection - - - - - fileChangeDirAction - - - image17 - - - &Change dir - - - &Change dir - - - Ctrl+C - - - - - optionsnew_itemAction - - - new item - - - new item - - - - - parametersExport_AsAction - - - image18 - - - Export As... - - - &Export As... - - - Alt+E - - - - - parametersAppend_ToAction - - - image19 - - - Append To... - - - &Append To... - - - Alt+A - - - - - Fit - - - image20 - - - Fit and Plot - - - Ctrl+F - - - - - Plot - - - false - - - image21 - - - Plot - - - Ctrl+P - - - - - T0 - - - image22 - - - Show t0 and Bg Bins - - - Ctrl+T - - - - - optionsFourier - - - true - - - Fourier - - - Fourier - - - - - optionsT0 - - - true - - - T0 and Bg bins - - - T0 and Bg bins - - - - - optionsConfigure - - - Configure - - - Configure - - - - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000011149444154388da554cb12c2200cdce063c6bb073cfaff3fe657b81e5a6858428b9a19a634249bcd030c81d0ed2d3298924c1e1b81b220dfee3c452c0124f6bafb6a7f95a009c0d3ed6f9531012a90d08ad25255f36f94926a4d09c0e2b2136d0b9aff84b19847017002700170def1a9d218095b4df5bdae2949b631fb7db286be7d03b54406f49373186e05ade0001e814d571b2777551426bb93e1d98eeaa523d2a5e367296239734d2bf06403e90347c1e237667d33f832d8727146444d37d16143c0d7dab3d71e781725510e8f4746c43269799b4c2ee015b490d8052e4696b744f8ea874627a203f64da4635474560004dc32592e99f769c51995b59751adc994cf24f020d0b1cf37a0fff87c05fc011aec943b34e289c20000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000ce49444154388dd553c911c3200c5c31f9b82428c58db80637e252e492fc541e1965988d1598d83cb22f21c16ad121aa8a11486e2cf3641c5ce6c96a3fdff1f3993fb9b16e8730c9ba1dc2fe089c24390100442467f1fa5d1d735f6212bec8899820c2a3961f29ed21aaefbf157b2deb404f5d9b8aa3ec4edea3962143e7389762b9944b5f678801b6ab8a2770fb323197e22ef28f39de55e58eb2840b3284b84775abe13f29f63e440272292600c2ac0680bbd8f2195e3f6e2e483d25df26c6957bbc6bf3f8510fc6aef45f113f01c3eca579cdbc94f70000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000d749444154388dbd54c10d83300c3c477cba056bc4523b088b7406166114f3cc383cd347e52a4a13482ce03e90937c9ccfc12422b802f41c439c978d94784f8f382f1be9533900503e17c9f979d9680000cf1c016015a1bc28ffc0d1bb9e5d4db084b4f808c3afd531001376dbec16d602cf1c5f63a83acd5bde834b0fb58c5b5da6184aa467fe4683b6284ab7820044c99c7ae6d83ad01a5c895c4548afe0a9c267a02aacaeadce771daf22648da5290a8bf8fd19df26dc3bcc2ec73dc33445d1e2de9cb1fef235f1e212b28aa7fb8580ffe56e452af401190497001e10df320000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000002c949444154388db5934b4854511cc67fe7dc73c7999cb41acb6a2a22d28aa227f6448808a38248905ab80a5ab46a5154eb20dab4691591460815d42283a0508a088328911e584932a5e318448e363377661cefcc3d2d46f175291dea8303f77e177ef73bff87d05a33a6fb0f9e8cbfcc40a6bf6c456d4d559fdb3735d53874703f7e9f39c9b36d48a7219582541a52294d2cf989fe4838dcdcda5e595b53d53d95236794cc04af77c229cafb6b2af7625b035f9a5bdb37160406f078c6a145debc57b6c0c7aa95fbb0ad81f7cdaded3b0b02c378e231b096693c450e81b23dd8d6c0abbb8fded417041e83fb464bd11bfe4a22f915afb78fe0b215283b7abba9a9692db834ef6f92127c3ec18eadeb49a52014d2dad142680ddf87faa2f3156b81ae592706500a8687211281a2d07d61765e43291062428042c0bf42dd44da5a31142c2f7b44c5ba0e0cc361fee007b5e0dbd395aee0914cd6d67f5893781c92af2f52b9eb25745c462a8930159ecf37a93ffeab74dbe29ef3ee605b99b118c462104f8065413209090b8686c04ac2c8ea73647ac2541cce61f834d214545487c9468768eb2eb9012ecd532abf108e035a43ce197f7634385d0ff144db8846e3941787f16eaa0204b9de105f9adf663795d8d59d27e69e74052b9507693d19aa1d30128dcc3b520d7a116801467ef6e4e2201bced42a34fbac96e7bba7838dc98927c2b586d4e606c2af3f203ede2358b714a93538a03323bcb9d2928da4fd977f76b4dc9e3ec7223fab72b4fa5313cf2d5f82ec7d4ae9b1a5e40606c9748530fc7e7426c7f6b30794bcfaa4a2ae4d77ff75dca404c30073b4f64a41b6ff19233d7dfc183c0ad2440b49cc7f9ae4bbcfba7ca1deeddabc3f4988fc4f02758d64ac18c1920089c70dc86486d2ea8d5c7f5123bc62f0c2a9d982c76428c59c790100d4964b0c5b718a3df9cbfb4a03995927765371700dc52e7e412b3d13fd37f0b45234debaf34fc0bf01fe532119ee8d4b590000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003f749444154388db5955f68d56518c73fe7777ed333dd3f67fecb74c722ed62f9071223332c5620062d0982a88bec22888aeac242322d2b2808b12e022fb4a0eea216155de46866641bcaccd4e2b464736ecef36f673be7fcfebc7f9eb78b6dce95125ef8c2c3fbc0fb3c9ff7e179bf0f6fc239c78d58de0da10289eb4d78f5cdeeb41877a86696b7b65cd62b3e7a7f63e96a71d755f16b6f75bfd4dc98eaddfe54ebe6ed4fb636599143d70c76ce5dd3a6d6ae777ad6eedcdbd3dbd935e2aa55e7b259ed4647adfbf860c63df3c24fed57e3265a9efec3b56f5e8808280bda08cac017df0f95c26fd7ccdbf3def13de95b9a763ff8400b8df53518e3d0da628c23954af2fabbdda5b1f178c5e707ee9fd192c4a61de7dcbedd2b5006220bca40ac61a82f64e058866d6dcbb86b5d335a835260ed34d839c7df8315f67e78aae387d3899739b5b97f0aecff5b6e46c170cf10f526e28d17d730a716acbd7a1b451cad2b9bd8b4aeb95da4f069e729a6c156a6c1a5f3214327fa79b82d4d7a79ed35df0560b462d8df71099c43ebb9648aa3fb5873642d22e01cfe95d58c8f8c73cffa25ff0b2d5585adbb32b4dd7b33b72eab4304d2ab16a7cb55fb8a3694f67f70bcdeb7329de02d5dc8ce83a7d9b05e7016ac58ac15c438c43acca4ffddaf451edbd2c2ac054d1c190011989d82df7ac7ea073bfbb240d78c567c753847faf605ac5eea33efa63904e20895235410448e400b5104cfae5c4c5ce3d3736e029af0a03010923dd66f914a9a847b7b06f8f0d12c99cf5a2964358df37da40e7265c89761e0225446211f433e0bc592259f8b090a152e9ec9521aae96881283d4db5578aecb376602fa634fc8a63b1ba84d41cdc21a7a33e32c58de40e602f40dc048ce90cb5b2ee50db9bc21288584a52aa5e1519c721090c5b73ed8b3641eeaf765526e47ba8b6cdbd84c55e0520c59af813f4f5ac42509228752102921568e2816f2b9001d68983b176c0cc490544d383900e08915c6abf0fbd9128fb7d59129c285224440b12c8c5584583b22e5501a4a639a919100ebcfc64bcd9e2997a469c4d231a963387caccc7dab1b19a9409d0f4b525067a16189cf585161fc04cd6268d011f58b14b735259138468218136bc2c0902bc8fc81419da57fcb4900df5847d72f05763cba883bea276f9e075a431439b4f68863431c5b94f250ca278a0c5afb44512d4ad5a0548a2f8f8ecdffe4bcfbe6b274ab81a17fa0cc231b660e85e781ef7b2493093ccf9bf4bdcbbee74d9c4df93f9f0941dcd753f97e61b8ca734fb4fc67ba92c9097338440cb1d284514c186a824011c53151a8d15a88b5a1efaf002e6cedb80cc64bd079a2c8ddcf8fe1c42102884344b056b05a30c6608d608dc1188bd1163132b18ba51a38085cc79585256ed467fa0f0f457af9307ab8bf0000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000002c249444154388dd5943d8f1c4510869fd99d35773ef0c705c8329203021001827f8090900810883f003111227506d14504fc03624840204182217300423210fa641964c9be1577bb33bbd3dd55d5d504333bc7c96b3b764badaaee19bdfdf4dbd50d4f5bab36c90f3ffefa515d4f0f5433b37a42d376c4a464cbccea29661911c52ca36aa86ea271e79f39f3a3c577cd62f5f1cf373e5f00d41be1ba9e1ebcf4cab54b5071edea3e9f7ef10dcb2670e1b95d3efbe4fdc7d27d7fe3167fdebafdc1b75ffd02f0e119e194942e0ad5b0899bbf1f72f9c279ea7af2c46d2f9a0e07dcf3bb23e82691617b55d50bef5fdce3e517aff0c295cb4f14163196cb1529c938772a2c8aa831a97ac2b7df7895abcf5f64ffd2b38f15752f2c9b96e5a2c12c3f2c9cc410cd94629c341defbdf53aa5144a81f9713be4fd7813cd8c939396a307c774216266db887b2bba98f8ed8f3ba865cc32967dc8bdaf889c1131624834cb96f53a707cd212a33c8a581155421c4aca725f529607ff8d98941885b65d11ba484a424a8a88106324e72dc23a58e1ee9cdf3d87651f6ad7a88ae30693929996ccce6cca64f71cb349c56c3ae12804521272f647111b3bcfcc78e7cdd7707742104248a4a4a8da6097f5072d36f62fbffe8979488ff718c02c1342220441d5b6089f5d208920a2dbad484911cd981a77effecbfdfb0daa365c611daeb08ef698f5e23b3b35290a49d2766119c84c95aa2aecedd588802ad475a1ae613a2d98c16452502d5455011c1988ddb7799c94d5ba239bb15a45168b6ea4ea094f1f21111d1fa1d9ac1aac90edc43124d6eb407147d570cfe4fc7037eba3bb8d42fd42b29d38c4440809bc606694e2b8f7bdcff330ee63ce9bbca022a828ee5b88c33ab25eb4e46cac56cbf1e44fabe0ec21aae6f19f75db90ba35bead8e8fe78bebf7fe7e701053e2f65f87e45c46e29c0ba5f8ffe64ebfb917ee1dcee982e2ce759edaf61f121ae0ff0b36cf4c0000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003fe49444154388dd593cb6b5d551487bf73ee39378f9bf7a3a6e94b694b2bb65a1111a13a102b82edc0fe0d0a82e0d006670e041d8aa8d38238d18120522cad5207c596da121f55aad69b3ed2a4499a9b7bef39679fbdd77e38484c93b60a1dba266bb3f8f1b1d66fed15711fb1f03ed5643cfdc00dbcf96a73aa7db53d75e9a3b9b3c78f1e38c9dc9ddae47ec07137bbba7686fdd591ebd1e0de57b635ebd36f0767fb4ef0cd3b074ea2d681bf3e7eee485c8927ac78d224a6d9cad1c6e2ac234d2a586b31c662ade3d78e0f93a7fb8fd7b8f62951fb045d0b8f76deca8b873f0b2f77c217ebc169357d77c7cecdc49598cd63831c79ef738cb13c30dac7c46b2fad0a8364985f5e27f6319440d3b37875961fd28387cf3716a68137d64da7b5509486521b004e9fff83d9f926aa346b64015b3f4a7564065add20fdf8762fbf15db311bf7e0bd3b7497c7462c461c61a53032d8c3eeed1b7968ebe8aac8e737201c230a03a03ba0eca2b950e5f7aea768b60a8cc85dfb488cb118b144d172e1e073fbd83a3ecc86e1de956603be718ab8a30ed910f80a2eebc36e7a9cf9eb63349b0dac75f7020b462cce7b1aad82c32f3e4108811002f38b6d708afef65754077b60b102ba83765ee5726d2f4bb94315e5bf812d228e565672eea73ad63aac7588f558e718f5177876cf34a8412080d4b8382d7ca92d8b799b526b9cfb8f8e556910eb1071cbd93a82e43c367686a46f1c16045c42d1709cbab9911b91c31883526bc1fb60f9365c62c461c4e17da0d655c5a6cb9d6a6de9e347366d0b607a0003b687bfaecdd0ecdb4d8f4bb99917686d70ce03fb52a00ba80226d15a3022f4f674f2c2fe4770ce5396069535e96c9ea636340a6d03a146de70c896e739f4e43318717cfcc9318a4221622ac0c81a27d25856bedb3fdee6b922cf4ba45ca223aa1345034037f8216e3522dae916546968b532f2bc4015eade1e6b2d88388a4253af2f3037d746c452b10d86c7c7408621aae26ccccfd714533d31aa9ca2b33341a912630cdef93bb93e316229b5c11a431c07babb13440249d6c2fbed50dd859319ea93df32dbb117224f9ac684e011238811bc5f053b960f5e275a0bedaca05a89c9b29266b340c4d2b1344f36344054445c3e53e7eccc832c25bdd84c61ad234d638c118c15bcf70168ad403d4c8644294d912b7c9a206271cee1bd23cb0cdf7f779eeeca247fb60650dd9bf062f1dee19c238a02ce59bcb3048287c97cad17b1521aa50c6569b0d61282c77b8f379672fa0a57cc18a677332184d59193a442b59ae2bc47ac5b6bc5ede5a9a2245b6a6192983c6f216211b198da06f48e03844a8d542cb03c490860ad43298d6ab7d0457eafe591cccf2e4e4c5d9e9e10112e5eb884f7cb9d39e757dfb7f3fadaec95065a5bbc8fdeba8bfcbf8bbf01e870cbc9b35858b90000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b249444154388d9594db6fd44514c73ff3bb75dbdda55d8cdbb4200a4d4b5bd3284414a3084568dad81062a4120dbef237c083c4575f89a40f3e61a231a24f3ed912de08acb484b281a42c50ed65d3d2ad2cddcbefd7df5c7ce805b6ed72f92693c99c73e6332733678ea08a868753d9643291a8e607b87327933a79b2ef93cd7c4eb54ddbb62593eded6f5aebed4a1bb43118037373b99d8000cc4b838dd9108bd206a50d5269841068adaa6daf0e564a56852a6d10168461f8ea60299f82d743a532d8a632e615325655a14a6bb43648b95415bce171007a7a7adaa50cab427d3f444b85effbd1cececebae766dcdbdbfb9952eac3e3c74f7cdedcdcdca6b5b656a1f21968e087282951c2c6f3dcc4d9b3e7e66fdd1abd3132f2f75f9665fd3e3c3c7c0740f4f7f7dbfbf77f343e30f0f52ecff3009899f987a20f7bde7b8750ad420d7eb0020d15b59ec395cb431c3d7c00216c8c31e4f3790607cfff3238f8c357764b4bcbe93367be3d1589d4605916966571efe104bb3adea5bca409424d28354a19841058b68de3ba282c8837a30bb3048161b154c2b53ddada3abac6c646869c0307ba4f47223515f7f3b010a1d18daeada58662682849f09541ea657be07a88ffeed3f8fa16ae67eff17e63070d0d0d44a3d12f9caeaeaeb71cc75ea9044db9ec93091338f316c510c6f386d9122c7fb0f5b2d9bf6038f186c7e19d7bd6acdbb7efd8ed04c192e7ba0e524a826009cf7399d0af71e39ee0fa5c35e053150a314e45dcb5b5ebda2493c94627951a092391244d4d0992c9048e03ffced771fbfe73796b9ab7b7108d462814cacccc2c90cb3d616e6e5e394250544ad74f4de5989aca2184e0fcbe38813d4f513a3cf605b99221f34813ab11ec480812b5501f815a11e2a91257afce561ca6b57aec044139178d469a974d86a1a13f37cdac61659e591915be8604fbf67dbc4c309a7c7e61c629169f4c45a3b55d004b4b3ed7ae5da1b5b595d6d6d697ba8a542a455d5d9c43878e02b0b8f804dff7279d5ceed1cf42a8be582c8eef1bfafafa3972e453b66e6d780172591d1d5d64b359e2f10860313dfdc04c4e4efee1c462b15fc7c76fffd8dd7db4a6be3ecac1837decddfb36e2f9c50080948a64b289bb7727a8af8f03904e8f6632994cdab978f162984ea7db6ede1cfd2e168bed3e766ce00321366f4eeba1522a1cc7e6c183fbfea54b3f5dcf66a7c72e5f1efe1ea8eca7172efcd6bbb858322f52184a532e07a650289b7cbe68d2e971d3dddddff92caba21fd7d579dfccce2e305b593d1b648c414a8952cb230c435cd7fd1238b71af33f85d71e86e22fe4ea0000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000045749444154388da595cd4f545718c67fe79c3b7760669896f1624305044394882c2c289258a31235367161e28a85d1a50b57a64b57eaae24eac2855b13fa078864ecc684b882513a52c5548b16ac7c88c0ccbdcc1733e77471ef8cd836ddf82627e74deeb9cf79cef37e891fa125a4d4b55d8e33642965f30556ae544ab32b2b239b95ca552ba4d4b52b274f5ec8e7f3acb82e18f3d9612904524aa410a86097ffdc033f5a576797e1c24f0f1f627538ced0462ec7c2eedd247a7b3f0315d59f844085c3082110e5325208df0fbe55fd8de7cf89a6d37438ce90654969afb82e0d9d9de872f933a6d18e0eec8e0ec24d4d44120900363e7e64636989dcab57c4d6d7610b70b8bd9d522a8525a56d19c018c366368bdedc04c0aaaf67db891334f6f4fc4bc798e310731ce8eee6cf8909542a45bd312025a258440881012c8c0163286532a862113b1261e7a54bd4050c7f7bf4880fcf9e51595a221e0e63353793e8e9a17d60809d070fe2eedac5fbbb7769b22cd8dc44001883a58d411bc3eae424897dfbf8e6dc39ea120972990cbf0c0fb3fdfd7b5a62315feb6211e9bac8d7af79934ed33c344483e3a00e1f663399c4360603686390c6185f8a850542d1284e7f3f0063376ed03e3b4b63a582f13cbe3a791275f428854c063c0f7b7a9accbd7b00741e39c2bbc646c8e51081b4b29a5c4a299a4e9d02e0d7fbf789a7d358f93cc675a96f6fc7397d9ab633677c00d705cfc3a452ac8e8f0310efeb23b7b484010cf88ca510584a11efee06607674946dd92c3a9bc5b82e52a95af07428049e07ae8bf03c542a05c0f6ce4e5617176b8c2d13e8128ec789b6b501907ff9125128604a254c2804c5e2a7b42895c0f3fccb8ca19c4efb8c5b5ac8d8363baac0da1844c0b86af54aa1a4f41720b5fe94dfc660698d34c6afbc2d955a0cfc5af0300691cbe1cdcf0310d9bbd707550a2b28dbad85b3b59ced3d7b00c8be7bc7d7e53246eb207881c64a2972333300b40c0e82945801ebad8c8dd648295141efb00e1d0260656686ede130d582933ad0584989974c02b0efec59d67b7b6b7294a6a6f0e6e6587bfb96fc9327a880b17de000e1c14100e692499c0058578109800b8f1fb3383606c077d7af93efebf319e7f3642f5e64fefc790e84423e687f3ff6952b00bc1e1be3dbe9692c29315aa3ab5921c07fb6526cdcbac5c6fefd449b9be9be7993b9070f084d4c60bd79431b10eaea420c0c1039760c006f6181b9dbb7f93e164308810ea410c3b19839dad949241cae3d9d860642972fd3fac30ffc9ffd3e3acad29d3bf48642d84a218460796d8d9f2727fd74ab6a5c5bf93c6a78983fc6c791c78f93e8ea22dedaea477f7e9e959919fe4a26d9f1e2058722915adbac32d6c66055b42ee50b05bb311aada5587552c49f3e454d4d510096c36136ca651aca659a6c9b56cb426c01ad36fc0febeb54b42e596b85c2c862267341030df5f5ff391daa7b34e8b5cbd533e0377afc69b392cdf2767999b54261c4d2c65c4d2d2e125f5d1d92427cd130d5c694b2a5d28836e6eadf44cbf02c068658550000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000023b49444154388dedd54f68d30014c7f16fd2ac71eb562b1b76b021ab0c640c598720881e36f02244d8403d88487af5e09fb183f71d15c744c483909d77b1d0c0f030eac59b87ce8b30d0669b75d35517d7d4a66dfe78a8741b5dd5293b0806dee5c7cb87e4e525117cdfe7200ef140d47f1216144569085f0ea5545146f3cacc9e5dbc98f813b8e18a17ba52aa9d439b3a99255ad85417ba52ea5fc3f391d488e3a2dd1bcb31341863ea4a804eb9a0cd47f68fd761bd2319773dffd9ddf3ef091de961690d2c37cc9d0b3e87e592a67724f7858b007a682e8eefa413a7d7228edccbd21af5cadb61ae9da9100c789a1e9afb6d5ce0f2561c414c9fea9723c7a352d3c6ad6285e7af0570ed8452ba3afb6bf8d2974dc460a4450e012005e0dc89ed0663a35600d56a151c0b6058b1af677e064bf8de38ae4df59b5d3bd977a63f7d8dc6c3adb506cf876af1a389202640340194b2da14d5834fe340ba618f75e989d679b447edefdece5ebd03d75acd00a38a73c36c8a4a8f6f83380d241be1c0a3110287d283fd51a41dcbb8b8ec4271c504668059c5bb6900e8e2c33e600cb805f401268218dbf3cdd3850769da7a47068eb5eecaf305d8d82c41691dbc4a2d94daa0250c8850fa602288a38a3f91d97b0d7c6f9ce24af6cd6a5f241695eb71bb0cedddad40ac9e551cc87d2e836598c0a8e24f64a0c9474861d20486b18c4c7639879107ab0c7675bbf205c8ae97c8adbe05cb48023185c9fa43dd7314bbc6c27df5c7fce288c1daad574c00037801ccec04ebf0ff3fc881c3df0122e6e0f16d7121140000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000027249444154388ded95df4b936114c73fefebfc91ad7cd72f35a2e6af6976b3821002c95d54173d928a6517112d22080451bce84fe832af03dd455751294c08ea620baa9b88d68d6939b7a05a3ae75edd66737bf7be5dcca653340dbc087ae0c0c339e7fbe11c78ce7924c330d88923ef08f59f044b428875ce97f56ebba9841eb99816c07abb768cb17933afc247017c5a8c81e68fadae2d835fec772bb2c4d0b1bdd1b65b6766693e594975a5394fe07917e2f19b38eecf753edda0fd5ca435b829f899e2b6cb129ebb2de3cad9d3351417156edaeaf3d7e3dcf336a89a4ed5c5f956756ddc0430ba67c48e6e783a1afd8a7f5ae2c98339c6228700282f8d71a9f11bf5d68328fb0ee484d69a06ba66fdcac30fd5c380635dc5742d2a487200508020c803c0888877040146cd4fadc00dd07b2ed8c28afdf8919c38a3a519f46acc25648788777af3c197178691e43624b95724aedcdfa8f5d1dd8f140cdd535721d9ed35a539ff6428c5fba9b44b2c5e75e6833be7a248b243fcbce6db105aec6a59be2a48f2d0896a8b72d89275a809783b1ef561e8bdab352691bc6ed90898850eda31340f263398b295c693904c65e3258550b8cb624f670c0f002915f494fac701114b377d18ba132d4e7da54453ad448502a9cc8a9daa82a65a89f23209b44515437714d86cb63fb1b1e96edf27ce7f8944636d45256514c8a065f22d18867028a082e110da1ddf96475a64ba5d6492ce4020c0cc0224d32b36390d91ef132a86e610996e1f6c735708a3cf859e7286befa998d414a83a91948842700da85d1977b00db5e42827e17bae68cfcf013985e221d9d00700afabdabf3fe6abb2dc35dc483bfa1aeb539d2ff1f64c7c1bf00249101a1f694e3ca0000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003d049444154388d9d955b485b771cc7bfe7e4e4666d76cc6c35316a6493d43af134bad9d5871a686765945a3a18658345287bf0654b614cf6522aac0f9badb5b0be6c6bf230f2d23253ac506869ed982dbde1d9c6d84acd929ae8b471e6e45c7339c9d9c316ebad78f9c11ffefcfedfff87dfe57f21344d0300100481f56c74f42e6db55a6e170a1ad3dedeb4e686228f5c97b6dcfc6d6d8d4ca1a0ad2ba43643b55a2ddd04014892b26aeddab571afc9643c05a06ed36092fc2f41515c0ef6fb47bd36db0ebfd56a79a1dd0c58146564b3790882b4e81b18087aebeaec7eb7bb1e1c276c15ac40961588a20c00e8ebbbe8ddb3c7e5dfbf9f01cf2b98987812286a37550a4150204969f0bc841327ce780f1c78d3dfdaba0bf1780257affec49224e1db62c4326439039e97d0d9f9b6dfe5aac5d4d41c2e5d1a611716784f6fef316e4b11cb721ae3e3bfc0e5aac5eedd4e44a3b3b87cf9260bc073e1c2496ea9764df0ad3e47b7514f30063d60a0106dfe22160080e9c82452a94a1c3ab417d1e82c82c1ebaca6c1130c9ee656329681aff43a9c96520c37ed0353be4b0fbc42418c007f9caff94497c7d0033389fa967d0885ee201c8eb38a92f18c8c0cac82020051bc82811e075db5b31039d895a3130903645e87329b0e966603c438409a74b833d582470fdf4232fa1893dc8eb2b5a08b4f4471f2ed870eff079dbcf7cf78099effa3efe93a1b0f3c3d57d351c590b7cd8d06c06c0044027fff2c23ab681067733e009c06849a3e8f712bc18ba7a2daaa78f56a168f7ea7ce779d8d070020c169acc2e7015945219641f8ba009bc788ca660aaec32583af779afd469a8c3cecaf665646be087ed598c1c2bc064ed09e157d29491bdc56a22217cfe1fe9534bbad1c402e07e34e0d543e0f63a986fa77f4346526865fda3c51062ab667515d963ef5d5117badbd1c4c7383d2812c89b19b3a161a3caa9c4f422c60e61eb87412be7c01476a5bd05dd3a0396f7ce6e83ef8753cb40afc38563ae6ae943a8eef5da061c6a730eb31395d8a07bf1a03aa0adf7b17e3dc5fdfdb918f698886a9d3edfdb10080c06fe71c9146b7ea5432140360355848eb8e0e8ddb071987d45d62023da79858394b0d7dfcc374a0a8915279280b2a12491d5bf4852388bee1ce38958c6eed52f4df98e100f4fc3f00a456960d89e78836d8d3cef9a4e9230063dfbc5f45d3a519468ea950322f69de46ecc9336a4c1373687b8df77ef9ae7d584faa136e074f3f9d24a1645f940158728e37f2e70d1eb33b2b2cd989e3adf37431574120f0dd5d5be8e48f334781352ec846c00070e6b09d2933e5869b2b046752d1839ddb1ed011f0f58dcc704bc1ff02755cb448a18033c40000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000019549444154388da594cd6e82401485cf1dc6f8205d1a9b98b8eed2751fc0b7d37d7d1013928a8b26f60d8c69b448c90c73baa0a0c0f0637a120284e1dc73ef7c2024b1df7f121d0ac31d96cb57e95ad3104944d181f732266392181e8f5f3c9dce8ca20357ab3792c4d043f98a05812008044add1ecfe7cf58af379d9dddcb6b0c002282200800e4a3d86edf0160b0b9eeacaa14b22cc362f182f3f91b974b8cfdfe635062af719e363f2ba510c7099224ad8ce65f894508e71caed71f28a5a094c26c366d50e4a3c66b6cad83b50e719c204d0d00603279f23c8fffba9862bddef0debcd11b99a74cd31424311a058dc243a869186719cb945aeb928cbafaa8a98c82248c311091f2e8dab02e6a2ac6cee5e67d1a424d258e3159e5e53ebc0a6a8cc9a0b582d6b79cb5c416a48074e526fa54a7663c1e81d4b0f6b6be342e4620428848eb48daa821f3f72ac661b84318ee5a5b9ecda6e5759d9aa22b6b5dd3b8ef5f5b7c696dd438e74a420a0dfff8d14e4d5e0095c40f193f42cd83890b6a58a1c6d7c560e33a35f7aadf033dbfcd427dd4f8f40bcc2c550346d4fe540000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000002ab49444154388d8d953b6854411486bfb9f78680c6204202e283588845445704254acc8a36a6b2b7b0486d2104b130b1b15110b14a9a2882a5165a2485882f108455221ae3ab301811821a13b377ef6bceb1b8fbca6677b33f1cb8cc9cfbcd7fce0c33863aba7af5ce0d20533da6caf4c58b67cfd7e6aa6a3dc45a8d8e8edf1e1fbfafb51a1bbba7232363b76ba18dc27cb8d9bbd9315c3686ccb35fc7362f751ccd0c0f9fc1f783550b0641c8ad5b0fe9fcf7723adbf5e2af2ad37bcebd5f5341499e1fe893edfdc7331d3b76b27457e9ebdbcbfcfc42dde4bebe7dbc7cfe23b3edf42e56be7fcabebed69b3d7861e6405d309d5b32dd877a0088ac0fc0dcdccf86ad8a6cc886ad1bd9d0bd87f9371f338df2bc483d344acb3e31203c7efaa02114e06456d3fc30264a9c8679e6d1f57ecd0e0d3485cd7c1b6a3a9fcbcd323474caac72ecfb82c441a37fcadabfbfa7fc1d454a92082b2b3e8e93ba9e9898d26ab8e3172c1a054da356ae6b705d07d7adb4e2f0e15e2626a6b40a2c4814348d7a32863238979be5d5ab99b273002f085b6b452d1428b641181c3cc2d2529ee5e53cefde7d05c0539155e56a21063f86c482142bebaae7d6608cc1750d8b8b050a8500d7adec9fa72a48148228fa270fb1b4ecd818b05689638be7b988547aee21828405f4b70fb15d17aa0a715c3a1505c230a1bdbd0d550f6b2ba652c78bcb683e6c09aa9aba0cc31055686b730110518ca96a05d622bf97d785964a8f63258aa2f467cf452475992482e354f7384c90286e092c02719c608c2987e3388828ae6b4892caddec51dabc16646dfd8bdd18ca0b95c10b7f1d0af988f6b6f54f435cb5b9a5a356edb25ade95c9cfe6d2e06eedda943404668b7794882d6e60fa4a48f19cd77b9d3c802b935fccdaa98adebefda6d6969ca66e537865ac16ee35039694cbcd92cbcdb6925ad67f2579adb1850abe460000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000049149444154388d95955b6c944518869f99ffb487eef66f69cb967ad10a36f180161488312660823131206a888844b6953b1b0991182f38085c34484c4189180e6d4940b83042d110a03156083448a2e5868294166a0b2d14da6e77973dfcff3f5ed036b484aa6f3237339327ef7cdf9777040fe9d0a113a586e16dcc229608a96c8142d704caa555b96affd2a56f6ee731da5cd7a2ce9c6ba3696f950010a3070d0d3f465d5dd406823e3b909383df6f21a504c0711c52f1388958ac359da4b2aaea9dd689e085abea5477570f6da7d68bcd752d4a00ecdc79306a04647d41718450288869ea689a0680ebb818a681a66924e2096e76760c0e0d38b3aaab3fb8fe38f70b57d5295953535fea48b7b6a038826d87b17373c8cf0b93678708858218a681937500985290474959992db44cfd44d8da1dcd2abaf1980268da5b25a4eb2656dbf9613b18f4130cfa098773c80d87b04339b88e4b61411e81800fd3d401881417915f60cfdfb2e59b8a51e8c75b4faaaeee3bf4f4f4f3d2bbb50a40a6ddcc127b4a3e8661e0f399f87d1621bf9fdc6010cff330759d40c04730e0c7efb3300d9dd2e9a564b3c32b47c143b1240303c3a45269945200e852aa52cb34d07589142010689a462c91c4f25958a681a73ca4940821504a11298e904a25c71c5fbbd683e33864d359e2b11800d23035344d4308c1502c41f7addb74fc7d93bb4343847302189a86a9eb63cb320c4c5d279dbe3f56df96c3d5654ed6211e8bd1fedb1601a00fc71208f160eafc3e0bddd09140382787a06591ca64d0751d5d4aa49428a5703c8f6432f570efaeffd9b8563cbc21fbfaee5e775d1729250383c3643359345dc3f55c92990c9aa661681ac6885353d7e9edb9493c9e796496c781fb7b078fdee8e804c0b20c1cd7c3f51e34402090234e0d4dc3320c745da7e96413c3c3eefe49c1f1b8d874fad7b383e97416bfcf429362b2fb74767472b1b58d9292270727053737ef1beced8e57fe7ce418e94c169fcf04c0f5140a85e779789e47d675b9fc573b5feff896f2f20ac2e160c564600da0b3b3f572d05776b1fdeaa537ecdc90af706a11baae21857810264270f2f809be3ff0033366bc4049c9340aad7bcb3e9979e58bf766074a0ffe3edc38113ceeddf3e77f649b6676636124b4243f2f50aa6902905cbd72a3399b35f6cf9933af359d4edbb6bc5d5f9e3c523ab722c440673b6db7fc0dcbeb6e553e627bc39eb3ead515bb14e09bb4c023faeefde2813b17d6a964db36d57ff86575fe335bed5a563c2e3f2440cbf92bdceebd0d90aafef294aa58b44d4d064edc674dcb9146ac3c9bc0f36f317df6d33c372d19ad5954fc48388dea8905d1ddaa7cc1c649c100eb5f8f440f7f3a53b97d752a79a946f51f9aa77ea90eabcf5f8bd40388ad072ea83b7713f4df8bd1b069f1e4b33641ab5f89442b6615d57fb87e0de9fe9b242f3672e1741b3fb5061b6457cf3d4623efc5b7bf52f0e09b59b8aaee5f5def38dbdb70fa5c5fe59e0ddbb18a4a08cc5cccb3739f4249232a13c9f458e431921967ceb5d1ddd5f39f5cd7ffd1d7d072beb772f7ba5a1c7f3efb8e43b06205624174b74a2653a4efa7c7a5d3ffd5ca8aa9f57ebf8ceacf2ca7b33775f41f5687e4181c28b9610000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000043149444154388d8d954d6c545514c77ff7beef992953a04829691952401a44890944d2f8d584a5a189bb26ee202a316eba926008892b6263a20b17ccd25437268d6b5335418d2921f801a122525b18a14c69a7d39979f3debc7b5cbc692d20c849cee6dcfff9dfffbdf79c7315ff63874f8a2f42179013c0185612a17cf1ac0a1f97a71eb530784a3a8161631812a10fc81b81c4501198159814c3c4a50fd5d213110f9e921c30a214a3394f0a3d1b710a5b8cda964fd01a4a4b1637e6b594ee99787e59cf44891a1361fcf2476ae591c42fbe2f79239cb135c707b69bcc91e760603b6c0884e55a8c91141ef82e73775b7c7541f1c334f5e5d03e97184e4f7fac2a0f11b7957e90f5e4ed23fb5beeabfb6d02c7103663f219cdf62e1b6963a7e7221cc7c26033351df2d9792b2a2db99f8a70eaf74f52e57a9de0115b73ecf01e715f79c64621acd423067a5dfa7b5c7c5713b4fd40bfcfd64e4514b7787e77c0eb871237e326c744185925d3ab0fa514a3852d267b7097a2112bca958867777a049ea6d684cb7370f106cc96c108746db0e9d964510d6177afcfc17eb24a31baf38474ae573c1c3852d8d70bad44b15885aca7f05d8d11f8e3365cbf0337cb3075ad45b91201d011686a21dcab42efe6840e3f29186118c03e7c527c6318ca677072be62b99eee94f56c5a09342298be05cd388dc7cd3a819b01a0160a3f5e35dcae68ea9143e02947aa0cf5bd255fd8ede2efcb78a8a8a558aca5049586c5bd1aac84506da4b10ea7c6e0804d2eb03102df5e365c29596b8f94f55122f489d065033911f2be63580eff05016b9b00584985a32ffbf43de521c0d4b584af7fbdbf0d7c078c9017919c9d9834d88c61a10a6b35b53ec16af0c64b2e3bb67ab412f8e6b784cfbf57ac84faa10e1349096c11aa02956a6861590f800031c2d66e4dcfa694e2c275c3973f29c258afe1551bdb0c01910a8aaa6d600198ad3591ac87524a1051a97049d3b4d25896a2da80f357d34ad0ff31652a3504cc2cc282be785685c630596b482c2268a5b034d81a6c2bf5bb558ba93f35df5d81b9721a731e7011a152333130592a3aa19dde0b13b526efd59bb2a77ba342ad5723902431956a0bad3459df2791fbe58ac09d25c34a2833c004b41be4e731b514276aacb4686aca34c978906d7bc6130ef4c5bc7628e0e80b01837b15397ffd3a2471c85ff3ad5a2b91b152d1595a236e0b1b5f6ed8c55f667594c40d7c5708da89aeebd1329a3849ef36f052f75d218e1a4c5d9768a9ae8a20e3ab7cf79de9e977252fc299cdd9e8f8be5ec9f4776b1cc7c1b66047173836cccc4318431c35992e09976e24f5f9aa730e385d2a7a0f8fcd55dbf58ee404463c2b19edceb70a7bbb1bceb68db6f283008046a3cead722c57fef6e35b8bd64c18eb3190f152d17bf4a05f6f8513d229c2b00843266dd3bc88a4758a99052641264a45f7c9bea607adf74df145d86c443a4040a40ab2502a3a8ffd4cff01b1e10a7293d99fd30000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000018000000180806000000e0773df8000002304944415448899dd5cb4e54411006e06f865114af3131021a160671e365a16f6074e9d2b8d52089f125e6397c099fc157d095181315508c1708a00383302eba8ef4f41c06b4929399aeaefaebeffaebf4e1f0d6446fc8338e1368a191273622b9cf590fde8e27071ef04d602c7234c279165d6c61b7006f245f3b966d788c0d6ce3c5dededffd192ca1d30cef6a59b9609f27cfe13be6f11a37fb0b80299c4633077b87c99a2259ebdaf03c087d09961f4a749cc251344ab66f6a8a445f2b966d7819204d6cd614e8b3ba8998c1497be28f85afda7f88db386750e859dc91a66aa412b9ceaee2137ec57a2c4e77317296305f9cec093ee32d16d11956a0aec8b138d948f2f781cf6239c0ab9cdd830a94457a01be5d80cf65cc972a700647b2ce72e1f723b4818f39f36ae33005ca222335fb9b588bdff2451d7abf94cf65693c2732df23d9d494e0ad21ac9f611d1dfcc6cfec041b92365311bb10b103ec0f12f9aebdbeee482d588fffdd88b9214dcf4a10e9b35283a7c5ba156c97a529f911c0dd343d6d788533e26aa86399f7f2bec1be5f9366bf4a6e4ab76fb5ff00b7c23730349506f702601157a479ae6c42ba3d37a516f4a46b7d1a972266357c03ed6ee03c2e487dfe1afeb522ee3ade4b42f78269f55693da583ba22d49b4e8abad489e94c4ad6c1cdfa489da09a04ec48b75edb0b422a8abbfefe5098ee3887e117b516ca8b532d03c714beafdb424de4a46e29f6cbf0f7d03a3d2676f340aaed947c8ff2950ed551f9c9e217d1e667f0045acd1dd3ebdd4130000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000038249444154388db595cf6b5c5514c73fef4766d2264da631050b46a2558a229404b156ba70e142dd982c4411174a0b5d360b8566515c28d1aac5a62e142be44f502c2e249616ab062948b4859aa84d6968da24f3266f6632efcd7be7be7b5c4c7e27820573e172e072cee79efbbdf79ee3a82adb31dc6da102cebd38bffbe16821b33a92cb797d8b35e9193af9fcf8469f6505fe73c6ef9d1eed6bded134f54a7f6fdf91d70f21c68edc4b529bc6a9e10bdd439f7c7ff1dbeffed0eaa268a9946818a67ae187291d183c3fb055c6aa8aa3aa3c33f8dba61bfcf9fd03cec79f5e1a686b6f7ee7c5e79e287476b42092618cc5188bdfe472f68b1fc3bb738b3d9f9f7ee9e65a308073e8c4b8befdda7e520b92412250295598bb3ec90b4f3fc0c127bb71802c538c59051b638912e1d4f0c5afcf9de9efdf08f60bcd3e8f3cda8cd806f4d6d5dbec886679f3c85314da73a8824823e8c4c89ffc7ea34296296a15df7798fccbebe3f0378ad8905ffa762f6fe0db2511a205c3c44fd7e8d9bf87dec3bd9bb43e76f61a8b99cf076f1da41a432c5017701cf8756c868f3e1b2bacf577f6be31a6fbbadaa8046576e67dda77e5510b6a2d995534534ad5847d0f1638f6ea635cfe1bc21a9423a8d521b85964f2f204778a77e0eacbce8a14071e6ee3fcc9c711a0584ad8d39127026a066a4923b8568730822bd38d2c130395b2303d7e8b606a8ee6bc070a478f7ff52c7009c057ab08500382cca1584c6969cf315f81bb25989987b0aa04654350ce28570d335321c1d41c2ac9ead9ad0538be066c51a00e78bb734c5c5fa4a99c6376014aa1128442b164982f09f381500d6392b0066a01c88c12546350e5cbe1fefe7367967e9eaa9202b185990588fc56a66e27a402621491f5d388c55a0baad42261ae5cc7e45b604331f3330b31301d36b4cc1ca85b1729a7a4e2929886a689402a4a9629990841b18af57278ad6d0d66b601eca098143a73b04ba1c381fbee6f222cc658944e4f087d21cc0b959694a852673188616f335621cb12acb58cceae7f9ebeab4a570eba7240ebea3da4dd4d248941049204441cd2d425497622d2449208692aa4a941c4307a657da174ed1685de75c1f33c7cdfc5f3dc15ebba8db565eb79ded2ba0b763dc7e55f1a88e7392b419ee7e1baee12d4c5f39c25bb3a37827db55b935d175cd7453523953a71bd4e14c5c4f598384a88e2987a9c20598611b309ecf0d0d0ffd6f4f4c6e08ad0ce7635d37f00f4b819f9e3b0a8920000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000dd49444154388dbd55ed0e8430082b892f35de3ff5b1b81f8ac1c93ed4bb6b62dc269452492624d183aa5adc931455357fd7f1240500962cb115dc3af742f1dbd24a7a8b29c51e7347c494e2275d5d14bf253c887fe5b100187afc887834c7198aaaad0301278fbf69cbffe6d89115ac2de85972dbe31284f47c7e3415333fafa9b85416d54445d564cfaf631d161f922009dbd77b8059e8ccd756756b217f6a2a049048269b85c7b9ef23d2a988c5484255bb85b398a1e28cb4b6208bb94c454886b7e84459eb06d8ba5d53c7baaf58f5f4c3321f6f290ef7588b670a1fe923b36c6e54b07f0000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000f049444154388dbd926b1283300884978e970af79ff558f487a2481313b52d334e1ec2025f1092383355b5782629aa6abe667f920200532db0e5dcbaf744f1dfd40a7a6a4315bbcf9522862abed3d547c54f0537e15f3116005dc6b7847b735cb3a26a73a78003e36f62f9df1cbbd512660467482e332ea19033ceb7a662e4f19a159784280b155593353efbba59fc4882246cddaf0e66a133df5bead642fcd0540820514c1684dbbd9fa34daaeaf90c100180888724769fbad57c5e8b88998b67e6355147e35d3412efa271cd4c7b5ce39ee43e15aac5c8f930fc51c039ee4c177491b101db1806e876101a33693efc1b7858d21f6a6c70020000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000010949444154388da554410ec3200cb3d1f6831dd8ff3fb757cc3b8cd034a4946e919020c48e49002231b939b38025abd279d0252300dc6c25ecd415016f6cbe989c0e9209636928057427359fbe4b1b310987b900b93158f3657bd1b55b9784cb2bf152d4c0f709a6dbcd2fc219b3ba2e5be1a6ecf79b95600b00b0ca6a6d32d3124dee65be9534f0992127c48fe8a0117b5f56130b38aa577807e391e9023395abcfb434b29506ca27ce92e57f4cfb33f4220830284b319c6cee04f85a7bf5b1071e1245d8e6ece5a5c62ab16e37535ff24e6a22a6c416c4ba1d44aff1d2c41b3110fb26ba1fcf9ac6fe7505725609558a98bdb9201bb313f59a2c6116890f129d63ae90fe83b944fc0152038ce6e09860ab0000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000014149444154388da554414ec4300c9ca958a4151202b1081ff777bc83e7f02aae3d7042e28084341c1ab78e9bb6dbc552d4c471c6338e53a2610a73b6022e325317f07cb472e4dc39ae1a1d80bb449065f3b0024a005d0067c0b91dd626a96429518770400a680d155991e26c046e49bc16b84b5e0238461fd377c56ee2a20266c3b7c37eab2c042897604579cf4830771f515f9adb699ecbe4b51ec04db976bbdb998552c58a11b8b06f514c6c3fb7819d7932f5e412756fee45604ebe616d7a01f006e0b589181435930a78cf0cc6a6363d29f4f4687e1f7954494c007056cf8fd229394fa5324eaacd4609c757986a5efb4df7418d66ea8a5df318be687ac604aaf83a3dd92ab00771fab5523d01e03bc56d377a90e7f27f609a9d4be5014cc7a5520e66ea607a5c0faac0bd734edb674c0f9700afaad80abc14f43f677601ff014483cede45a9c1380000000049454e44ae426082 - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000015b49444154388d8d554172c330085c142739f49a837aebff3fd67ca097b6d3edc12023404998d1c8b660592f48020aa30e74b25a7fc51a3a5bf82672e0573901409ee0be37007f319835a8d96991f402e0ac493f9ba3d11c9dc188c764cbbf0be06f00d7b1a611e7e84580e81c22739a865deb9f029a52fff18cbd4998839ddcf3a66350904595c8acf7ead9132d3c3a057d4864524400d35bc2fbe4d700403af795bb92ef65537ce82c3abc53ad14c3c09e683036d68b1e2c196fa5ebfd59ff4f2686eea30c786c9447900264991624a68de05d08503a411728316faec5aefd94acd3b41dc0be2b5cfb258bf549094311e94e37d391217906568b275bf9cdf732ef426bcfb82b7d0f469037e4d30e0e68c7500d3de3584203be69c62f016ea188132bfb0341661c25ea3a5fa0ed3736853bddbc1567486d93864781f6e2e51b66020fb14711bd431cafdc79451c00604b4d9fe21e5bb86d0805ff073e4cd2ff1f380e920000000049454e44ae426082 - - - - - Fit - activated() - MuSRFitform - GoFit() - - - parametersAppend_ToAction - activated() - MuSRFitform - parametersAppend() - - - parametersExport_AsAction - activated() - MuSRFitform - parametersExport() - - - fileChangeDirAction - activated() - MuSRFitform - fileChangeDir() - - - fileOpenAction - activated() - MuSRFitform - fileOpen() - - - fileSaveAction - activated() - MuSRFitform - fileSave() - - - filePrintAction - activated() - MuSRFitform - filePrint() - - - fileExitAction - activated() - MuSRFitform - fileExit() - - - editUndoAction - activated() - MuSRFitform - editUndo() - - - editRedoAction - activated() - MuSRFitform - editRedo() - - - editCutAction - activated() - MuSRFitform - editCut() - - - editCopyAction - activated() - MuSRFitform - editCopy() - - - editPasteAction - activated() - MuSRFitform - editPaste() - - - helpIndexAction - activated() - MuSRFitform - helpIndex() - - - helpContentsAction - activated() - MuSRFitform - helpContents() - - - helpAboutAction - activated() - MuSRFitform - helpAbout() - - - T0 - activated() - MuSRFitform - ShowMuSRT0() - - - Plot - activated() - MuSRFitform - GoPlot() - - - ManualFile - toggled(bool) - MuSRFitform - RunSelectionToggle() - - - ResetFunc - clicked() - MuSRFitform - InitializeFunctions() - - - AddConstraint - clicked() - MuSRFitform - AppendToFunctions() - - - InitParamTable - valueChanged(int,int) - MuSRFitform - CallMSRCreate() - - - buttonGroupSharing - toggled(bool) - MuSRFitform - ActivateShComp() - - - Browse - clicked() - MuSRFitform - fileBrowse() - - - BeamLine - activated(int) - MuSRFitform - T0Update() - - - FitType3 - activated(const QString&) - MuSRFitform - InitializeFunctions() - - - FitType1 - activated(const QString&) - MuSRFitform - InitializeFunctions() - - - FitType2 - activated(const QString&) - MuSRFitform - InitializeFunctions() - - - musrfit_tabs - selected(const QString&) - MuSRFitform - TabChanged() - - - t0Update - clicked() - MuSRFitform - t0UpdateClicked() - - - buttonGroupSharing - toggled(bool) - MuSRFitform - ActivateShComp() - - - - musrfit_tabs - RunNumbers - BeamLine - YEAR - RunFiles - Browse - FitType1 - FitType2 - FitType3 - Tis - Tfs - BINS - FitAsyType - LRBF - FitTextOutput - ShParam_1_1 - ShParam_1_2 - ShParam_1_3 - ShParam_1_4 - ShParam_1_5 - ShParam_1_6 - ShParam_1_7 - ShParam_1_8 - ShParam_1_9 - ShParam_2_1 - ShParam_2_2 - ShParam_2_3 - ShParam_2_4 - ShParam_2_5 - ShParam_2_6 - ShParam_2_7 - ShParam_2_8 - ShParam_2_9 - ShParam_3_1 - ShParam_3_2 - ShParam_3_3 - ShParam_3_4 - ShParam_3_5 - ShParam_3_6 - ShParam_3_7 - ShParam_3_8 - ShParam_3_9 - InitParamTable - TITLE - FILENAME - textMSROutput - FUnits - FApodization - FPlot - FrqMin - FrqMax - t01 - Bg11 - Bg21 - Data11 - Data21 - t02 - Bg12 - Bg22 - Data12 - Data22 - t03 - Bg13 - Bg23 - Data13 - Data23 - t04 - Bg14 - Bg24 - Data14 - Data24 - - - MuSRFit.ui.h - - - fileOpen() - fileSave() - fileChangeDir() - filePrint() - fileExit() - parametersExport() - parametersAppend() - editUndo() - editRedo() - editCut() - editCopy() - editPaste() - helpIndex() - helpContents() - helpAbout() - CreateAllInput() - CallMSRCreate() - UpdateMSRFileInitTable() - ActivateT0Hists() - ActivateShComp() - InitializeTab() - TabChanged() - GoFit() - GoPlot() - ShowMuSRT0() - T0Update() - RunSelectionToggle() - fileBrowse() - AppendToFunctions() - InitializeFunctions() - optionConfigure() - t0UpdateClicked() - - - diff --git a/src/external/MuSRFitGUI/devel/MuSRFit.ui.h b/src/external/MuSRFitGUI/devel/MuSRFit.ui.h deleted file mode 100755 index 60e5e46e..00000000 --- a/src/external/MuSRFitGUI/devel/MuSRFit.ui.h +++ /dev/null @@ -1,991 +0,0 @@ -/**************************************************************************** -** 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 theform'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 . -# -# Copyright 2009 by Zaher Salman and the LEM Group. -# - -void MuSRFitMenu::fileOpen() -{ - my $file=Qt::FileDialog::getOpenFileName( - ".", - "MSR Files (*.msr *.mlog)", - this, - "open file dialog", - "Choose a MSR file"); - print "Selected file: $file\n"; -# TODO: Possibly decipher the MSR file and setup the GUI accordingly -# Find run numbers, beamlines etc. -# Get theory block and understand it -# Get parameters list and update table - -} - - -void MuSRFitMenu::fileSave() -{ - my %All=CreateAllInput(); - my $FILENAME=$All{"FILENAME"}.".msr"; - my $file=Qt::FileDialog::getSaveFileName( - "$FILENAME", - "MSR Files (*.msr *.mlog)", - this, - "save file dialog", - "Choose a filename to save under"); - -# If the user gave a filename the copy to it - if ($file ne "") { -# TODO: check if the extension is correct, or add it. - if (-e $FILENAME) { - 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 MuSRFitMenu::fileChangeDir() -{ - my $newdir=Qt::FileDialog::getExistingDirectory( - "", - this, - "get existing directory", - "Choose a directory", - 1); - chdir ("$newdir"); -} - -void MuSRFitMenu::filePrint() -{ - -} - - -void MuSRFitMenu::fileExit() -{ - my $Ans = Qt::MessageBox::question( this, "Quit?","Are you sure you want to quit?","&Yes","&No","",0,1); - if ($Ans==0) { -# Then quit - Qt::Application::exit( 0 ); - } -# Otherwize go back -} - -void MuSRFitMenu::parametersExport() -{ - my %All=CreateAllInput(); -# Add also a flag for header - $All{"Header"}=1; - my $FILENAME=$All{"FILENAME"}.".dat"; - my $file=Qt::FileDialog::getSaveFileName( - "$FILENAME", - "Data Files (*.dat)", - this, - "export file dialog", - "Choose a filename to export to"); - -# If the user gave a filename the copy to it - if ($file ne "") { - my $Text = MSR::ExportParams(\%All); - open( DATF,q{>},"$file" ); - print DATF $Text; - close(DATF); - } -} - - -void MuSRFitMenu::parametersAppend() -{ - my %All=CreateAllInput(); -# Add also a flag for header - $All{"Header"}=0; - my $FILENAME=$All{"FILENAME"}.".dat"; - my $file=Qt::FileDialog::getOpenFileName( - "./", - "Data Files (*.dat)", - this, - "append file dialog", - "Choose a filename to append to"); - -# If the user gave a filename the copy to it - if ($file ne "") { - my $Text = MSR::ExportParams(\%All); - open( DATF,q{>>},"$file" ); - print DATF $Text; - close(DATF); - } -} - - -void MuSRFitMenu::editUndo() -{ - -} - - -void MuSRFitMenu::editRedo() -{ - -} - - -void MuSRFitMenu::editCut() -{ - -} - - -void MuSRFitMenu::editCopy() -{ - -} - - -void MuSRFitMenu::editPaste() -{ - -} - - -void MuSRFitMenu::helpIndex() -{ - -} - - -void MuSRFitMenu::helpContents() -{ - -} - -void MuSRFitMenu::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 . - - Copyright 2009 by Zaher Salman and the LEM Group. - - "; - my $AboutWindow = Qt::MessageBox::information( this, "About MuSRFit GUI",$AboutText); -} - -void MuSRFitform::CreateAllInput() -{ - my %All=(); - -# From RUNS Tab -# Run data file - $All{"RunNumbers"} = RunNumbers->text; - $All{"RunFiles"} = RunFiles->text; - $All{"BeamLine"} = BeamLine->currentText; - $All{"RUNSType"} = ManualFile->isOn(); - $All{"optionsFourier"} = optionsFourier->isOn(); - $All{"optionsT0"} = optionsT0->isOn(); - $All{"YEAR"} =YEAR->currentText; - if ($All{"YEAR"} eq "") { -# If year combobox is empty fill it up from 2004 up to current year - my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(); - my $current_year = 1900 + $yearOffset; - for (my $i=$current_year;$i>=2004;$i--) { - YEAR->insertItem($i,-1); - } - } -# Time range and BINS - $All{"Tis"} = Tis->text; - $All{"Tfs"} = Tfs->text; - $All{"BINS"} = BINS->text; - $All{"FitAsyType"} = FitAsyType->currentText; - $All{"LRBF"} = LRBF->text; - my @Hists = split(/,/, $All{"LRBF"} ); -# Lifetime corrections in enabled/visible only for SingleHis fits - if ( $All{"FitAsyType"} eq "Asymmetry" ) { - ltc->setHidden(1); - } - elsif ( $All{"FitAsyType"} eq "SingleHist" ) { - ltc->setHidden(0); - } - -# From Fitting Tab -# Plot range - $All{"Xi"}=Xi->text; - $All{"Xf"}=Xf->text; - $All{"Yi"}=Yi->text; - $All{"Yf"}=Yf->text; - $All{"ViewBin"}=ViewBin->text; -# Life time correction - if (ltc->isChecked()) { - $All{"ltc"}="y"; - } else { - $All{"ltc"}="n"; - } -# Minuit commands - if ( $All{"go"} eq "" ) { - $All{"go"}="PLOT"; - } -# Get minimization process - $All{"Minimization"} = Minimization->currentText(); - $All{"go"}=$All{"Minimization"}; - -# Get Error calculation process - $All{"ErrorCalc"} = ErrorCalc->currentText(); - $All{"go"}=$All{"ErrorCalc"}; - - RunSelectionToggle(); - my @RUNS = (); - if ($All{"RUNSType"} ) { - @RUNS = split( /,/, $All{"RunFiles"}); - } else { - $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; - @RUNS = split( /,/, $All{"RunNumbers"} ); - } - -# From MSR File Tab - $All{"TITLE"}= TITLE->text; - $All{"FILENAME"}= FILENAME->text; - -# From Fourier Tab - $All{"FUNITS"}= FUnits->currentText; - $All{"FAPODIZATION"}= FApodization->currentText; - $All{"FPLOT"}= FPlot->currentText; - $All{"FPHASE"}=FPHASE->text; -# Fourier range - $All{"FrqMin"}=FrqMin->text; - $All{"FrqMax"}=FrqMax->text; - -# Rotating reference frame parameters - $All{"RRFFrq"}=RRFFrq->text; - $All{"RRFPack"}=RRFPack->text; - $All{"RRFPhase"}=RRFPhase->text; - $All{"RRFUnits"}=RRFUnits->currentText; - -# Get values of t0 and Bg/Data bins if given - my $NHist = 1; - foreach my $Hist (@Hists) { - foreach ("t0","Bg1","Bg2","Data1","Data2") { - my $Name = "$_$NHist"; - $All{$Name}=child($Name)->text; -# TODO: If empty fill with defaults - if ($All{$Name} eq "") { - $All{$Name}=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); - child($Name)->setText($All{$Name}); - } - } - $NHist++; - } - -# 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,"MolMag", - 14,"Meissner", - 15,"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; - -# Functions block - $All{"FunctionsBlock"}=FunctionsBlock->text; -# and the associated theory block - $All{"Func_T_Block"}=TheoryBlock->text; - -# Shared settings are detected here - $All{"EnableSharing"} = buttonGroupSharing->isChecked(); - - 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, ( "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; -# TODO: I need to take care of single hist fits here - if ( $All{"FitAsyType"} eq "SingleHist" ) { - $Param=$Param.$Hists[0]; - } - if ( $#FitTypes != 0 && ( $Param ne "Alpha" && $Param ne "No" && $Param ne "NBg" ) ){ - $Param = join( "", $Param, "_", $Component); - } - -# Is there any point of sharing, multiple runs? - if ( $#RUNS == 0 && $All{"FitAsyType"} eq "Asymmetry") { - $Shared = 1; - } - elsif ( $#RUNS == 0 && $#Hists == 0 && $All{"FitAsyType"} eq "SingleHist" ) { - $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{"RUNSType"}) { - $All{"FILENAME"}=$RUNS[0]."_".$All{"BeamLine"}."_".$All{"YEAR"}; - if ($All{"BeamLine"} eq "LEM (PPC)") { - $All{"FILENAME"}=$RUNS[0]."_LEM_".$All{"YEAR"}; - } - } else { - $All{"FILENAME"}="TMP"; - } - - -# This has to be at the end of CreateAll - my %PTable=MSR::PrepParamTable(\%All); - -# Setup the table with the right size - my $NParam=scalar keys( %PTable ); - -# Read initial values of paramets from tabel - my $erradd = "d"; - my $minadd = "_min"; - my $maxadd = "_max"; - my $Header=InitParamTable->verticalHeader(); -# TODO: Should not go over all rows, only on parameters. - if ($NParam > 0) { - for (my $i=0;$i<$NParam;$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); - } - } - - -# Return Hash with all important values - return %All; -} - -void MuSRFitform::CallMSRCreate() -{ - use MSR; - my %All=CreateAllInput(); - -# Check if the option for checking for existing files is selected - my $FileExistCheck= FileExistCheck->isOn(); - my $FILENAME=$All{"FILENAME"}.".msr"; - my $Answer=0; - if ($All{"RunNumbers"} ne "" || $All{"RunFiles"} ne "") { - if ( $FileExistCheck==1 ) { - if (-e $FILENAME) { -# Warning: MSR file exists -# my $Warning = "Warning: MSR file $FILENAME Already exists!\nIf you continue it will overwriten."; - my $Warning = "Warning: MSR file $FILENAME Already exists!\nDo you want to overwrite it?"; -# my $WarningWindow = Qt::MessageBox::information( this, "Warning",$Warning); -# $Answer =1,0 for yes and no - $Answer= Qt::MessageBox::warning( this, "Warning",$Warning, "&No", "&Yes", undef, 1,1); - } - } else { -# Just overwrite file - $Answer=1; - } - - if ($Answer) { - if ( $All{"FitAsyType"} eq "Asymmetry" ) { - my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateMSR(\%All); - } - elsif ( $All{"FitAsyType"} eq "SingleHist" ) { - my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateMSRSingleHist(\%All); - } - UpdateMSRFileInitTable(); - } - } - return $Answer; -} - -void MuSRFitform::UpdateMSRFileInitTable() -{ - my %All=CreateAllInput(); - my $FILENAME=$All{"FILENAME"}; - open (MSRF,q{<},"$FILENAME.msr" ); - my @lines = ; - close(IFILE); - textMSROutput->setText(""); - foreach my $line (@lines) { - textMSROutput->append("$line"); - } - - (my $TBlock_ref, my $FPBlock_ref)=MSR::ExtractBlks(@lines); - my @FPBloc = @$FPBlock_ref; - - my $PCount=0; - foreach my $line (@FPBloc) { - $PCount++; - my @Param=split(/\s+/,$line); - -# Depending on how many elements in @Param determine what they mean -# 0th element is empty (always) -# 1st element is the order (always) -# 2nd element is the name (always) -# 3rd element is the value (always) -# 4th element can be taken as step/error (always) -# 5th element can be -# if it is last element or there are two more = positive error, check $#Param=5/7 -# if there is only one more = minimum, check $#Param=6 - -# To summarize, check the value of $#Param - my $value=1.0*$Param[3]; - my $error = 1.0*$Param[4]; - my $minvalue=0.0; - my $maxvalue=0.0; - if ($#Param == 4) { - $minvalue=0.0; - $maxvalue=0.0; - } - elsif ($#Param == 6) { - $minvalue=1.0*$Param[5]; - $maxvalue=1.0*$Param[6]; - } - elsif ($#Param == 5 || $#Param == 7) { - $minvalue=1.0*$Param[6]; - $maxvalue=1.0*$Param[7]; - } -# Now update the initialization tabel - InitParamTable->setText($PCount-1,0,$value); - InitParamTable->setText($PCount-1,1,$error); - InitParamTable->setText($PCount-1,2,$minvalue); - InitParamTable->setText($PCount-1,3,$maxvalue); -# Set bg color to mark different runs - } - return; -} - -void MuSRFitform::ActivateT0Hists() -{ - my %All=CreateAllInput(); - my @Hists = split(/,/, $All{"LRBF"} ); - my $HistBox = ""; - for (my $iHist=1; $iHist<=4; $iHist++) { - $HistBox="groupHist$iHist"; - my $HistBoxHandle = child($HistBox); - if ($iHist<=$#Hists+1) { -# Activate this histogram box - $HistBoxHandle->setHidden(0); - $HistBoxHandle->setEnabled(1); - $HistBoxHandle->setTitle("Hist # $Hists[$iHist-1]"); - } else { -# Deactivate this histogram box - $HistBoxHandle->setHidden(1); - $HistBoxHandle->setEnabled(0); - } - } - -# TODO: Set default values - -} - -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"}; - -# Possible to share only if sharing is enabled altogether - my $EnableSharing = $All{"EnableSharing"}; - if ($EnableSharing) { - 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, ( "No", "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<=9;$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() -{ - my %All=CreateAllInput(); - InitParamTable->setLeftMargin(100); - 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); -# InitParamTable->removeRow($i); - } - } - - my %PTable=MSR::PrepParamTable(\%All); - -# Setup the table with the right size - my $NParam=scalar keys( %PTable ); - if ($NParam>$NRows) { - InitParamTable->setNumRows($NParam); - } - -# Fill the table with labels and values of parametr - for (my $PCount=0;$PCount<$NParam;$PCount++) { - my ($Param,$value,$error,$minvalue,$maxvalue,$RUN) = split(/,/,$PTable{$PCount}); -# Now make sure we have no nans - if ($error eq "nan") { $error=0.1;} -# If you use this then reading the parameters from the table is a problem -# You need to extract the correct parameter name from the row label -# InitParamTable->verticalHeader()->setLabel( $PCount,"$RUN: $Param"); - InitParamTable->verticalHeader()->setLabel( $PCount,"$Param"); - InitParamTable->showRow($PCount); - InitParamTable->setText($PCount,0,$value); - InitParamTable->setText($PCount,1,$error); - InitParamTable->setText($PCount,2,$minvalue); - InitParamTable->setText($PCount,3,$maxvalue); - } -} - -void MuSRFitform::TabChanged() -{ -# TODO: First check if there are some runs given, otherwise disbale - my %All=CreateAllInput(); - -# First make sure we have sharing initialized - ActivateShComp(); -# Here we need to apply sharing if selected... - InitializeTab(); - UpdateMSRFileInitTable(); -# And also setup T0 and Bg bins - ActivateT0Hists(); - -# Initialize FUNCTIONS block only if it has not been initialized yet - if ($All{"Func_T_Block"} eq "" ) { - InitializeFunctions(); - } -} - - -void MuSRFitform::GoFit() -{ - my %All=CreateAllInput(); -# Check here is the number of histograms makes sense -# other wise give error. - my @Hists = split( /,/, $All{"LRBF"} ); - if ($All{"FitAsyType"} eq "Asymmetry" && $#Hists != 1) { -# we have a problem here send error message - my $Warning = "Error: The number of histograms should be 2 for an asymmetry fit!"; - my $WarningWindow = Qt::MessageBox::information( this, "Error",$Warning); - } else { - musrfit_tabs->setCurrentPage(1); - my $Answer=CallMSRCreate(); - if ($Answer) { - my $FILENAME=$All{"FILENAME"}.".msr"; - if (-e $FILENAME) { - my $cmd="musrfit -t $FILENAME"; - my $pid = open(FTO,"$cmd 2>&1 |"); - while () { - FitTextOutput->append("$_"); - } - 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::GoPlot() -{ - my %All=CreateAllInput(); -# Check here is the number of histograms makes sense -# other wise give error. - my @Hists = split( /,/, $All{"LRBF"} ); - if ($All{"FitAsyType"} eq "Asymmetry" && $#Hists != 1) { -# we have a problem here send error message - my $Warning = "Error: The number of histograms should be 2 for an asymmetry fit!"; - my $WarningWindow = Qt::MessageBox::information( this, "Error",$Warning); - } else { - my $Answer=CallMSRCreate(); - my $FILENAME=$All{"FILENAME"}.".msr"; - if ($Answer) { - if (-e $FILENAME) { - my $cmd="musrview $FILENAME &"; - my $pid = system($cmd); - } else { - FitTextOutput->append("Cannot find MSR file!"); - FitTextOutput->append("-----------------------------------------------------------------------------------------------------------------------------"); - } - } - } - return; -} - - -void MuSRFitform::ShowMuSRT0() -{ - my %All=CreateAllInput(); - musrfit_tabs->setCurrentPage(6); -# Create MSR file and then run musrt0 - my $Answer=CallMSRCreate(); - - if ($Answer) { - my $FILENAME=$All{"FILENAME"}.".msr"; - if (-e $FILENAME) { - my $cmd="musrt0 $FILENAME &"; - my $pid = system($cmd); - t0Update->setEnabled(1) - } else { - print STDERR "Cannot find MSR file!\n"; - } - } - return; -} - - -void MuSRFitform::T0Update() -{ - my %All = CreateAllInput(); - my @Hists = split(/,/, $All{"LRBF"} ); - -# Get values of t0 and Bg/Data bins if given - my $NHist = 1; - foreach my $Hist (@Hists) { - foreach ("t0","Bg1","Bg2","Data1","Data2") { - my $Name = "$_$NHist"; - my $tmp=MSR::T0BgData($_,$Hist,$All{"BeamLine"}); - child($Name)->setText($tmp); - } - $NHist++ - } - -} - - -void MuSRFitform::RunSelectionToggle() -{ - my $ManualFile= ManualFile->isOn(); - if ($ManualFile) { -# Manual RUN selection - RUNSMan->setEnabled(1); - RUNSMan->setHidden(0); - RunNumbers->setText(""); - RUNSAuto->setEnabled(0); - RUNSAuto->setHidden(1); - } else { -# Auto RUN selection - RUNSMan->setEnabled(0); - RUNSMan->setHidden(1); - RunFiles->setText(""); - RUNSAuto->setEnabled(1); - RUNSAuto->setHidden(0); - } - -# Also use this for other options -# Fourier toggle - my $Fourier=optionsFourier->isOn(); - if ($Fourier) { -# Fourier tab visible -# musrfit_tabs->addTab(FourierPage,"Fourier"); -# musrfit_tabs->showPage(FourierPage); -# FourierPage->hide(); - } else { -# Fourier tab invisible -# musrfit_tabs->removePage(FourierPage); -# FourierPage->show(); - } -} - -void MuSRFitform::fileBrowse() -{ - my $RunFiles=RunFiles->text(); - print "Runs:$RunFiles\n"; - my $files_ref=Qt::FileDialog::getOpenFileNames( - "Data files (*.root *.bin)", - "./", - this, - "open files dialog", - "Select one or more files to fit"); - my @files = @$files_ref; - if ($RunFiles eq "") { -# We started with an empty list - $RunFiles=join(",",@files); - } else { -# Add files to existing list - $RunFiles=join(",",$RunFiles,@files); - } - RunFiles->setText($RunFiles); -} - -void MuSRFitform::AppendToFunctions() -{ - my $ParName=CParamsCombo->currentText(); - my $Full_T_Block=TheoryBlock->text; - my $Constraint=ConstraintLine->text; -# Then clear the text - ConstraintLine->setText(""); - -# Check how many constraints (lines) in FUNCTIONS Block - my $i=FunctionsBlock->lines(); - my $ConstLine="fun$i = $Constraint\n"; - FunctionsBlock->append($ConstLine); - -# Replace parameter in theory block with fun$i - $Full_T_Block=~ s/$ParName/fun$i/; - TheoryBlock->setText($Full_T_Block); -} - -void MuSRFitform::InitializeFunctions() -{ - 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 ); - } - } - -# Get number of parameters to determine the size of the table - my ($Full_T_Block,$Paramcomp_ref)= MSR::CreateTheory(@FitTypes); - my @Paramcomp = @$Paramcomp_ref; - my $Full_T_Block= $All{"Full_T_Block"}; - -# Initialize Parameters List in function block (constraints). - my $ParametersList=""; - ParametersList->setText(""); -# Counter for function block (with out Alpha etc.) - my $ParCount=0; - CParamsCombo->clear(); - -# Possibly use the parameters block to axtract names for the dropdown menu -# this makes sense if we can use fun in map line. Check! - my $Component=1; - foreach my $FitType (@FitTypes) { - my $Parameters=$Paramcomp[$Component-1]; - my @Params = split( /\s+/, $Parameters ); - -# Alpha, No and NBg are counted in the parameters - if ( $Component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) { - unshift( @Params, "Alpha" ); - } - elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { - unshift( @Params, ( "No", "NBg" ) ); - } - -# Add list to the constraints drop down menu - for (my $i=1; $i<=9;$i++) { - my $CParam = $Params[$i-1]."_".$Component; - if ($Params[$i-1] ne "" ) { - if ($Params[$i-1] ne "Alpha" && $Params[$i-1] ne "No" && $Params[$i-1] ne "NBg") { - CParamsCombo->insertItem($CParam,-1); - $Full_T_Block=~ s/\b$Params[$i-1]\b/$CParam/; - } -# also enumerate the parameters as should be used in the FUNCTIONS Block - $ParCount++; - $ParametersList=$ParametersList."$CParam \t is \t par$ParCount\n"; - ParametersList->setText($ParametersList); - } - } - $Component++; - } -# Set theory block in Constraints - TheoryBlock->setText($Full_T_Block); -# Then clear the text - ConstraintLine->setText(""); - FunctionsBlock->setText(""); -} - - -void MuSRFitform::optionConfigure() -{ - use Customize; - - my $Customize = Qt::Dialog(this); - my $w = Customize; - $w->setModal(1); - $w->exec(); -# $Customize->setMainWidget($w); -# $w->show; -# exit $Customize->exec; - -} - -void MuSRFitform::t0UpdateClicked() -{ -# Read MSR file and get new values of t0,Bg and Data - my %All=CreateAllInput(); - my $FILENAME=$All{"FILENAME"}; - open (MSRF,q{<},"$FILENAME.msr" ); - my @lines = ; - close(IFILE); - - my @T0s = grep {/t0 /} @lines; - my @Bgs = grep {/background /} @lines; - my @Datas = grep {/data /} @lines; - - my @Hists = split(/,/, $All{"LRBF"} ); - my $NHist = $#Hists+1; - print "Histograms: $NHist\n"; - - my $FinHist = 1; -# First T0s - while ($FinHist) { - my $counter=0; - (my $tmp,my @SplitT0) = split( /\s+/, $T0s[$counter]); - (my $tmp,my @SplitBg) = split( /\s+/, $Bgs[$counter]); - (my $tmp,my @SplitData) = split( /\s+/, $Datas[$counter]); - if ($#SplitBg>0) { - foreach (@SplitBg) { - print $_."\n"; - } - } - $counter++; - if ($counter>=$#Bgs) {$FinHist=0;} - } - -# Finally, disable the update button - t0Update->setEnabled(0); -# t0Update->setText("musrt0") -} From 7a87bb1141d82d4d446b0681b148368890057af0 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 23 May 2017 12:54:31 +0000 Subject: [PATCH 13/87] README.md edited online with Bitbucket --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 84454b3e..c0a546b9 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Currently it allows the following things: * Linux * Mac OS X -* Windows - not really, only for the very brave ones +* Windows - not really, but possible. ### Documentation #### @@ -29,5 +29,4 @@ For a more exhaustive user documentation see: ### Contact ### - - + \ No newline at end of file From 852f9eafe66b6e2592d5ca33a8df3c7dcd8a75f2 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 23 May 2017 12:55:14 +0000 Subject: [PATCH 14/87] README.md edited online with Bitbucket --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c0a546b9..63208d2d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# musrfit - muSR data analysis package # +# musrfit - muSR and beta-NMR data analysis package # ### Contents ### From a1c4c4cc02e9af915756e796412a6057be20f113 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Thu, 1 Jun 2017 13:04:19 +0200 Subject: [PATCH 15/87] Minor error corrections in messages --- src/classes/PRunAsymmetry.cpp | 18 +++++++++--------- src/classes/PRunAsymmetryRRF.cpp | 18 +++++++++--------- src/classes/PRunMuMinus.cpp | 10 +++++----- src/classes/PRunSingleHisto.cpp | 18 +++++++++--------- src/classes/PRunSingleHistoRRF.cpp | 10 +++++----- 5 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/classes/PRunAsymmetry.cpp b/src/classes/PRunAsymmetry.cpp index f86b13e2..e4517dd5 100644 --- a/src/classes/PRunAsymmetry.cpp +++ b/src/classes/PRunAsymmetry.cpp @@ -635,7 +635,7 @@ Bool_t PRunAsymmetry::PrepareData() cerr << endl << ">> Will try the following:"; cerr << endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); cerr << endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); - cerr << endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; cerr << endl; if (!SubtractEstimatedBkg()) return false; @@ -1585,7 +1585,7 @@ Bool_t PRunAsymmetry::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalB cerr << endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1597,7 +1597,7 @@ Bool_t PRunAsymmetry::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalB cerr << endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1669,7 +1669,7 @@ Bool_t PRunAsymmetry::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalB cerr << endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1681,7 +1681,7 @@ Bool_t PRunAsymmetry::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalB cerr << endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1734,28 +1734,28 @@ Bool_t PRunAsymmetry::GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2] start[0] = (Int_t)t0[0]+offset; fRunInfo->SetDataRange(start[0], 0); cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } if (start[1] < 0) { start[1] = (Int_t)t0[1]+offset; fRunInfo->SetDataRange(start[1], 2); cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } if (end[0] < 0) { end[0] = runData->GetDataBin(histoNo[0])->size(); fRunInfo->SetDataRange(end[0], 1); cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } if (end[1] < 0) { end[1] = runData->GetDataBin(histoNo[1])->size(); fRunInfo->SetDataRange(end[1], 3); cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } diff --git a/src/classes/PRunAsymmetryRRF.cpp b/src/classes/PRunAsymmetryRRF.cpp index ba172879..68723bd7 100644 --- a/src/classes/PRunAsymmetryRRF.cpp +++ b/src/classes/PRunAsymmetryRRF.cpp @@ -627,7 +627,7 @@ Bool_t PRunAsymmetryRRF::PrepareData() cerr << endl << ">> Will try the following:"; cerr << endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); cerr << endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); - cerr << endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; cerr << endl; if (!SubtractEstimatedBkg()) return false; @@ -1225,7 +1225,7 @@ Bool_t PRunAsymmetryRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glob cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1237,7 +1237,7 @@ Bool_t PRunAsymmetryRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glob cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1309,7 +1309,7 @@ Bool_t PRunAsymmetryRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glob cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1321,7 +1321,7 @@ Bool_t PRunAsymmetryRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glob cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1374,28 +1374,28 @@ Bool_t PRunAsymmetryRRF::GetProperDataRange(PRawRunData* runData, UInt_t histoNo start[0] = (Int_t)t0[0]+offset; fRunInfo->SetDataRange(start[0], 0); cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } if (start[1] < 0) { start[1] = (Int_t)t0[1]+offset; fRunInfo->SetDataRange(start[1], 2); cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } if (end[0] < 0) { end[0] = runData->GetDataBin(histoNo[0])->size(); fRunInfo->SetDataRange(end[0], 1); cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } if (end[1] < 0) { end[1] = runData->GetDataBin(histoNo[1])->size(); fRunInfo->SetDataRange(end[1], 3); cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } diff --git a/src/classes/PRunMuMinus.cpp b/src/classes/PRunMuMinus.cpp index 244b9bb1..da89d85a 100644 --- a/src/classes/PRunMuMinus.cpp +++ b/src/classes/PRunMuMinus.cpp @@ -658,7 +658,7 @@ Bool_t PRunMuMinus::PrepareRawViewData(PRawRunData* runData, const UInt_t histoN start = ((Int_t)fT0s[0]+offset) - (((Int_t)fT0s[0]+offset)/packing)*packing; end = start + ((fForward.size()-start)/packing)*packing; cerr << endl << ">> PRunMuMinus::PrepareData(): **WARNING** data range was not provided, will try data range start = " << start << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } // check if start, end, and t0 make any sense @@ -807,7 +807,7 @@ Bool_t PRunMuMinus::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlo cerr << endl << ">> PRunMuMinus::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(histoNo[i]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -865,7 +865,7 @@ Bool_t PRunMuMinus::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlo cerr << endl << ">> PRunMuMinus::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(histoNo[j]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -919,14 +919,14 @@ Bool_t PRunMuMinus::GetProperDataRange() start = (Int_t)fT0s[0]+offset; fRunInfo->SetDataRange(start, 0); cerr << endl << ">> PRunMuMinus::GetProperDataRange(): **WARNING** data range was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } if (end < 0) { end = fForward.size(); fRunInfo->SetDataRange(end, 1); cerr << endl << ">> PRunMuMinus::GetProperDataRange(): **WARNING** data range was not provided, will try data range end = " << end << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } diff --git a/src/classes/PRunSingleHisto.cpp b/src/classes/PRunSingleHisto.cpp index 23738b70..4e09ff33 100644 --- a/src/classes/PRunSingleHisto.cpp +++ b/src/classes/PRunSingleHisto.cpp @@ -856,7 +856,7 @@ Bool_t PRunSingleHisto::PrepareFitData(PRawRunData* runData, const UInt_t histoN fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); cerr << endl << ">> PRunSingleHisto::PrepareFitData(): **WARNING** Neither fix background nor background bins are given!"; cerr << endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; cerr << endl; if (!EstimateBkg(histoNo)) return false; @@ -955,7 +955,7 @@ Bool_t PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const UInt_t hi start = ((Int_t)fT0s[0]+offset) - (((Int_t)fT0s[0]+offset)/packing)*packing; end = start + ((fForward.size()-start)/packing)*packing; cerr << endl << ">> PRunSingleHisto::PrepareRawViewData(): **WARNING** data range was not provided, will try data range start = " << start << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } // check if start, end, and t0 make any sense @@ -1041,7 +1041,7 @@ Bool_t PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const UInt_t hi fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); cerr << endl << ">> PRunSingleHisto::PrepareRawViewData(): **WARNING** Neither fix background nor background bins are given!"; cerr << endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; cerr << endl; if (!EstimateBkg(histoNo)) return false; @@ -1151,7 +1151,7 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo start = ((Int_t)fT0s[0]+offset) - (((Int_t)fT0s[0]+offset)/packing)*packing; end = start + ((fForward.size()-start)/packing)*packing; cerr << endl << ">> PRunSingleHisto::PrepareViewData(): **WARNING** data range was not provided, will try data range start = " << start << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } @@ -1215,7 +1215,7 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); cerr << endl << ">> PRunSingleHisto::PrepareViewData(): **WARNING** Neither fix background nor background bins are given!"; cerr << endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; cerr << endl; if (!EstimateBkg(histoNo)) return false; @@ -1423,7 +1423,7 @@ Bool_t PRunSingleHisto::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globa cerr << endl << ">> PRunSingleHisto::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(histoNo[i]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1481,7 +1481,7 @@ Bool_t PRunSingleHisto::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globa cerr << endl << ">> PRunSingleHisto::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(histoNo[j]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -1535,14 +1535,14 @@ Bool_t PRunSingleHisto::GetProperDataRange() start = (Int_t)fT0s[0]+offset; fRunInfo->SetDataRange(start, 0); cerr << endl << ">> PRunSingleHisto::GetProperDataRange(): **WARNING** data range was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } if (end < 0) { end = fForward.size(); fRunInfo->SetDataRange(end, 1); cerr << endl << ">> PRunSingleHisto::GetProperDataRange(): **WARNING** data range was not provided, will try data range end = " << end << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } diff --git a/src/classes/PRunSingleHistoRRF.cpp b/src/classes/PRunSingleHistoRRF.cpp index d43546ae..a1b38bc5 100644 --- a/src/classes/PRunSingleHistoRRF.cpp +++ b/src/classes/PRunSingleHistoRRF.cpp @@ -588,7 +588,7 @@ Bool_t PRunSingleHistoRRF::PrepareFitData(PRawRunData* runData, const UInt_t his fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); cerr << endl << ">> PRunSingleHistoRRF::PrepareFitData(): **WARNING** Neither fix background nor background bins are given!"; cerr << endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; cerr << endl; if (!EstimateBkg(histoNo)) return false; @@ -832,7 +832,7 @@ Bool_t PRunSingleHistoRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *gl cerr << endl << ">> PRunSingleHistoRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(histoNo[i]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -890,7 +890,7 @@ Bool_t PRunSingleHistoRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *gl cerr << endl << ">> PRunSingleHistoRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(histoNo[j]); - cerr << endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; cerr << endl; } } @@ -944,14 +944,14 @@ Bool_t PRunSingleHistoRRF::GetProperDataRange() start = (Int_t)fT0s[0]+offset; fRunInfo->SetDataRange(start, 0); cerr << endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **WARNING** data range was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } if (end < 0) { end = fForward.size(); fRunInfo->SetDataRange(end, 1); cerr << endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **WARNING** data range was not provided, will try data range end = " << end << "."; - cerr << endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; cerr << endl; } From 34ef2ea926af326d3ce32cea1f204486c5d00fe0 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 19 Jan 2018 11:32:20 +0100 Subject: [PATCH 16/87] Fixed a bug in the calculation of SExpRlx for beta-NMR (reported by Gerald Morris)/ --- src/external/libBNMR/TBNMR.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/external/libBNMR/TBNMR.cpp b/src/external/libBNMR/TBNMR.cpp index bf139803..245f820c 100644 --- a/src/external/libBNMR/TBNMR.cpp +++ b/src/external/libBNMR/TBNMR.cpp @@ -88,15 +88,15 @@ double SExpRlx::operator()(double x, const vector &par) const { if ( x >= 0 && x <= par[0] ) { - TF1 sexp("sexp", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 10000.0); + TF1 sexp("sexp", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); sexp.SetParameters(x, par[1], par[2],tau_Li); sexp.SetNpx(1000); y=sexp.Integral(0.0,x)/(1-exp(-x/tau_Li))/tau_Li; } else if ( x > par[0] ) { - TF1 sexp("sexp", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 10000.0); + TF1 sexp("sexp", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); sexp.SetParameters(x, par[1], par[2], par[0],tau_Li); sexp.SetNpx(1000); - y=sexp.Integral(0.0,par[0])/(1-exp(-x/tau_Li))/tau_Li; + y=sexp.Integral(0.0,par[0])/(1-exp(-par[0]/tau_Li))/tau_Li; } else { y = 0; } @@ -124,7 +124,7 @@ double MLRes::operator()(double x, const vector &par) const { TF1 sexp("sexp", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 10000.0); sexp.SetParameters(x, par[1], par[2], par[0],tau_Li); sexp.SetNpx(1000); - y=sexp.Integral(0.0,par[0])/(1-exp(-x/tau_Li))/tau_Li; + y=sexp.Integral(0.0,par[0])/(1-exp(-par[0]/tau_Li))/tau_Li; } else { y = 0; } From c02df731498e51b0c94d87e466bb2f0b1e5737a2 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 29 Jan 2018 15:23:13 +0100 Subject: [PATCH 17/87] 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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 Date: Tue, 6 Feb 2018 08:52:05 +0100 Subject: [PATCH 18/87] Partial implementation of global fit option using msr2data. --- src/external/MuSRFitGUI/MSR.pm | 1198 +++++------------------- src/external/MuSRFitGUI/MuSRFit4.pm | 94 +- src/external/MuSRFitGUI/MuSRFit4.ui | 9 +- src/external/MuSRFitGUI/Ui_MuSRFit4.pm | 7 +- 4 files changed, 304 insertions(+), 1004 deletions(-) diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm index 51ff9913..c006d29d 100644 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -50,796 +50,6 @@ my $erradd = "d"; my $minadd = "_min"; my $maxadd = "_max"; - - -sub CreateMSR { -########################################################################## -# 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 -# -########################################################################## - 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; - } - - # $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; - } - } - - # Initialise $shcount, a counter for shared parameters - my $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 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 ]; - 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"; - - # 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; - } - ++$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 -############################################################### -$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 -# -########################################################################## - 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"} ); - 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 - $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; - } - - # Until here identical to sub CreateMSR - # $shcount is a counter for shared parameters - if ( $#RUNS == 0 && $#Hists == 0) { - my $shcount = 1; - } else { - if ( $All{"Sh_No"} == 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; - my $iHist = 0; - 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 - 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; - } - # Otherwise check input if it was marked as shared - else { - $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 - # Now deal with physical parameters and phases - elsif ( $Param_ORG ne "Phi" && $Param_ORG ne "No" && $Param_ORG ne "NBg") { - - } -#################################################################################################### - - # 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"}; - } - - # $MAP_Line = "map 0 0 0 0 0 0 0 0 0 0"; - $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; - } - - # From here again identical to sub CreateMSR - # The number of runs is - $NRUNS = $iRun - 1; - # Start constructing all block - 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 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 @@ -900,18 +110,7 @@ sub CreateMSRUni { 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"}; } @@ -938,7 +137,7 @@ sub CreateMSRUni { my $PLT = 2; # For SingleHist fit - if ($All{"FitAsyType"} eq "SingleHist") { $PLT = 0;} + if ($All{"FitAsyType"} eq "SingleHist" ) { $PLT = 0;} # Need to select here RUNSAuto or RUNSManual # $RUNSType = 0 (Auto) or 1 (Manual) @@ -948,13 +147,12 @@ sub CreateMSRUni { # Remove spaces and other illegal characters $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; $All{"RunNumbers"} =~ s/[a-zA-Z]//g; - # Expand hyphens + # Expand hyphens and colons $All{"RunNumbers"} = MSR::ExpandRunNumbers($All{"RunNumbers"}); # Split commas @RUNS=split( /,/, $All{"RunNumbers"}); $RUNSType = 0; - } - elsif ($All{"RunFiles"} ne $EMPTY) { + } elsif ($All{"RunFiles"} ne $EMPTY) { @RUNS=split( /,/, $All{"RunFiles"}); $RUNSType = 1; } @@ -966,9 +164,8 @@ sub CreateMSRUni { # range order my $Range_Order = 1; - my $iHist = 0; foreach my $RUN (@RUNS) { - if ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsyGLB") { + if ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB") { # Prepare the Parameters and initial values block my $component = 0; my $Single_RUN = $EMPTY; @@ -1056,7 +253,7 @@ sub CreateMSRUni { $RUN = $RUNS[ $iRun - 1 ]; - $DEBUG = $DEBUG.MSR::CreateRUNBlk($RUN, $YEAR, $BeamLine, $All{"FitAsyType"}, $All{"LRBF"}, $All{"Tis"}, $All{"Tfs"}, $All{"BINS"}); + #$DEBUG = $DEBUG.MSR::CreateRUNBlk($RUN, $YEAR, $BeamLine, $All{"FitAsyType"}, $All{"LRBF"}, $All{"Tis"}, $All{"Tfs"}, $All{"BINS"}); my $RUN_Line = $EMPTY; if ($All{"RUNSType"}) { @@ -1106,9 +303,9 @@ sub CreateMSRUni { "$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/; + #$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; @@ -1132,13 +329,19 @@ sub CreateMSRUni { } } 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 + # 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 + + # iHist is the histogram counter, used to catch Phi + my $iHist = 1; foreach my $Hist (@Hists) { # Prepare the Parameters and initial values block my $component = 0; @@ -1160,7 +363,15 @@ sub CreateMSRUni { my @Params = split( /\s+/, $Parameters ); # Only the first histiograms has new physical parameters # the others keep only Phi if they have it - + if ($iHist != 1 ) { + # @Param contains only Phi + if (grep(/Phi/,@Params)) { + @Params=("Phi"); + } else { + @Params=(); + } + } + # For the first component we need No and NBg for SingleHist fits if ( $component == 1 ) { unshift( @Params, ( "No", "NBg" ) ); @@ -1168,7 +379,8 @@ sub CreateMSRUni { foreach my $Param (@Params) { my $Param_ORG = $Param; - $Param=$Param.$Hist; + # Tag with histogram number only No, NBg and Phi + if ($Param_ORG =~ m/^(No|NBg|Phi)/ ) {$Param=$Param.$Hist;} if ( ($#FitTypes != 0) && !( $Param_ORG =~ m/^(No|NBg)/ ) ) { $Param = join( $EMPTY, $Param, "_", "$component" ); } @@ -1208,21 +420,23 @@ sub CreateMSRUni { $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; - } + if ((($Shared && $iRun == 1) || $#RUNS == 0) && $Param_ORG ne "Phi" ) { + # Do not map a parameter if + # - it is shared and this is the first run + # - this is a single run fit + # it is enough to keep order from first run + $Full_T_Block =~ s/$Param_ORG/$PCount/; + if ($Shared) {++$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)) { +# if ( !( $Param_ORG =~ m/^(No|NBg)/ ) && ($#RUNS != 0 || $#Hist != 0)) { + if ( !( $Param_ORG =~ m/^(No|NBg)/ ) ) { + $DEBUG = $DEBUG."# I am here: $Param_ORG\n"; ++$nonsh; $Full_T_Block =~ s/$Param_ORG/map$nonsh/; $MAP_Line = join( ' ', $MAP_Line, $PCount ); @@ -1241,7 +455,7 @@ sub CreateMSRUni { $RUN = $RUNS[ $iRun - 1 ]; - $DEBUG = $DEBUG.MSR::CreateRUNBlk($RUN, $YEAR, $BeamLine, $All{"FitAsyType"}, $All{"LRBF"}, $All{"Tis"}, $All{"Tfs"}, $All{"BINS"}); + #$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); @@ -1278,9 +492,9 @@ sub CreateMSRUni { . "$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/; + #$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; @@ -1418,11 +632,13 @@ sub CreateMSRGLB { } else { @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); # Make example from first run - $All{"RunNumbers"}=$RUNS[0]; + $All{"RunNumbers"}=$RUNS[0]; } my ($Full_T_Block,$Paramcomp_ref,$MSRTemplate)= MSR::CreateMSRUni(\%All); +# It is better to call msr2data here, but can we do that without writing to the disk? Not yet. + # Return as usual my @Paramcomp = @$Paramcomp_ref; @@ -1802,56 +1018,10 @@ sub PrepParamTable { # Function return a Hash with a table of parameters for the fit # input should be # %All +# output is +# hash of parameter table +# %ParTable = PCount / $Param,$value,$error,$minvalue,$maxvalue,$RUN ######################## -# Take this information as input arguments -# "Smart" default value of the fit parameters. - my %Defaults = ( - "Asy", "0.20", "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", - "Frql", "1.0", "dFrql", "1.", - "Frql_min", "0", "Frql_max", "0", - "Frqg", "1.0", "dFrqg", "1.", - "Frqg_min", "0", "Frqg_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"; @@ -1867,7 +1037,13 @@ sub PrepParamTable { if ($All{"RUNSType"}) { @RUNS = split( /,/, $All{"RunFiles"} ); } else { - @RUNS = split( /,/, $All{"RunNumbers"} ); + # Remove spaces and other illegal characters + $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; + $All{"RunNumbers"} =~ s/[a-zA-Z]//g; + # Expand hyphens and colons + $All{"RunNumbers"} = MSR::ExpandRunNumbers($All{"RunNumbers"}); + # Split commas + @RUNS=split( /,/, $All{"RunNumbers"}); } my @Hists = split( /,/, $All{"LRBF"} ); @@ -1890,20 +1066,20 @@ sub PrepParamTable { my $Component=1; foreach my $RUN (@RUNS) { - $iRun++; - $Component=1; - if ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsyGLB") { - foreach my $FitType (@FitTypes) { - my $Parameters=$Paramcomp[$Component-1]; - my @Params = split( /\s+/, $Parameters ); + $iRun++; + $Component=1; + if ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB") { + 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 + # This is the counter for parameters of this component my $NP=1; $Shared = 0; -# Change state/label of parameters + # Change state/label of parameters foreach my $Param (@Params) { my $Param_ORG = $Param; if ( $#FitTypes != 0 && ( $Param ne "Alpha" ) ){ @@ -1912,31 +1088,36 @@ sub PrepParamTable { $Shared = $All{"Sh_$Param"}; if ( $Shared!=1 || $iRun == 1 ) { -# It there are multiple runs index the parameters accordingly + # It there are multiple runs index the + # parameters accordingly my $RUNtmp = sprintf("%04d",$RUN); if ($All{"RUNSType"}) { $RUNtmp = $iRun; } if ($Shared!=1) {$Param=$Param."_".$RUNtmp;} -# Check if this parameter has been initialized befor. If not take from defaults + # 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 ?? + # 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 + # ?? - -# We have two options here, either take default values or take values of previous -# run if available -# $ParamPrev =~ s/$iRun-1/$iRun/g; - $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 ) }; + # We have two options here, either take + # default values or take values of + # previous run if available + + # $ParamPrev =~ s/$iRun-1/$iRun/g; + $value = MSR::Defaults{$Param_ORG}; + $error = MSR::Defaults{ join( $EMPTY, $erradd, $Param_ORG ) }; + $minvalue = MSR::Defaults{ join($EMPTY, $Param_ORG, $minadd ) }; + $maxvalue = MSR::Defaults{ join($EMPTY, $Param_ORG, $maxadd ) }; } $values=join(",",$Param,$value,$error,$minvalue,$maxvalue,$RUN); $ParTable{$PCount}=$values; @@ -1944,52 +1125,69 @@ sub PrepParamTable { } $NP++; } - $Component++; - } - } - 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; + $Component++; + } + } else { + # For a single histogram fit we basically need to repeat + # this for each hist + my $iHist = 1; + foreach my $Hist (@Hists) { + $Component=1; foreach my $FitType (@FitTypes) { my $Parameters=$Paramcomp[$Component-1]; - my @Params = split( /\s+/, $Parameters ); + my @Params = split( /\s+/, $Parameters ); + # Only the first Hist gets new physical + # parameters, the rest only Phi if present + if ($iHist != 1 ) { + # does @Param contains only Phi + if (grep(/Phi/,@Params)) { + @Params=("Phi"); + } else { + @Params=(); + } + } if ( $Component == 1 ) { unshift( @Params, ( "No", "NBg" ) ); } -# This is the counter for parameters of this component + # This is the counter for parameters of this component my $NP=1; $Shared = 0; -# Change state/label of parameters + # Change state/label of parameters foreach my $Param (@Params) { my $Param_ORG = $Param; - # If multiple histograms (sum or difference) take the first histogram only + # If multiple histograms (sum or difference) + # take the first histogram only ($Hist,$tmp) = split(/ /,$Hist); - $Param=$Param.$Hist; + # Tag with histogram number only No, NBg and Phi + if ($Param_ORG =~ m/^(No|NBg|Phi)/ ) {$Param=$Param.$Hist;} if ( $#FitTypes != 0 && ( $Param_ORG ne "No" && $Param_ORG ne "NBg" ) ){ $Param = join( $EMPTY, $Param, "_", "$Component" ); } $Shared = $All{"Sh_$Param"}; if ( $Shared!=1 || $iRun == 1 ) { -# It there are multiple runs index the parameters accordingly + # 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 + # 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 ) }; + # 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 = MSR::Defaults{$Param_ORG}; + $error = MSR::Defaults{ join( $EMPTY, $erradd, $Param_ORG ) }; + $minvalue = MSR::Defaults{ join($EMPTY, $Param_ORG, $minadd ) }; + $maxvalue = MSR::Defaults{ join($EMPTY, $Param_ORG, $maxadd ) }; } $values=join(",",$Param,$value,$error,$minvalue,$maxvalue,$RUN); $ParTable{$PCount}=$values; @@ -1999,9 +1197,9 @@ sub PrepParamTable { } $Component++; } + ++$iHist; } } - } return %ParTable; } @@ -2012,12 +1210,14 @@ sub ExportParams { # Function return a tab separated table of parameters for the fit # input should be # %All +# output is +# $TABLE containing an ascii table of fit parameters ######################## my $erradd = "d"; my $minadd = "_min"; my $maxadd = "_max"; -# First assume nothing is shared + # First assume nothing is shared my $Shared = 0; my $TABLE=$EMPTY; @@ -2029,7 +1229,13 @@ sub ExportParams { if ($All{"RUNSType"}) { @RUNS = split( /,/, $All{"RunFiles"} ); } else { - @RUNS = split( /,/, $All{"RunNumbers"} ); + # Remove spaces and other illegal characters + $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; + $All{"RunNumbers"} =~ s/[a-zA-Z]//g; + # Expand hyphens and colons + $All{"RunNumbers"} = MSR::ExpandRunNumbers($All{"RunNumbers"}); + # Split commas + @RUNS=split( /,/, $All{"RunNumbers"}); } my @Hists = split( /,/, $All{"LRBF"} ); @@ -2037,14 +1243,15 @@ sub ExportParams { 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 + # 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"}; + # 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"}; -# Then loop over expected parameters and extract their values and error bar + # Then loop over expected parameters and extract their values and + # error bar my $PCount =0; my $iRun =0; my $value =0; @@ -2065,10 +1272,10 @@ sub ExportParams { unshift( @Params, "Alpha" ); } -# This is the counter for parameters of this component + # This is the counter for parameters of this component my $NP=1; $Shared = 0; -# Change state/label of parameters + # Change state/label of parameters foreach my $Param (@Params) { my $Param_ORG = $Param; if ( $#FitTypes != 0 && ( $Param ne "Alpha" ) ){ @@ -2081,10 +1288,12 @@ sub ExportParams { $Shared = $All{"Sh_$Param"}; if ( $Shared!=1 || $iRun == 1 ) { -# If there are multiple runs index the parameters accordingly + # If 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. (should be) + # Check if this parameter has been initialized + # befor. (should be) $value = $All{"$Param"}; $error = $All{"$erradd$Param"}; @@ -2092,7 +1301,8 @@ sub ExportParams { $PCount++; } elsif ($Shared==1) { -# The parameter is shared, take the value from the first run + # The parameter is shared, take the value from + # the first run $Param=$Param; $value = $All{"$Param"}; $error = $All{"$erradd$Param"}; @@ -2104,7 +1314,8 @@ sub ExportParams { } } elsif ($All{"FitAsyType"} eq "SingleHist" ) { -# For a single histogram fit we basically need to repeat this for each hist + # For a single histogram fit we basically need to repeat + # this for each hist foreach my $Hist (@Hists) { $Component=1; foreach my $FitType (@FitTypes) { @@ -2114,23 +1325,27 @@ sub ExportParams { unshift( @Params, ( "No", "NBg" ) ); } -# This is the counter for parameters of this component + # This is the counter for parameters of this + # component my $NP=1; $Shared = 0; -# Change state/label of parameters + # Change state/label of parameters foreach my $Param (@Params) { my $Param_ORG = $Param; - $Param=$Param.$Hist; + # Tag with histogram number only No, NBg and Phi + if ($Param_ORG =~ m/^(No|NBg|Phi)/ ) {$Param=$Param.$Hist;} if ( $#FitTypes != 0 && ( $Param_ORG ne "No" && $Param_ORG ne "NBg" ) ){ $Param = join( $EMPTY, $Param, "_", "$Component" ); } $Shared = $All{"Sh_$Param"}; if ( $Shared!=1 || $iRun == 1 ) { -# If there are multiple runs index the parameters accordingly + # If 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. (should be) + # Check if this parameter has been + # initialized befor. (should be) $value = $All{"$Param"}; $error = $All{"$erradd$Param"}; $minvalue = $All{"$Param$minadd"}; @@ -2521,8 +1736,8 @@ sub CreateRUNBlk { # Split the histograms my @Hists = split( /,/, $LRBF ); $Fit_Type = 0; - if ($FitAsyType eq "Asymmetry" || $FitAsyType eq "AsyGLB") { - $Fit_Type = 2; + if ($FitAsyType eq "Asymmetry" || $FitAsyType eq "AsymmetryGLB") { + $Fit_Type = 2; } $RUN_Block =~ s/RUN_LINE/$RUN_Line/; @@ -2581,7 +1796,9 @@ FRQRANGE"; } sub ExpandRunNumbers { -# Subroutine to conver hyphens in the RunNumbers into a series of comma separated runs +# Subroutine to conver RunNumbers string into comma separated array +# following the msr2data notations; hyphens denote from-to and a colon +# denotes a loop with steps from:to:step my ($RunNumbers) = @_; # Split by commas @RUNS=split( /,/, $RunNumbers); @@ -2593,10 +1810,93 @@ sub ExpandRunNumbers { 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/; + # Replace the original hyphens by the expanded series + $RunNumbers =~ s/$tmp/$RunJoined/; + } + # Find array members that include a colon (:) + my @RUNLoops = grep { /\:/ } @RUNS; + foreach my $tmp (@RUNLoops) { + # Each item that includes a colon is expanded as from:to:step array + my ($Begin,$End,$Step)=split(':',$tmp); + if ($Begin>$End) { + # Swap $Begin and $End + my $tmpBegin = $Begin; + $Begin = $End; + $End = $tmpBegin; + } + my @Series = (); + for (my $i = $Begin; $i<=$End; $i += $Step) { + push(@Series,$i); + } + # Join the expanded series using commas + my $RunJoined = join(',',@Series); + # Replace the original hyphens by the expanded series + $RunNumbers =~ s/$tmp/$RunJoined/; } return $RunNumbers; } +sub Defaults { +######################## +# Defaults +# Function return a default value of parameter +# input should be +# $Parameter +# output is +# $value +######################## +# Take this information as input arguments +# "Smart" default value of the fit parameters. + my ($Param)=@_; + + my %Defaults = ( + "Asy", "0.20", "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", + "Frql", "1.0", "dFrql", "1.", + "Frql_min", "0", "Frql_max", "0", + "Frqg", "1.0", "dFrqg", "1.", + "Frqg_min", "0", "Frqg_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" + ); + + return $Defaults{$Param}; +} + 1; diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm index a589f149..8fba7235 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.pm +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -282,13 +282,12 @@ sub CreateAllInput() $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" ) { + if ( $All{"FitAsyType"} eq "SingleHist" ) { this->{ui}->ltc->setHidden(0); $All{"fittype"}=0; + } else { + this->{ui}->ltc->setHidden(1); + $All{"fittype"}=2; } # From Fitting Tab @@ -419,10 +418,9 @@ sub CreateAllInput() my $Parameters=$Paramcomp[$Component-1]; my @Params = split( /\s+/, $Parameters ); - if ( $Component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) { + if ( $Component == 1 && ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB" )) { unshift( @Params, "Alpha" ); - } - elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { + } elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { unshift( @Params, ( "No", "NBg" ) ); } @@ -441,7 +439,7 @@ sub CreateAllInput() } # Is there any point of sharing, multiple runs? - if ( $#RUNS == 0 && $All{"FitAsyType"} eq "Asymmetry") { + if ( $#RUNS == 0 && ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB")) { $Shared = 1; } elsif ( $#RUNS == 0 && $#Hists == 0 && $All{"FitAsyType"} eq "SingleHist" ) { @@ -532,49 +530,54 @@ sub CallMSRCreate() } if ($Answer) { - if ( $All{"FitAsyType"} eq "Asymmetry" ) { + if ( $All{"FitAsyType"} eq "Asymmetry") { if ($All{"RUNSType"}) { - my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSR(\%All); + my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSRUni(\%All); # Open output file FILENAME.msr open( OUTF,q{>},"$FILENAME" ); print OUTF ("$FullMSRFile"); close(OUTF); } else { - my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSR(\%All); + my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSRUni(\%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"}; - if ($All{"BeamLine"} eq "LEM (PPC)") { - $Extension = "_LEM_".$All{"YEAR"}; - } - - if (-e $FILENAME) { - my $RUN0 = $FILENAME; - $RUN0 =~ s/$Extension//g; - $RUN0 =~ s/.msr//g; - my $cmd = $All{"RunNumbers"}; - $cmd =~ s/,/ /g; - $cmd = "msr2data \[".$cmd."\] ".$Extension." msr-".$RUN0." global"; - $cmd = $cmd."; mv $RUN0+global$Extension.msr ".$FILENAME; - print $cmd."\n"; - my $pid = open(FTO,"$cmd 2>&1 |"); - while () { - this->{ui}->fitTextOutput->append("$_"); - } - close(FTO); - } } - } - elsif ( $All{"FitAsyType"} eq "SingleHist" ) { - my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSRSingleHist(\%All); -# Open output file FILENAME.msr - open( OUTF,q{>},"$FILENAME" ); + } else { + my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSRGLB(\%All); + my @RUNS = split( /,/,MSR::ExpandRunNumbers($All{"RunNumbers"})); + my @Hists = split( /,/, $All{"LRBF"} ); + # Write to template file + open( OUTF,q{>},"$RUNS[0]_tmpl.msr" ); print OUTF ("$FullMSRFile"); close(OUTF); + + # Change runs line in the final global fit + my $NSpectra = ($#RUNS+1)*($#Hists+1); + my $NewRunLine = "runs ".join(" ",(1...$NSpectra)); + # Use msr2data to generate global fit MSR file + my $RunList = join(" ",@RUNS); + my $cmd = "msr2data \[".$RunList."\] "." _tmpl msr-".$RUNS[0]." global"; + # create the global file + print $cmd."\n"; + my $pid = open(FTO,"$cmd 2>&1 |"); + while () { + this->{ui}->fitTextOutput->append("$_"); + } + close(FTO); + # change the stupid name + my $StupidName = $RUNS[0]."+global_tmpl.msr"; + # change stupid default runs line + $cmd = "cp $StupidName $FILENAME; perl -pi -e 's/runs.*?(?=\n)/$NewRunLine/s' $FILENAME"; + $pid = open(FTO,"$cmd 2>&1 |"); + print $cmd."\n"; + while () { + this->{ui}->fitTextOutput->append("$_"); + } + close(FTO); + # feed in values of parameters if they exist + } UpdateMSRFileInitTable(); } @@ -614,7 +617,8 @@ sub UpdateMSRFileInitTable() # if it is last element or there are two more = positive error, check $#Param=5/7 # if there is only one more = minimum, check $#Param=6 -# To summarize, check the value of $#Param + # To summarize, check the value of $#Param + my $name=$Param[2]; my $value=1.0*$Param[3]; my $error = 1.0*$Param[4]; my $minvalue=0.0; @@ -640,6 +644,8 @@ sub UpdateMSRFileInitTable() $QTable->setItem($PCount,1,Qt::TableWidgetItem()); $QTable->setItem($PCount,2,Qt::TableWidgetItem()); $QTable->setItem($PCount,3,Qt::TableWidgetItem()); + # Set also label or row + $QTable->verticalHeaderItem($PCount)->setText($name); $QTable->item($PCount,0)->setText($value); $QTable->item($PCount,1)->setText($error); $QTable->item($PCount,2)->setText($minvalue); @@ -710,7 +716,7 @@ sub ActivateShComp() my $Parameters=$Paramcomp[$Component-1]; my @Params = split( /\s+/, $Parameters ); - if ( $Component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) { + if ( $Component == 1 && ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB")) { unshift( @Params, "Alpha" ); } elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { @@ -821,7 +827,7 @@ sub GoFit() # Check here is the number of histograms makes sense # other wise give error. my @Hists = split( /,/, $All{"LRBF"} ); - if ($All{"FitAsyType"} eq "Asymmetry" && $#Hists != 1) { + if (($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB") && $#Hists != 1) { # we have a problem here send error message my $Warning = "Error: The number of histograms should be 2 for an asymmetry fit!"; my $WarningWindow = Qt::MessageBox::information( this, "Error",$Warning); @@ -856,7 +862,7 @@ sub GoPlot() # Check here is the number of histograms makes sense # other wise give error. my @Hists = split( /,/, $All{"LRBF"} ); - if ($All{"FitAsyType"} eq "Asymmetry" && $#Hists != 1) { + if (($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB") && $#Hists != 1) { # we have a problem here send error message my $Warning = "Error: The number of histograms should be 2 for an asymmetry fit!"; my $WarningWindow = Qt::MessageBox::information( this, "Error",$Warning); @@ -1019,7 +1025,7 @@ sub InitializeFunctions() my @Params = split( /\s+/, $Parameters ); # Alpha, No and NBg are counted in the parameters - if ( $Component == 1 && $All{"FitAsyType"} eq "Asymmetry" ) { + if ( $Component == 1 && ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB" )) { unshift( @Params, "Alpha" ); } elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { diff --git a/src/external/MuSRFitGUI/MuSRFit4.ui b/src/external/MuSRFitGUI/MuSRFit4.ui index a8ce1a1e..0c452720 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.ui +++ b/src/external/MuSRFitGUI/MuSRFit4.ui @@ -231,7 +231,7 @@ - Asymmetry + Asymmetry GLB @@ -241,12 +241,7 @@ - Asymmetry GLB - - - - - Single Hist GLB + Asymmetry diff --git a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm index 4ac83c51..d3b05fb9 100644 --- a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm +++ b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm @@ -5,7 +5,7 @@ ################################################################################# ## Form generated from reading UI file 'MuSRFit4.ui' ## -## Created: Mon Jan 29 14:11:03 2018 +## Created: Mon Feb 5 15:38:20 2018 ## by: Qt User Interface Compiler version 4.8.7 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! @@ -3199,10 +3199,9 @@ sub retranslateUi { $self->{browse}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); $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() ), + $self->{fitAsyType}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Asymmetry GLB", 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() )]); + Qt::Application::translate( 'MuSRFit4', "Asymmetry", 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() ) ); From a965a171f7ca8e418b8cbe0c275f4d50ca633b66 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 6 Feb 2018 17:41:48 +0100 Subject: [PATCH 19/87] Use msr2data for single histogram fits --- src/external/MuSRFitGUI/MuSRFit4.pm | 125 ++++++++++++++++++++-------- 1 file changed, 91 insertions(+), 34 deletions(-) diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm index 8fba7235..b22fdc55 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.pm +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -421,7 +421,18 @@ sub CreateAllInput() if ( $Component == 1 && ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB" )) { unshift( @Params, "Alpha" ); } elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { - unshift( @Params, ( "No", "NBg" ) ); + if (grep(/Phi/,@Params)) { + # remove the Phi and put it back for each histogram + @Params = grep ! /Phi/,@Params; + # for each histogram + foreach my $Hist (@Hists) { + # take only first histogram from sum + ($Hist,my $tmp) = split(/ /,$Hist); + # Doesn't make sense to share No or NBg! + # unshift( @Params, ( "N0$Hist", "NBg$Hist", "Phi$Hist" ) ); + push(@Params,"Phi$Hist"); + } + } } # This is the counter for parameters of this component @@ -431,27 +442,25 @@ sub CreateAllInput() foreach my $Param (@Params) { my $Param_ORG = $Param; # TODO: I need to take care of single hist fits here - if ( $All{"FitAsyType"} eq "SingleHist" ) { - $Param=$Param.$Hists[0]; - } +# if ( $All{"FitAsyType"} eq "SingleHist" ) { +# $Param=$Param.$Hists[0]; +# } if ( $#FitTypes != 0 && ( $Param ne "Alpha" && $Param ne "No" && $Param ne "NBg" ) ){ $Param = join( "", $Param, "_", $Component); } # Is there any point of sharing, multiple runs? - if ( $#RUNS == 0 && ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB")) { - $Shared = 1; - } - elsif ( $#RUNS == 0 && $#Hists == 0 && $All{"FitAsyType"} eq "SingleHist" ) { + 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 +# check if it is checked my $ChkName="shParam_".$Component."_".$NP; my $ChkBx = child("Qt::Widget",$ChkName); $Shared = $ChkBx->isChecked(); } $All{"Sh_$Param"}=$Shared; + print "Param $Param is $Shared\n"; $NP++; } #Loop on parameters @@ -577,7 +586,30 @@ sub CallMSRCreate() } close(FTO); # feed in values of parameters if they exist - + my $wholefile = ""; + my $newline = ""; + {open (MSRF,q{<},"$FILENAME" ); + local $/ = undef; + $wholefile = ; + close(MSRF);} + my %PTable=MSR::PrepParamTable(\%All); + my $NParam=keys( %PTable ); + for (my $iP=0;$iP<$NParam;$iP++) { + my ($Param,$value,$error,$minvalue,$maxvalue,$RUNtmp) = split(/,/,$PTable{$iP}); + if (defined($All{"$Param"})) { + # replace the corresponding $Param line + if ( $All{"$Param\_min"} == $All{"$Param\_max"} ) { + $All{"$Param\_min"} = ""; + $All{"$Param\_max"} = ""; + } + $newline = join(" ",($Param,$All{"$Param"},$All{"d$Param"},$All{"d$Param"},$All{"$Param\_min"},$All{"$Param\_max"})); + $wholefile =~ s/$Param.*/$newline/; + } + } + # Now rewrite the msr file + open (MSRF,q{>},"$FILENAME" ); + print MSRF $wholefile; + close(MSRF); } UpdateMSRFileInitTable(); } @@ -593,7 +625,7 @@ sub UpdateMSRFileInitTable() if (-e "$FILENAME.msr") { open (MSRF,q{<},"$FILENAME.msr" ); @lines = ; - close(IFILE); + close(MSRF); } this->{ui}->textMSROutput->setText(""); foreach my $line (@lines) { @@ -685,6 +717,7 @@ sub ActivateShComp() { my %All=CreateAllInput(); my @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); + my @Hists = split( /,/, $All{"LRBF"} ); # Hide all sharing components this->{ui}->sharingComp1->setHidden(1); @@ -718,9 +751,20 @@ sub ActivateShComp() if ( $Component == 1 && ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB")) { unshift( @Params, "Alpha" ); - } - elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { - unshift( @Params, ( "No", "NBg" ) ); + } elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { + if (grep(/Phi/,@Params)) { + # remove the Phi and put it back for each histogram + @Params = grep ! /Phi/,@Params; + # for each histogram + foreach my $Hist (@Hists) { + # take only first histogram from sum + ($Hist,my $tmp) = split(/ /,$Hist); + # Doesn't make sense to share No or NBg! + # unshift( @Params, ( "N0$Hist", "NBg$Hist", "Phi$Hist" ) ); + push(@Params,"Phi$Hist"); + } + } + # unshift( @Params, ( "No", "NBg" ) ); } @@ -776,12 +820,10 @@ sub InitializeTab() $QTable->setNumRows($NParam); } -# for (my $i=0;$i<$NParam;$i++) {print "Line=$PTable{$i}\n";} - - # Fill the table with labels and values of parameter for (my $PCount=0;$PCount<$NParam;$PCount++) { my ($Param,$value,$error,$minvalue,$maxvalue,$RUN) = split(/,/,$PTable{$PCount}); +# print $PTable{$PCount}."\n"; # Now make sure we have no nans if ($error eq "nan") { $error=0.1;} # Make sure items exist before addressing them @@ -805,14 +847,17 @@ sub TabChanged() { # TODO: First check if there are some runs given, otherwise disbale my %All=CreateAllInput(); - -# First make sure we have sharing initialized - ActivateShComp(); -# Here we need to apply sharing if selected... - InitializeTab(); - UpdateMSRFileInitTable(); -# And also setup T0 and Bg bins - ActivateT0Hists(); + my $curTab = this->{ui}->musrfit_tabs->currentIndex(); + if ($curTab >= 2 && $curTab <= 4) { + # First make sure we have sharing initialized + ActivateShComp(); + # Here we need to apply sharing if selected... + InitializeTab(); + UpdateMSRFileInitTable(); + } elsif ($curTab == 7) { + # And also setup T0 and Bg bins + ActivateT0Hists(); + } # Initialize FUNCTIONS block only if it has not been initialized yet if ($All{"Func_T_Block"} eq "" ) { @@ -823,6 +868,7 @@ sub TabChanged() sub GoFit() { + # This function should be able to do both plot and fit, check who called you. my %All=CreateAllInput(); # Check here is the number of histograms makes sense # other wise give error. @@ -834,17 +880,15 @@ sub GoFit() } else { this->{ui}->musrfit_tabs->setCurrentIndex(1); my $Answer=CallMSRCreate(); + my $FILENAME=$All{"FILENAME"}.".msr"; if ($Answer) { - my $FILENAME=$All{"FILENAME"}.".msr"; if (-e $FILENAME) { - my $cmd="musrfit -t $FILENAME"; + my $cmd="musrfit -t $FILENAME; musrview $FILENAME &"; my $pid = open(FTO,"$cmd 2>&1 |"); while () { this->{ui}->fitTextOutput->insertPlainText("$_"); } close(FTO); - $cmd="musrview $FILENAME &"; - $pid = system($cmd); } else { this->{ui}->fitTextOutput->insertPlainText("Cannot find MSR file!"); } @@ -858,6 +902,7 @@ sub GoFit() sub GoPlot() { + # This function should be able to do both plot and fit, check who called you. my %All=CreateAllInput(); # Check here is the number of histograms makes sense # other wise give error. @@ -997,7 +1042,8 @@ sub InitializeFunctions() { my %All=CreateAllInput(); my @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); - + my @Hists = split( /,/, $All{"LRBF"} ); + my @FitTypes =(); foreach my $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) { if ( $FitType ne "None" ) { @@ -1027,9 +1073,20 @@ sub InitializeFunctions() # Alpha, No and NBg are counted in the parameters if ( $Component == 1 && ($All{"FitAsyType"} eq "Asymmetry" || $All{"FitAsyType"} eq "AsymmetryGLB" )) { unshift( @Params, "Alpha" ); - } - elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { - unshift( @Params, ( "No", "NBg" ) ); + } elsif ( $Component == 1 && $All{"FitAsyType"} eq "SingleHist" ) { + if (grep(/Phi/,@Params)) { + # remove the Phi and put it back for each histogram + @Params = grep ! /Phi/,@Params; + # for each histogram + foreach my $Hist (@Hists) { + # take only first histogram from sum + ($Hist,my $tmp) = split(/ /,$Hist); + # Doesn't make sense to share No or NBg! + # unshift( @Params, ( "N0$Hist", "NBg$Hist", "Phi$Hist" ) ); + push(@Params,"Phi$Hist"); + } + } + # unshift( @Params, ( "No", "NBg" ) ); } # Add list to the constraints drop down menu @@ -1065,7 +1122,7 @@ sub t0UpdateClicked() my $FILENAME=$All{"FILENAME"}; open (MSRF,q{<},"$FILENAME.msr" ); my @lines = ; - close(IFILE); + close(MSRF); my @T0s = grep {/t0 /} @lines; my @Bgs = grep {/background /} @lines; From ff681b99f506110be5fa0a363b09d3d9e2975dc4 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sun, 11 Feb 2018 15:44:06 +0100 Subject: [PATCH 20/87] Small rearrangement of GUI. --- src/external/MuSRFitGUI/MuSRFit4.pm | 209 +- src/external/MuSRFitGUI/MuSRFit4.ui | 3940 ++++++++++++------------ src/external/MuSRFitGUI/Ui_MuSRFit4.pm | 765 ++--- 3 files changed, 2618 insertions(+), 2296 deletions(-) diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm index b22fdc55..9c72c427 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.pm +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -39,6 +39,7 @@ use QtCore4::slots fileBrowse => [], AppendToFunctions => [], InitializeFunctions => [], + addFitType => [], t0UpdateClicked => []; use Ui_MuSRFit4; @@ -255,6 +256,8 @@ Copyright 2009-2017 by Zaher Salman sub CreateAllInput() { my %All=(); + + # From RUNS Tab # Run data file @@ -382,18 +385,32 @@ sub CreateAllInput() 17,"LGKTSExp", 18,"None" ); - - my $FT1=this->{ui}->fitType1->currentIndex; - my $FT2=this->{ui}->fitType2->currentIndex; - my $FT3=this->{ui}->fitType3->currentIndex; - $All{"FitType1"} = $FTs{$FT1}; - $All{"FitType2"} = $FTs{$FT2}; - $All{"FitType3"} = $FTs{$FT3}; + + # Check the number of components + my $numComps = 0; + my $FT1=0; + my $FT2=0; + my $FT3=0; my @FitTypes =(); - my $FitType=""; - foreach $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) { - if ( $FitType ne "None" ) { - push( @FitTypes, $FitType ); + my $FT=0; + if (defined(this->{ui}->numComps)) { + # new style, check the number of components + $numComps = this->{ui}->numComps->value; + if ($numComps != this->{ui}->columnView->count() ) { + addFitType(); + } + } else { + # old style, only 3 componenets + $numComps = 3; + } + + # loop over fitTypes + for (my $i=1;$i<=$numComps;$i++) { + my $FTi=child("Qt::ComboBox","fitType$i"); + $All{"FitType$i"} = $FTs{$FTi->currentIndex}; + print "i=$i with value ".$All{"FitType$i"}."\n"; + if ( $All{"FitType$i"} ne "None" ) { + push( @FitTypes, $All{"FitType$i"} ); } } @@ -414,7 +431,7 @@ sub CreateAllInput() my $Shared = 0; my $PCount =0; my $Component=1; - foreach $FitType (@FitTypes) { + foreach my $FitType (@FitTypes) { my $Parameters=$Paramcomp[$Component-1]; my @Params = split( /\s+/, $Parameters ); @@ -460,7 +477,6 @@ sub CreateAllInput() $Shared = $ChkBx->isChecked(); } $All{"Sh_$Param"}=$Shared; - print "Param $Param is $Shared\n"; $NP++; } #Loop on parameters @@ -1164,11 +1180,176 @@ sub child { } else { $Attrib = 0; } -# print "name = $name and attrib = $Attrib\n"; # Return handle on widget return($Attrib); } +sub addFitType { + # Input number of components + my $numComps = this->{ui}->numComps->value; + # count number of exisitng components + my $NButtons = this->{ui}->columnView->count(); + # create ComboBox in theoryFunction parent + my $fitType = Qt::ComboBox( this->{ui}->theoryFunction ); + + # do we have less components that we need + if ($numComps > $NButtons) { + # add as needed + for (my $i=$NButtons+1;$i<=$numComps;$i++) { + my $nameComp = "fitType$i"; + this->{ui}->columnView->addWidget( $fitType ); + $fitType->setObjectName( $nameComp ); + $fitType->setMinimumSize( Qt::Size(0, 25) ); + $fitType->setMaximumSize( Qt::Size(255, 25) ); + $fitType->insertItems(0, + [Qt::Application::translate( 'MuSRFit4', "Exponential", undef,Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian", undef,Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Exp.",undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Exponential Cos",undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Cos",undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Stretch Cos",undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Background",undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef,Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef,Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef,Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef,Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "MolMag", undef,Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "None", undef,Qt::Application::UnicodeUTF8() )]); + if ($i==1) { + $fitType->setCurrentIndex( 0 ); + } else { + $fitType->setCurrentIndex( 18 ); + } + } + } else { + for (my $i=$NButtons;$i > $numComps ;$i--) { + # component is there, delete it + my $widget = this->{ui}->columnView->itemAt($i-1)->widget(); + $widget -> hide(); + this->{ui}->columnView->removeWidget($widget); + undef $widget; + } + } +} + +sub addSharingComp { + my $self = this->{ui}; + # Input number of components + my $numComps = $self->numComps->value; + # count number of exisitng components + my $NShComps = $self->horizontalLayout->count(); + my $sharingComp = Qt::GroupBox( $self->buttonGroupSharing ); + my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); + $self->{$sizePolicy} = $sizePolicy; + $sizePolicy->setHorizontalStretch( 0 ); + $sizePolicy->setVerticalStretch( 0 ); + $sizePolicy->setHeightForWidth( $sharingComp->sizePolicy()->hasHeightForWidth() ); + for (my $i=2;$i<=$numComps;$i++) { + $sharingComp->setObjectName( "sharingComp$i" ); + $sharingComp->setEnabled( 0 ); + $sharingComp->setSizePolicy( $sizePolicy ); + $sharingComp->setAlignment( Qt::AlignLeading() ); + my $layout = Qt::Widget( $sharingComp ); + $layout->setObjectName( "layoutSh$i" ); + $layout->setGeometry( Qt::Rect(40, 60, 81, 266) ); + my $_5 = Qt::VBoxLayout( $layout ); + $self->{_5} = $_5; + $_5->setSpacing( 0 ); + $_5->setMargin( 0 ); + $_5->setObjectName( "_5" ); + $_5->setContentsMargins(0, 0, 0, 0 ); + my $shParam_1_1 = Qt::CheckBox( $layout ); + $self->{shParam_1_1} = $shParam_1_1; + $shParam_1_1->setObjectName( "shParam_1_1" ); + + $_5->addWidget( $shParam_1_1 ); + + my $shParam_1_2 = Qt::CheckBox( $layout ); + $self->{shParam_1_2} = $shParam_1_2; + $shParam_1_2->setObjectName( "shParam_1_2" ); + + $_5->addWidget( $shParam_1_2 ); + + my $shParam_1_3 = Qt::CheckBox( $layout ); + $self->{shParam_1_3} = $shParam_1_3; + $shParam_1_3->setObjectName( "shParam_1_3" ); + + $_5->addWidget( $shParam_1_3 ); + + my $shParam_1_4 = Qt::CheckBox( $layout ); + $self->{shParam_1_4} = $shParam_1_4; + $shParam_1_4->setObjectName( "shParam_1_4" ); + + $_5->addWidget( $shParam_1_4 ); + + my $shParam_1_5 = Qt::CheckBox( $layout ); + $self->{shParam_1_5} = $shParam_1_5; + $shParam_1_5->setObjectName( "shParam_1_5" ); + $shParam_1_5->setEnabled( 0 ); + $shParam_1_5->setTristate( 0 ); + + $_5->addWidget( $shParam_1_5 ); + + my $shParam_1_6 = Qt::CheckBox( $layout ); + $self->{shParam_1_6} = $shParam_1_6; + $shParam_1_6->setObjectName( "shParam_1_6" ); + $shParam_1_6->setEnabled( 0 ); + $shParam_1_6->setTristate( 0 ); + + $_5->addWidget( $shParam_1_6 ); + + my $shParam_1_7 = Qt::CheckBox( $layout ); + $self->{shParam_1_7} = $shParam_1_7; + $shParam_1_7->setObjectName( "shParam_1_7" ); + $shParam_1_7->setEnabled( 0 ); + $shParam_1_7->setTristate( 0 ); + + $_5->addWidget( $shParam_1_7 ); + + my $shParam_1_8 = Qt::CheckBox( $layout ); + $self->{shParam_1_8} = $shParam_1_8; + $shParam_1_8->setObjectName( "shParam_1_8" ); + $shParam_1_8->setEnabled( 0 ); + $shParam_1_8->setTristate( 0 ); + + $_5->addWidget( $shParam_1_8 ); + + my $shParam_1_9 = Qt::CheckBox( $layout ); + $self->{shParam_1_9} = $shParam_1_9; + $shParam_1_9->setObjectName( "shParam_1_9" ); + $shParam_1_9->setEnabled( 0 ); + $shParam_1_9->setTristate( 0 ); + + $_5->addWidget( $shParam_1_9 ); + + my $comp1ShLabel = Qt::Label( $sharingComp ); + $self->{comp1ShLabel} = $comp1ShLabel; + $comp1ShLabel->setObjectName( "comp1ShLabel" ); + $comp1ShLabel->setGeometry( Qt::Rect(2, 30, 141, 20) ); + $comp1ShLabel->setWordWrap( 0 ); + + $self->horizontalLayout->addWidget( $sharingComp ); + + $self->{sharingComp1}->setTitle( Qt::Application::translate( 'MuSRFit4', "1st Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_4}->setText( Qt::Application::translate( 'MuSRFit4', "Param4", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_5}->setText( Qt::Application::translate( 'MuSRFit4', "Param5", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_6}->setText( Qt::Application::translate( 'MuSRFit4', "Param6", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{shParam_1_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{comp1ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType1", undef, Qt::Application::UnicodeUTF8() ) ); + } + +} 1; diff --git a/src/external/MuSRFitGUI/MuSRFit4.ui b/src/external/MuSRFitGUI/MuSRFit4.ui index 0c452720..10cb5ef2 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.ui +++ b/src/external/MuSRFitGUI/MuSRFit4.ui @@ -6,8 +6,8 @@ 0 0 - 674 - 541 + 694 + 556 @@ -76,7 +76,7 @@ - + 1 1 @@ -97,7 +97,7 @@ RUN Files - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -323,7 +323,7 @@ RUN Numbers - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -559,1951 +559,2057 @@ Theory Function - - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 242 - 247 - 252 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - - 128 - 128 - 128 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - First Component - - - false - - - - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 242 - 247 - 252 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - - 128 - 128 - 128 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - Second Component - - - false - - - - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 242 - 247 - 252 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - - 128 - 128 - 128 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - Third Component - - - false - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - false - - - false - - - - Exponential + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + 430 + 170 + 130 + 16 + + + + + + + false + + + + + + 10 + 30 + 641 + 181 + + + + + QLayout::SetMinimumSize + + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + - - - Gaussian + First Component + + + false + + + + + + + + 0 + 0 + - - - Stretch Exp. + Initial Fit Time + + + false + + + + + + + + 0 + 0 + - - - Exponential Cos + Final Fit Time + + + false + + + + + + + + 0 + 0 + - - - Gaussian Cos + Fit Binning Factor + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + false + + + false + + + + Exponential + + + + + Gaussian + + + + + Stretch Exp. + + + + + Exponential Cos + + + + + Gaussian Cos + + + + + Stretch Cos + + + + + Lorentzian Dynamic KT + + + + + Gaussian Dynamic KT + + + + + Background + + + + + Lorentzian Kubo-Toyabe LF x Exp + + + + + Gaussian Kubo-Toyabe LF x Exp + + + + + Lorentzian Kubo-Toyabe LF x Str Exp + + + + + Gaussian Kubo-Toyabe LF x Str Exp + + + + + MolMag + + + + + Meissner State Model + + + + + Lor-Gss combi KT + + + + + Lor-Gss combi KT x Exp + + + + + Lor-Gss combi KT x SExp + + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + - - - Stretch Cos + 0 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + - - - Lorentzian Dynamic KT + 8 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + - - - Gaussian Dynamic KT + 100 + + + + + + + + 0 + 25 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + - - - Background + Second Component + + + false + + + + + + + + 0 + 25 + - - - Lorentzian Kubo-Toyabe LF x Exp + Min X + + + false + + + + + + + + 0 + 25 + - - - Gaussian Kubo-Toyabe LF x Exp + Max X + + + false + + + + + + + + 0 + 25 + - - - Lorentzian Kubo-Toyabe LF x Str Exp + View Binning Factor + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 18 + + + + Exponential + + + + + Gaussian + + + + + Stretch Exp. + + + + + Exponential Cos + + + + + Gaussian Cos + + + + + Stretch Cos + + + + + Lorentzian Dynamic KT + + + + + Gaussian Dynamic KT + + + + + Background + + + + + Lorentzian Kubo-Toyabe LF x Exp + + + + + Gaussian Kubo-Toyabe LF x Exp + + + + + Lorentzian Kubo-Toyabe LF x Str Exp + + + + + Gaussian Kubo-Toyabe LF x Str Exp + + + + + MolMag + + + + + Meissner State Model + + + + + Lor-Gss combi KT + + + + + Lor-Gss combi KT x Exp + + + + + Lor-Gss combi KT x SExp + + + + + None + + + + + + + + + 0 + 25 + + + + + + + + + 0 + 25 + + + + + + + + + 0 + 25 + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + - - - Gaussian Kubo-Toyabe LF x Str Exp + Third Component + + + false + + + + + + + + 0 + 25 + - - - MolMag + Min Y + + + false + + + + + + + + 0 + 25 + - - - Meissner State Model + Max Y + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + - - - Lor-Gss combi KT + + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 18 + + + + Exponential + + + + + Gaussian + + + + + Stretch Exp. + + + + + Exponential Cos + + + + + Gaussian Cos + + + + + Stretch Cos + + + + + Lorentzian Dynamic KT + + + + + Gaussian Dynamic KT + + + + + Background + + + + + Lorentzian Kubo-Toyabe LF x Exp + + + + + Gaussian Kubo-Toyabe LF x Exp + + + + + Lorentzian Kubo-Toyabe LF x Str Exp + + + + + Gaussian Kubo-Toyabe LF x Str Exp + + + + + MolMag + + + + + Meissner State Model + + + + + Lor-Gss combi KT + + + + + Lor-Gss combi KT x Exp + + + + + Lor-Gss combi KT x SExp + + + + + None + + + + + + + + + 0 + 25 + + + + + + + + + 0 + 25 + + + + + + + + + 0 + 0 + + + + + 0 + 25 + - - - Lor-Gss combi KT x Exp + Life time correction - - - - Lor-Gss combi KT x SExp + + true - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 18 - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - Lor-Gss combi KT - - - - - Lor-Gss combi KT x Exp - - - - - Lor-Gss combi KT x SExp - - - - - None - - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 18 - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - Lor-Gss combi KT - - - - - Lor-Gss combi KT x Exp - - - - - Lor-Gss combi KT x SExp - - - - - None - - - - - - - - - 0 - 0 - - - - Initial Fit Time - - - false - - - - - - - - 0 - 0 - - - - Final Fit Time - - - false - - - - - - - - 0 - 0 - - - - Fit Binning Factor - - - false - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 0 - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 8 - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 100 - - - - - - - Min X - - - false - - - - - - - Max X - - - false - - - - - - - View Binning Factor - - - false - - - - - - - - 0 - 25 - - - - - - - - - 0 - 25 - - - - - - - - - 0 - 25 - - - - - - - - Min Y - - - false - - - - - - - Max Y - - - false - - - - - - - - - - false - - - - - - - - - - - - - Life time correction - - - true - - - - + + + + @@ -5436,7 +5542,7 @@ 0 0 - 674 + 694 27 diff --git a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm index d3b05fb9..20706783 100644 --- a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm +++ b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm @@ -5,7 +5,7 @@ ################################################################################# ## Form generated from reading UI file 'MuSRFit4.ui' ## -## Created: Mon Feb 5 15:38:20 2018 +## Created: Sun Feb 11 15:43:10 2018 ## by: Qt User Interface Compiler version 4.8.7 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! @@ -186,34 +186,22 @@ sub groupBox { return shift->{groupBox}; } -sub gridLayout_8 { - return shift->{gridLayout_8}; +sub textLabel1_4_2_3 { + return shift->{textLabel1_4_2_3}; +} + +sub layoutWidget { + return shift->{layoutWidget}; +} + +sub gridLayout1 { + return shift->{gridLayout1}; } sub comp1Label { return shift->{comp1Label}; } -sub comp2Label { - return shift->{comp2Label}; -} - -sub comp3Label { - return shift->{comp3Label}; -} - -sub fitType1 { - return shift->{fitType1}; -} - -sub fitType2 { - return shift->{fitType2}; -} - -sub fitType3 { - return shift->{fitType3}; -} - sub tisLabel { return shift->{tisLabel}; } @@ -226,6 +214,10 @@ sub binsLabel { return shift->{binsLabel}; } +sub fitType1 { + return shift->{fitType1}; +} + sub tis { return shift->{tis}; } @@ -238,6 +230,10 @@ sub bins { return shift->{bins}; } +sub comp2Label { + return shift->{comp2Label}; +} + sub textLabel1_4 { return shift->{textLabel1_4}; } @@ -250,6 +246,10 @@ sub textLabel1_4_2_2 { return shift->{textLabel1_4_2_2}; } +sub fitType2 { + return shift->{fitType2}; +} + sub xi { return shift->{xi}; } @@ -262,6 +262,10 @@ sub viewBin { return shift->{viewBin}; } +sub comp3Label { + return shift->{comp3Label}; +} + sub textLabel1_4_2 { return shift->{textLabel1_4_2}; } @@ -274,6 +278,10 @@ sub textLabel1_4_4 { return shift->{textLabel1_4_4}; } +sub fitType3 { + return shift->{fitType3}; +} + sub yi { return shift->{yi}; } @@ -290,8 +298,8 @@ sub fittingPage { return shift->{fittingPage}; } -sub gridLayout1 { - return shift->{gridLayout1}; +sub gridLayout2 { + return shift->{gridLayout2}; } sub fitGrid { @@ -326,8 +334,8 @@ sub sharingPage { return shift->{sharingPage}; } -sub gridLayout2 { - return shift->{gridLayout2}; +sub gridLayout3 { + return shift->{gridLayout3}; } sub buttonGroupSharing { @@ -502,8 +510,8 @@ sub initializationPage { return shift->{initializationPage}; } -sub gridLayout3 { - return shift->{gridLayout3}; +sub gridLayout4 { + return shift->{gridLayout4}; } sub initParamTable { @@ -514,8 +522,8 @@ sub msrPage { return shift->{msrPage}; } -sub gridLayout4 { - return shift->{gridLayout4}; +sub gridLayout5 { + return shift->{gridLayout5}; } sub vboxLayout { @@ -526,8 +534,8 @@ sub groupTitle { return shift->{groupTitle}; } -sub gridLayout5 { - return shift->{gridLayout5}; +sub gridLayout6 { + return shift->{gridLayout6}; } sub vboxLayout1 { @@ -562,8 +570,8 @@ sub fourierPage { return shift->{fourierPage}; } -sub gridLayout6 { - return shift->{gridLayout6}; +sub gridLayout7 { + return shift->{gridLayout7}; } sub fourierBox { @@ -574,8 +582,8 @@ sub layout34 { return shift->{layout34}; } -sub gridLayout7 { - return shift->{gridLayout7}; +sub gridLayout8 { + return shift->{gridLayout8}; } sub frqMax { @@ -658,8 +666,8 @@ sub layout35 { return shift->{layout35}; } -sub gridLayout8 { - return shift->{gridLayout8}; +sub gridLayout9 { + return shift->{gridLayout9}; } sub textLabel1_6_2_2 { @@ -702,8 +710,8 @@ sub t0Page { return shift->{t0Page}; } -sub gridLayout9 { - return shift->{gridLayout9}; +sub gridLayout10 { + return shift->{gridLayout10}; } sub hboxLayout1 { @@ -886,16 +894,16 @@ sub tabPage { return shift->{tabPage}; } -sub gridLayout10 { - return shift->{gridLayout10}; +sub gridLayout11 { + return shift->{gridLayout11}; } sub vboxLayout7 { return shift->{vboxLayout7}; } -sub gridLayout11 { - return shift->{gridLayout11}; +sub gridLayout12 { + return shift->{gridLayout12}; } sub theoryBlock_Label { @@ -993,7 +1001,7 @@ sub setupUi { if ( !defined $muSRFit4->objectName() ) { $muSRFit4->setObjectName( "muSRFit4" ); } - $muSRFit4->resize( 674, 541 ); + $muSRFit4->resize( 694, 556 ); my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); $self->{$sizePolicy} = $sizePolicy; $sizePolicy->setHorizontalStretch( 1 ); @@ -1108,11 +1116,15 @@ sub setupUi { my $runsMan = Qt::GroupBox( $runsPage ); $self->{runsMan} = $runsMan; $runsMan->setObjectName( "runsMan" ); - $sizePolicy->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); - $runsMan->setSizePolicy( $sizePolicy ); + my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Maximum() ); + $self->{$sizePolicy1} = $sizePolicy1; + $sizePolicy1->setHorizontalStretch( 1 ); + $sizePolicy1->setVerticalStretch( 1 ); + $sizePolicy1->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); + $runsMan->setSizePolicy( $sizePolicy1 ); $runsMan->setMinimumSize( Qt::Size(0, 80) ); $runsMan->setBaseSize( Qt::Size(1, 1) ); - $runsMan->setAlignment( Qt::AlignHCenter()|Qt::AlignTop() ); + $runsMan->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); my $gridLayout_4 = Qt::GridLayout( $runsMan ); $self->{gridLayout_4} = $gridLayout_4; $gridLayout_4->setSpacing( 6 ); @@ -1130,12 +1142,12 @@ sub setupUi { $self->{runFiles} = $runFiles; $runFiles->setObjectName( "runFiles" ); $runFiles->setEnabled( 1 ); - my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy1} = $sizePolicy1; - $sizePolicy1->setHorizontalStretch( 0 ); - $sizePolicy1->setVerticalStretch( 0 ); - $sizePolicy1->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); - $runFiles->setSizePolicy( $sizePolicy1 ); + my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy2} = $sizePolicy2; + $sizePolicy2->setHorizontalStretch( 0 ); + $sizePolicy2->setVerticalStretch( 0 ); + $sizePolicy2->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); + $runFiles->setSizePolicy( $sizePolicy2 ); $runFiles->setMinimumSize( Qt::Size(0, 23) ); $runFiles->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1145,12 +1157,12 @@ sub setupUi { $self->{browse} = $browse; $browse->setObjectName( "browse" ); $browse->setEnabled( 1 ); - my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); - $self->{$sizePolicy2} = $sizePolicy2; - $sizePolicy2->setHorizontalStretch( 0 ); - $sizePolicy2->setVerticalStretch( 0 ); - $sizePolicy2->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); - $browse->setSizePolicy( $sizePolicy2 ); + my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy3} = $sizePolicy3; + $sizePolicy3->setHorizontalStretch( 0 ); + $sizePolicy3->setVerticalStretch( 0 ); + $sizePolicy3->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); + $browse->setSizePolicy( $sizePolicy3 ); $browse->setMinimumSize( Qt::Size(0, 20) ); $browse->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1170,12 +1182,12 @@ sub setupUi { my $fitAsyTypeLabel = Qt::Label( $runsPage ); $self->{fitAsyTypeLabel} = $fitAsyTypeLabel; $fitAsyTypeLabel->setObjectName( "fitAsyTypeLabel" ); - my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy3} = $sizePolicy3; - $sizePolicy3->setHorizontalStretch( 0 ); - $sizePolicy3->setVerticalStretch( 0 ); - $sizePolicy3->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); - $fitAsyTypeLabel->setSizePolicy( $sizePolicy3 ); + my $sizePolicy4 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy4} = $sizePolicy4; + $sizePolicy4->setHorizontalStretch( 0 ); + $sizePolicy4->setVerticalStretch( 0 ); + $sizePolicy4->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); + $fitAsyTypeLabel->setSizePolicy( $sizePolicy4 ); $fitAsyTypeLabel->setWordWrap( 0 ); $gridLayout_6->addWidget( $fitAsyTypeLabel, 0, 0, 1, 1 ); @@ -1183,8 +1195,8 @@ sub setupUi { my $fitAsyType = Qt::ComboBox( $runsPage ); $self->{fitAsyType} = $fitAsyType; $fitAsyType->setObjectName( "fitAsyType" ); - $sizePolicy3->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); - $fitAsyType->setSizePolicy( $sizePolicy3 ); + $sizePolicy4->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); + $fitAsyType->setSizePolicy( $sizePolicy4 ); $fitAsyType->setMinimumSize( Qt::Size(0, 25) ); $fitAsyType->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1193,8 +1205,8 @@ sub setupUi { my $histsLRBFLabel = Qt::Label( $runsPage ); $self->{histsLRBFLabel} = $histsLRBFLabel; $histsLRBFLabel->setObjectName( "histsLRBFLabel" ); - $sizePolicy3->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); - $histsLRBFLabel->setSizePolicy( $sizePolicy3 ); + $sizePolicy4->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); + $histsLRBFLabel->setSizePolicy( $sizePolicy4 ); $histsLRBFLabel->setWordWrap( 0 ); $gridLayout_6->addWidget( $histsLRBFLabel, 0, 2, 1, 1 ); @@ -1202,8 +1214,8 @@ sub setupUi { my $histsLRBF = Qt::LineEdit( $runsPage ); $self->{histsLRBF} = $histsLRBF; $histsLRBF->setObjectName( "histsLRBF" ); - $sizePolicy3->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); - $histsLRBF->setSizePolicy( $sizePolicy3 ); + $sizePolicy4->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); + $histsLRBF->setSizePolicy( $sizePolicy4 ); $histsLRBF->setMinimumSize( Qt::Size(0, 25) ); $histsLRBF->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1219,14 +1231,10 @@ sub setupUi { my $runsAuto = Qt::GroupBox( $runsPage ); $self->{runsAuto} = $runsAuto; $runsAuto->setObjectName( "runsAuto" ); - 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 ); + $sizePolicy1->setHeightForWidth( $runsAuto->sizePolicy()->hasHeightForWidth() ); + $runsAuto->setSizePolicy( $sizePolicy1 ); $runsAuto->setMinimumSize( Qt::Size(0, 100) ); - $runsAuto->setAlignment( Qt::AlignHCenter()|Qt::AlignTop() ); + $runsAuto->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); my $gridLayout_3 = Qt::GridLayout( $runsAuto ); $self->{gridLayout_3} = $gridLayout_3; $gridLayout_3->setSpacing( 6 ); @@ -1241,8 +1249,8 @@ sub setupUi { my $year = Qt::ComboBox( $runsAuto ); $self->{year} = $year; $year->setObjectName( "year" ); - $sizePolicy2->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); - $year->setSizePolicy( $sizePolicy2 ); + $sizePolicy3->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); + $year->setSizePolicy( $sizePolicy3 ); $year->setMinimumSize( Qt::Size(0, 20) ); $year->setMaximumSize( Qt::Size(16777215, 25) ); $year->setEditable( 0 ); @@ -1255,8 +1263,8 @@ sub setupUi { my $runNumbers = Qt::LineEdit( $runsAuto ); $self->{runNumbers} = $runNumbers; $runNumbers->setObjectName( "runNumbers" ); - $sizePolicy1->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); - $runNumbers->setSizePolicy( $sizePolicy1 ); + $sizePolicy2->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); + $runNumbers->setSizePolicy( $sizePolicy2 ); $runNumbers->setMinimumSize( Qt::Size(0, 23) ); $runNumbers->setMaximumSize( Qt::Size(16777215, 25) ); $runNumbers->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); @@ -1270,8 +1278,8 @@ sub setupUi { my $beamLine = Qt::ComboBox( $runsAuto ); $self->{beamLine} = $beamLine; $beamLine->setObjectName( "beamLine" ); - $sizePolicy2->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); - $beamLine->setSizePolicy( $sizePolicy2 ); + $sizePolicy3->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); + $beamLine->setSizePolicy( $sizePolicy3 ); $beamLine->setMinimumSize( Qt::Size(0, 20) ); $beamLine->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1319,12 +1327,24 @@ sub setupUi { $groupBox->setSizePolicy( $sizePolicy6 ); $groupBox->setMinimumSize( Qt::Size(0, 220) ); $groupBox->setBaseSize( Qt::Size(0, 0) ); - my $gridLayout_8 = Qt::GridLayout( $groupBox ); - $self->{gridLayout_8} = $gridLayout_8; - $gridLayout_8->setSpacing( 6 ); - $gridLayout_8->setMargin( 11 ); - $gridLayout_8->setObjectName( "gridLayout_8" ); - my $comp1Label = Qt::Label( $groupBox ); + $groupBox->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignVCenter() ); + my $textLabel1_4_2_3 = Qt::Label( $groupBox ); + $self->{textLabel1_4_2_3} = $textLabel1_4_2_3; + $textLabel1_4_2_3->setObjectName( "textLabel1_4_2_3" ); + $textLabel1_4_2_3->setGeometry( Qt::Rect(430, 170, 130, 16) ); + $textLabel1_4_2_3->setWordWrap( 0 ); + my $layoutWidget = Qt::Widget( $groupBox ); + $self->{layoutWidget} = $layoutWidget; + $layoutWidget->setObjectName( "layoutWidget" ); + $layoutWidget->setGeometry( Qt::Rect(10, 30, 641, 181) ); + my $gridLayout1 = Qt::GridLayout( $layoutWidget ); + $self->{gridLayout1} = $gridLayout1; + $gridLayout1->setSpacing( 6 ); + $gridLayout1->setMargin( 11 ); + $gridLayout1->setObjectName( "gridLayout1" ); + $gridLayout1->setSizeConstraint( Qt::Layout::SetMinimumSize() ); + $gridLayout1->setContentsMargins(0, 0, 0, 0 ); + my $comp1Label = Qt::Label( $layoutWidget ); $self->{comp1Label} = $comp1Label; $comp1Label->setObjectName( "comp1Label" ); my $palette = Qt::Palette(); @@ -1401,11 +1421,81 @@ sub setupUi { $comp1Label->setPalette( $palette ); $comp1Label->setWordWrap( 0 ); - $gridLayout_8->addWidget( $comp1Label, 0, 0, 1, 1 ); + $gridLayout1->addWidget( $comp1Label, 0, 0, 1, 1 ); - my $comp2Label = Qt::Label( $groupBox ); + my $tisLabel = Qt::Label( $layoutWidget ); + $self->{tisLabel} = $tisLabel; + $tisLabel->setObjectName( "tisLabel" ); + $sizePolicy4->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); + $tisLabel->setSizePolicy( $sizePolicy4 ); + $tisLabel->setWordWrap( 0 ); + + $gridLayout1->addWidget( $tisLabel, 0, 1, 1, 1 ); + + my $tfsLabel = Qt::Label( $layoutWidget ); + $self->{tfsLabel} = $tfsLabel; + $tfsLabel->setObjectName( "tfsLabel" ); + $sizePolicy4->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); + $tfsLabel->setSizePolicy( $sizePolicy4 ); + $tfsLabel->setWordWrap( 0 ); + + $gridLayout1->addWidget( $tfsLabel, 0, 2, 1, 1 ); + + my $binsLabel = Qt::Label( $layoutWidget ); + $self->{binsLabel} = $binsLabel; + $binsLabel->setObjectName( "binsLabel" ); + $sizePolicy4->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); + $binsLabel->setSizePolicy( $sizePolicy4 ); + $binsLabel->setWordWrap( 0 ); + + $gridLayout1->addWidget( $binsLabel, 0, 3, 1, 1 ); + + my $fitType1 = Qt::ComboBox( $layoutWidget ); + $self->{fitType1} = $fitType1; + $fitType1->setObjectName( "fitType1" ); + $sizePolicy2->setHeightForWidth( $fitType1->sizePolicy()->hasHeightForWidth() ); + $fitType1->setSizePolicy( $sizePolicy2 ); + $fitType1->setMinimumSize( Qt::Size(0, 25) ); + $fitType1->setMaximumSize( Qt::Size(16777215, 25) ); + $fitType1->setAutoCompletion( 0 ); + $fitType1->setDuplicatesEnabled( 0 ); + + $gridLayout1->addWidget( $fitType1, 1, 0, 1, 1 ); + + my $tis = Qt::LineEdit( $layoutWidget ); + $self->{tis} = $tis; + $tis->setObjectName( "tis" ); + $sizePolicy2->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); + $tis->setSizePolicy( $sizePolicy2 ); + $tis->setMinimumSize( Qt::Size(0, 25) ); + $tis->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout1->addWidget( $tis, 1, 1, 1, 1 ); + + my $tfs = Qt::LineEdit( $layoutWidget ); + $self->{tfs} = $tfs; + $tfs->setObjectName( "tfs" ); + $sizePolicy2->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); + $tfs->setSizePolicy( $sizePolicy2 ); + $tfs->setMinimumSize( Qt::Size(0, 25) ); + $tfs->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout1->addWidget( $tfs, 1, 2, 1, 1 ); + + my $bins = Qt::LineEdit( $layoutWidget ); + $self->{bins} = $bins; + $bins->setObjectName( "bins" ); + $sizePolicy2->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); + $bins->setSizePolicy( $sizePolicy2 ); + $bins->setMinimumSize( Qt::Size(0, 25) ); + $bins->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout1->addWidget( $bins, 1, 3, 1, 1 ); + + my $comp2Label = Qt::Label( $layoutWidget ); $self->{comp2Label} = $comp2Label; $comp2Label->setObjectName( "comp2Label" ); + $comp2Label->setMinimumSize( Qt::Size(0, 25) ); my $palette1 = Qt::Palette(); $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); @@ -1458,9 +1548,64 @@ sub setupUi { $comp2Label->setPalette( $palette1 ); $comp2Label->setWordWrap( 0 ); - $gridLayout_8->addWidget( $comp2Label, 0, 2, 1, 1 ); + $gridLayout1->addWidget( $comp2Label, 2, 0, 1, 1 ); - my $comp3Label = Qt::Label( $groupBox ); + my $textLabel1_4 = Qt::Label( $layoutWidget ); + $self->{textLabel1_4} = $textLabel1_4; + $textLabel1_4->setObjectName( "textLabel1_4" ); + $textLabel1_4->setMinimumSize( Qt::Size(0, 25) ); + $textLabel1_4->setWordWrap( 0 ); + + $gridLayout1->addWidget( $textLabel1_4, 2, 1, 1, 1 ); + + my $textLabel1_8 = Qt::Label( $layoutWidget ); + $self->{textLabel1_8} = $textLabel1_8; + $textLabel1_8->setObjectName( "textLabel1_8" ); + $textLabel1_8->setMinimumSize( Qt::Size(0, 25) ); + $textLabel1_8->setWordWrap( 0 ); + + $gridLayout1->addWidget( $textLabel1_8, 2, 2, 1, 1 ); + + my $textLabel1_4_2_2 = Qt::Label( $layoutWidget ); + $self->{textLabel1_4_2_2} = $textLabel1_4_2_2; + $textLabel1_4_2_2->setObjectName( "textLabel1_4_2_2" ); + $textLabel1_4_2_2->setMinimumSize( Qt::Size(0, 25) ); + $textLabel1_4_2_2->setWordWrap( 0 ); + + $gridLayout1->addWidget( $textLabel1_4_2_2, 2, 3, 1, 1 ); + + my $fitType2 = Qt::ComboBox( $layoutWidget ); + $self->{fitType2} = $fitType2; + $fitType2->setObjectName( "fitType2" ); + $sizePolicy2->setHeightForWidth( $fitType2->sizePolicy()->hasHeightForWidth() ); + $fitType2->setSizePolicy( $sizePolicy2 ); + $fitType2->setMinimumSize( Qt::Size(0, 25) ); + $fitType2->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout1->addWidget( $fitType2, 3, 0, 1, 1 ); + + my $xi = Qt::LineEdit( $layoutWidget ); + $self->{xi} = $xi; + $xi->setObjectName( "xi" ); + $xi->setMinimumSize( Qt::Size(0, 25) ); + + $gridLayout1->addWidget( $xi, 3, 1, 1, 1 ); + + my $xf = Qt::LineEdit( $layoutWidget ); + $self->{xf} = $xf; + $xf->setObjectName( "xf" ); + $xf->setMinimumSize( Qt::Size(0, 25) ); + + $gridLayout1->addWidget( $xf, 3, 2, 1, 1 ); + + my $viewBin = Qt::LineEdit( $layoutWidget ); + $self->{viewBin} = $viewBin; + $viewBin->setObjectName( "viewBin" ); + $viewBin->setMinimumSize( Qt::Size(0, 25) ); + + $gridLayout1->addWidget( $viewBin, 3, 3, 1, 1 ); + + my $comp3Label = Qt::Label( $layoutWidget ); $self->{comp3Label} = $comp3Label; $comp3Label->setObjectName( "comp3Label" ); my $palette2 = Qt::Palette(); @@ -1515,178 +1660,67 @@ sub setupUi { $comp3Label->setPalette( $palette2 ); $comp3Label->setWordWrap( 0 ); - $gridLayout_8->addWidget( $comp3Label, 0, 4, 1, 1 ); + $gridLayout1->addWidget( $comp3Label, 4, 0, 1, 1 ); - my $fitType1 = Qt::ComboBox( $groupBox ); - $self->{fitType1} = $fitType1; - $fitType1->setObjectName( "fitType1" ); - $sizePolicy3->setHeightForWidth( $fitType1->sizePolicy()->hasHeightForWidth() ); - $fitType1->setSizePolicy( $sizePolicy3 ); - $fitType1->setMinimumSize( Qt::Size(0, 25) ); - $fitType1->setMaximumSize( Qt::Size(16777215, 25) ); - $fitType1->setAutoCompletion( 0 ); - $fitType1->setDuplicatesEnabled( 0 ); + my $textLabel1_4_2 = Qt::Label( $layoutWidget ); + $self->{textLabel1_4_2} = $textLabel1_4_2; + $textLabel1_4_2->setObjectName( "textLabel1_4_2" ); + $textLabel1_4_2->setMinimumSize( Qt::Size(0, 25) ); + $textLabel1_4_2->setWordWrap( 0 ); - $gridLayout_8->addWidget( $fitType1, 1, 0, 1, 2 ); + $gridLayout1->addWidget( $textLabel1_4_2, 4, 1, 1, 1 ); - my $fitType2 = Qt::ComboBox( $groupBox ); - $self->{fitType2} = $fitType2; - $fitType2->setObjectName( "fitType2" ); - $sizePolicy3->setHeightForWidth( $fitType2->sizePolicy()->hasHeightForWidth() ); - $fitType2->setSizePolicy( $sizePolicy3 ); - $fitType2->setMinimumSize( Qt::Size(0, 25) ); - $fitType2->setMaximumSize( Qt::Size(16777215, 25) ); + my $textLabel1_4_3 = Qt::Label( $layoutWidget ); + $self->{textLabel1_4_3} = $textLabel1_4_3; + $textLabel1_4_3->setObjectName( "textLabel1_4_3" ); + $textLabel1_4_3->setMinimumSize( Qt::Size(0, 25) ); + $textLabel1_4_3->setWordWrap( 0 ); - $gridLayout_8->addWidget( $fitType2, 1, 2, 1, 2 ); + $gridLayout1->addWidget( $textLabel1_4_3, 4, 2, 1, 1 ); - my $fitType3 = Qt::ComboBox( $groupBox ); + my $textLabel1_4_4 = Qt::Label( $layoutWidget ); + $self->{textLabel1_4_4} = $textLabel1_4_4; + $textLabel1_4_4->setObjectName( "textLabel1_4_4" ); + $sizePolicy2->setHeightForWidth( $textLabel1_4_4->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_4->setSizePolicy( $sizePolicy2 ); + $textLabel1_4_4->setMinimumSize( Qt::Size(0, 25) ); + $textLabel1_4_4->setWordWrap( 0 ); + + $gridLayout1->addWidget( $textLabel1_4_4, 4, 3, 1, 1 ); + + my $fitType3 = Qt::ComboBox( $layoutWidget ); $self->{fitType3} = $fitType3; $fitType3->setObjectName( "fitType3" ); - $sizePolicy3->setHeightForWidth( $fitType3->sizePolicy()->hasHeightForWidth() ); - $fitType3->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $fitType3->sizePolicy()->hasHeightForWidth() ); + $fitType3->setSizePolicy( $sizePolicy2 ); $fitType3->setMinimumSize( Qt::Size(0, 25) ); $fitType3->setMaximumSize( Qt::Size(16777215, 25) ); - $gridLayout_8->addWidget( $fitType3, 1, 4, 1, 1 ); + $gridLayout1->addWidget( $fitType3, 5, 0, 1, 1 ); - my $tisLabel = Qt::Label( $groupBox ); - $self->{tisLabel} = $tisLabel; - $tisLabel->setObjectName( "tisLabel" ); - $sizePolicy3->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); - $tisLabel->setSizePolicy( $sizePolicy3 ); - $tisLabel->setWordWrap( 0 ); - - $gridLayout_8->addWidget( $tisLabel, 2, 0, 1, 1 ); - - my $tfsLabel = Qt::Label( $groupBox ); - $self->{tfsLabel} = $tfsLabel; - $tfsLabel->setObjectName( "tfsLabel" ); - $sizePolicy3->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); - $tfsLabel->setSizePolicy( $sizePolicy3 ); - $tfsLabel->setWordWrap( 0 ); - - $gridLayout_8->addWidget( $tfsLabel, 2, 2, 1, 1 ); - - my $binsLabel = Qt::Label( $groupBox ); - $self->{binsLabel} = $binsLabel; - $binsLabel->setObjectName( "binsLabel" ); - $sizePolicy3->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); - $binsLabel->setSizePolicy( $sizePolicy3 ); - $binsLabel->setWordWrap( 0 ); - - $gridLayout_8->addWidget( $binsLabel, 2, 4, 1, 1 ); - - my $tis = Qt::LineEdit( $groupBox ); - $self->{tis} = $tis; - $tis->setObjectName( "tis" ); - $sizePolicy3->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); - $tis->setSizePolicy( $sizePolicy3 ); - $tis->setMinimumSize( Qt::Size(0, 25) ); - $tis->setMaximumSize( Qt::Size(16777215, 25) ); - - $gridLayout_8->addWidget( $tis, 3, 0, 1, 1 ); - - my $tfs = Qt::LineEdit( $groupBox ); - $self->{tfs} = $tfs; - $tfs->setObjectName( "tfs" ); - $sizePolicy3->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); - $tfs->setSizePolicy( $sizePolicy3 ); - $tfs->setMinimumSize( Qt::Size(0, 25) ); - $tfs->setMaximumSize( Qt::Size(16777215, 25) ); - - $gridLayout_8->addWidget( $tfs, 3, 2, 1, 1 ); - - my $bins = Qt::LineEdit( $groupBox ); - $self->{bins} = $bins; - $bins->setObjectName( "bins" ); - $sizePolicy3->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); - $bins->setSizePolicy( $sizePolicy3 ); - $bins->setMinimumSize( Qt::Size(0, 25) ); - $bins->setMaximumSize( Qt::Size(16777215, 25) ); - - $gridLayout_8->addWidget( $bins, 3, 4, 1, 1 ); - - my $textLabel1_4 = Qt::Label( $groupBox ); - $self->{textLabel1_4} = $textLabel1_4; - $textLabel1_4->setObjectName( "textLabel1_4" ); - $textLabel1_4->setWordWrap( 0 ); - - $gridLayout_8->addWidget( $textLabel1_4, 4, 0, 1, 1 ); - - my $textLabel1_8 = Qt::Label( $groupBox ); - $self->{textLabel1_8} = $textLabel1_8; - $textLabel1_8->setObjectName( "textLabel1_8" ); - $textLabel1_8->setWordWrap( 0 ); - - $gridLayout_8->addWidget( $textLabel1_8, 4, 2, 1, 1 ); - - my $textLabel1_4_2_2 = Qt::Label( $groupBox ); - $self->{textLabel1_4_2_2} = $textLabel1_4_2_2; - $textLabel1_4_2_2->setObjectName( "textLabel1_4_2_2" ); - $textLabel1_4_2_2->setWordWrap( 0 ); - - $gridLayout_8->addWidget( $textLabel1_4_2_2, 4, 4, 1, 1 ); - - my $xi = Qt::LineEdit( $groupBox ); - $self->{xi} = $xi; - $xi->setObjectName( "xi" ); - $xi->setMinimumSize( Qt::Size(0, 25) ); - - $gridLayout_8->addWidget( $xi, 5, 0, 1, 1 ); - - my $xf = Qt::LineEdit( $groupBox ); - $self->{xf} = $xf; - $xf->setObjectName( "xf" ); - $xf->setMinimumSize( Qt::Size(0, 25) ); - - $gridLayout_8->addWidget( $xf, 5, 2, 1, 1 ); - - my $viewBin = Qt::LineEdit( $groupBox ); - $self->{viewBin} = $viewBin; - $viewBin->setObjectName( "viewBin" ); - $viewBin->setMinimumSize( Qt::Size(0, 25) ); - - $gridLayout_8->addWidget( $viewBin, 5, 3, 1, 2 ); - - my $textLabel1_4_2 = Qt::Label( $groupBox ); - $self->{textLabel1_4_2} = $textLabel1_4_2; - $textLabel1_4_2->setObjectName( "textLabel1_4_2" ); - $textLabel1_4_2->setWordWrap( 0 ); - - $gridLayout_8->addWidget( $textLabel1_4_2, 6, 0, 1, 1 ); - - my $textLabel1_4_3 = Qt::Label( $groupBox ); - $self->{textLabel1_4_3} = $textLabel1_4_3; - $textLabel1_4_3->setObjectName( "textLabel1_4_3" ); - $textLabel1_4_3->setWordWrap( 0 ); - - $gridLayout_8->addWidget( $textLabel1_4_3, 6, 2, 1, 1 ); - - my $textLabel1_4_4 = Qt::Label( $groupBox ); - $self->{textLabel1_4_4} = $textLabel1_4_4; - $textLabel1_4_4->setObjectName( "textLabel1_4_4" ); - $textLabel1_4_4->setWordWrap( 0 ); - - $gridLayout_8->addWidget( $textLabel1_4_4, 6, 4, 1, 1 ); - - my $yi = Qt::LineEdit( $groupBox ); + my $yi = Qt::LineEdit( $layoutWidget ); $self->{yi} = $yi; $yi->setObjectName( "yi" ); + $yi->setMinimumSize( Qt::Size(0, 25) ); - $gridLayout_8->addWidget( $yi, 7, 0, 1, 1 ); + $gridLayout1->addWidget( $yi, 5, 1, 1, 1 ); - my $yf = Qt::LineEdit( $groupBox ); + my $yf = Qt::LineEdit( $layoutWidget ); $self->{yf} = $yf; $yf->setObjectName( "yf" ); + $yf->setMinimumSize( Qt::Size(0, 25) ); - $gridLayout_8->addWidget( $yf, 7, 1, 1, 2 ); + $gridLayout1->addWidget( $yf, 5, 2, 1, 1 ); - my $ltc = Qt::CheckBox( $groupBox ); + my $ltc = Qt::CheckBox( $layoutWidget ); $self->{ltc} = $ltc; $ltc->setObjectName( "ltc" ); + $sizePolicy2->setHeightForWidth( $ltc->sizePolicy()->hasHeightForWidth() ); + $ltc->setSizePolicy( $sizePolicy2 ); + $ltc->setMinimumSize( Qt::Size(0, 25) ); $ltc->setChecked( 1 ); - $gridLayout_8->addWidget( $ltc, 7, 4, 1, 1 ); + $gridLayout1->addWidget( $ltc, 5, 3, 1, 1 ); $gridLayout_2->addWidget( $groupBox, 2, 0, 1, 1 ); @@ -1698,11 +1732,11 @@ sub setupUi { my $fittingPage = Qt::Widget( ); $self->{fittingPage} = $fittingPage; $fittingPage->setObjectName( "fittingPage" ); - my $gridLayout1 = Qt::GridLayout( $fittingPage ); - $self->{gridLayout1} = $gridLayout1; - $gridLayout1->setSpacing( 6 ); - $gridLayout1->setMargin( 11 ); - $gridLayout1->setObjectName( "gridLayout1" ); + my $gridLayout2 = Qt::GridLayout( $fittingPage ); + $self->{gridLayout2} = $gridLayout2; + $gridLayout2->setSpacing( 6 ); + $gridLayout2->setMargin( 11 ); + $gridLayout2->setObjectName( "gridLayout2" ); my $fitGrid = Qt::VBoxLayout( ); $self->{fitGrid} = $fitGrid; $fitGrid->setSpacing( 6 ); @@ -1747,23 +1781,23 @@ sub setupUi { $fitGrid->addLayout( $fitLayout ); - $gridLayout1->addLayout( $fitGrid, 0, 0, 1, 1 ); + $gridLayout2->addLayout( $fitGrid, 0, 0, 1, 1 ); my $fitTextOutput = Qt::TextEdit( $fittingPage ); $self->{fitTextOutput} = $fitTextOutput; $fitTextOutput->setObjectName( "fitTextOutput" ); - $gridLayout1->addWidget( $fitTextOutput, 1, 0, 1, 1 ); + $gridLayout2->addWidget( $fitTextOutput, 1, 0, 1, 1 ); $musrfit_tabs->addTab( $fittingPage, Qt::Application::translate( 'MuSRFit4', "Fitting", undef, Qt::Application::UnicodeUTF8() ) ); my $sharingPage = Qt::Widget( ); $self->{sharingPage} = $sharingPage; $sharingPage->setObjectName( "sharingPage" ); - my $gridLayout2 = Qt::GridLayout( $sharingPage ); - $self->{gridLayout2} = $gridLayout2; - $gridLayout2->setSpacing( 6 ); - $gridLayout2->setMargin( 11 ); - $gridLayout2->setObjectName( "gridLayout2" ); + my $gridLayout3 = Qt::GridLayout( $sharingPage ); + $self->{gridLayout3} = $gridLayout3; + $gridLayout3->setSpacing( 6 ); + $gridLayout3->setMargin( 11 ); + $gridLayout3->setObjectName( "gridLayout3" ); my $buttonGroupSharing = Qt::GroupBox( $sharingPage ); $self->{buttonGroupSharing} = $buttonGroupSharing; $buttonGroupSharing->setObjectName( "buttonGroupSharing" ); @@ -2051,34 +2085,34 @@ sub setupUi { $gridLayout_7->addLayout( $horizontalLayout, 0, 0, 1, 1 ); - $gridLayout2->addWidget( $buttonGroupSharing, 0, 0, 1, 1 ); + $gridLayout3->addWidget( $buttonGroupSharing, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $sharingPage, Qt::Application::translate( 'MuSRFit4', "Sharing", undef, Qt::Application::UnicodeUTF8() ) ); my $initializationPage = Qt::Widget( ); $self->{initializationPage} = $initializationPage; $initializationPage->setObjectName( "initializationPage" ); - my $gridLayout3 = Qt::GridLayout( $initializationPage ); - $self->{gridLayout3} = $gridLayout3; - $gridLayout3->setSpacing( 6 ); - $gridLayout3->setMargin( 11 ); - $gridLayout3->setObjectName( "gridLayout3" ); + my $gridLayout4 = Qt::GridLayout( $initializationPage ); + $self->{gridLayout4} = $gridLayout4; + $gridLayout4->setSpacing( 6 ); + $gridLayout4->setMargin( 11 ); + $gridLayout4->setObjectName( "gridLayout4" ); my $initParamTable = Qt::TableWidget( $initializationPage ); $self->{initParamTable} = $initParamTable; $initParamTable->setObjectName( "initParamTable" ); $initParamTable->setRowCount( 1 ); $initParamTable->setColumnCount( 4 ); - $gridLayout3->addWidget( $initParamTable, 0, 0, 1, 1 ); + $gridLayout4->addWidget( $initParamTable, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $initializationPage, Qt::Application::translate( 'MuSRFit4', "Initialization", undef, Qt::Application::UnicodeUTF8() ) ); my $msrPage = Qt::Widget( ); $self->{msrPage} = $msrPage; $msrPage->setObjectName( "msrPage" ); - my $gridLayout4 = Qt::GridLayout( $msrPage ); - $self->{gridLayout4} = $gridLayout4; - $gridLayout4->setSpacing( 6 ); - $gridLayout4->setMargin( 11 ); - $gridLayout4->setObjectName( "gridLayout4" ); + my $gridLayout5 = Qt::GridLayout( $msrPage ); + $self->{gridLayout5} = $gridLayout5; + $gridLayout5->setSpacing( 6 ); + $gridLayout5->setMargin( 11 ); + $gridLayout5->setObjectName( "gridLayout5" ); my $vboxLayout = Qt::VBoxLayout( ); $self->{vboxLayout} = $vboxLayout; $vboxLayout->setSpacing( 6 ); @@ -2087,13 +2121,13 @@ sub setupUi { my $groupTitle = Qt::GroupBox( $msrPage ); $self->{groupTitle} = $groupTitle; $groupTitle->setObjectName( "groupTitle" ); - $sizePolicy1->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); - $groupTitle->setSizePolicy( $sizePolicy1 ); - my $gridLayout5 = Qt::GridLayout( $groupTitle ); - $self->{gridLayout5} = $gridLayout5; - $gridLayout5->setSpacing( 6 ); - $gridLayout5->setMargin( 11 ); - $gridLayout5->setObjectName( "gridLayout5" ); + $sizePolicy2->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); + $groupTitle->setSizePolicy( $sizePolicy2 ); + my $gridLayout6 = Qt::GridLayout( $groupTitle ); + $self->{gridLayout6} = $gridLayout6; + $gridLayout6->setSpacing( 6 ); + $gridLayout6->setMargin( 11 ); + $gridLayout6->setObjectName( "gridLayout6" ); my $vboxLayout1 = Qt::VBoxLayout( ); $self->{vboxLayout1} = $vboxLayout1; $vboxLayout1->setSpacing( 6 ); @@ -2133,8 +2167,8 @@ sub setupUi { my $fileName = Qt::LineEdit( $groupTitle ); $self->{fileName} = $fileName; $fileName->setObjectName( "fileName" ); - $sizePolicy1->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); - $fileName->setSizePolicy( $sizePolicy1 ); + $sizePolicy2->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); + $fileName->setSizePolicy( $sizePolicy2 ); $hboxLayout->addWidget( $fileName ); @@ -2142,7 +2176,7 @@ sub setupUi { $vboxLayout1->addLayout( $hboxLayout ); - $gridLayout5->addLayout( $vboxLayout1, 0, 0, 1, 1 ); + $gridLayout6->addLayout( $vboxLayout1, 0, 0, 1, 1 ); $vboxLayout->addWidget( $groupTitle ); @@ -2155,17 +2189,17 @@ sub setupUi { $vboxLayout->addWidget( $textMSROutput ); - $gridLayout4->addLayout( $vboxLayout, 0, 0, 1, 1 ); + $gridLayout5->addLayout( $vboxLayout, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $msrPage, Qt::Application::translate( 'MuSRFit4', "MSR File", undef, Qt::Application::UnicodeUTF8() ) ); my $fourierPage = Qt::Widget( ); $self->{fourierPage} = $fourierPage; $fourierPage->setObjectName( "fourierPage" ); - my $gridLayout6 = Qt::GridLayout( $fourierPage ); - $self->{gridLayout6} = $gridLayout6; - $gridLayout6->setSpacing( 6 ); - $gridLayout6->setMargin( 11 ); - $gridLayout6->setObjectName( "gridLayout6" ); + my $gridLayout7 = Qt::GridLayout( $fourierPage ); + $self->{gridLayout7} = $gridLayout7; + $gridLayout7->setSpacing( 6 ); + $gridLayout7->setMargin( 11 ); + $gridLayout7->setObjectName( "gridLayout7" ); my $fourierBox = Qt::GroupBox( $fourierPage ); $self->{fourierBox} = $fourierBox; $fourierBox->setObjectName( "fourierBox" ); @@ -2175,19 +2209,19 @@ sub setupUi { $self->{layout34} = $layout34; $layout34->setObjectName( "layout34" ); $layout34->setGeometry( Qt::Rect(12, 19, 510, 117) ); - my $gridLayout7 = Qt::GridLayout( $layout34 ); - $self->{gridLayout7} = $gridLayout7; - $gridLayout7->setSpacing( 5 ); - $gridLayout7->setMargin( 5 ); - $gridLayout7->setObjectName( "gridLayout7" ); - $gridLayout7->setContentsMargins(0, 0, 0, 0 ); + my $gridLayout8 = Qt::GridLayout( $layout34 ); + $self->{gridLayout8} = $gridLayout8; + $gridLayout8->setSpacing( 5 ); + $gridLayout8->setMargin( 5 ); + $gridLayout8->setObjectName( "gridLayout8" ); + $gridLayout8->setContentsMargins(0, 0, 0, 0 ); my $frqMax = Qt::LineEdit( $layout34 ); $self->{frqMax} = $frqMax; $frqMax->setObjectName( "frqMax" ); $sizePolicy5->setHeightForWidth( $frqMax->sizePolicy()->hasHeightForWidth() ); $frqMax->setSizePolicy( $sizePolicy5 ); - $gridLayout7->addWidget( $frqMax, 0, 6, 1, 1 ); + $gridLayout8->addWidget( $frqMax, 0, 6, 1, 1 ); my $funits = Qt::ComboBox( $layout34 ); $self->{funits} = $funits; @@ -2199,7 +2233,7 @@ sub setupUi { $sizePolicy9->setHeightForWidth( $funits->sizePolicy()->hasHeightForWidth() ); $funits->setSizePolicy( $sizePolicy9 ); - $gridLayout7->addWidget( $funits, 0, 2, 1, 1 ); + $gridLayout8->addWidget( $funits, 0, 2, 1, 1 ); my $fplot = Qt::ComboBox( $layout34 ); $self->{fplot} = $fplot; @@ -2207,35 +2241,35 @@ sub setupUi { $sizePolicy5->setHeightForWidth( $fplot->sizePolicy()->hasHeightForWidth() ); $fplot->setSizePolicy( $sizePolicy5 ); - $gridLayout7->addWidget( $fplot, 2, 2, 1, 1 ); + $gridLayout8->addWidget( $fplot, 2, 2, 1, 1 ); my $textLabel1_3_8 = Qt::Label( $layout34 ); $self->{textLabel1_3_8} = $textLabel1_3_8; $textLabel1_3_8->setObjectName( "textLabel1_3_8" ); $textLabel1_3_8->setWordWrap( 0 ); - $gridLayout7->addWidget( $textLabel1_3_8, 2, 6, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_3_8, 2, 6, 1, 1 ); my $textLabel1_7 = Qt::Label( $layout34 ); $self->{textLabel1_7} = $textLabel1_7; $textLabel1_7->setObjectName( "textLabel1_7" ); $textLabel1_7->setWordWrap( 0 ); - $gridLayout7->addWidget( $textLabel1_7, 1, 3, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_7, 1, 3, 1, 1 ); my $fplotLabel = Qt::Label( $layout34 ); $self->{fplotLabel} = $fplotLabel; $fplotLabel->setObjectName( "fplotLabel" ); $fplotLabel->setWordWrap( 0 ); - $gridLayout7->addWidget( $fplotLabel, 2, 1, 1, 1 ); + $gridLayout8->addWidget( $fplotLabel, 2, 1, 1, 1 ); my $textLabel1_3_4 = Qt::Label( $layout34 ); $self->{textLabel1_3_4} = $textLabel1_3_4; $textLabel1_3_4->setObjectName( "textLabel1_3_4" ); $textLabel1_3_4->setWordWrap( 0 ); - $gridLayout7->addWidget( $textLabel1_3_4, 1, 6, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_3_4, 1, 6, 1, 1 ); my $fapodization = Qt::ComboBox( $layout34 ); $self->{fapodization} = $fapodization; @@ -2243,35 +2277,35 @@ sub setupUi { $sizePolicy5->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); $fapodization->setSizePolicy( $sizePolicy5 ); - $gridLayout7->addWidget( $fapodization, 1, 2, 1, 1 ); + $gridLayout8->addWidget( $fapodization, 1, 2, 1, 1 ); my $fapodizationLabel = Qt::Label( $layout34 ); $self->{fapodizationLabel} = $fapodizationLabel; $fapodizationLabel->setObjectName( "fapodizationLabel" ); $fapodizationLabel->setWordWrap( 0 ); - $gridLayout7->addWidget( $fapodizationLabel, 1, 1, 1, 1 ); + $gridLayout8->addWidget( $fapodizationLabel, 1, 1, 1, 1 ); my $textLabel1_3_3 = Qt::Label( $layout34 ); $self->{textLabel1_3_3} = $textLabel1_3_3; $textLabel1_3_3->setObjectName( "textLabel1_3_3" ); $textLabel1_3_3->setWordWrap( 0 ); - $gridLayout7->addWidget( $textLabel1_3_3, 1, 5, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_3_3, 1, 5, 1, 1 ); my $textLabel1_2 = Qt::Label( $layout34 ); $self->{textLabel1_2} = $textLabel1_2; $textLabel1_2->setObjectName( "textLabel1_2" ); $textLabel1_2->setWordWrap( 0 ); - $gridLayout7->addWidget( $textLabel1_2, 0, 5, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_2, 0, 5, 1, 1 ); my $textLabel1_3_6 = Qt::Label( $layout34 ); $self->{textLabel1_3_6} = $textLabel1_3_6; $textLabel1_3_6->setObjectName( "textLabel1_3_6" ); $textLabel1_3_6->setWordWrap( 0 ); - $gridLayout7->addWidget( $textLabel1_3_6, 2, 4, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_3_6, 2, 4, 1, 1 ); my $fphase = Qt::LineEdit( $layout34 ); $self->{fphase} = $fphase; @@ -2279,21 +2313,21 @@ sub setupUi { $sizePolicy5->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); $fphase->setSizePolicy( $sizePolicy5 ); - $gridLayout7->addWidget( $fphase, 1, 4, 1, 1 ); + $gridLayout8->addWidget( $fphase, 1, 4, 1, 1 ); my $textLabel1_3_5 = Qt::Label( $layout34 ); $self->{textLabel1_3_5} = $textLabel1_3_5; $textLabel1_3_5->setObjectName( "textLabel1_3_5" ); $textLabel1_3_5->setWordWrap( 0 ); - $gridLayout7->addWidget( $textLabel1_3_5, 2, 3, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_3_5, 2, 3, 1, 1 ); my $textLabel1_3_7 = Qt::Label( $layout34 ); $self->{textLabel1_3_7} = $textLabel1_3_7; $textLabel1_3_7->setObjectName( "textLabel1_3_7" ); $textLabel1_3_7->setWordWrap( 0 ); - $gridLayout7->addWidget( $textLabel1_3_7, 2, 5, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_3_7, 2, 5, 1, 1 ); my $frqMin = Qt::LineEdit( $layout34 ); $self->{frqMin} = $frqMin; @@ -2301,23 +2335,23 @@ sub setupUi { $sizePolicy5->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); $frqMin->setSizePolicy( $sizePolicy5 ); - $gridLayout7->addWidget( $frqMin, 0, 4, 1, 1 ); + $gridLayout8->addWidget( $frqMin, 0, 4, 1, 1 ); my $textLabel1 = Qt::Label( $layout34 ); $self->{textLabel1} = $textLabel1; $textLabel1->setObjectName( "textLabel1" ); $textLabel1->setWordWrap( 0 ); - $gridLayout7->addWidget( $textLabel1, 0, 3, 1, 1 ); + $gridLayout8->addWidget( $textLabel1, 0, 3, 1, 1 ); my $label = Qt::Label( $layout34 ); $self->{label} = $label; $label->setObjectName( "label" ); - $gridLayout7->addWidget( $label, 0, 1, 1, 1 ); + $gridLayout8->addWidget( $label, 0, 1, 1, 1 ); - $gridLayout6->addWidget( $fourierBox, 0, 0, 1, 1 ); + $gridLayout7->addWidget( $fourierBox, 0, 0, 1, 1 ); my $rrfBox = Qt::GroupBox( $fourierPage ); $self->{rrfBox} = $rrfBox; @@ -2328,83 +2362,83 @@ sub setupUi { $self->{layout35} = $layout35; $layout35->setObjectName( "layout35" ); $layout35->setGeometry( Qt::Rect(10, 18, 265, 107) ); - my $gridLayout8 = Qt::GridLayout( $layout35 ); - $self->{gridLayout8} = $gridLayout8; - $gridLayout8->setSpacing( 5 ); - $gridLayout8->setMargin( 5 ); - $gridLayout8->setObjectName( "gridLayout8" ); - $gridLayout8->setContentsMargins(0, 0, 0, 0 ); + my $gridLayout9 = Qt::GridLayout( $layout35 ); + $self->{gridLayout9} = $gridLayout9; + $gridLayout9->setSpacing( 5 ); + $gridLayout9->setMargin( 5 ); + $gridLayout9->setObjectName( "gridLayout9" ); + $gridLayout9->setContentsMargins(0, 0, 0, 0 ); my $textLabel1_6_2_2 = Qt::Label( $layout35 ); $self->{textLabel1_6_2_2} = $textLabel1_6_2_2; $textLabel1_6_2_2->setObjectName( "textLabel1_6_2_2" ); $textLabel1_6_2_2->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_6_2_2, 2, 0, 1, 1 ); + $gridLayout9->addWidget( $textLabel1_6_2_2, 2, 0, 1, 1 ); my $textLabel1_6 = Qt::Label( $layout35 ); $self->{textLabel1_6} = $textLabel1_6; $textLabel1_6->setObjectName( "textLabel1_6" ); $textLabel1_6->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_6, 0, 0, 1, 1 ); + $gridLayout9->addWidget( $textLabel1_6, 0, 0, 1, 1 ); my $textLabel1_6_2_4 = Qt::Label( $layout35 ); $self->{textLabel1_6_2_4} = $textLabel1_6_2_4; $textLabel1_6_2_4->setObjectName( "textLabel1_6_2_4" ); $textLabel1_6_2_4->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_6_2_4, 2, 2, 1, 1 ); + $gridLayout9->addWidget( $textLabel1_6_2_4, 2, 2, 1, 1 ); my $rrfFrq = Qt::LineEdit( $layout35 ); $self->{rrfFrq} = $rrfFrq; $rrfFrq->setObjectName( "rrfFrq" ); - $gridLayout8->addWidget( $rrfFrq, 0, 1, 1, 1 ); + $gridLayout9->addWidget( $rrfFrq, 0, 1, 1, 1 ); my $textLabel1_6_2_3 = Qt::Label( $layout35 ); $self->{textLabel1_6_2_3} = $textLabel1_6_2_3; $textLabel1_6_2_3->setObjectName( "textLabel1_6_2_3" ); $textLabel1_6_2_3->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_6_2_3, 1, 2, 1, 1 ); + $gridLayout9->addWidget( $textLabel1_6_2_3, 1, 2, 1, 1 ); my $rrfPack = Qt::LineEdit( $layout35 ); $self->{rrfPack} = $rrfPack; $rrfPack->setObjectName( "rrfPack" ); - $gridLayout8->addWidget( $rrfPack, 1, 1, 1, 1 ); + $gridLayout9->addWidget( $rrfPack, 1, 1, 1, 1 ); my $textLabel1_6_2 = Qt::Label( $layout35 ); $self->{textLabel1_6_2} = $textLabel1_6_2; $textLabel1_6_2->setObjectName( "textLabel1_6_2" ); $textLabel1_6_2->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_6_2, 1, 0, 1, 1 ); + $gridLayout9->addWidget( $textLabel1_6_2, 1, 0, 1, 1 ); my $rrfUnits = Qt::ComboBox( $layout35 ); $self->{rrfUnits} = $rrfUnits; $rrfUnits->setObjectName( "rrfUnits" ); - $gridLayout8->addWidget( $rrfUnits, 0, 2, 1, 1 ); + $gridLayout9->addWidget( $rrfUnits, 0, 2, 1, 1 ); my $rrfPhase = Qt::LineEdit( $layout35 ); $self->{rrfPhase} = $rrfPhase; $rrfPhase->setObjectName( "rrfPhase" ); - $gridLayout8->addWidget( $rrfPhase, 2, 1, 1, 1 ); + $gridLayout9->addWidget( $rrfPhase, 2, 1, 1, 1 ); - $gridLayout6->addWidget( $rrfBox, 1, 0, 1, 1 ); + $gridLayout7->addWidget( $rrfBox, 1, 0, 1, 1 ); $musrfit_tabs->addTab( $fourierPage, Qt::Application::translate( 'MuSRFit4', "FFT/RRF", undef, Qt::Application::UnicodeUTF8() ) ); my $t0Page = Qt::Widget( ); $self->{t0Page} = $t0Page; $t0Page->setObjectName( "t0Page" ); - my $gridLayout9 = Qt::GridLayout( $t0Page ); - $self->{gridLayout9} = $gridLayout9; - $gridLayout9->setSpacing( 6 ); - $gridLayout9->setMargin( 11 ); - $gridLayout9->setObjectName( "gridLayout9" ); + my $gridLayout10 = Qt::GridLayout( $t0Page ); + $self->{gridLayout10} = $gridLayout10; + $gridLayout10->setSpacing( 6 ); + $gridLayout10->setMargin( 11 ); + $gridLayout10->setObjectName( "gridLayout10" ); my $hboxLayout1 = Qt::HBoxLayout( ); $self->{hboxLayout1} = $hboxLayout1; $hboxLayout1->setSpacing( 6 ); @@ -2660,7 +2694,7 @@ sub setupUi { $hboxLayout1->addWidget( $groupHist4 ); - $gridLayout9->addLayout( $hboxLayout1, 0, 0, 1, 1 ); + $gridLayout10->addLayout( $hboxLayout1, 0, 0, 1, 1 ); my $hboxLayout2 = Qt::HBoxLayout( ); $self->{hboxLayout2} = $hboxLayout2; @@ -2684,25 +2718,25 @@ sub setupUi { $hboxLayout2->addWidget( $t0Update ); - $gridLayout9->addLayout( $hboxLayout2, 1, 0, 1, 1 ); + $gridLayout10->addLayout( $hboxLayout2, 1, 0, 1, 1 ); $musrfit_tabs->addTab( $t0Page, Qt::Application::translate( 'MuSRFit4', "t0/Bg", undef, Qt::Application::UnicodeUTF8() ) ); my $tabPage = Qt::Widget( ); $self->{tabPage} = $tabPage; $tabPage->setObjectName( "tabPage" ); - my $gridLayout10 = Qt::GridLayout( $tabPage ); - $self->{gridLayout10} = $gridLayout10; - $gridLayout10->setSpacing( 6 ); - $gridLayout10->setMargin( 11 ); - $gridLayout10->setObjectName( "gridLayout10" ); + my $gridLayout11 = Qt::GridLayout( $tabPage ); + $self->{gridLayout11} = $gridLayout11; + $gridLayout11->setSpacing( 6 ); + $gridLayout11->setMargin( 11 ); + $gridLayout11->setObjectName( "gridLayout11" ); my $vboxLayout7 = Qt::VBoxLayout( ); $self->{vboxLayout7} = $vboxLayout7; $vboxLayout7->setSpacing( 6 ); $vboxLayout7->setObjectName( "vboxLayout7" ); - my $gridLayout11 = Qt::GridLayout( ); - $self->{gridLayout11} = $gridLayout11; - $gridLayout11->setSpacing( 6 ); - $gridLayout11->setObjectName( "gridLayout11" ); + my $gridLayout12 = Qt::GridLayout( ); + $self->{gridLayout12} = $gridLayout12; + $gridLayout12->setSpacing( 6 ); + $gridLayout12->setObjectName( "gridLayout12" ); my $theoryBlock_Label = Qt::Label( $tabPage ); $self->{theoryBlock_Label} = $theoryBlock_Label; $theoryBlock_Label->setObjectName( "theoryBlock_Label" ); @@ -2758,14 +2792,14 @@ sub setupUi { $theoryBlock_Label->setPalette( $palette3 ); $theoryBlock_Label->setWordWrap( 0 ); - $gridLayout11->addWidget( $theoryBlock_Label, 0, 0, 1, 1 ); + $gridLayout12->addWidget( $theoryBlock_Label, 0, 0, 1, 1 ); my $theoryBlock = Qt::TextEdit( $tabPage ); $self->{theoryBlock} = $theoryBlock; $theoryBlock->setObjectName( "theoryBlock" ); $theoryBlock->setEnabled( 1 ); - $gridLayout11->addWidget( $theoryBlock, 1, 0, 1, 1 ); + $gridLayout12->addWidget( $theoryBlock, 1, 0, 1, 1 ); my $parametersList_Label = Qt::Label( $tabPage ); $self->{parametersList_Label} = $parametersList_Label; @@ -2822,17 +2856,17 @@ sub setupUi { $parametersList_Label->setPalette( $palette4 ); $parametersList_Label->setWordWrap( 0 ); - $gridLayout11->addWidget( $parametersList_Label, 0, 1, 1, 1 ); + $gridLayout12->addWidget( $parametersList_Label, 0, 1, 1, 1 ); my $parametersList = Qt::TextEdit( $tabPage ); $self->{parametersList} = $parametersList; $parametersList->setObjectName( "parametersList" ); $parametersList->setEnabled( 1 ); - $gridLayout11->addWidget( $parametersList, 1, 1, 1, 1 ); + $gridLayout12->addWidget( $parametersList, 1, 1, 1, 1 ); - $vboxLayout7->addLayout( $gridLayout11 ); + $vboxLayout7->addLayout( $gridLayout12 ); my $hboxLayout3 = Qt::HBoxLayout( ); $self->{hboxLayout3} = $hboxLayout3; @@ -2858,8 +2892,8 @@ sub setupUi { my $constraintLine = Qt::LineEdit( $tabPage ); $self->{constraintLine} = $constraintLine; $constraintLine->setObjectName( "constraintLine" ); - $sizePolicy1->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); - $constraintLine->setSizePolicy( $sizePolicy1 ); + $sizePolicy2->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); + $constraintLine->setSizePolicy( $sizePolicy2 ); $constraintLine->setMinimumSize( Qt::Size(0, 25) ); $hboxLayout3->addWidget( $constraintLine ); @@ -2960,7 +2994,7 @@ sub setupUi { $vboxLayout7->addLayout( $hboxLayout4 ); - $gridLayout10->addLayout( $vboxLayout7, 0, 0, 1, 1 ); + $gridLayout11->addLayout( $vboxLayout7, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $tabPage, Qt::Application::translate( 'MuSRFit4', "Constraints", undef, Qt::Application::UnicodeUTF8() ) ); @@ -2971,7 +3005,7 @@ sub setupUi { $self->{menuBar} = $menuBar; $menuBar->setObjectName( "menuBar" ); $menuBar->setEnabled( 1 ); - $menuBar->setGeometry( Qt::Rect(0, 0, 674, 27) ); + $menuBar->setGeometry( Qt::Rect(0, 0, 694, 27) ); my $fileMenu = Qt::Menu( $menuBar ); $self->{fileMenu} = $fileMenu; $fileMenu->setObjectName( "fileMenu" ); @@ -3218,9 +3252,11 @@ sub retranslateUi { $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->{textLabel1_4_2_3}->setText( '' ); $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() ) ); - $self->{comp3Label}->setText( Qt::Application::translate( 'MuSRFit4', "Third Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tisLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Initial Fit Time", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tfsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Final Fit Time", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{binsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Fit Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); $self->{fitType1}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), @@ -3239,6 +3275,13 @@ sub retranslateUi { Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() )]); + $self->{tis}->setText( Qt::Application::translate( 'MuSRFit4', "0", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{tfs}->setText( Qt::Application::translate( 'MuSRFit4', "8", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{bins}->setText( Qt::Application::translate( 'MuSRFit4', "100", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{comp2Label}->setText( Qt::Application::translate( 'MuSRFit4', "Second Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4}->setText( Qt::Application::translate( 'MuSRFit4', "Min X", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Max X", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "View Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); $self->{fitType2}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), @@ -3258,6 +3301,10 @@ sub retranslateUi { Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "None", undef, Qt::Application::UnicodeUTF8() )]); + $self->{comp3Label}->setText( Qt::Application::translate( 'MuSRFit4', "Third Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_2}->setText( Qt::Application::translate( 'MuSRFit4', "Min Y", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_3}->setText( Qt::Application::translate( 'MuSRFit4', "Max Y", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{textLabel1_4_4}->setText( '' ); $self->{fitType3}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), @@ -3277,18 +3324,6 @@ sub retranslateUi { Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "None", undef, Qt::Application::UnicodeUTF8() )]); - $self->{tisLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Initial Fit Time", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{tfsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Final Fit Time", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{binsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Fit Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{tis}->setText( Qt::Application::translate( 'MuSRFit4', "0", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{tfs}->setText( Qt::Application::translate( 'MuSRFit4', "8", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{bins}->setText( Qt::Application::translate( 'MuSRFit4', "100", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_4}->setText( Qt::Application::translate( 'MuSRFit4', "Min X", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Max X", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_4_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "View Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_4_2}->setText( Qt::Application::translate( 'MuSRFit4', "Min Y", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_4_3}->setText( Qt::Application::translate( 'MuSRFit4', "Max Y", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_4_4}->setText( '' ); $self->{ltc}->setText( Qt::Application::translate( 'MuSRFit4', "Life time correction", undef, Qt::Application::UnicodeUTF8() ) ); $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{runsPage}), Qt::Application::translate( 'MuSRFit4', "RUNS", undef, Qt::Application::UnicodeUTF8() ) ); $self->{errorCalc}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "HESSE", undef, Qt::Application::UnicodeUTF8() ), From e4580072ff07deda4b37bd0dec24efa43f041ac6 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sun, 11 Feb 2018 15:49:03 +0100 Subject: [PATCH 21/87] Moving on to variable number of components --- src/external/MuSRFitGUI/MuSRFit4.ui | 3914 +++++++++--------------- src/external/MuSRFitGUI/Ui_MuSRFit4.pm | 1675 +++++----- 2 files changed, 2134 insertions(+), 3455 deletions(-) diff --git a/src/external/MuSRFitGUI/MuSRFit4.ui b/src/external/MuSRFitGUI/MuSRFit4.ui index 10cb5ef2..f7af51be 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.ui +++ b/src/external/MuSRFitGUI/MuSRFit4.ui @@ -6,8 +6,8 @@ 0 0 - 694 - 556 + 705 + 574 @@ -27,7 +27,7 @@ - icos/MuSRFit.pngicos/MuSRFit.png + ../../../../../../.designer/backup/icos/MuSRFit.png../../../../../../.designer/backup/icos/MuSRFit.png MuSRFitGUI @@ -64,286 +64,372 @@ RUNS - - - - - QLayout::SetMinimumSize - - - 0 - - - - - - 1 - 1 - - - - - 0 - 80 - - - - - 1 - 1 - - - - RUN Files - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 411 - 21 - - - - - - - - true - - - - 0 - 0 - - - - - 0 - 23 - - - - - 16777215 - 25 - - - - Names of data files to be fit. Multiple data files are comma separated. - - - Names of data files to be fit. Multiple data files are comma separated. - - - - - - - true - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 25 - - - - Browse to select data files for fitting. - - - Browse to select data files for fitting. - - - Browse - - - - - - - - - - - - QLayout::SetMinimumSize - + + + + 1 + 1 + 676 + 355 + + + + + + + + 1 + 1 + + + + + 0 + 100 + + + + RUN Numbers + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + - - - - 0 - 0 - + + + QLayout::SetMinimumSize - - Fit type + + 0 - - false + + 0 - - - - - - - 0 - 0 - + + 0 - - - 0 - 25 - - - - - 16777215 - 25 - - - - - Asymmetry GLB - + + + + + 0 + 0 + + + + + 0 + 20 + + + + + 16777215 + 25 + + + + false + + + QComboBox::InsertAtTop + + + true + + + false + + - - - Single Hist - + + + + + 0 + 0 + + + + + 0 + 23 + + + + + 16777215 + 25 + + + + Numbers of RUNs to fit. Multiple runs are comma separated. + + + Numbers of RUNs to fit. Multiple runs are comma separated. + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + - - - Asymmetry - + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 181 + 21 + + + - - - - - - - 0 - 0 - - - - Histograms list - - - false - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 1 5,3 7 - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 81 - 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 + + + + - - - - - - 1 - 1 - - - - - 0 - 100 - - - - RUN Numbers - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - QLayout::SetDefaultConstraint - - - 0 - - - 0 - - - 0 - - - + + + + + + + 1 + 1 + + + + + 0 + 80 + + + + + 1 + 1 + + + + RUN Files + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 411 + 21 + + + + + + + + true + + + + 0 + 0 + + + + + 0 + 23 + + + + + 16777215 + 25 + + + + Names of data files to be fit. Multiple data files are comma separated. + + + Names of data files to be fit. Multiple data files are comma separated. + + + + + + + true + + + + 0 + 0 + + + + + 0 + 20 + + + + + 16777215 + 25 + + + + Browse to select data files for fitting. + + + Browse to select data files for fitting. + + + Browse + + + + + + + + + + + + + + + + - + 0 0 @@ -351,7 +437,7 @@ 0 - 20 + 25 @@ -360,82 +446,465 @@ 25 - - false - - - QComboBox::InsertAtTop - - - true - - - false - - - - - - - - 0 - 0 - - - - - 0 - 23 - - - - - 16777215 - 25 - - - - Numbers of RUNs to fit. Multiple runs are comma separated. - - - Numbers of RUNs to fit. Multiple runs are comma separated. + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 242 + 247 + 252 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + + + + + 128 + 128 + 128 + + + + + + + 230 + 240 + 249 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 115 + 120 + 124 + + + + + + + 154 + 160 + 166 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 238 + + + + + + + 82 + 24 + 139 + + + + + - + Number of components - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 181 - 21 - - - - - - - - - 0 - 0 - - + + 0 - 20 + 25 @@ -444,2177 +913,540 @@ 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 + + 1 + + + + + 0 + 0 + + + + + 280 + 0 + + + + Qt::ScrollBarAsNeeded + + + true + + + + + 0 + 0 + 276 + 70 + + + + + + 10 + 10 + 261 + 151 + + + + + + - - - - - - - 0 - 0 - - - - - 0 - 220 - - - - - 0 - 0 - - - - Theory Function - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - 430 - 170 - 130 - 16 - + + + + + + 0 + 0 + + + + + 384 + 0 + + + + true + + + + + 0 + 0 + 380 + 105 + + + + + + 10 + 10 + 355 + 180 + + + + + 5 + + + 5 + + + + + + 0 + 0 + + + + Initial Fit Time + + + false + + + + + + + + 0 + 0 + + + + Final Fit Time + + + false + + + + + + + + 0 + 0 + + + + Fit Binning Factor + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 0 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 8 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 100 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + Min X + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + Max X + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + View Binning Factor + + + false + + + + + + + + 0 + 25 + + + + + + + + + 0 + 25 + + + + + + + + + 0 + 25 + + + + + + + + + 0 + 25 + + + + Min Y + + + false + + + + + + + + 0 + 25 + + + + Max Y + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + + + false + + + + + + + + 0 + 25 + + + + + + + + + 0 + 25 + + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + Life time correction + + + true + + + + + + + + + + + + + + QLayout::SetMinimumSize + + + + + + 0 + 0 + - + Fit type false - - - - 10 - 30 - 641 - 181 - + + + + + + 0 + 0 + - - - QLayout::SetMinimumSize + + + 0 + 25 + + + + + 16777215 + 25 + + + + + Asymmetry GLB - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 242 - 247 - 252 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - - 128 - 128 - 128 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - First Component - - - false - - - - - - - - 0 - 0 - - - - Initial Fit Time - - - false - - - - - - - - 0 - 0 - - - - Final Fit Time - - - false - - - - - - - - 0 - 0 - - - - Fit Binning Factor - - - false - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - false - - - false - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - Lor-Gss combi KT - - - - - Lor-Gss combi KT x Exp - - - - - Lor-Gss combi KT x SExp - - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 0 - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 8 - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 100 - - - - - - - - 0 - 25 - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 242 - 247 - 252 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - - 128 - 128 - 128 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - Second Component - - - false - - - - - - - - 0 - 25 - - - - Min X - - - false - - - - - - - - 0 - 25 - - - - Max X - - - false - - - - - - - - 0 - 25 - - - - View Binning Factor - - - false - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 18 - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - Lor-Gss combi KT - - - - - Lor-Gss combi KT x Exp - - - - - Lor-Gss combi KT x SExp - - - - - None - - - - - - - - - 0 - 25 - - - - - - - - - 0 - 25 - - - - - - - - - 0 - 25 - - - - - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 242 - 247 - 252 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - - 128 - 128 - 128 - - - - - - - 230 - 240 - 249 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 115 - 120 - 124 - - - - - - - 154 - 160 - 166 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 127 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 238 - - - - - - - 82 - 24 - 139 - - - - - - - - Third Component - - - false - - - - - - - - 0 - 25 - - - - Min Y - - - false - - - - - - - - 0 - 25 - - - - Max Y - - - false - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - - - false - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - 18 - - - - Exponential - - - - - Gaussian - - - - - Stretch Exp. - - - - - Exponential Cos - - - - - Gaussian Cos - - - - - Stretch Cos - - - - - Lorentzian Dynamic KT - - - - - Gaussian Dynamic KT - - - - - Background - - - - - Lorentzian Kubo-Toyabe LF x Exp - - - - - Gaussian Kubo-Toyabe LF x Exp - - - - - Lorentzian Kubo-Toyabe LF x Str Exp - - - - - Gaussian Kubo-Toyabe LF x Str Exp - - - - - MolMag - - - - - Meissner State Model - - - - - Lor-Gss combi KT - - - - - Lor-Gss combi KT x Exp - - - - - Lor-Gss combi KT x SExp - - - - - None - - - - - - - - - 0 - 25 - - - - - - - - - 0 - 25 - - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - Life time correction - - - true - - - - + + + + Single Hist + + + + + Asymmetry + + - - - - - + + + + + + 0 + 0 + + + + Histograms list + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + 1 5,3 7 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 81 + 21 + + + + + + + + @@ -5542,7 +4374,7 @@ 0 0 - 694 + 705 27 @@ -5629,7 +4461,7 @@ - icos/save.pngicos/save.png + ../../../../../../.designer/backup/icos/save.png../../../../../../.designer/backup/icos/save.png &Save MSR... @@ -5647,7 +4479,7 @@ - icos/exit.pngicos/exit.png + ../../../../../../.designer/backup/icos/exit.png../../../../../../.designer/backup/icos/exit.png E&xit @@ -5704,7 +4536,7 @@ - icos/chdir.pngicos/chdir.png + ../../../../../../.designer/backup/icos/chdir.png../../../../../../.designer/backup/icos/chdir.png &Change dir @@ -5727,7 +4559,7 @@ - icos/Export.pngicos/Export.png + ../../../../../../.designer/backup/icos/Export.png../../../../../../.designer/backup/icos/Export.png &Export As... @@ -5742,7 +4574,7 @@ - icos/Append.pngicos/Append.png + ../../../../../../.designer/backup/icos/Append.png../../../../../../.designer/backup/icos/Append.png &Append To... @@ -5757,7 +4589,7 @@ - icos/Fit.pngicos/Fit.png + ../../../../../../.designer/backup/icos/Fit.png../../../../../../.designer/backup/icos/Fit.png Fit and Plot @@ -5772,7 +4604,7 @@ - icos/Plot.pngicos/Plot.png + ../../../../../../.designer/backup/icos/Plot.png../../../../../../.designer/backup/icos/Plot.png Plot @@ -5784,7 +4616,7 @@ - icos/T0.pngicos/T0.png + ../../../../../../.designer/backup/icos/T0.png../../../../../../.designer/backup/icos/T0.png Show t0 and Bg Bins @@ -5817,6 +4649,13 @@ + + + QVBoxLayout + QWidget +

qvboxlayout.h
+ + musrfit_tabs runNumbers @@ -5824,18 +4663,6 @@ year runFiles browse - fitType1 - fitType2 - fitType3 - tis - tfs - bins - xi - xf - viewBin - yi - yf - ltc fitAsyType histsLRBF minimization @@ -6065,8 +4892,8 @@ InitializeFunctions() - 593 - 489 + 686 + 655 20 @@ -6081,8 +4908,8 @@ AppendToFunctions() - 593 - 284 + 686 + 368 20 @@ -6097,8 +4924,8 @@ ActivateShComp() - 28 - 98 + 38 + 200 20 @@ -6129,8 +4956,8 @@ t0UpdateClicked() - 594 - 490 + 687 + 656 20 @@ -6145,8 +4972,8 @@ ActivateShComp() - 28 - 98 + 38 + 200 20 @@ -6170,22 +4997,6 @@ - - fitType1 - currentIndexChanged(int) - MuSRFit4 - InitializeFunctions() - - - 79 - 304 - - - 601 - 323 - - - beamLine currentIndexChanged(int) @@ -6193,8 +5004,8 @@ t0Update() - 416 - 144 + 544 + 188 603 @@ -6202,6 +5013,22 @@ + + numComps + valueChanged(int) + MuSRFit4 + addFitType() + + + 235 + 345 + + + 703 + 397 + + + t0UpdateClicked() @@ -6222,5 +5049,6 @@ ActivateShComp() TabChanged() t0Update() + addFitType() diff --git a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm index 20706783..958ce18c 100644 --- a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm +++ b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm @@ -5,7 +5,7 @@ ################################################################################# ## Form generated from reading UI file 'MuSRFit4.ui' ## -## Created: Sun Feb 11 15:43:10 2018 +## Created: Sun Feb 11 15:47:22 2018 ## by: Qt User Interface Compiler version 4.8.7 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! @@ -90,60 +90,12 @@ sub runsPage { return shift->{runsPage}; } -sub gridLayout_1 { - return shift->{gridLayout_1}; +sub layoutWidget { + return shift->{layoutWidget}; } -sub gridLayout_2 { - return shift->{gridLayout_2}; -} - -sub runsMan { - return shift->{runsMan}; -} - -sub gridLayout_4 { - return shift->{gridLayout_4}; -} - -sub runFiles_2 { - return shift->{runFiles_2}; -} - -sub spacer3 { - return shift->{spacer3}; -} - -sub runFiles { - return shift->{runFiles}; -} - -sub browse { - return shift->{browse}; -} - -sub gridLayout_6 { - return shift->{gridLayout_6}; -} - -sub fitAsyTypeLabel { - return shift->{fitAsyTypeLabel}; -} - -sub fitAsyType { - return shift->{fitAsyType}; -} - -sub histsLRBFLabel { - return shift->{histsLRBFLabel}; -} - -sub histsLRBF { - return shift->{histsLRBF}; -} - -sub spacer4 { - return shift->{spacer4}; +sub verticalLayout_2 { + return shift->{verticalLayout_2}; } sub runsAuto { @@ -182,26 +134,78 @@ sub beamLineLabel { return shift->{beamLineLabel}; } -sub groupBox { - return shift->{groupBox}; +sub runsMan { + return shift->{runsMan}; } -sub textLabel1_4_2_3 { - return shift->{textLabel1_4_2_3}; +sub gridLayout_4 { + return shift->{gridLayout_4}; } -sub layoutWidget { - return shift->{layoutWidget}; +sub runFiles_2 { + return shift->{runFiles_2}; } -sub gridLayout1 { - return shift->{gridLayout1}; +sub spacer3 { + return shift->{spacer3}; +} + +sub runFiles { + return shift->{runFiles}; +} + +sub browse { + return shift->{browse}; +} + +sub horizontalLayout_3 { + return shift->{horizontalLayout_3}; +} + +sub verticalLayout { + return shift->{verticalLayout}; +} + +sub horizontalLayout_2 { + return shift->{horizontalLayout_2}; } sub comp1Label { return shift->{comp1Label}; } +sub numComps { + return shift->{numComps}; +} + +sub theoryFunction { + return shift->{theoryFunction}; +} + +sub scrollAreaWidgetContents { + return shift->{scrollAreaWidgetContents}; +} + +sub columnView { + return shift->{columnView}; +} + +sub scrollArea { + return shift->{scrollArea}; +} + +sub scrollAreaWidgetContents_2 { + return shift->{scrollAreaWidgetContents_2}; +} + +sub layoutWidget2 { + return shift->{layoutWidget2}; +} + +sub gridLayout_1 { + return shift->{gridLayout_1}; +} + sub tisLabel { return shift->{tisLabel}; } @@ -214,10 +218,6 @@ sub binsLabel { return shift->{binsLabel}; } -sub fitType1 { - return shift->{fitType1}; -} - sub tis { return shift->{tis}; } @@ -230,10 +230,6 @@ sub bins { return shift->{bins}; } -sub comp2Label { - return shift->{comp2Label}; -} - sub textLabel1_4 { return shift->{textLabel1_4}; } @@ -246,10 +242,6 @@ sub textLabel1_4_2_2 { return shift->{textLabel1_4_2_2}; } -sub fitType2 { - return shift->{fitType2}; -} - sub xi { return shift->{xi}; } @@ -262,10 +254,6 @@ sub viewBin { return shift->{viewBin}; } -sub comp3Label { - return shift->{comp3Label}; -} - sub textLabel1_4_2 { return shift->{textLabel1_4_2}; } @@ -278,10 +266,6 @@ sub textLabel1_4_4 { return shift->{textLabel1_4_4}; } -sub fitType3 { - return shift->{fitType3}; -} - sub yi { return shift->{yi}; } @@ -294,12 +278,36 @@ sub ltc { return shift->{ltc}; } +sub gridLayout_6 { + return shift->{gridLayout_6}; +} + +sub fitAsyTypeLabel { + return shift->{fitAsyTypeLabel}; +} + +sub fitAsyType { + return shift->{fitAsyType}; +} + +sub histsLRBFLabel { + return shift->{histsLRBFLabel}; +} + +sub histsLRBF { + return shift->{histsLRBF}; +} + +sub spacer4 { + return shift->{spacer4}; +} + sub fittingPage { return shift->{fittingPage}; } -sub gridLayout2 { - return shift->{gridLayout2}; +sub gridLayout1 { + return shift->{gridLayout1}; } sub fitGrid { @@ -334,8 +342,8 @@ sub sharingPage { return shift->{sharingPage}; } -sub gridLayout3 { - return shift->{gridLayout3}; +sub gridLayout2 { + return shift->{gridLayout2}; } sub buttonGroupSharing { @@ -510,8 +518,8 @@ sub initializationPage { return shift->{initializationPage}; } -sub gridLayout4 { - return shift->{gridLayout4}; +sub gridLayout3 { + return shift->{gridLayout3}; } sub initParamTable { @@ -522,8 +530,8 @@ sub msrPage { return shift->{msrPage}; } -sub gridLayout5 { - return shift->{gridLayout5}; +sub gridLayout4 { + return shift->{gridLayout4}; } sub vboxLayout { @@ -534,8 +542,8 @@ sub groupTitle { return shift->{groupTitle}; } -sub gridLayout6 { - return shift->{gridLayout6}; +sub gridLayout5 { + return shift->{gridLayout5}; } sub vboxLayout1 { @@ -570,8 +578,8 @@ sub fourierPage { return shift->{fourierPage}; } -sub gridLayout7 { - return shift->{gridLayout7}; +sub gridLayout6 { + return shift->{gridLayout6}; } sub fourierBox { @@ -582,8 +590,8 @@ sub layout34 { return shift->{layout34}; } -sub gridLayout8 { - return shift->{gridLayout8}; +sub gridLayout7 { + return shift->{gridLayout7}; } sub frqMax { @@ -666,8 +674,8 @@ sub layout35 { return shift->{layout35}; } -sub gridLayout9 { - return shift->{gridLayout9}; +sub gridLayout8 { + return shift->{gridLayout8}; } sub textLabel1_6_2_2 { @@ -710,8 +718,8 @@ sub t0Page { return shift->{t0Page}; } -sub gridLayout10 { - return shift->{gridLayout10}; +sub gridLayout9 { + return shift->{gridLayout9}; } sub hboxLayout1 { @@ -894,16 +902,16 @@ sub tabPage { return shift->{tabPage}; } -sub gridLayout11 { - return shift->{gridLayout11}; +sub gridLayout10 { + return shift->{gridLayout10}; } sub vboxLayout7 { return shift->{vboxLayout7}; } -sub gridLayout12 { - return shift->{gridLayout12}; +sub gridLayout11 { + return shift->{gridLayout11}; } sub theoryBlock_Label { @@ -1001,7 +1009,7 @@ sub setupUi { if ( !defined $muSRFit4->objectName() ) { $muSRFit4->setObjectName( "muSRFit4" ); } - $muSRFit4->resize( 694, 556 ); + $muSRFit4->resize( 705, 574 ); my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); $self->{$sizePolicy} = $sizePolicy; $sizePolicy->setHorizontalStretch( 1 ); @@ -1010,19 +1018,19 @@ sub setupUi { $muSRFit4->setSizePolicy( $sizePolicy ); $muSRFit4->setMinimumSize( Qt::Size(600, 505) ); my $icon = Qt::Icon(); - $icon->addPixmap(Qt::Pixmap("icos/MuSRFit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/MuSRFit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $muSRFit4->setWindowIcon( $icon ); my $fileSaveAction = Qt::Action($muSRFit4); $self->{fileSaveAction} = $fileSaveAction; $fileSaveAction->setObjectName( "fileSaveAction" ); my $icon1 = Qt::Icon(); - $icon1->addPixmap(Qt::Pixmap("icos/save.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon1->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/save.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $fileSaveAction->setIcon( $icon1 ); my $fileExitAction = Qt::Action($muSRFit4); $self->{fileExitAction} = $fileExitAction; $fileExitAction->setObjectName( "fileExitAction" ); my $icon2 = Qt::Icon(); - $icon2->addPixmap(Qt::Pixmap("icos/exit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon2->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/exit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $fileExitAction->setIcon( $icon2 ); my $helpAboutAction = Qt::Action($muSRFit4); $self->{helpAboutAction} = $helpAboutAction; @@ -1040,7 +1048,7 @@ sub setupUi { $self->{fileChangeDirAction} = $fileChangeDirAction; $fileChangeDirAction->setObjectName( "fileChangeDirAction" ); my $icon3 = Qt::Icon(); - $icon3->addPixmap(Qt::Pixmap("icos/chdir.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon3->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/chdir.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $fileChangeDirAction->setIcon( $icon3 ); my $optionsnew_itemAction = Qt::Action($muSRFit4); $self->{optionsnew_itemAction} = $optionsnew_itemAction; @@ -1049,32 +1057,32 @@ sub setupUi { $self->{parametersExport_AsAction} = $parametersExport_AsAction; $parametersExport_AsAction->setObjectName( "parametersExport_AsAction" ); my $icon4 = Qt::Icon(); - $icon4->addPixmap(Qt::Pixmap("icos/Export.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon4->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/Export.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $parametersExport_AsAction->setIcon( $icon4 ); my $parametersAppend_ToAction = Qt::Action($muSRFit4); $self->{parametersAppend_ToAction} = $parametersAppend_ToAction; $parametersAppend_ToAction->setObjectName( "parametersAppend_ToAction" ); my $icon5 = Qt::Icon(); - $icon5->addPixmap(Qt::Pixmap("icos/Append.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon5->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/Append.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $parametersAppend_ToAction->setIcon( $icon5 ); my $fit = Qt::Action($muSRFit4); $self->{fit} = $fit; $fit->setObjectName( "fit" ); my $icon6 = Qt::Icon(); - $icon6->addPixmap(Qt::Pixmap("icos/Fit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon6->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/Fit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $fit->setIcon( $icon6 ); my $plot = Qt::Action($muSRFit4); $self->{plot} = $plot; $plot->setObjectName( "plot" ); $plot->setCheckable( 0 ); my $icon7 = Qt::Icon(); - $icon7->addPixmap(Qt::Pixmap("icos/Plot.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon7->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/Plot.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $plot->setIcon( $icon7 ); my $t0 = Qt::Action($muSRFit4); $self->{t0} = $t0; $t0->setObjectName( "t0" ); my $icon8 = Qt::Icon(); - $icon8->addPixmap(Qt::Pixmap("icos/T0.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon8->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/T0.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $t0->setIcon( $icon8 ); my $optionsFourier = Qt::Action($muSRFit4); $self->{optionsFourier} = $optionsFourier; @@ -1103,23 +1111,119 @@ sub setupUi { my $runsPage = Qt::Widget( ); $self->{runsPage} = $runsPage; $runsPage->setObjectName( "runsPage" ); - my $gridLayout_1 = Qt::GridLayout( $runsPage ); - $self->{gridLayout_1} = $gridLayout_1; - $gridLayout_1->setSpacing( 6 ); - $gridLayout_1->setMargin( 11 ); - $gridLayout_1->setObjectName( "gridLayout_1" ); - my $gridLayout_2 = Qt::GridLayout( ); - $self->{gridLayout_2} = $gridLayout_2; - $gridLayout_2->setSpacing( 0 ); - $gridLayout_2->setObjectName( "gridLayout_2" ); - $gridLayout_2->setSizeConstraint( Qt::Layout::SetMinimumSize() ); - my $runsMan = Qt::GroupBox( $runsPage ); - $self->{runsMan} = $runsMan; - $runsMan->setObjectName( "runsMan" ); + my $layoutWidget = Qt::Widget( $runsPage ); + $self->{layoutWidget} = $layoutWidget; + $layoutWidget->setObjectName( "layoutWidget" ); + $layoutWidget->setGeometry( Qt::Rect(1, 1, 676, 355) ); + my $verticalLayout_2 = Qt::VBoxLayout( $layoutWidget ); + $self->{verticalLayout_2} = $verticalLayout_2; + $verticalLayout_2->setSpacing( 6 ); + $verticalLayout_2->setMargin( 11 ); + $verticalLayout_2->setObjectName( "verticalLayout_2" ); + $verticalLayout_2->setContentsMargins(0, 0, 0, 0 ); + my $runsAuto = Qt::GroupBox( $layoutWidget ); + $self->{runsAuto} = $runsAuto; + $runsAuto->setObjectName( "runsAuto" ); my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Maximum() ); $self->{$sizePolicy1} = $sizePolicy1; $sizePolicy1->setHorizontalStretch( 1 ); $sizePolicy1->setVerticalStretch( 1 ); + $sizePolicy1->setHeightForWidth( $runsAuto->sizePolicy()->hasHeightForWidth() ); + $runsAuto->setSizePolicy( $sizePolicy1 ); + $runsAuto->setMinimumSize( Qt::Size(0, 100) ); + $runsAuto->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); + my $gridLayout_3 = Qt::GridLayout( $runsAuto ); + $self->{gridLayout_3} = $gridLayout_3; + $gridLayout_3->setSpacing( 6 ); + $gridLayout_3->setMargin( 11 ); + $gridLayout_3->setObjectName( "gridLayout_3" ); + my $runNumbers_2 = Qt::GridLayout( ); + $self->{runNumbers_2} = $runNumbers_2; + $runNumbers_2->setSpacing( 0 ); + $runNumbers_2->setObjectName( "runNumbers_2" ); + $runNumbers_2->setSizeConstraint( Qt::Layout::SetMinimumSize() ); + $runNumbers_2->setContentsMargins(-1, 0, -1, 0 ); + my $year = Qt::ComboBox( $runsAuto ); + $self->{year} = $year; + $year->setObjectName( "year" ); + my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy2} = $sizePolicy2; + $sizePolicy2->setHorizontalStretch( 0 ); + $sizePolicy2->setVerticalStretch( 0 ); + $sizePolicy2->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); + $year->setSizePolicy( $sizePolicy2 ); + $year->setMinimumSize( Qt::Size(0, 20) ); + $year->setMaximumSize( Qt::Size(16777215, 25) ); + $year->setEditable( 0 ); + $year->setInsertPolicy( Qt::ComboBox::InsertAtTop() ); + $year->setAutoCompletion( 1 ); + $year->setDuplicatesEnabled( 0 ); + + $runNumbers_2->addWidget( $year, 1, 4, 1, 1 ); + + my $runNumbers = Qt::LineEdit( $runsAuto ); + $self->{runNumbers} = $runNumbers; + $runNumbers->setObjectName( "runNumbers" ); + my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy3} = $sizePolicy3; + $sizePolicy3->setHorizontalStretch( 0 ); + $sizePolicy3->setVerticalStretch( 0 ); + $sizePolicy3->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); + $runNumbers->setSizePolicy( $sizePolicy3 ); + $runNumbers->setMinimumSize( Qt::Size(0, 23) ); + $runNumbers->setMaximumSize( Qt::Size(16777215, 25) ); + $runNumbers->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); + + $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 $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, 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 ); + + + $verticalLayout_2->addWidget( $runsAuto ); + + my $runsMan = Qt::GroupBox( $layoutWidget ); + $self->{runsMan} = $runsMan; + $runsMan->setObjectName( "runsMan" ); $sizePolicy1->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); $runsMan->setSizePolicy( $sizePolicy1 ); $runsMan->setMinimumSize( Qt::Size(0, 80) ); @@ -1142,12 +1246,8 @@ sub setupUi { $self->{runFiles} = $runFiles; $runFiles->setObjectName( "runFiles" ); $runFiles->setEnabled( 1 ); - my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy2} = $sizePolicy2; - $sizePolicy2->setHorizontalStretch( 0 ); - $sizePolicy2->setVerticalStretch( 0 ); - $sizePolicy2->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); - $runFiles->setSizePolicy( $sizePolicy2 ); + $sizePolicy3->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); + $runFiles->setSizePolicy( $sizePolicy3 ); $runFiles->setMinimumSize( Qt::Size(0, 23) ); $runFiles->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1157,12 +1257,8 @@ sub setupUi { $self->{browse} = $browse; $browse->setObjectName( "browse" ); $browse->setEnabled( 1 ); - my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); - $self->{$sizePolicy3} = $sizePolicy3; - $sizePolicy3->setHorizontalStretch( 0 ); - $sizePolicy3->setVerticalStretch( 0 ); - $sizePolicy3->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); - $browse->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); + $browse->setSizePolicy( $sizePolicy2 ); $browse->setMinimumSize( Qt::Size(0, 20) ); $browse->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1172,181 +1268,31 @@ sub setupUi { $gridLayout_4->addLayout( $runFiles_2, 0, 0, 1, 1 ); - $gridLayout_2->addWidget( $runsMan, 1, 0, 1, 1 ); + $verticalLayout_2->addWidget( $runsMan ); - my $gridLayout_6 = Qt::GridLayout( ); - $self->{gridLayout_6} = $gridLayout_6; - $gridLayout_6->setSpacing( 6 ); - $gridLayout_6->setObjectName( "gridLayout_6" ); - $gridLayout_6->setSizeConstraint( Qt::Layout::SetMinimumSize() ); - my $fitAsyTypeLabel = Qt::Label( $runsPage ); - $self->{fitAsyTypeLabel} = $fitAsyTypeLabel; - $fitAsyTypeLabel->setObjectName( "fitAsyTypeLabel" ); - my $sizePolicy4 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy4} = $sizePolicy4; - $sizePolicy4->setHorizontalStretch( 0 ); - $sizePolicy4->setVerticalStretch( 0 ); - $sizePolicy4->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); - $fitAsyTypeLabel->setSizePolicy( $sizePolicy4 ); - $fitAsyTypeLabel->setWordWrap( 0 ); - - $gridLayout_6->addWidget( $fitAsyTypeLabel, 0, 0, 1, 1 ); - - my $fitAsyType = Qt::ComboBox( $runsPage ); - $self->{fitAsyType} = $fitAsyType; - $fitAsyType->setObjectName( "fitAsyType" ); - $sizePolicy4->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); - $fitAsyType->setSizePolicy( $sizePolicy4 ); - $fitAsyType->setMinimumSize( Qt::Size(0, 25) ); - $fitAsyType->setMaximumSize( Qt::Size(16777215, 25) ); - - $gridLayout_6->addWidget( $fitAsyType, 0, 1, 1, 1 ); - - my $histsLRBFLabel = Qt::Label( $runsPage ); - $self->{histsLRBFLabel} = $histsLRBFLabel; - $histsLRBFLabel->setObjectName( "histsLRBFLabel" ); - $sizePolicy4->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); - $histsLRBFLabel->setSizePolicy( $sizePolicy4 ); - $histsLRBFLabel->setWordWrap( 0 ); - - $gridLayout_6->addWidget( $histsLRBFLabel, 0, 2, 1, 1 ); - - my $histsLRBF = Qt::LineEdit( $runsPage ); - $self->{histsLRBF} = $histsLRBF; - $histsLRBF->setObjectName( "histsLRBF" ); - $sizePolicy4->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); - $histsLRBF->setSizePolicy( $sizePolicy4 ); - $histsLRBF->setMinimumSize( Qt::Size(0, 25) ); - $histsLRBF->setMaximumSize( Qt::Size(16777215, 25) ); - - $gridLayout_6->addWidget( $histsLRBF, 0, 3, 1, 1 ); - - my $spacer4 = Qt::SpacerItem( 81, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); - - $gridLayout_6->addItem( $spacer4, 0, 4, 1, 1 ); - - - $gridLayout_2->addLayout( $gridLayout_6, 3, 0, 1, 1 ); - - my $runsAuto = Qt::GroupBox( $runsPage ); - $self->{runsAuto} = $runsAuto; - $runsAuto->setObjectName( "runsAuto" ); - $sizePolicy1->setHeightForWidth( $runsAuto->sizePolicy()->hasHeightForWidth() ); - $runsAuto->setSizePolicy( $sizePolicy1 ); - $runsAuto->setMinimumSize( Qt::Size(0, 100) ); - $runsAuto->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); - my $gridLayout_3 = Qt::GridLayout( $runsAuto ); - $self->{gridLayout_3} = $gridLayout_3; - $gridLayout_3->setSpacing( 6 ); - $gridLayout_3->setMargin( 11 ); - $gridLayout_3->setObjectName( "gridLayout_3" ); - my $runNumbers_2 = Qt::GridLayout( ); - $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" ); - $sizePolicy3->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); - $year->setSizePolicy( $sizePolicy3 ); - $year->setMinimumSize( Qt::Size(0, 20) ); - $year->setMaximumSize( Qt::Size(16777215, 25) ); - $year->setEditable( 0 ); - $year->setInsertPolicy( Qt::ComboBox::InsertAtTop() ); - $year->setAutoCompletion( 1 ); - $year->setDuplicatesEnabled( 0 ); - - $runNumbers_2->addWidget( $year, 1, 4, 1, 1 ); - - my $runNumbers = Qt::LineEdit( $runsAuto ); - $self->{runNumbers} = $runNumbers; - $runNumbers->setObjectName( "runNumbers" ); - $sizePolicy2->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); - $runNumbers->setSizePolicy( $sizePolicy2 ); - $runNumbers->setMinimumSize( Qt::Size(0, 23) ); - $runNumbers->setMaximumSize( Qt::Size(16777215, 25) ); - $runNumbers->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); - - $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" ); - $sizePolicy3->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); - $beamLine->setSizePolicy( $sizePolicy3 ); - $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 ); - - - $gridLayout_2->addWidget( $runsAuto, 0, 0, 1, 1 ); - - my $groupBox = Qt::GroupBox( $runsPage ); - $self->{groupBox} = $groupBox; - $groupBox->setObjectName( "groupBox" ); - 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) ); - $groupBox->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignVCenter() ); - my $textLabel1_4_2_3 = Qt::Label( $groupBox ); - $self->{textLabel1_4_2_3} = $textLabel1_4_2_3; - $textLabel1_4_2_3->setObjectName( "textLabel1_4_2_3" ); - $textLabel1_4_2_3->setGeometry( Qt::Rect(430, 170, 130, 16) ); - $textLabel1_4_2_3->setWordWrap( 0 ); - my $layoutWidget = Qt::Widget( $groupBox ); - $self->{layoutWidget} = $layoutWidget; - $layoutWidget->setObjectName( "layoutWidget" ); - $layoutWidget->setGeometry( Qt::Rect(10, 30, 641, 181) ); - my $gridLayout1 = Qt::GridLayout( $layoutWidget ); - $self->{gridLayout1} = $gridLayout1; - $gridLayout1->setSpacing( 6 ); - $gridLayout1->setMargin( 11 ); - $gridLayout1->setObjectName( "gridLayout1" ); - $gridLayout1->setSizeConstraint( Qt::Layout::SetMinimumSize() ); - $gridLayout1->setContentsMargins(0, 0, 0, 0 ); + my $horizontalLayout_3 = Qt::HBoxLayout( ); + $self->{horizontalLayout_3} = $horizontalLayout_3; + $horizontalLayout_3->setSpacing( 6 ); + $horizontalLayout_3->setObjectName( "horizontalLayout_3" ); + my $verticalLayout = Qt::VBoxLayout( ); + $self->{verticalLayout} = $verticalLayout; + $verticalLayout->setSpacing( 6 ); + $verticalLayout->setObjectName( "verticalLayout" ); + my $horizontalLayout_2 = Qt::HBoxLayout( ); + $self->{horizontalLayout_2} = $horizontalLayout_2; + $horizontalLayout_2->setSpacing( 6 ); + $horizontalLayout_2->setObjectName( "horizontalLayout_2" ); my $comp1Label = Qt::Label( $layoutWidget ); $self->{comp1Label} = $comp1Label; $comp1Label->setObjectName( "comp1Label" ); + my $sizePolicy5 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy5} = $sizePolicy5; + $sizePolicy5->setHorizontalStretch( 0 ); + $sizePolicy5->setVerticalStretch( 0 ); + $sizePolicy5->setHeightForWidth( $comp1Label->sizePolicy()->hasHeightForWidth() ); + $comp1Label->setSizePolicy( $sizePolicy5 ); + $comp1Label->setMinimumSize( Qt::Size(0, 25) ); + $comp1Label->setMaximumSize( Qt::Size(16777215, 25) ); my $palette = Qt::Palette(); my $brush = Qt::Brush(Qt::Color(0, 0, 0, 255)); $brush->setStyle( Qt::SolidPattern() ); @@ -1419,324 +1365,303 @@ sub setupUi { $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); $palette->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); $comp1Label->setPalette( $palette ); + $comp1Label->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignVCenter() ); $comp1Label->setWordWrap( 0 ); - $gridLayout1->addWidget( $comp1Label, 0, 0, 1, 1 ); + $horizontalLayout_2->addWidget( $comp1Label ); - my $tisLabel = Qt::Label( $layoutWidget ); + my $numComps = Qt::SpinBox( $layoutWidget ); + $self->{numComps} = $numComps; + $numComps->setObjectName( "numComps" ); + $numComps->setMinimumSize( Qt::Size(0, 25) ); + $numComps->setMaximumSize( Qt::Size(16777215, 25) ); + $numComps->setMinimum( 1 ); + + $horizontalLayout_2->addWidget( $numComps ); + + + $verticalLayout->addLayout( $horizontalLayout_2 ); + + my $theoryFunction = Qt::ScrollArea( $layoutWidget ); + $self->{theoryFunction} = $theoryFunction; + $theoryFunction->setObjectName( "theoryFunction" ); + my $sizePolicy6 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); + $self->{$sizePolicy6} = $sizePolicy6; + $sizePolicy6->setHorizontalStretch( 0 ); + $sizePolicy6->setVerticalStretch( 0 ); + $sizePolicy6->setHeightForWidth( $theoryFunction->sizePolicy()->hasHeightForWidth() ); + $theoryFunction->setSizePolicy( $sizePolicy6 ); + $theoryFunction->setMinimumSize( Qt::Size(280, 0) ); + $theoryFunction->setVerticalScrollBarPolicy( Qt::ScrollBarAsNeeded() ); + $theoryFunction->setWidgetResizable( 1 ); + my $scrollAreaWidgetContents = Qt::Widget( ); + $self->{scrollAreaWidgetContents} = $scrollAreaWidgetContents; + $scrollAreaWidgetContents->setObjectName( "scrollAreaWidgetContents" ); + $scrollAreaWidgetContents->setGeometry( Qt::Rect(0, 0, 276, 70) ); + my $columnView = Qt::VBoxLayout( $scrollAreaWidgetContents ); + $self->{columnView} = $columnView; + $columnView->setObjectName( "columnView" ); + $columnView->setGeometry( Qt::Rect(10, 10, 261, 151) ); + $theoryFunction->setWidget( $scrollAreaWidgetContents ); + + $verticalLayout->addWidget( $theoryFunction ); + + + $horizontalLayout_3->addLayout( $verticalLayout ); + + my $scrollArea = Qt::ScrollArea( $layoutWidget ); + $self->{scrollArea} = $scrollArea; + $scrollArea->setObjectName( "scrollArea" ); + my $sizePolicy7 = Qt::SizePolicy( Qt::SizePolicy::Minimum(), Qt::SizePolicy::Minimum() ); + $self->{$sizePolicy7} = $sizePolicy7; + $sizePolicy7->setHorizontalStretch( 0 ); + $sizePolicy7->setVerticalStretch( 0 ); + $sizePolicy7->setHeightForWidth( $scrollArea->sizePolicy()->hasHeightForWidth() ); + $scrollArea->setSizePolicy( $sizePolicy7 ); + $scrollArea->setMinimumSize( Qt::Size(384, 0) ); + $scrollArea->setWidgetResizable( 1 ); + my $scrollAreaWidgetContents_2 = Qt::Widget( ); + $self->{scrollAreaWidgetContents_2} = $scrollAreaWidgetContents_2; + $scrollAreaWidgetContents_2->setObjectName( "scrollAreaWidgetContents_2" ); + $scrollAreaWidgetContents_2->setGeometry( Qt::Rect(0, 0, 380, 105) ); + my $layoutWidget2 = Qt::Widget( $scrollAreaWidgetContents_2 ); + $self->{layoutWidget2} = $layoutWidget2; + $layoutWidget2->setObjectName( "layoutWidget2" ); + $layoutWidget2->setGeometry( Qt::Rect(10, 10, 355, 180) ); + my $gridLayout_1 = Qt::GridLayout( $layoutWidget2 ); + $self->{gridLayout_1} = $gridLayout_1; + $gridLayout_1->setSpacing( 6 ); + $gridLayout_1->setMargin( 11 ); + $gridLayout_1->setObjectName( "gridLayout_1" ); + $gridLayout_1->setContentsMargins(5, 0, 5, 0 ); + my $tisLabel = Qt::Label( $layoutWidget2 ); $self->{tisLabel} = $tisLabel; $tisLabel->setObjectName( "tisLabel" ); - $sizePolicy4->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); - $tisLabel->setSizePolicy( $sizePolicy4 ); + $sizePolicy5->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); + $tisLabel->setSizePolicy( $sizePolicy5 ); $tisLabel->setWordWrap( 0 ); - $gridLayout1->addWidget( $tisLabel, 0, 1, 1, 1 ); + $gridLayout_1->addWidget( $tisLabel, 0, 0, 1, 1 ); - my $tfsLabel = Qt::Label( $layoutWidget ); + my $tfsLabel = Qt::Label( $layoutWidget2 ); $self->{tfsLabel} = $tfsLabel; $tfsLabel->setObjectName( "tfsLabel" ); - $sizePolicy4->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); - $tfsLabel->setSizePolicy( $sizePolicy4 ); + $sizePolicy5->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); + $tfsLabel->setSizePolicy( $sizePolicy5 ); $tfsLabel->setWordWrap( 0 ); - $gridLayout1->addWidget( $tfsLabel, 0, 2, 1, 1 ); + $gridLayout_1->addWidget( $tfsLabel, 0, 1, 1, 1 ); - my $binsLabel = Qt::Label( $layoutWidget ); + my $binsLabel = Qt::Label( $layoutWidget2 ); $self->{binsLabel} = $binsLabel; $binsLabel->setObjectName( "binsLabel" ); - $sizePolicy4->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); - $binsLabel->setSizePolicy( $sizePolicy4 ); + $sizePolicy5->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); + $binsLabel->setSizePolicy( $sizePolicy5 ); $binsLabel->setWordWrap( 0 ); - $gridLayout1->addWidget( $binsLabel, 0, 3, 1, 1 ); + $gridLayout_1->addWidget( $binsLabel, 0, 2, 1, 1 ); - my $fitType1 = Qt::ComboBox( $layoutWidget ); - $self->{fitType1} = $fitType1; - $fitType1->setObjectName( "fitType1" ); - $sizePolicy2->setHeightForWidth( $fitType1->sizePolicy()->hasHeightForWidth() ); - $fitType1->setSizePolicy( $sizePolicy2 ); - $fitType1->setMinimumSize( Qt::Size(0, 25) ); - $fitType1->setMaximumSize( Qt::Size(16777215, 25) ); - $fitType1->setAutoCompletion( 0 ); - $fitType1->setDuplicatesEnabled( 0 ); - - $gridLayout1->addWidget( $fitType1, 1, 0, 1, 1 ); - - my $tis = Qt::LineEdit( $layoutWidget ); + my $tis = Qt::LineEdit( $layoutWidget2 ); $self->{tis} = $tis; $tis->setObjectName( "tis" ); - $sizePolicy2->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); - $tis->setSizePolicy( $sizePolicy2 ); + $sizePolicy3->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); + $tis->setSizePolicy( $sizePolicy3 ); $tis->setMinimumSize( Qt::Size(0, 25) ); $tis->setMaximumSize( Qt::Size(16777215, 25) ); - $gridLayout1->addWidget( $tis, 1, 1, 1, 1 ); + $gridLayout_1->addWidget( $tis, 1, 0, 1, 1 ); - my $tfs = Qt::LineEdit( $layoutWidget ); + my $tfs = Qt::LineEdit( $layoutWidget2 ); $self->{tfs} = $tfs; $tfs->setObjectName( "tfs" ); - $sizePolicy2->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); - $tfs->setSizePolicy( $sizePolicy2 ); + $sizePolicy3->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); + $tfs->setSizePolicy( $sizePolicy3 ); $tfs->setMinimumSize( Qt::Size(0, 25) ); $tfs->setMaximumSize( Qt::Size(16777215, 25) ); - $gridLayout1->addWidget( $tfs, 1, 2, 1, 1 ); + $gridLayout_1->addWidget( $tfs, 1, 1, 1, 1 ); - my $bins = Qt::LineEdit( $layoutWidget ); + my $bins = Qt::LineEdit( $layoutWidget2 ); $self->{bins} = $bins; $bins->setObjectName( "bins" ); - $sizePolicy2->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); - $bins->setSizePolicy( $sizePolicy2 ); + $sizePolicy3->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); + $bins->setSizePolicy( $sizePolicy3 ); $bins->setMinimumSize( Qt::Size(0, 25) ); $bins->setMaximumSize( Qt::Size(16777215, 25) ); - $gridLayout1->addWidget( $bins, 1, 3, 1, 1 ); + $gridLayout_1->addWidget( $bins, 1, 2, 1, 1 ); - my $comp2Label = Qt::Label( $layoutWidget ); - $self->{comp2Label} = $comp2Label; - $comp2Label->setObjectName( "comp2Label" ); - $comp2Label->setMinimumSize( Qt::Size(0, 25) ); - my $palette1 = Qt::Palette(); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); - $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); - $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); - $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); - $comp2Label->setPalette( $palette1 ); - $comp2Label->setWordWrap( 0 ); - - $gridLayout1->addWidget( $comp2Label, 2, 0, 1, 1 ); - - my $textLabel1_4 = Qt::Label( $layoutWidget ); + my $textLabel1_4 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4} = $textLabel1_4; $textLabel1_4->setObjectName( "textLabel1_4" ); + my $sizePolicy8 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Minimum() ); + $self->{$sizePolicy8} = $sizePolicy8; + $sizePolicy8->setHorizontalStretch( 0 ); + $sizePolicy8->setVerticalStretch( 0 ); + $sizePolicy8->setHeightForWidth( $textLabel1_4->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4->setSizePolicy( $sizePolicy8 ); $textLabel1_4->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_4->setWordWrap( 0 ); - $gridLayout1->addWidget( $textLabel1_4, 2, 1, 1, 1 ); + $gridLayout_1->addWidget( $textLabel1_4, 2, 0, 1, 1 ); - my $textLabel1_8 = Qt::Label( $layoutWidget ); + my $textLabel1_8 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_8} = $textLabel1_8; $textLabel1_8->setObjectName( "textLabel1_8" ); + $sizePolicy8->setHeightForWidth( $textLabel1_8->sizePolicy()->hasHeightForWidth() ); + $textLabel1_8->setSizePolicy( $sizePolicy8 ); $textLabel1_8->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_8->setWordWrap( 0 ); - $gridLayout1->addWidget( $textLabel1_8, 2, 2, 1, 1 ); + $gridLayout_1->addWidget( $textLabel1_8, 2, 1, 1, 1 ); - my $textLabel1_4_2_2 = Qt::Label( $layoutWidget ); + my $textLabel1_4_2_2 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_2_2} = $textLabel1_4_2_2; $textLabel1_4_2_2->setObjectName( "textLabel1_4_2_2" ); + $sizePolicy8->setHeightForWidth( $textLabel1_4_2_2->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_2_2->setSizePolicy( $sizePolicy8 ); $textLabel1_4_2_2->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_4_2_2->setWordWrap( 0 ); - $gridLayout1->addWidget( $textLabel1_4_2_2, 2, 3, 1, 1 ); + $gridLayout_1->addWidget( $textLabel1_4_2_2, 2, 2, 1, 1 ); - my $fitType2 = Qt::ComboBox( $layoutWidget ); - $self->{fitType2} = $fitType2; - $fitType2->setObjectName( "fitType2" ); - $sizePolicy2->setHeightForWidth( $fitType2->sizePolicy()->hasHeightForWidth() ); - $fitType2->setSizePolicy( $sizePolicy2 ); - $fitType2->setMinimumSize( Qt::Size(0, 25) ); - $fitType2->setMaximumSize( Qt::Size(16777215, 25) ); - - $gridLayout1->addWidget( $fitType2, 3, 0, 1, 1 ); - - my $xi = Qt::LineEdit( $layoutWidget ); + my $xi = Qt::LineEdit( $layoutWidget2 ); $self->{xi} = $xi; $xi->setObjectName( "xi" ); $xi->setMinimumSize( Qt::Size(0, 25) ); - $gridLayout1->addWidget( $xi, 3, 1, 1, 1 ); + $gridLayout_1->addWidget( $xi, 3, 0, 1, 1 ); - my $xf = Qt::LineEdit( $layoutWidget ); + my $xf = Qt::LineEdit( $layoutWidget2 ); $self->{xf} = $xf; $xf->setObjectName( "xf" ); $xf->setMinimumSize( Qt::Size(0, 25) ); - $gridLayout1->addWidget( $xf, 3, 2, 1, 1 ); + $gridLayout_1->addWidget( $xf, 3, 1, 1, 1 ); - my $viewBin = Qt::LineEdit( $layoutWidget ); + my $viewBin = Qt::LineEdit( $layoutWidget2 ); $self->{viewBin} = $viewBin; $viewBin->setObjectName( "viewBin" ); $viewBin->setMinimumSize( Qt::Size(0, 25) ); - $gridLayout1->addWidget( $viewBin, 3, 3, 1, 1 ); + $gridLayout_1->addWidget( $viewBin, 3, 2, 1, 1 ); - my $comp3Label = Qt::Label( $layoutWidget ); - $self->{comp3Label} = $comp3Label; - $comp3Label->setObjectName( "comp3Label" ); - my $palette2 = Qt::Palette(); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); - $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); - $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); - $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); - $comp3Label->setPalette( $palette2 ); - $comp3Label->setWordWrap( 0 ); - - $gridLayout1->addWidget( $comp3Label, 4, 0, 1, 1 ); - - my $textLabel1_4_2 = Qt::Label( $layoutWidget ); + my $textLabel1_4_2 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_2} = $textLabel1_4_2; $textLabel1_4_2->setObjectName( "textLabel1_4_2" ); $textLabel1_4_2->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_4_2->setWordWrap( 0 ); - $gridLayout1->addWidget( $textLabel1_4_2, 4, 1, 1, 1 ); + $gridLayout_1->addWidget( $textLabel1_4_2, 4, 0, 1, 1 ); - my $textLabel1_4_3 = Qt::Label( $layoutWidget ); + my $textLabel1_4_3 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_3} = $textLabel1_4_3; $textLabel1_4_3->setObjectName( "textLabel1_4_3" ); $textLabel1_4_3->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_4_3->setWordWrap( 0 ); - $gridLayout1->addWidget( $textLabel1_4_3, 4, 2, 1, 1 ); + $gridLayout_1->addWidget( $textLabel1_4_3, 4, 1, 1, 1 ); - my $textLabel1_4_4 = Qt::Label( $layoutWidget ); + my $textLabel1_4_4 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_4} = $textLabel1_4_4; $textLabel1_4_4->setObjectName( "textLabel1_4_4" ); - $sizePolicy2->setHeightForWidth( $textLabel1_4_4->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4_4->setSizePolicy( $sizePolicy2 ); + $sizePolicy3->setHeightForWidth( $textLabel1_4_4->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_4->setSizePolicy( $sizePolicy3 ); $textLabel1_4_4->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_4_4->setWordWrap( 0 ); - $gridLayout1->addWidget( $textLabel1_4_4, 4, 3, 1, 1 ); + $gridLayout_1->addWidget( $textLabel1_4_4, 4, 2, 1, 1 ); - my $fitType3 = Qt::ComboBox( $layoutWidget ); - $self->{fitType3} = $fitType3; - $fitType3->setObjectName( "fitType3" ); - $sizePolicy2->setHeightForWidth( $fitType3->sizePolicy()->hasHeightForWidth() ); - $fitType3->setSizePolicy( $sizePolicy2 ); - $fitType3->setMinimumSize( Qt::Size(0, 25) ); - $fitType3->setMaximumSize( Qt::Size(16777215, 25) ); - - $gridLayout1->addWidget( $fitType3, 5, 0, 1, 1 ); - - my $yi = Qt::LineEdit( $layoutWidget ); + my $yi = Qt::LineEdit( $layoutWidget2 ); $self->{yi} = $yi; $yi->setObjectName( "yi" ); $yi->setMinimumSize( Qt::Size(0, 25) ); - $gridLayout1->addWidget( $yi, 5, 1, 1, 1 ); + $gridLayout_1->addWidget( $yi, 5, 0, 1, 1 ); - my $yf = Qt::LineEdit( $layoutWidget ); + my $yf = Qt::LineEdit( $layoutWidget2 ); $self->{yf} = $yf; $yf->setObjectName( "yf" ); $yf->setMinimumSize( Qt::Size(0, 25) ); - $gridLayout1->addWidget( $yf, 5, 2, 1, 1 ); + $gridLayout_1->addWidget( $yf, 5, 1, 1, 1 ); - my $ltc = Qt::CheckBox( $layoutWidget ); + my $ltc = Qt::CheckBox( $layoutWidget2 ); $self->{ltc} = $ltc; $ltc->setObjectName( "ltc" ); - $sizePolicy2->setHeightForWidth( $ltc->sizePolicy()->hasHeightForWidth() ); - $ltc->setSizePolicy( $sizePolicy2 ); + $sizePolicy3->setHeightForWidth( $ltc->sizePolicy()->hasHeightForWidth() ); + $ltc->setSizePolicy( $sizePolicy3 ); $ltc->setMinimumSize( Qt::Size(0, 25) ); $ltc->setChecked( 1 ); - $gridLayout1->addWidget( $ltc, 5, 3, 1, 1 ); + $gridLayout_1->addWidget( $ltc, 5, 2, 1, 1 ); + + $scrollArea->setWidget( $scrollAreaWidgetContents_2 ); + + $horizontalLayout_3->addWidget( $scrollArea ); - $gridLayout_2->addWidget( $groupBox, 2, 0, 1, 1 ); + $verticalLayout_2->addLayout( $horizontalLayout_3 ); + + my $gridLayout_6 = Qt::GridLayout( ); + $self->{gridLayout_6} = $gridLayout_6; + $gridLayout_6->setSpacing( 6 ); + $gridLayout_6->setObjectName( "gridLayout_6" ); + $gridLayout_6->setSizeConstraint( Qt::Layout::SetMinimumSize() ); + my $fitAsyTypeLabel = Qt::Label( $layoutWidget ); + $self->{fitAsyTypeLabel} = $fitAsyTypeLabel; + $fitAsyTypeLabel->setObjectName( "fitAsyTypeLabel" ); + $sizePolicy5->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); + $fitAsyTypeLabel->setSizePolicy( $sizePolicy5 ); + $fitAsyTypeLabel->setWordWrap( 0 ); + + $gridLayout_6->addWidget( $fitAsyTypeLabel, 0, 0, 1, 1 ); + + my $fitAsyType = Qt::ComboBox( $layoutWidget ); + $self->{fitAsyType} = $fitAsyType; + $fitAsyType->setObjectName( "fitAsyType" ); + $sizePolicy5->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); + $fitAsyType->setSizePolicy( $sizePolicy5 ); + $fitAsyType->setMinimumSize( Qt::Size(0, 25) ); + $fitAsyType->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout_6->addWidget( $fitAsyType, 0, 1, 1, 1 ); + + my $histsLRBFLabel = Qt::Label( $layoutWidget ); + $self->{histsLRBFLabel} = $histsLRBFLabel; + $histsLRBFLabel->setObjectName( "histsLRBFLabel" ); + $sizePolicy5->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); + $histsLRBFLabel->setSizePolicy( $sizePolicy5 ); + $histsLRBFLabel->setWordWrap( 0 ); + + $gridLayout_6->addWidget( $histsLRBFLabel, 0, 2, 1, 1 ); + + my $histsLRBF = Qt::LineEdit( $layoutWidget ); + $self->{histsLRBF} = $histsLRBF; + $histsLRBF->setObjectName( "histsLRBF" ); + $sizePolicy5->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); + $histsLRBF->setSizePolicy( $sizePolicy5 ); + $histsLRBF->setMinimumSize( Qt::Size(0, 25) ); + $histsLRBF->setMaximumSize( Qt::Size(16777215, 25) ); + + $gridLayout_6->addWidget( $histsLRBF, 0, 3, 1, 1 ); + + my $spacer4 = Qt::SpacerItem( 81, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); + + $gridLayout_6->addItem( $spacer4, 0, 4, 1, 1 ); - $gridLayout_1->addLayout( $gridLayout_2, 0, 0, 1, 1 ); + $verticalLayout_2->addLayout( $gridLayout_6 ); $musrfit_tabs->addTab( $runsPage, Qt::Application::translate( 'MuSRFit4', "RUNS", undef, Qt::Application::UnicodeUTF8() ) ); my $fittingPage = Qt::Widget( ); $self->{fittingPage} = $fittingPage; $fittingPage->setObjectName( "fittingPage" ); - my $gridLayout2 = Qt::GridLayout( $fittingPage ); - $self->{gridLayout2} = $gridLayout2; - $gridLayout2->setSpacing( 6 ); - $gridLayout2->setMargin( 11 ); - $gridLayout2->setObjectName( "gridLayout2" ); + my $gridLayout1 = Qt::GridLayout( $fittingPage ); + $self->{gridLayout1} = $gridLayout1; + $gridLayout1->setSpacing( 6 ); + $gridLayout1->setMargin( 11 ); + $gridLayout1->setObjectName( "gridLayout1" ); my $fitGrid = Qt::VBoxLayout( ); $self->{fitGrid} = $fitGrid; $fitGrid->setSpacing( 6 ); @@ -1781,23 +1706,23 @@ sub setupUi { $fitGrid->addLayout( $fitLayout ); - $gridLayout2->addLayout( $fitGrid, 0, 0, 1, 1 ); + $gridLayout1->addLayout( $fitGrid, 0, 0, 1, 1 ); my $fitTextOutput = Qt::TextEdit( $fittingPage ); $self->{fitTextOutput} = $fitTextOutput; $fitTextOutput->setObjectName( "fitTextOutput" ); - $gridLayout2->addWidget( $fitTextOutput, 1, 0, 1, 1 ); + $gridLayout1->addWidget( $fitTextOutput, 1, 0, 1, 1 ); $musrfit_tabs->addTab( $fittingPage, Qt::Application::translate( 'MuSRFit4', "Fitting", undef, Qt::Application::UnicodeUTF8() ) ); my $sharingPage = Qt::Widget( ); $self->{sharingPage} = $sharingPage; $sharingPage->setObjectName( "sharingPage" ); - my $gridLayout3 = Qt::GridLayout( $sharingPage ); - $self->{gridLayout3} = $gridLayout3; - $gridLayout3->setSpacing( 6 ); - $gridLayout3->setMargin( 11 ); - $gridLayout3->setObjectName( "gridLayout3" ); + my $gridLayout2 = Qt::GridLayout( $sharingPage ); + $self->{gridLayout2} = $gridLayout2; + $gridLayout2->setSpacing( 6 ); + $gridLayout2->setMargin( 11 ); + $gridLayout2->setObjectName( "gridLayout2" ); my $buttonGroupSharing = Qt::GroupBox( $sharingPage ); $self->{buttonGroupSharing} = $buttonGroupSharing; $buttonGroupSharing->setObjectName( "buttonGroupSharing" ); @@ -1819,12 +1744,12 @@ sub setupUi { $self->{sharingComp1} = $sharingComp1; $sharingComp1->setObjectName( "sharingComp1" ); $sharingComp1->setEnabled( 0 ); - 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 ); + my $sizePolicy9 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); + $self->{$sizePolicy9} = $sizePolicy9; + $sizePolicy9->setHorizontalStretch( 0 ); + $sizePolicy9->setVerticalStretch( 0 ); + $sizePolicy9->setHeightForWidth( $sharingComp1->sizePolicy()->hasHeightForWidth() ); + $sharingComp1->setSizePolicy( $sizePolicy9 ); $sharingComp1->setAlignment( Qt::AlignLeading() ); my $layout14 = Qt::Widget( $sharingComp1 ); $self->{layout14} = $layout14; @@ -1912,8 +1837,8 @@ sub setupUi { $self->{sharingComp2} = $sharingComp2; $sharingComp2->setObjectName( "sharingComp2" ); $sharingComp2->setEnabled( 0 ); - $sizePolicy7->setHeightForWidth( $sharingComp2->sizePolicy()->hasHeightForWidth() ); - $sharingComp2->setSizePolicy( $sizePolicy7 ); + $sizePolicy9->setHeightForWidth( $sharingComp2->sizePolicy()->hasHeightForWidth() ); + $sharingComp2->setSizePolicy( $sizePolicy9 ); my $comp2ShLabel = Qt::Label( $sharingComp2 ); $self->{comp2ShLabel} = $comp2ShLabel; $comp2ShLabel->setObjectName( "comp2ShLabel" ); @@ -1998,8 +1923,8 @@ sub setupUi { $self->{sharingComp3} = $sharingComp3; $sharingComp3->setObjectName( "sharingComp3" ); $sharingComp3->setEnabled( 0 ); - $sizePolicy7->setHeightForWidth( $sharingComp3->sizePolicy()->hasHeightForWidth() ); - $sharingComp3->setSizePolicy( $sizePolicy7 ); + $sizePolicy9->setHeightForWidth( $sharingComp3->sizePolicy()->hasHeightForWidth() ); + $sharingComp3->setSizePolicy( $sizePolicy9 ); $sharingComp3->setAlignment( Qt::AlignJustify()|Qt::AlignVCenter() ); my $comp3ShLabel = Qt::Label( $sharingComp3 ); $self->{comp3ShLabel} = $comp3ShLabel; @@ -2085,34 +2010,34 @@ sub setupUi { $gridLayout_7->addLayout( $horizontalLayout, 0, 0, 1, 1 ); - $gridLayout3->addWidget( $buttonGroupSharing, 0, 0, 1, 1 ); + $gridLayout2->addWidget( $buttonGroupSharing, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $sharingPage, Qt::Application::translate( 'MuSRFit4', "Sharing", undef, Qt::Application::UnicodeUTF8() ) ); my $initializationPage = Qt::Widget( ); $self->{initializationPage} = $initializationPage; $initializationPage->setObjectName( "initializationPage" ); - my $gridLayout4 = Qt::GridLayout( $initializationPage ); - $self->{gridLayout4} = $gridLayout4; - $gridLayout4->setSpacing( 6 ); - $gridLayout4->setMargin( 11 ); - $gridLayout4->setObjectName( "gridLayout4" ); + my $gridLayout3 = Qt::GridLayout( $initializationPage ); + $self->{gridLayout3} = $gridLayout3; + $gridLayout3->setSpacing( 6 ); + $gridLayout3->setMargin( 11 ); + $gridLayout3->setObjectName( "gridLayout3" ); my $initParamTable = Qt::TableWidget( $initializationPage ); $self->{initParamTable} = $initParamTable; $initParamTable->setObjectName( "initParamTable" ); $initParamTable->setRowCount( 1 ); $initParamTable->setColumnCount( 4 ); - $gridLayout4->addWidget( $initParamTable, 0, 0, 1, 1 ); + $gridLayout3->addWidget( $initParamTable, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $initializationPage, Qt::Application::translate( 'MuSRFit4', "Initialization", undef, Qt::Application::UnicodeUTF8() ) ); my $msrPage = Qt::Widget( ); $self->{msrPage} = $msrPage; $msrPage->setObjectName( "msrPage" ); - my $gridLayout5 = Qt::GridLayout( $msrPage ); - $self->{gridLayout5} = $gridLayout5; - $gridLayout5->setSpacing( 6 ); - $gridLayout5->setMargin( 11 ); - $gridLayout5->setObjectName( "gridLayout5" ); + my $gridLayout4 = Qt::GridLayout( $msrPage ); + $self->{gridLayout4} = $gridLayout4; + $gridLayout4->setSpacing( 6 ); + $gridLayout4->setMargin( 11 ); + $gridLayout4->setObjectName( "gridLayout4" ); my $vboxLayout = Qt::VBoxLayout( ); $self->{vboxLayout} = $vboxLayout; $vboxLayout->setSpacing( 6 ); @@ -2121,13 +2046,13 @@ sub setupUi { my $groupTitle = Qt::GroupBox( $msrPage ); $self->{groupTitle} = $groupTitle; $groupTitle->setObjectName( "groupTitle" ); - $sizePolicy2->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); - $groupTitle->setSizePolicy( $sizePolicy2 ); - my $gridLayout6 = Qt::GridLayout( $groupTitle ); - $self->{gridLayout6} = $gridLayout6; - $gridLayout6->setSpacing( 6 ); - $gridLayout6->setMargin( 11 ); - $gridLayout6->setObjectName( "gridLayout6" ); + $sizePolicy3->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); + $groupTitle->setSizePolicy( $sizePolicy3 ); + my $gridLayout5 = Qt::GridLayout( $groupTitle ); + $self->{gridLayout5} = $gridLayout5; + $gridLayout5->setSpacing( 6 ); + $gridLayout5->setMargin( 11 ); + $gridLayout5->setObjectName( "gridLayout5" ); my $vboxLayout1 = Qt::VBoxLayout( ); $self->{vboxLayout1} = $vboxLayout1; $vboxLayout1->setSpacing( 6 ); @@ -2135,8 +2060,8 @@ sub setupUi { my $titleLabel = Qt::Label( $groupTitle ); $self->{titleLabel} = $titleLabel; $titleLabel->setObjectName( "titleLabel" ); - $sizePolicy5->setHeightForWidth( $titleLabel->sizePolicy()->hasHeightForWidth() ); - $titleLabel->setSizePolicy( $sizePolicy5 ); + $sizePolicy4->setHeightForWidth( $titleLabel->sizePolicy()->hasHeightForWidth() ); + $titleLabel->setSizePolicy( $sizePolicy4 ); $titleLabel->setWordWrap( 0 ); $vboxLayout1->addWidget( $titleLabel ); @@ -2144,12 +2069,12 @@ sub setupUi { my $title = Qt::LineEdit( $groupTitle ); $self->{title} = $title; $title->setObjectName( "title" ); - 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 ); + my $sizePolicy10 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy10} = $sizePolicy10; + $sizePolicy10->setHorizontalStretch( 1 ); + $sizePolicy10->setVerticalStretch( 1 ); + $sizePolicy10->setHeightForWidth( $title->sizePolicy()->hasHeightForWidth() ); + $title->setSizePolicy( $sizePolicy10 ); $vboxLayout1->addWidget( $title ); @@ -2167,8 +2092,8 @@ sub setupUi { my $fileName = Qt::LineEdit( $groupTitle ); $self->{fileName} = $fileName; $fileName->setObjectName( "fileName" ); - $sizePolicy2->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); - $fileName->setSizePolicy( $sizePolicy2 ); + $sizePolicy3->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); + $fileName->setSizePolicy( $sizePolicy3 ); $hboxLayout->addWidget( $fileName ); @@ -2176,7 +2101,7 @@ sub setupUi { $vboxLayout1->addLayout( $hboxLayout ); - $gridLayout6->addLayout( $vboxLayout1, 0, 0, 1, 1 ); + $gridLayout5->addLayout( $vboxLayout1, 0, 0, 1, 1 ); $vboxLayout->addWidget( $groupTitle ); @@ -2189,17 +2114,17 @@ sub setupUi { $vboxLayout->addWidget( $textMSROutput ); - $gridLayout5->addLayout( $vboxLayout, 0, 0, 1, 1 ); + $gridLayout4->addLayout( $vboxLayout, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $msrPage, Qt::Application::translate( 'MuSRFit4', "MSR File", undef, Qt::Application::UnicodeUTF8() ) ); my $fourierPage = Qt::Widget( ); $self->{fourierPage} = $fourierPage; $fourierPage->setObjectName( "fourierPage" ); - my $gridLayout7 = Qt::GridLayout( $fourierPage ); - $self->{gridLayout7} = $gridLayout7; - $gridLayout7->setSpacing( 6 ); - $gridLayout7->setMargin( 11 ); - $gridLayout7->setObjectName( "gridLayout7" ); + my $gridLayout6 = Qt::GridLayout( $fourierPage ); + $self->{gridLayout6} = $gridLayout6; + $gridLayout6->setSpacing( 6 ); + $gridLayout6->setMargin( 11 ); + $gridLayout6->setObjectName( "gridLayout6" ); my $fourierBox = Qt::GroupBox( $fourierPage ); $self->{fourierBox} = $fourierBox; $fourierBox->setObjectName( "fourierBox" ); @@ -2209,149 +2134,149 @@ sub setupUi { $self->{layout34} = $layout34; $layout34->setObjectName( "layout34" ); $layout34->setGeometry( Qt::Rect(12, 19, 510, 117) ); - my $gridLayout8 = Qt::GridLayout( $layout34 ); - $self->{gridLayout8} = $gridLayout8; - $gridLayout8->setSpacing( 5 ); - $gridLayout8->setMargin( 5 ); - $gridLayout8->setObjectName( "gridLayout8" ); - $gridLayout8->setContentsMargins(0, 0, 0, 0 ); + my $gridLayout7 = Qt::GridLayout( $layout34 ); + $self->{gridLayout7} = $gridLayout7; + $gridLayout7->setSpacing( 5 ); + $gridLayout7->setMargin( 5 ); + $gridLayout7->setObjectName( "gridLayout7" ); + $gridLayout7->setContentsMargins(0, 0, 0, 0 ); my $frqMax = Qt::LineEdit( $layout34 ); $self->{frqMax} = $frqMax; $frqMax->setObjectName( "frqMax" ); - $sizePolicy5->setHeightForWidth( $frqMax->sizePolicy()->hasHeightForWidth() ); - $frqMax->setSizePolicy( $sizePolicy5 ); + $sizePolicy4->setHeightForWidth( $frqMax->sizePolicy()->hasHeightForWidth() ); + $frqMax->setSizePolicy( $sizePolicy4 ); - $gridLayout8->addWidget( $frqMax, 0, 6, 1, 1 ); + $gridLayout7->addWidget( $frqMax, 0, 6, 1, 1 ); my $funits = Qt::ComboBox( $layout34 ); $self->{funits} = $funits; $funits->setObjectName( "funits" ); - 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 ); + my $sizePolicy11 = Qt::SizePolicy( Qt::SizePolicy::Ignored(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy11} = $sizePolicy11; + $sizePolicy11->setHorizontalStretch( 0 ); + $sizePolicy11->setVerticalStretch( 0 ); + $sizePolicy11->setHeightForWidth( $funits->sizePolicy()->hasHeightForWidth() ); + $funits->setSizePolicy( $sizePolicy11 ); - $gridLayout8->addWidget( $funits, 0, 2, 1, 1 ); + $gridLayout7->addWidget( $funits, 0, 2, 1, 1 ); my $fplot = Qt::ComboBox( $layout34 ); $self->{fplot} = $fplot; $fplot->setObjectName( "fplot" ); - $sizePolicy5->setHeightForWidth( $fplot->sizePolicy()->hasHeightForWidth() ); - $fplot->setSizePolicy( $sizePolicy5 ); + $sizePolicy4->setHeightForWidth( $fplot->sizePolicy()->hasHeightForWidth() ); + $fplot->setSizePolicy( $sizePolicy4 ); - $gridLayout8->addWidget( $fplot, 2, 2, 1, 1 ); + $gridLayout7->addWidget( $fplot, 2, 2, 1, 1 ); my $textLabel1_3_8 = Qt::Label( $layout34 ); $self->{textLabel1_3_8} = $textLabel1_3_8; $textLabel1_3_8->setObjectName( "textLabel1_3_8" ); $textLabel1_3_8->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_3_8, 2, 6, 1, 1 ); + $gridLayout7->addWidget( $textLabel1_3_8, 2, 6, 1, 1 ); my $textLabel1_7 = Qt::Label( $layout34 ); $self->{textLabel1_7} = $textLabel1_7; $textLabel1_7->setObjectName( "textLabel1_7" ); $textLabel1_7->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_7, 1, 3, 1, 1 ); + $gridLayout7->addWidget( $textLabel1_7, 1, 3, 1, 1 ); my $fplotLabel = Qt::Label( $layout34 ); $self->{fplotLabel} = $fplotLabel; $fplotLabel->setObjectName( "fplotLabel" ); $fplotLabel->setWordWrap( 0 ); - $gridLayout8->addWidget( $fplotLabel, 2, 1, 1, 1 ); + $gridLayout7->addWidget( $fplotLabel, 2, 1, 1, 1 ); my $textLabel1_3_4 = Qt::Label( $layout34 ); $self->{textLabel1_3_4} = $textLabel1_3_4; $textLabel1_3_4->setObjectName( "textLabel1_3_4" ); $textLabel1_3_4->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_3_4, 1, 6, 1, 1 ); + $gridLayout7->addWidget( $textLabel1_3_4, 1, 6, 1, 1 ); my $fapodization = Qt::ComboBox( $layout34 ); $self->{fapodization} = $fapodization; $fapodization->setObjectName( "fapodization" ); - $sizePolicy5->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); - $fapodization->setSizePolicy( $sizePolicy5 ); + $sizePolicy4->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); + $fapodization->setSizePolicy( $sizePolicy4 ); - $gridLayout8->addWidget( $fapodization, 1, 2, 1, 1 ); + $gridLayout7->addWidget( $fapodization, 1, 2, 1, 1 ); my $fapodizationLabel = Qt::Label( $layout34 ); $self->{fapodizationLabel} = $fapodizationLabel; $fapodizationLabel->setObjectName( "fapodizationLabel" ); $fapodizationLabel->setWordWrap( 0 ); - $gridLayout8->addWidget( $fapodizationLabel, 1, 1, 1, 1 ); + $gridLayout7->addWidget( $fapodizationLabel, 1, 1, 1, 1 ); my $textLabel1_3_3 = Qt::Label( $layout34 ); $self->{textLabel1_3_3} = $textLabel1_3_3; $textLabel1_3_3->setObjectName( "textLabel1_3_3" ); $textLabel1_3_3->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_3_3, 1, 5, 1, 1 ); + $gridLayout7->addWidget( $textLabel1_3_3, 1, 5, 1, 1 ); my $textLabel1_2 = Qt::Label( $layout34 ); $self->{textLabel1_2} = $textLabel1_2; $textLabel1_2->setObjectName( "textLabel1_2" ); $textLabel1_2->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_2, 0, 5, 1, 1 ); + $gridLayout7->addWidget( $textLabel1_2, 0, 5, 1, 1 ); my $textLabel1_3_6 = Qt::Label( $layout34 ); $self->{textLabel1_3_6} = $textLabel1_3_6; $textLabel1_3_6->setObjectName( "textLabel1_3_6" ); $textLabel1_3_6->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_3_6, 2, 4, 1, 1 ); + $gridLayout7->addWidget( $textLabel1_3_6, 2, 4, 1, 1 ); my $fphase = Qt::LineEdit( $layout34 ); $self->{fphase} = $fphase; $fphase->setObjectName( "fphase" ); - $sizePolicy5->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); - $fphase->setSizePolicy( $sizePolicy5 ); + $sizePolicy4->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); + $fphase->setSizePolicy( $sizePolicy4 ); - $gridLayout8->addWidget( $fphase, 1, 4, 1, 1 ); + $gridLayout7->addWidget( $fphase, 1, 4, 1, 1 ); my $textLabel1_3_5 = Qt::Label( $layout34 ); $self->{textLabel1_3_5} = $textLabel1_3_5; $textLabel1_3_5->setObjectName( "textLabel1_3_5" ); $textLabel1_3_5->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_3_5, 2, 3, 1, 1 ); + $gridLayout7->addWidget( $textLabel1_3_5, 2, 3, 1, 1 ); my $textLabel1_3_7 = Qt::Label( $layout34 ); $self->{textLabel1_3_7} = $textLabel1_3_7; $textLabel1_3_7->setObjectName( "textLabel1_3_7" ); $textLabel1_3_7->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1_3_7, 2, 5, 1, 1 ); + $gridLayout7->addWidget( $textLabel1_3_7, 2, 5, 1, 1 ); my $frqMin = Qt::LineEdit( $layout34 ); $self->{frqMin} = $frqMin; $frqMin->setObjectName( "frqMin" ); - $sizePolicy5->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); - $frqMin->setSizePolicy( $sizePolicy5 ); + $sizePolicy4->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); + $frqMin->setSizePolicy( $sizePolicy4 ); - $gridLayout8->addWidget( $frqMin, 0, 4, 1, 1 ); + $gridLayout7->addWidget( $frqMin, 0, 4, 1, 1 ); my $textLabel1 = Qt::Label( $layout34 ); $self->{textLabel1} = $textLabel1; $textLabel1->setObjectName( "textLabel1" ); $textLabel1->setWordWrap( 0 ); - $gridLayout8->addWidget( $textLabel1, 0, 3, 1, 1 ); + $gridLayout7->addWidget( $textLabel1, 0, 3, 1, 1 ); my $label = Qt::Label( $layout34 ); $self->{label} = $label; $label->setObjectName( "label" ); - $gridLayout8->addWidget( $label, 0, 1, 1, 1 ); + $gridLayout7->addWidget( $label, 0, 1, 1, 1 ); - $gridLayout7->addWidget( $fourierBox, 0, 0, 1, 1 ); + $gridLayout6->addWidget( $fourierBox, 0, 0, 1, 1 ); my $rrfBox = Qt::GroupBox( $fourierPage ); $self->{rrfBox} = $rrfBox; @@ -2362,83 +2287,83 @@ sub setupUi { $self->{layout35} = $layout35; $layout35->setObjectName( "layout35" ); $layout35->setGeometry( Qt::Rect(10, 18, 265, 107) ); - my $gridLayout9 = Qt::GridLayout( $layout35 ); - $self->{gridLayout9} = $gridLayout9; - $gridLayout9->setSpacing( 5 ); - $gridLayout9->setMargin( 5 ); - $gridLayout9->setObjectName( "gridLayout9" ); - $gridLayout9->setContentsMargins(0, 0, 0, 0 ); + my $gridLayout8 = Qt::GridLayout( $layout35 ); + $self->{gridLayout8} = $gridLayout8; + $gridLayout8->setSpacing( 5 ); + $gridLayout8->setMargin( 5 ); + $gridLayout8->setObjectName( "gridLayout8" ); + $gridLayout8->setContentsMargins(0, 0, 0, 0 ); my $textLabel1_6_2_2 = Qt::Label( $layout35 ); $self->{textLabel1_6_2_2} = $textLabel1_6_2_2; $textLabel1_6_2_2->setObjectName( "textLabel1_6_2_2" ); $textLabel1_6_2_2->setWordWrap( 0 ); - $gridLayout9->addWidget( $textLabel1_6_2_2, 2, 0, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_6_2_2, 2, 0, 1, 1 ); my $textLabel1_6 = Qt::Label( $layout35 ); $self->{textLabel1_6} = $textLabel1_6; $textLabel1_6->setObjectName( "textLabel1_6" ); $textLabel1_6->setWordWrap( 0 ); - $gridLayout9->addWidget( $textLabel1_6, 0, 0, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_6, 0, 0, 1, 1 ); my $textLabel1_6_2_4 = Qt::Label( $layout35 ); $self->{textLabel1_6_2_4} = $textLabel1_6_2_4; $textLabel1_6_2_4->setObjectName( "textLabel1_6_2_4" ); $textLabel1_6_2_4->setWordWrap( 0 ); - $gridLayout9->addWidget( $textLabel1_6_2_4, 2, 2, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_6_2_4, 2, 2, 1, 1 ); my $rrfFrq = Qt::LineEdit( $layout35 ); $self->{rrfFrq} = $rrfFrq; $rrfFrq->setObjectName( "rrfFrq" ); - $gridLayout9->addWidget( $rrfFrq, 0, 1, 1, 1 ); + $gridLayout8->addWidget( $rrfFrq, 0, 1, 1, 1 ); my $textLabel1_6_2_3 = Qt::Label( $layout35 ); $self->{textLabel1_6_2_3} = $textLabel1_6_2_3; $textLabel1_6_2_3->setObjectName( "textLabel1_6_2_3" ); $textLabel1_6_2_3->setWordWrap( 0 ); - $gridLayout9->addWidget( $textLabel1_6_2_3, 1, 2, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_6_2_3, 1, 2, 1, 1 ); my $rrfPack = Qt::LineEdit( $layout35 ); $self->{rrfPack} = $rrfPack; $rrfPack->setObjectName( "rrfPack" ); - $gridLayout9->addWidget( $rrfPack, 1, 1, 1, 1 ); + $gridLayout8->addWidget( $rrfPack, 1, 1, 1, 1 ); my $textLabel1_6_2 = Qt::Label( $layout35 ); $self->{textLabel1_6_2} = $textLabel1_6_2; $textLabel1_6_2->setObjectName( "textLabel1_6_2" ); $textLabel1_6_2->setWordWrap( 0 ); - $gridLayout9->addWidget( $textLabel1_6_2, 1, 0, 1, 1 ); + $gridLayout8->addWidget( $textLabel1_6_2, 1, 0, 1, 1 ); my $rrfUnits = Qt::ComboBox( $layout35 ); $self->{rrfUnits} = $rrfUnits; $rrfUnits->setObjectName( "rrfUnits" ); - $gridLayout9->addWidget( $rrfUnits, 0, 2, 1, 1 ); + $gridLayout8->addWidget( $rrfUnits, 0, 2, 1, 1 ); my $rrfPhase = Qt::LineEdit( $layout35 ); $self->{rrfPhase} = $rrfPhase; $rrfPhase->setObjectName( "rrfPhase" ); - $gridLayout9->addWidget( $rrfPhase, 2, 1, 1, 1 ); + $gridLayout8->addWidget( $rrfPhase, 2, 1, 1, 1 ); - $gridLayout7->addWidget( $rrfBox, 1, 0, 1, 1 ); + $gridLayout6->addWidget( $rrfBox, 1, 0, 1, 1 ); $musrfit_tabs->addTab( $fourierPage, Qt::Application::translate( 'MuSRFit4', "FFT/RRF", undef, Qt::Application::UnicodeUTF8() ) ); my $t0Page = Qt::Widget( ); $self->{t0Page} = $t0Page; $t0Page->setObjectName( "t0Page" ); - my $gridLayout10 = Qt::GridLayout( $t0Page ); - $self->{gridLayout10} = $gridLayout10; - $gridLayout10->setSpacing( 6 ); - $gridLayout10->setMargin( 11 ); - $gridLayout10->setObjectName( "gridLayout10" ); + my $gridLayout9 = Qt::GridLayout( $t0Page ); + $self->{gridLayout9} = $gridLayout9; + $gridLayout9->setSpacing( 6 ); + $gridLayout9->setMargin( 11 ); + $gridLayout9->setObjectName( "gridLayout9" ); my $hboxLayout1 = Qt::HBoxLayout( ); $self->{hboxLayout1} = $hboxLayout1; $hboxLayout1->setSpacing( 6 ); @@ -2694,7 +2619,7 @@ sub setupUi { $hboxLayout1->addWidget( $groupHist4 ); - $gridLayout10->addLayout( $hboxLayout1, 0, 0, 1, 1 ); + $gridLayout9->addLayout( $hboxLayout1, 0, 0, 1, 1 ); my $hboxLayout2 = Qt::HBoxLayout( ); $self->{hboxLayout2} = $hboxLayout2; @@ -2708,38 +2633,210 @@ sub setupUi { $self->{t0Update} = $t0Update; $t0Update->setObjectName( "t0Update" ); $t0Update->setEnabled( 0 ); - 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 ); + my $sizePolicy12 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy12} = $sizePolicy12; + $sizePolicy12->setHorizontalStretch( 0 ); + $sizePolicy12->setVerticalStretch( 0 ); + $sizePolicy12->setHeightForWidth( $t0Update->sizePolicy()->hasHeightForWidth() ); + $t0Update->setSizePolicy( $sizePolicy12 ); $hboxLayout2->addWidget( $t0Update ); - $gridLayout10->addLayout( $hboxLayout2, 1, 0, 1, 1 ); + $gridLayout9->addLayout( $hboxLayout2, 1, 0, 1, 1 ); $musrfit_tabs->addTab( $t0Page, Qt::Application::translate( 'MuSRFit4', "t0/Bg", undef, Qt::Application::UnicodeUTF8() ) ); my $tabPage = Qt::Widget( ); $self->{tabPage} = $tabPage; $tabPage->setObjectName( "tabPage" ); - my $gridLayout11 = Qt::GridLayout( $tabPage ); - $self->{gridLayout11} = $gridLayout11; - $gridLayout11->setSpacing( 6 ); - $gridLayout11->setMargin( 11 ); - $gridLayout11->setObjectName( "gridLayout11" ); + my $gridLayout10 = Qt::GridLayout( $tabPage ); + $self->{gridLayout10} = $gridLayout10; + $gridLayout10->setSpacing( 6 ); + $gridLayout10->setMargin( 11 ); + $gridLayout10->setObjectName( "gridLayout10" ); my $vboxLayout7 = Qt::VBoxLayout( ); $self->{vboxLayout7} = $vboxLayout7; $vboxLayout7->setSpacing( 6 ); $vboxLayout7->setObjectName( "vboxLayout7" ); - my $gridLayout12 = Qt::GridLayout( ); - $self->{gridLayout12} = $gridLayout12; - $gridLayout12->setSpacing( 6 ); - $gridLayout12->setObjectName( "gridLayout12" ); + my $gridLayout11 = Qt::GridLayout( ); + $self->{gridLayout11} = $gridLayout11; + $gridLayout11->setSpacing( 6 ); + $gridLayout11->setObjectName( "gridLayout11" ); my $theoryBlock_Label = Qt::Label( $tabPage ); $self->{theoryBlock_Label} = $theoryBlock_Label; $theoryBlock_Label->setObjectName( "theoryBlock_Label" ); + my $palette1 = Qt::Palette(); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); + $palette1->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); + $palette1->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); + $palette1->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); + $theoryBlock_Label->setPalette( $palette1 ); + $theoryBlock_Label->setWordWrap( 0 ); + + $gridLayout11->addWidget( $theoryBlock_Label, 0, 0, 1, 1 ); + + my $theoryBlock = Qt::TextEdit( $tabPage ); + $self->{theoryBlock} = $theoryBlock; + $theoryBlock->setObjectName( "theoryBlock" ); + $theoryBlock->setEnabled( 1 ); + + $gridLayout11->addWidget( $theoryBlock, 1, 0, 1, 1 ); + + my $parametersList_Label = Qt::Label( $tabPage ); + $self->{parametersList_Label} = $parametersList_Label; + $parametersList_Label->setObjectName( "parametersList_Label" ); + my $palette2 = Qt::Palette(); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); + $palette2->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); + $palette2->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); + $palette2->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); + $parametersList_Label->setPalette( $palette2 ); + $parametersList_Label->setWordWrap( 0 ); + + $gridLayout11->addWidget( $parametersList_Label, 0, 1, 1, 1 ); + + my $parametersList = Qt::TextEdit( $tabPage ); + $self->{parametersList} = $parametersList; + $parametersList->setObjectName( "parametersList" ); + $parametersList->setEnabled( 1 ); + + $gridLayout11->addWidget( $parametersList, 1, 1, 1, 1 ); + + + $vboxLayout7->addLayout( $gridLayout11 ); + + my $hboxLayout3 = Qt::HBoxLayout( ); + $self->{hboxLayout3} = $hboxLayout3; + $hboxLayout3->setSpacing( 6 ); + $hboxLayout3->setObjectName( "hboxLayout3" ); + my $cParamsCombo = Qt::ComboBox( $tabPage ); + $self->{cParamsCombo} = $cParamsCombo; + $cParamsCombo->setObjectName( "cParamsCombo" ); + $sizePolicy12->setHeightForWidth( $cParamsCombo->sizePolicy()->hasHeightForWidth() ); + $cParamsCombo->setSizePolicy( $sizePolicy12 ); + + $hboxLayout3->addWidget( $cParamsCombo ); + + my $textLabel1_4_6 = Qt::Label( $tabPage ); + $self->{textLabel1_4_6} = $textLabel1_4_6; + $textLabel1_4_6->setObjectName( "textLabel1_4_6" ); + $sizePolicy12->setHeightForWidth( $textLabel1_4_6->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_6->setSizePolicy( $sizePolicy12 ); + $textLabel1_4_6->setWordWrap( 0 ); + + $hboxLayout3->addWidget( $textLabel1_4_6 ); + + my $constraintLine = Qt::LineEdit( $tabPage ); + $self->{constraintLine} = $constraintLine; + $constraintLine->setObjectName( "constraintLine" ); + $sizePolicy3->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); + $constraintLine->setSizePolicy( $sizePolicy3 ); + $constraintLine->setMinimumSize( Qt::Size(0, 25) ); + + $hboxLayout3->addWidget( $constraintLine ); + + my $addConstraint = Qt::PushButton( $tabPage ); + $self->{addConstraint} = $addConstraint; + $addConstraint->setObjectName( "addConstraint" ); + $sizePolicy12->setHeightForWidth( $addConstraint->sizePolicy()->hasHeightForWidth() ); + $addConstraint->setSizePolicy( $sizePolicy12 ); + + $hboxLayout3->addWidget( $addConstraint ); + + + $vboxLayout7->addLayout( $hboxLayout3 ); + + my $textLabel2_2_3_4 = Qt::Label( $tabPage ); + $self->{textLabel2_2_3_4} = $textLabel2_2_3_4; + $textLabel2_2_3_4->setObjectName( "textLabel2_2_3_4" ); my $palette3 = Qt::Palette(); $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); $palette3->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); @@ -2789,179 +2886,7 @@ sub setupUi { $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); $palette3->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); - $theoryBlock_Label->setPalette( $palette3 ); - $theoryBlock_Label->setWordWrap( 0 ); - - $gridLayout12->addWidget( $theoryBlock_Label, 0, 0, 1, 1 ); - - my $theoryBlock = Qt::TextEdit( $tabPage ); - $self->{theoryBlock} = $theoryBlock; - $theoryBlock->setObjectName( "theoryBlock" ); - $theoryBlock->setEnabled( 1 ); - - $gridLayout12->addWidget( $theoryBlock, 1, 0, 1, 1 ); - - my $parametersList_Label = Qt::Label( $tabPage ); - $self->{parametersList_Label} = $parametersList_Label; - $parametersList_Label->setObjectName( "parametersList_Label" ); - my $palette4 = Qt::Palette(); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); - $palette4->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); - $palette4->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); - $palette4->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); - $parametersList_Label->setPalette( $palette4 ); - $parametersList_Label->setWordWrap( 0 ); - - $gridLayout12->addWidget( $parametersList_Label, 0, 1, 1, 1 ); - - my $parametersList = Qt::TextEdit( $tabPage ); - $self->{parametersList} = $parametersList; - $parametersList->setObjectName( "parametersList" ); - $parametersList->setEnabled( 1 ); - - $gridLayout12->addWidget( $parametersList, 1, 1, 1, 1 ); - - - $vboxLayout7->addLayout( $gridLayout12 ); - - my $hboxLayout3 = Qt::HBoxLayout( ); - $self->{hboxLayout3} = $hboxLayout3; - $hboxLayout3->setSpacing( 6 ); - $hboxLayout3->setObjectName( "hboxLayout3" ); - my $cParamsCombo = Qt::ComboBox( $tabPage ); - $self->{cParamsCombo} = $cParamsCombo; - $cParamsCombo->setObjectName( "cParamsCombo" ); - $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" ); - $sizePolicy10->setHeightForWidth( $textLabel1_4_6->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4_6->setSizePolicy( $sizePolicy10 ); - $textLabel1_4_6->setWordWrap( 0 ); - - $hboxLayout3->addWidget( $textLabel1_4_6 ); - - my $constraintLine = Qt::LineEdit( $tabPage ); - $self->{constraintLine} = $constraintLine; - $constraintLine->setObjectName( "constraintLine" ); - $sizePolicy2->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); - $constraintLine->setSizePolicy( $sizePolicy2 ); - $constraintLine->setMinimumSize( Qt::Size(0, 25) ); - - $hboxLayout3->addWidget( $constraintLine ); - - my $addConstraint = Qt::PushButton( $tabPage ); - $self->{addConstraint} = $addConstraint; - $addConstraint->setObjectName( "addConstraint" ); - $sizePolicy10->setHeightForWidth( $addConstraint->sizePolicy()->hasHeightForWidth() ); - $addConstraint->setSizePolicy( $sizePolicy10 ); - - $hboxLayout3->addWidget( $addConstraint ); - - - $vboxLayout7->addLayout( $hboxLayout3 ); - - my $textLabel2_2_3_4 = Qt::Label( $tabPage ); - $self->{textLabel2_2_3_4} = $textLabel2_2_3_4; - $textLabel2_2_3_4->setObjectName( "textLabel2_2_3_4" ); - my $palette5 = Qt::Palette(); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::WindowText(), $brush); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Button(), $brush1); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Light(), $brush2); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Midlight(), $brush3); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Dark(), $brush4); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Mid(), $brush5); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Text(), $brush); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::BrightText(), $brush2); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::ButtonText(), $brush); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Base(), $brush2); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Window(), $brush6); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Shadow(), $brush); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Highlight(), $brush7); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::HighlightedText(), $brush2); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::Link(), $brush); - $palette5->setBrush(Qt::Palette::Active(), Qt::Palette::LinkVisited(), $brush); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::WindowText(), $brush); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Button(), $brush1); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Light(), $brush2); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Midlight(), $brush2); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Dark(), $brush4); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Mid(), $brush5); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Text(), $brush); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::BrightText(), $brush2); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::ButtonText(), $brush); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Base(), $brush2); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Window(), $brush6); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Shadow(), $brush); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Highlight(), $brush7); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::HighlightedText(), $brush2); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::Link(), $brush8); - $palette5->setBrush(Qt::Palette::Inactive(), Qt::Palette::LinkVisited(), $brush9); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::WindowText(), $brush10); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Button(), $brush1); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Light(), $brush2); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Midlight(), $brush2); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Dark(), $brush4); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Mid(), $brush5); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Text(), $brush10); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::BrightText(), $brush2); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::ButtonText(), $brush10); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Base(), $brush2); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Window(), $brush6); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Shadow(), $brush); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Highlight(), $brush7); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::HighlightedText(), $brush2); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::Link(), $brush8); - $palette5->setBrush(Qt::Palette::Disabled(), Qt::Palette::LinkVisited(), $brush9); - $textLabel2_2_3_4->setPalette( $palette5 ); + $textLabel2_2_3_4->setPalette( $palette3 ); $textLabel2_2_3_4->setWordWrap( 0 ); $vboxLayout7->addWidget( $textLabel2_2_3_4 ); @@ -2994,7 +2919,7 @@ sub setupUi { $vboxLayout7->addLayout( $hboxLayout4 ); - $gridLayout11->addLayout( $vboxLayout7, 0, 0, 1, 1 ); + $gridLayout10->addLayout( $vboxLayout7, 0, 0, 1, 1 ); $musrfit_tabs->addTab( $tabPage, Qt::Application::translate( 'MuSRFit4', "Constraints", undef, Qt::Application::UnicodeUTF8() ) ); @@ -3005,7 +2930,7 @@ sub setupUi { $self->{menuBar} = $menuBar; $menuBar->setObjectName( "menuBar" ); $menuBar->setEnabled( 1 ); - $menuBar->setGeometry( Qt::Rect(0, 0, 694, 27) ); + $menuBar->setGeometry( Qt::Rect(0, 0, 705, 27) ); my $fileMenu = Qt::Menu( $menuBar ); $self->{fileMenu} = $fileMenu; $fileMenu->setObjectName( "fileMenu" ); @@ -3036,19 +2961,7 @@ sub setupUi { Qt::Widget::setTabOrder( $beamLine, $year ); Qt::Widget::setTabOrder( $year, $runFiles ); Qt::Widget::setTabOrder( $runFiles, $browse ); - Qt::Widget::setTabOrder( $browse, $fitType1 ); - Qt::Widget::setTabOrder( $fitType1, $fitType2 ); - Qt::Widget::setTabOrder( $fitType2, $fitType3 ); - Qt::Widget::setTabOrder( $fitType3, $tis ); - Qt::Widget::setTabOrder( $tis, $tfs ); - Qt::Widget::setTabOrder( $tfs, $bins ); - Qt::Widget::setTabOrder( $bins, $xi ); - Qt::Widget::setTabOrder( $xi, $xf ); - Qt::Widget::setTabOrder( $xf, $viewBin ); - Qt::Widget::setTabOrder( $viewBin, $yi ); - Qt::Widget::setTabOrder( $yi, $yf ); - Qt::Widget::setTabOrder( $yf, $ltc ); - Qt::Widget::setTabOrder( $ltc, $fitAsyType ); + Qt::Widget::setTabOrder( $browse, $fitAsyType ); Qt::Widget::setTabOrder( $fitAsyType, $histsLRBF ); Qt::Widget::setTabOrder( $histsLRBF, $minimization ); Qt::Widget::setTabOrder( $minimization, $errorCalc ); @@ -3168,12 +3081,10 @@ sub setupUi { Qt::Object::connect($t0Update, SIGNAL 'clicked()' , $muSRFit4, SLOT 't0UpdateClicked()' ); Qt::Object::connect($buttonGroupSharing, SIGNAL 'toggled(bool)' , $muSRFit4, SLOT 'ActivateShComp()' ); Qt::Object::connect($menuBar, SIGNAL 'triggered(QAction*)' , $muSRFit4, SLOT 'RunSelectionToggle()' ); - Qt::Object::connect($fitType1, SIGNAL 'currentIndexChanged(int)' , $muSRFit4, SLOT 'InitializeFunctions()' ); Qt::Object::connect($beamLine, SIGNAL 'currentIndexChanged(int)' , $muSRFit4, SLOT 't0Update()' ); + Qt::Object::connect($numComps, SIGNAL 'valueChanged(int)' , $muSRFit4, SLOT 'addFitType()' ); $musrfit_tabs->setCurrentIndex( 0 ); - $fitType2->setCurrentIndex( 18 ); - $fitType3->setCurrentIndex( 18 ); Qt::MetaObject::connectSlotsByName( $muSRFit4 ); @@ -3226,18 +3137,6 @@ sub retranslateUi { $self->{optionsFourier}->setIconText( Qt::Application::translate( 'MuSRFit4', "Fourier", undef, Qt::Application::UnicodeUTF8() ) ); $self->{optionsT0}->setText( Qt::Application::translate( 'MuSRFit4', "T0 and Bg bins", undef, Qt::Application::UnicodeUTF8() ) ); $self->{optionsT0}->setIconText( Qt::Application::translate( 'MuSRFit4', "T0 and Bg bins", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{runsMan}->setTitle( Qt::Application::translate( 'MuSRFit4', "RUN Files", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{runFiles}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{runFiles}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{browse}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{browse}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); - $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 GLB", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Single Hist", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Asymmetry", 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->{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() ) ); @@ -3251,80 +3150,32 @@ sub retranslateUi { Qt::Application::translate( 'MuSRFit4', "LEM (PPC)", 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->{groupBox}->setTitle( Qt::Application::translate( 'MuSRFit4', "Theory Function", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{textLabel1_4_2_3}->setText( '' ); - $self->{comp1Label}->setText( Qt::Application::translate( 'MuSRFit4', "First Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runsMan}->setTitle( Qt::Application::translate( 'MuSRFit4', "RUN Files", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runFiles}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{runFiles}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Names of data files to be fit. Multiple data files are comma separated.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{browse}->setToolTip( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{browse}->setWhatsThis( Qt::Application::translate( 'MuSRFit4', "Browse to select data files for fitting.", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{browse}->setText( Qt::Application::translate( 'MuSRFit4', "Browse", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{comp1Label}->setText( Qt::Application::translate( 'MuSRFit4', "Number of components", undef, Qt::Application::UnicodeUTF8() ) ); $self->{tisLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Initial Fit Time", undef, Qt::Application::UnicodeUTF8() ) ); $self->{tfsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Final Fit Time", undef, Qt::Application::UnicodeUTF8() ) ); $self->{binsLabel}->setText( Qt::Application::translate( 'MuSRFit4', "Fit Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{fitType1}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Exponential Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Background", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "MolMag", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() )]); $self->{tis}->setText( Qt::Application::translate( 'MuSRFit4', "0", undef, Qt::Application::UnicodeUTF8() ) ); $self->{tfs}->setText( Qt::Application::translate( 'MuSRFit4', "8", undef, Qt::Application::UnicodeUTF8() ) ); $self->{bins}->setText( Qt::Application::translate( 'MuSRFit4', "100", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{comp2Label}->setText( Qt::Application::translate( 'MuSRFit4', "Second Component", undef, Qt::Application::UnicodeUTF8() ) ); $self->{textLabel1_4}->setText( Qt::Application::translate( 'MuSRFit4', "Min X", undef, Qt::Application::UnicodeUTF8() ) ); $self->{textLabel1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Max X", undef, Qt::Application::UnicodeUTF8() ) ); $self->{textLabel1_4_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "View Binning Factor", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{fitType2}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Exponential Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Background", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "MolMag", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "None", undef, Qt::Application::UnicodeUTF8() )]); - $self->{comp3Label}->setText( Qt::Application::translate( 'MuSRFit4', "Third Component", undef, Qt::Application::UnicodeUTF8() ) ); $self->{textLabel1_4_2}->setText( Qt::Application::translate( 'MuSRFit4', "Min Y", undef, Qt::Application::UnicodeUTF8() ) ); $self->{textLabel1_4_3}->setText( Qt::Application::translate( 'MuSRFit4', "Max Y", undef, Qt::Application::UnicodeUTF8() ) ); $self->{textLabel1_4_4}->setText( '' ); - $self->{fitType3}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "Exponential", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Exp.", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Exponential Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Cos", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Background", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "MolMag", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "None", undef, Qt::Application::UnicodeUTF8() )]); $self->{ltc}->setText( Qt::Application::translate( 'MuSRFit4', "Life time correction", 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 GLB", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Single Hist", undef, Qt::Application::UnicodeUTF8() ), + Qt::Application::translate( 'MuSRFit4', "Asymmetry", 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->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{runsPage}), Qt::Application::translate( 'MuSRFit4', "RUNS", undef, Qt::Application::UnicodeUTF8() ) ); $self->{errorCalc}->insertItems(0, [Qt::Application::translate( 'MuSRFit4', "HESSE", undef, Qt::Application::UnicodeUTF8() ), Qt::Application::translate( 'MuSRFit4', "MINOS", undef, Qt::Application::UnicodeUTF8() )]); From 4a16cbe5d3b31ef72c52ae0349590c7a03a149e3 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 12 Feb 2018 13:54:11 +0100 Subject: [PATCH 22/87] Implemented dynamic number of multiple components and sharing --- src/external/MuSRFitGUI/MuSRFit4.pm | 234 ++++------ src/external/MuSRFitGUI/MuSRFit4.ui | 353 +------------- src/external/MuSRFitGUI/Ui_MuSRFit4.pm | 624 ++++++------------------- 3 files changed, 266 insertions(+), 945 deletions(-) diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm index 9c72c427..2a9604fe 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.pm +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -403,12 +403,16 @@ sub CreateAllInput() # old style, only 3 componenets $numComps = 3; } + $All{"numComps"}=$numComps; # loop over fitTypes for (my $i=1;$i<=$numComps;$i++) { my $FTi=child("Qt::ComboBox","fitType$i"); - $All{"FitType$i"} = $FTs{$FTi->currentIndex}; - print "i=$i with value ".$All{"FitType$i"}."\n"; + if ($FTi == 0) { + $All{"FitType$i"} = "None"; + } else { + $All{"FitType$i"} = $FTs{$FTi->currentIndex}; + } if ( $All{"FitType$i"} ne "None" ) { push( @FitTypes, $All{"FitType$i"} ); } @@ -427,6 +431,9 @@ sub CreateAllInput() # Shared settings are detected here $All{"EnableSharing"} = this->{ui}->buttonGroupSharing->isChecked(); + # Make sure all sharing boxes exist + #addSharingComp(); + my $Shared = 0; my $PCount =0; @@ -474,7 +481,7 @@ sub CreateAllInput() # check if it is checked my $ChkName="shParam_".$Component."_".$NP; my $ChkBx = child("Qt::Widget",$ChkName); - $Shared = $ChkBx->isChecked(); + if ($ChkBx != 0) {$Shared = $ChkBx->isChecked();} } $All{"Sh_$Param"}=$Shared; $NP++; @@ -735,18 +742,23 @@ sub ActivateShComp() my @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); my @Hists = split( /,/, $All{"LRBF"} ); -# Hide all sharing components - this->{ui}->sharingComp1->setHidden(1); - this->{ui}->sharingComp2->setHidden(1); - this->{ui}->sharingComp3->setHidden(1); - this->{ui}->sharingComp1->setEnabled(0); - this->{ui}->sharingComp2->setEnabled(0); - this->{ui}->sharingComp3->setEnabled(0); + # Make sure all sharing boxes exist + addSharingComp(); + + my $NShComps = this->{ui}->horizontalLayout->count(); + my $sharingComp = ""; + my $i = 1; + # Hide all sharing components + for ($i = 1; $i<=$NShComps;$i++) { + $sharingComp = child("Qt::GroupBox","sharingComp$i"); + $sharingComp->setHidden(1); + $sharingComp->setEnabled(0); + } my @FitTypes =(); - foreach my $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) { - if ( $FitType ne "None" ) { - push( @FitTypes, $FitType ); + for ($i=1;$i<=$All{"numComps"};$i++) { + if ( $All{"FitType$i"} ne "None" ) { + push( @FitTypes, $All{"FitType$i"} ); } } @@ -796,7 +808,7 @@ sub ActivateShComp() $CompShL->setText($All{"FitType$Component"}); # Change state/label of parameters - for (my $i=1; $i<=9;$i++) { + for ($i=1; $i<=9;$i++) { my $ParamChkBx="shParam_".$Component."_".$i; my $ChkBx = child("Qt::Widget",$ParamChkBx); if (defined($Params[$i-1])) { @@ -1061,9 +1073,9 @@ sub InitializeFunctions() my @Hists = split( /,/, $All{"LRBF"} ); my @FitTypes =(); - foreach my $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) { - if ( $FitType ne "None" ) { - push( @FitTypes, $FitType ); + for (my $i=1;$i<=$All{"numComps"};$i++) { + if ( $All{"FitType$i"} ne "None" ) { + push( @FitTypes, $All{"FitType$i"} ); } } @@ -1203,27 +1215,29 @@ sub addFitType { $fitType->setMinimumSize( Qt::Size(0, 25) ); $fitType->setMaximumSize( Qt::Size(255, 25) ); $fitType->insertItems(0, - [Qt::Application::translate( 'MuSRFit4', "Exponential", undef,Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian", undef,Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Exp.",undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Exponential Cos",undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Cos",undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Stretch Cos",undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Dynamic KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Background",undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Exp", undef,Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Exp", undef,Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lorentzian Kubo-Toyabe LF x Str Exp", undef,Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Gaussian Kubo-Toyabe LF x Str Exp", undef,Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "MolMag", undef,Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Meissner State Model", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x Exp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "Lor-Gss combi KT x SExp", undef, Qt::Application::UnicodeUTF8() ), - Qt::Application::translate( 'MuSRFit4', "None", undef,Qt::Application::UnicodeUTF8() )]); + ["Exponential", + "Gaussian", + "Stretch Exp.", + "Exponential Cos", + "Gaussian Cos", + "Stretch Cos", + "Lorentzian Dynamic KT", + "Gaussian Dynamic KT", + "Background", + "Lorentzian Kubo-Toyabe LF x Exp", + "Gaussian Kubo-Toyabe LF x Exp", + "Lorentzian Kubo-Toyabe LF x Str Exp", + "Gaussian Kubo-Toyabe LF x Str Exp", + "MolMag", + "Meissner State Model", + "Lor-Gss combi KT", + "Lor-Gss combi KT x Exp", + "Lor-Gss combi KT x SExp", + "None",]); if ($i==1) { - $fitType->setCurrentIndex( 0 ); + $fitType->setCurrentIndex(0); + # remove the "None" option for the 1st component + $fitType->removeItem(18); } else { $fitType->setCurrentIndex( 18 ); } @@ -1245,111 +1259,51 @@ sub addSharingComp { my $numComps = $self->numComps->value; # count number of exisitng components my $NShComps = $self->horizontalLayout->count(); - my $sharingComp = Qt::GroupBox( $self->buttonGroupSharing ); - my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); - $self->{$sizePolicy} = $sizePolicy; - $sizePolicy->setHorizontalStretch( 0 ); - $sizePolicy->setVerticalStretch( 0 ); - $sizePolicy->setHeightForWidth( $sharingComp->sizePolicy()->hasHeightForWidth() ); - for (my $i=2;$i<=$numComps;$i++) { - $sharingComp->setObjectName( "sharingComp$i" ); - $sharingComp->setEnabled( 0 ); - $sharingComp->setSizePolicy( $sizePolicy ); - $sharingComp->setAlignment( Qt::AlignLeading() ); - my $layout = Qt::Widget( $sharingComp ); - $layout->setObjectName( "layoutSh$i" ); - $layout->setGeometry( Qt::Rect(40, 60, 81, 266) ); - my $_5 = Qt::VBoxLayout( $layout ); - $self->{_5} = $_5; - $_5->setSpacing( 0 ); - $_5->setMargin( 0 ); - $_5->setObjectName( "_5" ); - $_5->setContentsMargins(0, 0, 0, 0 ); - my $shParam_1_1 = Qt::CheckBox( $layout ); - $self->{shParam_1_1} = $shParam_1_1; - $shParam_1_1->setObjectName( "shParam_1_1" ); + my @sharingComps = (); + for (my $i=$NShComps+1;$i<=$numComps;$i++) { + $sharingComps[$i] = Qt::GroupBox( $self->buttonGroupSharing ); + my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); + $self->{$sizePolicy} = $sizePolicy; + $sizePolicy->setHorizontalStretch( 0 ); + $sizePolicy->setVerticalStretch( 0 ); + $sizePolicy->setHeightForWidth( $sharingComps[$i]->sizePolicy()->hasHeightForWidth() ); + # check is this component exists + if (child("Qt::GroupBox","sharingComp$i") == 0) { + $sharingComps[$i]->setObjectName( "sharingComp$i" ); + $sharingComps[$i]->setEnabled( 0 ); + $sharingComps[$i]->setSizePolicy( $sizePolicy ); + $sharingComps[$i]->setAlignment( Qt::AlignLeading() ); + $sharingComps[$i]->setTitle("Component $i"); + my $layout = Qt::Widget( $sharingComps[$i] ); + $layout->setObjectName( "layoutSh$i" ); + $layout->setGeometry( Qt::Rect(40, 60, 81, 266) ); + my $shBoxLayout = Qt::VBoxLayout( $layout ); + $self->{shBoxLayout} = $shBoxLayout; + $shBoxLayout->setSpacing( 0 ); + $shBoxLayout->setMargin( 0 ); + $shBoxLayout->setObjectName( "shBoxLayout$i" ); + $shBoxLayout->setContentsMargins(0, 0, 0, 0 ); + my @shParam = (); + for (my $j=1;$j<=9;$j++) { + $shParam[$j] = Qt::CheckBox( $layout ); + $self->{shParam} = $shParam[$j]; + $shParam[$j]->setObjectName( "shParam_".$i."_$j" ); + $shParam[$j]->setText("Param$j"); + $shBoxLayout->addWidget( $shParam[$j] ); + } + + my $compShLabel = Qt::Label( $sharingComps[$i] ); + $self->{compShLabel} = $compShLabel; + $compShLabel->setObjectName( "comp".$i."ShLabel" ); + $compShLabel->setGeometry( Qt::Rect(2, 30, 141, 20) ); + $compShLabel->setWordWrap( 0 ); - $_5->addWidget( $shParam_1_1 ); - - my $shParam_1_2 = Qt::CheckBox( $layout ); - $self->{shParam_1_2} = $shParam_1_2; - $shParam_1_2->setObjectName( "shParam_1_2" ); - - $_5->addWidget( $shParam_1_2 ); - - my $shParam_1_3 = Qt::CheckBox( $layout ); - $self->{shParam_1_3} = $shParam_1_3; - $shParam_1_3->setObjectName( "shParam_1_3" ); - - $_5->addWidget( $shParam_1_3 ); - - my $shParam_1_4 = Qt::CheckBox( $layout ); - $self->{shParam_1_4} = $shParam_1_4; - $shParam_1_4->setObjectName( "shParam_1_4" ); - - $_5->addWidget( $shParam_1_4 ); - - my $shParam_1_5 = Qt::CheckBox( $layout ); - $self->{shParam_1_5} = $shParam_1_5; - $shParam_1_5->setObjectName( "shParam_1_5" ); - $shParam_1_5->setEnabled( 0 ); - $shParam_1_5->setTristate( 0 ); - - $_5->addWidget( $shParam_1_5 ); - - my $shParam_1_6 = Qt::CheckBox( $layout ); - $self->{shParam_1_6} = $shParam_1_6; - $shParam_1_6->setObjectName( "shParam_1_6" ); - $shParam_1_6->setEnabled( 0 ); - $shParam_1_6->setTristate( 0 ); - - $_5->addWidget( $shParam_1_6 ); - - my $shParam_1_7 = Qt::CheckBox( $layout ); - $self->{shParam_1_7} = $shParam_1_7; - $shParam_1_7->setObjectName( "shParam_1_7" ); - $shParam_1_7->setEnabled( 0 ); - $shParam_1_7->setTristate( 0 ); - - $_5->addWidget( $shParam_1_7 ); - - my $shParam_1_8 = Qt::CheckBox( $layout ); - $self->{shParam_1_8} = $shParam_1_8; - $shParam_1_8->setObjectName( "shParam_1_8" ); - $shParam_1_8->setEnabled( 0 ); - $shParam_1_8->setTristate( 0 ); - - $_5->addWidget( $shParam_1_8 ); - - my $shParam_1_9 = Qt::CheckBox( $layout ); - $self->{shParam_1_9} = $shParam_1_9; - $shParam_1_9->setObjectName( "shParam_1_9" ); - $shParam_1_9->setEnabled( 0 ); - $shParam_1_9->setTristate( 0 ); - - $_5->addWidget( $shParam_1_9 ); - - my $comp1ShLabel = Qt::Label( $sharingComp ); - $self->{comp1ShLabel} = $comp1ShLabel; - $comp1ShLabel->setObjectName( "comp1ShLabel" ); - $comp1ShLabel->setGeometry( Qt::Rect(2, 30, 141, 20) ); - $comp1ShLabel->setWordWrap( 0 ); - - $self->horizontalLayout->addWidget( $sharingComp ); - - $self->{sharingComp1}->setTitle( Qt::Application::translate( 'MuSRFit4', "1st Component", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_4}->setText( Qt::Application::translate( 'MuSRFit4', "Param4", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_5}->setText( Qt::Application::translate( 'MuSRFit4', "Param5", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_6}->setText( Qt::Application::translate( 'MuSRFit4', "Param6", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_1_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{comp1ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType1", undef, Qt::Application::UnicodeUTF8() ) ); + $self->horizontalLayout->addWidget( $sharingComps[$i] ); + $compShLabel->setText("FitType$i"); + } else { + print "Exist, skip component $i\n"; + } } - } 1; diff --git a/src/external/MuSRFitGUI/MuSRFit4.ui b/src/external/MuSRFitGUI/MuSRFit4.ui index f7af51be..832029cf 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.ui +++ b/src/external/MuSRFitGUI/MuSRFit4.ui @@ -7,7 +7,7 @@ 0 0 705 - 574 + 587 @@ -27,7 +27,7 @@ - ../../../../../../.designer/backup/icos/MuSRFit.png../../../../../../.designer/backup/icos/MuSRFit.png + icos/MuSRFit.pngicos/MuSRFit.png MuSRFitGUI @@ -70,24 +70,12 @@ 1 1 676 - 355 + 461 - - - 1 - 1 - - - - - 0 - 100 - - RUN Numbers @@ -428,12 +416,6 @@ - - - 0 - 0 - - 0 @@ -946,7 +928,7 @@ 0 0 276 - 70 + 180 @@ -967,7 +949,7 @@ - + 0 0 @@ -987,7 +969,7 @@ 0 0 380 - 105 + 215 @@ -1331,7 +1313,7 @@ - QLayout::SetMinimumSize + QLayout::SetDefaultConstraint @@ -1589,7 +1571,7 @@ - 1st Component + Component 1 Qt::AlignLeading @@ -1723,277 +1705,6 @@ - - - - false - - - - 0 - 0 - - - - 2nd Component - - - - - 2 - 30 - 141 - 20 - - - - FitType2 - - - false - - - - - - 40 - 60 - 81 - 266 - - - - - 0 - - - 0 - - - - - Param1 - - - - - - - Param2 - - - - - - - Param3 - - - - - - - Param4 - - - - - - - Param5 - - - - - - - false - - - Param6 - - - false - - - - - - - false - - - Param7 - - - false - - - - - - - false - - - Param8 - - - false - - - - - - - false - - - Param9 - - - false - - - - - - - - - - - false - - - - 0 - 0 - - - - 3rd Component - - - Qt::AlignJustify|Qt::AlignVCenter - - - - - 2 - 30 - 141 - 20 - - - - FitType3 - - - false - - - - - - 41 - 58 - 81 - 266 - - - - - - - Param1 - - - - - - - Param2 - - - - - - - Param3 - - - - - - - Param4 - - - - - - - Param5 - - - - - - - false - - - Param6 - - - false - - - - - - - false - - - Param7 - - - false - - - - - - - false - - - Param8 - - - false - - - - - - - false - - - Param9 - - - false - - - - - - - @@ -4461,7 +4172,7 @@ - ../../../../../../.designer/backup/icos/save.png../../../../../../.designer/backup/icos/save.png + icos/save.pngicos/save.png &Save MSR... @@ -4479,7 +4190,7 @@ - ../../../../../../.designer/backup/icos/exit.png../../../../../../.designer/backup/icos/exit.png + icos/exit.pngicos/exit.png E&xit @@ -4536,7 +4247,7 @@ - ../../../../../../.designer/backup/icos/chdir.png../../../../../../.designer/backup/icos/chdir.png + icos/chdir.pngicos/chdir.png &Change dir @@ -4559,7 +4270,7 @@ - ../../../../../../.designer/backup/icos/Export.png../../../../../../.designer/backup/icos/Export.png + icos/Export.pngicos/Export.png &Export As... @@ -4574,7 +4285,7 @@ - ../../../../../../.designer/backup/icos/Append.png../../../../../../.designer/backup/icos/Append.png + icos/Append.pngicos/Append.png &Append To... @@ -4589,7 +4300,7 @@ - ../../../../../../.designer/backup/icos/Fit.png../../../../../../.designer/backup/icos/Fit.png + icos/Fit.pngicos/Fit.png Fit and Plot @@ -4604,7 +4315,7 @@ - ../../../../../../.designer/backup/icos/Plot.png../../../../../../.designer/backup/icos/Plot.png + icos/Plot.pngicos/Plot.png Plot @@ -4616,7 +4327,7 @@ - ../../../../../../.designer/backup/icos/T0.png../../../../../../.designer/backup/icos/T0.png + icos/T0.pngicos/T0.png Show t0 and Bg Bins @@ -4678,24 +4389,6 @@ shParam_1_7 shParam_1_8 shParam_1_9 - shParam_2_1 - shParam_2_2 - shParam_2_3 - shParam_2_4 - shParam_2_5 - shParam_2_6 - shParam_2_7 - shParam_2_8 - shParam_2_9 - shParam_3_1 - shParam_3_2 - shParam_3_3 - shParam_3_4 - shParam_3_5 - shParam_3_6 - shParam_3_7 - shParam_3_8 - shParam_3_9 initParamTable title fileName @@ -4893,7 +4586,7 @@ 686 - 655 + 555 20 @@ -4909,7 +4602,7 @@ 686 - 368 + 329 20 @@ -4957,7 +4650,7 @@ 687 - 656 + 556 20 @@ -5004,8 +4697,8 @@ t0Update() - 544 - 188 + 542 + 189 603 @@ -5020,8 +4713,8 @@ addFitType() - 235 - 345 + 292 + 340 703 diff --git a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm index 958ce18c..4cdfc312 100644 --- a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm +++ b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm @@ -5,7 +5,7 @@ ################################################################################# ## Form generated from reading UI file 'MuSRFit4.ui' ## -## Created: Sun Feb 11 15:47:22 2018 +## Created: Mon Feb 12 13:53:02 2018 ## by: Qt User Interface Compiler version 4.8.7 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! @@ -410,110 +410,6 @@ sub comp1ShLabel { return shift->{comp1ShLabel}; } -sub sharingComp2 { - return shift->{sharingComp2}; -} - -sub comp2ShLabel { - return shift->{comp2ShLabel}; -} - -sub layout13 { - return shift->{layout13}; -} - -sub _1 { - return shift->{_1}; -} - -sub shParam_2_1 { - return shift->{shParam_2_1}; -} - -sub shParam_2_2 { - return shift->{shParam_2_2}; -} - -sub shParam_2_3 { - return shift->{shParam_2_3}; -} - -sub shParam_2_4 { - return shift->{shParam_2_4}; -} - -sub shParam_2_5 { - return shift->{shParam_2_5}; -} - -sub shParam_2_6 { - return shift->{shParam_2_6}; -} - -sub shParam_2_7 { - return shift->{shParam_2_7}; -} - -sub shParam_2_8 { - return shift->{shParam_2_8}; -} - -sub shParam_2_9 { - return shift->{shParam_2_9}; -} - -sub sharingComp3 { - return shift->{sharingComp3}; -} - -sub comp3ShLabel { - return shift->{comp3ShLabel}; -} - -sub layout15 { - return shift->{layout15}; -} - -sub _3 { - return shift->{_3}; -} - -sub shParam_3_1 { - return shift->{shParam_3_1}; -} - -sub shParam_3_2 { - return shift->{shParam_3_2}; -} - -sub shParam_3_3 { - return shift->{shParam_3_3}; -} - -sub shParam_3_4 { - return shift->{shParam_3_4}; -} - -sub shParam_3_5 { - return shift->{shParam_3_5}; -} - -sub shParam_3_6 { - return shift->{shParam_3_6}; -} - -sub shParam_3_7 { - return shift->{shParam_3_7}; -} - -sub shParam_3_8 { - return shift->{shParam_3_8}; -} - -sub shParam_3_9 { - return shift->{shParam_3_9}; -} - sub initializationPage { return shift->{initializationPage}; } @@ -1009,7 +905,7 @@ sub setupUi { if ( !defined $muSRFit4->objectName() ) { $muSRFit4->setObjectName( "muSRFit4" ); } - $muSRFit4->resize( 705, 574 ); + $muSRFit4->resize( 705, 587 ); my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); $self->{$sizePolicy} = $sizePolicy; $sizePolicy->setHorizontalStretch( 1 ); @@ -1018,19 +914,19 @@ sub setupUi { $muSRFit4->setSizePolicy( $sizePolicy ); $muSRFit4->setMinimumSize( Qt::Size(600, 505) ); my $icon = Qt::Icon(); - $icon->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/MuSRFit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon->addPixmap(Qt::Pixmap("icos/MuSRFit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $muSRFit4->setWindowIcon( $icon ); my $fileSaveAction = Qt::Action($muSRFit4); $self->{fileSaveAction} = $fileSaveAction; $fileSaveAction->setObjectName( "fileSaveAction" ); my $icon1 = Qt::Icon(); - $icon1->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/save.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon1->addPixmap(Qt::Pixmap("icos/save.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $fileSaveAction->setIcon( $icon1 ); my $fileExitAction = Qt::Action($muSRFit4); $self->{fileExitAction} = $fileExitAction; $fileExitAction->setObjectName( "fileExitAction" ); my $icon2 = Qt::Icon(); - $icon2->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/exit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon2->addPixmap(Qt::Pixmap("icos/exit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $fileExitAction->setIcon( $icon2 ); my $helpAboutAction = Qt::Action($muSRFit4); $self->{helpAboutAction} = $helpAboutAction; @@ -1048,7 +944,7 @@ sub setupUi { $self->{fileChangeDirAction} = $fileChangeDirAction; $fileChangeDirAction->setObjectName( "fileChangeDirAction" ); my $icon3 = Qt::Icon(); - $icon3->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/chdir.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon3->addPixmap(Qt::Pixmap("icos/chdir.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $fileChangeDirAction->setIcon( $icon3 ); my $optionsnew_itemAction = Qt::Action($muSRFit4); $self->{optionsnew_itemAction} = $optionsnew_itemAction; @@ -1057,32 +953,32 @@ sub setupUi { $self->{parametersExport_AsAction} = $parametersExport_AsAction; $parametersExport_AsAction->setObjectName( "parametersExport_AsAction" ); my $icon4 = Qt::Icon(); - $icon4->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/Export.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon4->addPixmap(Qt::Pixmap("icos/Export.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $parametersExport_AsAction->setIcon( $icon4 ); my $parametersAppend_ToAction = Qt::Action($muSRFit4); $self->{parametersAppend_ToAction} = $parametersAppend_ToAction; $parametersAppend_ToAction->setObjectName( "parametersAppend_ToAction" ); my $icon5 = Qt::Icon(); - $icon5->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/Append.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon5->addPixmap(Qt::Pixmap("icos/Append.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $parametersAppend_ToAction->setIcon( $icon5 ); my $fit = Qt::Action($muSRFit4); $self->{fit} = $fit; $fit->setObjectName( "fit" ); my $icon6 = Qt::Icon(); - $icon6->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/Fit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon6->addPixmap(Qt::Pixmap("icos/Fit.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $fit->setIcon( $icon6 ); my $plot = Qt::Action($muSRFit4); $self->{plot} = $plot; $plot->setObjectName( "plot" ); $plot->setCheckable( 0 ); my $icon7 = Qt::Icon(); - $icon7->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/Plot.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon7->addPixmap(Qt::Pixmap("icos/Plot.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $plot->setIcon( $icon7 ); my $t0 = Qt::Action($muSRFit4); $self->{t0} = $t0; $t0->setObjectName( "t0" ); my $icon8 = Qt::Icon(); - $icon8->addPixmap(Qt::Pixmap("../../../../../../.designer/backup/icos/T0.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); + $icon8->addPixmap(Qt::Pixmap("icos/T0.png"), Qt::Icon::Normal(), Qt::Icon::Off() ); $t0->setIcon( $icon8 ); my $optionsFourier = Qt::Action($muSRFit4); $self->{optionsFourier} = $optionsFourier; @@ -1114,7 +1010,7 @@ sub setupUi { my $layoutWidget = Qt::Widget( $runsPage ); $self->{layoutWidget} = $layoutWidget; $layoutWidget->setObjectName( "layoutWidget" ); - $layoutWidget->setGeometry( Qt::Rect(1, 1, 676, 355) ); + $layoutWidget->setGeometry( Qt::Rect(1, 1, 676, 461) ); my $verticalLayout_2 = Qt::VBoxLayout( $layoutWidget ); $self->{verticalLayout_2} = $verticalLayout_2; $verticalLayout_2->setSpacing( 6 ); @@ -1124,13 +1020,6 @@ sub setupUi { my $runsAuto = Qt::GroupBox( $layoutWidget ); $self->{runsAuto} = $runsAuto; $runsAuto->setObjectName( "runsAuto" ); - my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Maximum() ); - $self->{$sizePolicy1} = $sizePolicy1; - $sizePolicy1->setHorizontalStretch( 1 ); - $sizePolicy1->setVerticalStretch( 1 ); - $sizePolicy1->setHeightForWidth( $runsAuto->sizePolicy()->hasHeightForWidth() ); - $runsAuto->setSizePolicy( $sizePolicy1 ); - $runsAuto->setMinimumSize( Qt::Size(0, 100) ); $runsAuto->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); my $gridLayout_3 = Qt::GridLayout( $runsAuto ); $self->{gridLayout_3} = $gridLayout_3; @@ -1146,12 +1035,12 @@ sub setupUi { my $year = Qt::ComboBox( $runsAuto ); $self->{year} = $year; $year->setObjectName( "year" ); - my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); - $self->{$sizePolicy2} = $sizePolicy2; - $sizePolicy2->setHorizontalStretch( 0 ); - $sizePolicy2->setVerticalStretch( 0 ); - $sizePolicy2->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); - $year->setSizePolicy( $sizePolicy2 ); + my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy1} = $sizePolicy1; + $sizePolicy1->setHorizontalStretch( 0 ); + $sizePolicy1->setVerticalStretch( 0 ); + $sizePolicy1->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); + $year->setSizePolicy( $sizePolicy1 ); $year->setMinimumSize( Qt::Size(0, 20) ); $year->setMaximumSize( Qt::Size(16777215, 25) ); $year->setEditable( 0 ); @@ -1164,12 +1053,12 @@ sub setupUi { my $runNumbers = Qt::LineEdit( $runsAuto ); $self->{runNumbers} = $runNumbers; $runNumbers->setObjectName( "runNumbers" ); - my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy3} = $sizePolicy3; - $sizePolicy3->setHorizontalStretch( 0 ); - $sizePolicy3->setVerticalStretch( 0 ); - $sizePolicy3->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); - $runNumbers->setSizePolicy( $sizePolicy3 ); + my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy2} = $sizePolicy2; + $sizePolicy2->setHorizontalStretch( 0 ); + $sizePolicy2->setVerticalStretch( 0 ); + $sizePolicy2->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); + $runNumbers->setSizePolicy( $sizePolicy2 ); $runNumbers->setMinimumSize( Qt::Size(0, 23) ); $runNumbers->setMaximumSize( Qt::Size(16777215, 25) ); $runNumbers->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); @@ -1183,8 +1072,8 @@ sub setupUi { my $beamLine = Qt::ComboBox( $runsAuto ); $self->{beamLine} = $beamLine; $beamLine->setObjectName( "beamLine" ); - $sizePolicy2->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); - $beamLine->setSizePolicy( $sizePolicy2 ); + $sizePolicy1->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); + $beamLine->setSizePolicy( $sizePolicy1 ); $beamLine->setMinimumSize( Qt::Size(0, 20) ); $beamLine->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1193,12 +1082,12 @@ sub setupUi { 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 ); + my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy3} = $sizePolicy3; + $sizePolicy3->setHorizontalStretch( 0 ); + $sizePolicy3->setVerticalStretch( 0 ); + $sizePolicy3->setHeightForWidth( $yearLabel->sizePolicy()->hasHeightForWidth() ); + $yearLabel->setSizePolicy( $sizePolicy3 ); $yearLabel->setMinimumSize( Qt::Size(0, 20) ); $yearLabel->setWordWrap( 0 ); @@ -1207,8 +1096,8 @@ sub setupUi { my $beamLineLabel = Qt::Label( $runsAuto ); $self->{beamLineLabel} = $beamLineLabel; $beamLineLabel->setObjectName( "beamLineLabel" ); - $sizePolicy4->setHeightForWidth( $beamLineLabel->sizePolicy()->hasHeightForWidth() ); - $beamLineLabel->setSizePolicy( $sizePolicy4 ); + $sizePolicy3->setHeightForWidth( $beamLineLabel->sizePolicy()->hasHeightForWidth() ); + $beamLineLabel->setSizePolicy( $sizePolicy3 ); $beamLineLabel->setMinimumSize( Qt::Size(0, 30) ); $beamLineLabel->setMaximumSize( Qt::Size(16777215, 30) ); $beamLineLabel->setWordWrap( 0 ); @@ -1224,8 +1113,12 @@ sub setupUi { my $runsMan = Qt::GroupBox( $layoutWidget ); $self->{runsMan} = $runsMan; $runsMan->setObjectName( "runsMan" ); - $sizePolicy1->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); - $runsMan->setSizePolicy( $sizePolicy1 ); + my $sizePolicy4 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Maximum() ); + $self->{$sizePolicy4} = $sizePolicy4; + $sizePolicy4->setHorizontalStretch( 1 ); + $sizePolicy4->setVerticalStretch( 1 ); + $sizePolicy4->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); + $runsMan->setSizePolicy( $sizePolicy4 ); $runsMan->setMinimumSize( Qt::Size(0, 80) ); $runsMan->setBaseSize( Qt::Size(1, 1) ); $runsMan->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); @@ -1246,8 +1139,8 @@ sub setupUi { $self->{runFiles} = $runFiles; $runFiles->setObjectName( "runFiles" ); $runFiles->setEnabled( 1 ); - $sizePolicy3->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); - $runFiles->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); + $runFiles->setSizePolicy( $sizePolicy2 ); $runFiles->setMinimumSize( Qt::Size(0, 23) ); $runFiles->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1257,8 +1150,8 @@ sub setupUi { $self->{browse} = $browse; $browse->setObjectName( "browse" ); $browse->setEnabled( 1 ); - $sizePolicy2->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); - $browse->setSizePolicy( $sizePolicy2 ); + $sizePolicy1->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); + $browse->setSizePolicy( $sizePolicy1 ); $browse->setMinimumSize( Qt::Size(0, 20) ); $browse->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1285,12 +1178,6 @@ sub setupUi { my $comp1Label = Qt::Label( $layoutWidget ); $self->{comp1Label} = $comp1Label; $comp1Label->setObjectName( "comp1Label" ); - my $sizePolicy5 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy5} = $sizePolicy5; - $sizePolicy5->setHorizontalStretch( 0 ); - $sizePolicy5->setVerticalStretch( 0 ); - $sizePolicy5->setHeightForWidth( $comp1Label->sizePolicy()->hasHeightForWidth() ); - $comp1Label->setSizePolicy( $sizePolicy5 ); $comp1Label->setMinimumSize( Qt::Size(0, 25) ); $comp1Label->setMaximumSize( Qt::Size(16777215, 25) ); my $palette = Qt::Palette(); @@ -1385,19 +1272,19 @@ sub setupUi { my $theoryFunction = Qt::ScrollArea( $layoutWidget ); $self->{theoryFunction} = $theoryFunction; $theoryFunction->setObjectName( "theoryFunction" ); - my $sizePolicy6 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); - $self->{$sizePolicy6} = $sizePolicy6; - $sizePolicy6->setHorizontalStretch( 0 ); - $sizePolicy6->setVerticalStretch( 0 ); - $sizePolicy6->setHeightForWidth( $theoryFunction->sizePolicy()->hasHeightForWidth() ); - $theoryFunction->setSizePolicy( $sizePolicy6 ); + my $sizePolicy5 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); + $self->{$sizePolicy5} = $sizePolicy5; + $sizePolicy5->setHorizontalStretch( 0 ); + $sizePolicy5->setVerticalStretch( 0 ); + $sizePolicy5->setHeightForWidth( $theoryFunction->sizePolicy()->hasHeightForWidth() ); + $theoryFunction->setSizePolicy( $sizePolicy5 ); $theoryFunction->setMinimumSize( Qt::Size(280, 0) ); $theoryFunction->setVerticalScrollBarPolicy( Qt::ScrollBarAsNeeded() ); $theoryFunction->setWidgetResizable( 1 ); my $scrollAreaWidgetContents = Qt::Widget( ); $self->{scrollAreaWidgetContents} = $scrollAreaWidgetContents; $scrollAreaWidgetContents->setObjectName( "scrollAreaWidgetContents" ); - $scrollAreaWidgetContents->setGeometry( Qt::Rect(0, 0, 276, 70) ); + $scrollAreaWidgetContents->setGeometry( Qt::Rect(0, 0, 276, 180) ); my $columnView = Qt::VBoxLayout( $scrollAreaWidgetContents ); $self->{columnView} = $columnView; $columnView->setObjectName( "columnView" ); @@ -1412,18 +1299,14 @@ sub setupUi { my $scrollArea = Qt::ScrollArea( $layoutWidget ); $self->{scrollArea} = $scrollArea; $scrollArea->setObjectName( "scrollArea" ); - my $sizePolicy7 = Qt::SizePolicy( Qt::SizePolicy::Minimum(), Qt::SizePolicy::Minimum() ); - $self->{$sizePolicy7} = $sizePolicy7; - $sizePolicy7->setHorizontalStretch( 0 ); - $sizePolicy7->setVerticalStretch( 0 ); - $sizePolicy7->setHeightForWidth( $scrollArea->sizePolicy()->hasHeightForWidth() ); - $scrollArea->setSizePolicy( $sizePolicy7 ); + $sizePolicy5->setHeightForWidth( $scrollArea->sizePolicy()->hasHeightForWidth() ); + $scrollArea->setSizePolicy( $sizePolicy5 ); $scrollArea->setMinimumSize( Qt::Size(384, 0) ); $scrollArea->setWidgetResizable( 1 ); my $scrollAreaWidgetContents_2 = Qt::Widget( ); $self->{scrollAreaWidgetContents_2} = $scrollAreaWidgetContents_2; $scrollAreaWidgetContents_2->setObjectName( "scrollAreaWidgetContents_2" ); - $scrollAreaWidgetContents_2->setGeometry( Qt::Rect(0, 0, 380, 105) ); + $scrollAreaWidgetContents_2->setGeometry( Qt::Rect(0, 0, 380, 215) ); my $layoutWidget2 = Qt::Widget( $scrollAreaWidgetContents_2 ); $self->{layoutWidget2} = $layoutWidget2; $layoutWidget2->setObjectName( "layoutWidget2" ); @@ -1437,8 +1320,12 @@ sub setupUi { my $tisLabel = Qt::Label( $layoutWidget2 ); $self->{tisLabel} = $tisLabel; $tisLabel->setObjectName( "tisLabel" ); - $sizePolicy5->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); - $tisLabel->setSizePolicy( $sizePolicy5 ); + my $sizePolicy6 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy6} = $sizePolicy6; + $sizePolicy6->setHorizontalStretch( 0 ); + $sizePolicy6->setVerticalStretch( 0 ); + $sizePolicy6->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); + $tisLabel->setSizePolicy( $sizePolicy6 ); $tisLabel->setWordWrap( 0 ); $gridLayout_1->addWidget( $tisLabel, 0, 0, 1, 1 ); @@ -1446,8 +1333,8 @@ sub setupUi { my $tfsLabel = Qt::Label( $layoutWidget2 ); $self->{tfsLabel} = $tfsLabel; $tfsLabel->setObjectName( "tfsLabel" ); - $sizePolicy5->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); - $tfsLabel->setSizePolicy( $sizePolicy5 ); + $sizePolicy6->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); + $tfsLabel->setSizePolicy( $sizePolicy6 ); $tfsLabel->setWordWrap( 0 ); $gridLayout_1->addWidget( $tfsLabel, 0, 1, 1, 1 ); @@ -1455,8 +1342,8 @@ sub setupUi { my $binsLabel = Qt::Label( $layoutWidget2 ); $self->{binsLabel} = $binsLabel; $binsLabel->setObjectName( "binsLabel" ); - $sizePolicy5->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); - $binsLabel->setSizePolicy( $sizePolicy5 ); + $sizePolicy6->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); + $binsLabel->setSizePolicy( $sizePolicy6 ); $binsLabel->setWordWrap( 0 ); $gridLayout_1->addWidget( $binsLabel, 0, 2, 1, 1 ); @@ -1464,8 +1351,8 @@ sub setupUi { my $tis = Qt::LineEdit( $layoutWidget2 ); $self->{tis} = $tis; $tis->setObjectName( "tis" ); - $sizePolicy3->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); - $tis->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); + $tis->setSizePolicy( $sizePolicy2 ); $tis->setMinimumSize( Qt::Size(0, 25) ); $tis->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1474,8 +1361,8 @@ sub setupUi { my $tfs = Qt::LineEdit( $layoutWidget2 ); $self->{tfs} = $tfs; $tfs->setObjectName( "tfs" ); - $sizePolicy3->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); - $tfs->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); + $tfs->setSizePolicy( $sizePolicy2 ); $tfs->setMinimumSize( Qt::Size(0, 25) ); $tfs->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1484,8 +1371,8 @@ sub setupUi { my $bins = Qt::LineEdit( $layoutWidget2 ); $self->{bins} = $bins; $bins->setObjectName( "bins" ); - $sizePolicy3->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); - $bins->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); + $bins->setSizePolicy( $sizePolicy2 ); $bins->setMinimumSize( Qt::Size(0, 25) ); $bins->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1494,12 +1381,12 @@ sub setupUi { my $textLabel1_4 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4} = $textLabel1_4; $textLabel1_4->setObjectName( "textLabel1_4" ); - my $sizePolicy8 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Minimum() ); - $self->{$sizePolicy8} = $sizePolicy8; - $sizePolicy8->setHorizontalStretch( 0 ); - $sizePolicy8->setVerticalStretch( 0 ); - $sizePolicy8->setHeightForWidth( $textLabel1_4->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4->setSizePolicy( $sizePolicy8 ); + my $sizePolicy7 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Minimum() ); + $self->{$sizePolicy7} = $sizePolicy7; + $sizePolicy7->setHorizontalStretch( 0 ); + $sizePolicy7->setVerticalStretch( 0 ); + $sizePolicy7->setHeightForWidth( $textLabel1_4->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4->setSizePolicy( $sizePolicy7 ); $textLabel1_4->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_4->setWordWrap( 0 ); @@ -1508,8 +1395,8 @@ sub setupUi { my $textLabel1_8 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_8} = $textLabel1_8; $textLabel1_8->setObjectName( "textLabel1_8" ); - $sizePolicy8->setHeightForWidth( $textLabel1_8->sizePolicy()->hasHeightForWidth() ); - $textLabel1_8->setSizePolicy( $sizePolicy8 ); + $sizePolicy7->setHeightForWidth( $textLabel1_8->sizePolicy()->hasHeightForWidth() ); + $textLabel1_8->setSizePolicy( $sizePolicy7 ); $textLabel1_8->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_8->setWordWrap( 0 ); @@ -1518,8 +1405,8 @@ sub setupUi { my $textLabel1_4_2_2 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_2_2} = $textLabel1_4_2_2; $textLabel1_4_2_2->setObjectName( "textLabel1_4_2_2" ); - $sizePolicy8->setHeightForWidth( $textLabel1_4_2_2->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4_2_2->setSizePolicy( $sizePolicy8 ); + $sizePolicy7->setHeightForWidth( $textLabel1_4_2_2->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_2_2->setSizePolicy( $sizePolicy7 ); $textLabel1_4_2_2->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_4_2_2->setWordWrap( 0 ); @@ -1565,8 +1452,8 @@ sub setupUi { my $textLabel1_4_4 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_4} = $textLabel1_4_4; $textLabel1_4_4->setObjectName( "textLabel1_4_4" ); - $sizePolicy3->setHeightForWidth( $textLabel1_4_4->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4_4->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $textLabel1_4_4->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_4->setSizePolicy( $sizePolicy2 ); $textLabel1_4_4->setMinimumSize( Qt::Size(0, 25) ); $textLabel1_4_4->setWordWrap( 0 ); @@ -1589,8 +1476,8 @@ sub setupUi { my $ltc = Qt::CheckBox( $layoutWidget2 ); $self->{ltc} = $ltc; $ltc->setObjectName( "ltc" ); - $sizePolicy3->setHeightForWidth( $ltc->sizePolicy()->hasHeightForWidth() ); - $ltc->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $ltc->sizePolicy()->hasHeightForWidth() ); + $ltc->setSizePolicy( $sizePolicy2 ); $ltc->setMinimumSize( Qt::Size(0, 25) ); $ltc->setChecked( 1 ); @@ -1607,12 +1494,12 @@ sub setupUi { $self->{gridLayout_6} = $gridLayout_6; $gridLayout_6->setSpacing( 6 ); $gridLayout_6->setObjectName( "gridLayout_6" ); - $gridLayout_6->setSizeConstraint( Qt::Layout::SetMinimumSize() ); + $gridLayout_6->setSizeConstraint( Qt::Layout::SetDefaultConstraint() ); my $fitAsyTypeLabel = Qt::Label( $layoutWidget ); $self->{fitAsyTypeLabel} = $fitAsyTypeLabel; $fitAsyTypeLabel->setObjectName( "fitAsyTypeLabel" ); - $sizePolicy5->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); - $fitAsyTypeLabel->setSizePolicy( $sizePolicy5 ); + $sizePolicy6->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); + $fitAsyTypeLabel->setSizePolicy( $sizePolicy6 ); $fitAsyTypeLabel->setWordWrap( 0 ); $gridLayout_6->addWidget( $fitAsyTypeLabel, 0, 0, 1, 1 ); @@ -1620,8 +1507,8 @@ sub setupUi { my $fitAsyType = Qt::ComboBox( $layoutWidget ); $self->{fitAsyType} = $fitAsyType; $fitAsyType->setObjectName( "fitAsyType" ); - $sizePolicy5->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); - $fitAsyType->setSizePolicy( $sizePolicy5 ); + $sizePolicy6->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); + $fitAsyType->setSizePolicy( $sizePolicy6 ); $fitAsyType->setMinimumSize( Qt::Size(0, 25) ); $fitAsyType->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1630,8 +1517,8 @@ sub setupUi { my $histsLRBFLabel = Qt::Label( $layoutWidget ); $self->{histsLRBFLabel} = $histsLRBFLabel; $histsLRBFLabel->setObjectName( "histsLRBFLabel" ); - $sizePolicy5->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); - $histsLRBFLabel->setSizePolicy( $sizePolicy5 ); + $sizePolicy6->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); + $histsLRBFLabel->setSizePolicy( $sizePolicy6 ); $histsLRBFLabel->setWordWrap( 0 ); $gridLayout_6->addWidget( $histsLRBFLabel, 0, 2, 1, 1 ); @@ -1639,8 +1526,8 @@ sub setupUi { my $histsLRBF = Qt::LineEdit( $layoutWidget ); $self->{histsLRBF} = $histsLRBF; $histsLRBF->setObjectName( "histsLRBF" ); - $sizePolicy5->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); - $histsLRBF->setSizePolicy( $sizePolicy5 ); + $sizePolicy6->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); + $histsLRBF->setSizePolicy( $sizePolicy6 ); $histsLRBF->setMinimumSize( Qt::Size(0, 25) ); $histsLRBF->setMaximumSize( Qt::Size(16777215, 25) ); @@ -1726,8 +1613,8 @@ sub setupUi { my $buttonGroupSharing = Qt::GroupBox( $sharingPage ); $self->{buttonGroupSharing} = $buttonGroupSharing; $buttonGroupSharing->setObjectName( "buttonGroupSharing" ); - $sizePolicy6->setHeightForWidth( $buttonGroupSharing->sizePolicy()->hasHeightForWidth() ); - $buttonGroupSharing->setSizePolicy( $sizePolicy6 ); + $sizePolicy5->setHeightForWidth( $buttonGroupSharing->sizePolicy()->hasHeightForWidth() ); + $buttonGroupSharing->setSizePolicy( $sizePolicy5 ); $buttonGroupSharing->setAlignment( Qt::AlignLeading() ); $buttonGroupSharing->setCheckable( 1 ); $buttonGroupSharing->setChecked( 0 ); @@ -1744,12 +1631,12 @@ sub setupUi { $self->{sharingComp1} = $sharingComp1; $sharingComp1->setObjectName( "sharingComp1" ); $sharingComp1->setEnabled( 0 ); - my $sizePolicy9 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); - $self->{$sizePolicy9} = $sizePolicy9; - $sizePolicy9->setHorizontalStretch( 0 ); - $sizePolicy9->setVerticalStretch( 0 ); - $sizePolicy9->setHeightForWidth( $sharingComp1->sizePolicy()->hasHeightForWidth() ); - $sharingComp1->setSizePolicy( $sizePolicy9 ); + my $sizePolicy8 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); + $self->{$sizePolicy8} = $sizePolicy8; + $sizePolicy8->setHorizontalStretch( 0 ); + $sizePolicy8->setVerticalStretch( 0 ); + $sizePolicy8->setHeightForWidth( $sharingComp1->sizePolicy()->hasHeightForWidth() ); + $sharingComp1->setSizePolicy( $sizePolicy8 ); $sharingComp1->setAlignment( Qt::AlignLeading() ); my $layout14 = Qt::Widget( $sharingComp1 ); $self->{layout14} = $layout14; @@ -1833,179 +1720,6 @@ sub setupUi { $horizontalLayout->addWidget( $sharingComp1 ); - my $sharingComp2 = Qt::GroupBox( $buttonGroupSharing ); - $self->{sharingComp2} = $sharingComp2; - $sharingComp2->setObjectName( "sharingComp2" ); - $sharingComp2->setEnabled( 0 ); - $sizePolicy9->setHeightForWidth( $sharingComp2->sizePolicy()->hasHeightForWidth() ); - $sharingComp2->setSizePolicy( $sizePolicy9 ); - my $comp2ShLabel = Qt::Label( $sharingComp2 ); - $self->{comp2ShLabel} = $comp2ShLabel; - $comp2ShLabel->setObjectName( "comp2ShLabel" ); - $comp2ShLabel->setGeometry( Qt::Rect(2, 30, 141, 20) ); - $comp2ShLabel->setWordWrap( 0 ); - my $layout13 = Qt::Widget( $sharingComp2 ); - $self->{layout13} = $layout13; - $layout13->setObjectName( "layout13" ); - $layout13->setGeometry( Qt::Rect(40, 60, 81, 266) ); - my $_1 = Qt::VBoxLayout( $layout13 ); - $self->{_1} = $_1; - $_1->setSpacing( 0 ); - $_1->setMargin( 0 ); - $_1->setObjectName( "_1" ); - $_1->setContentsMargins(0, 0, 0, 0 ); - my $shParam_2_1 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_1} = $shParam_2_1; - $shParam_2_1->setObjectName( "shParam_2_1" ); - - $_1->addWidget( $shParam_2_1 ); - - my $shParam_2_2 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_2} = $shParam_2_2; - $shParam_2_2->setObjectName( "shParam_2_2" ); - - $_1->addWidget( $shParam_2_2 ); - - my $shParam_2_3 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_3} = $shParam_2_3; - $shParam_2_3->setObjectName( "shParam_2_3" ); - - $_1->addWidget( $shParam_2_3 ); - - my $shParam_2_4 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_4} = $shParam_2_4; - $shParam_2_4->setObjectName( "shParam_2_4" ); - - $_1->addWidget( $shParam_2_4 ); - - my $shParam_2_5 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_5} = $shParam_2_5; - $shParam_2_5->setObjectName( "shParam_2_5" ); - - $_1->addWidget( $shParam_2_5 ); - - my $shParam_2_6 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_6} = $shParam_2_6; - $shParam_2_6->setObjectName( "shParam_2_6" ); - $shParam_2_6->setEnabled( 0 ); - $shParam_2_6->setTristate( 0 ); - - $_1->addWidget( $shParam_2_6 ); - - my $shParam_2_7 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_7} = $shParam_2_7; - $shParam_2_7->setObjectName( "shParam_2_7" ); - $shParam_2_7->setEnabled( 0 ); - $shParam_2_7->setTristate( 0 ); - - $_1->addWidget( $shParam_2_7 ); - - my $shParam_2_8 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_8} = $shParam_2_8; - $shParam_2_8->setObjectName( "shParam_2_8" ); - $shParam_2_8->setEnabled( 0 ); - $shParam_2_8->setTristate( 0 ); - - $_1->addWidget( $shParam_2_8 ); - - my $shParam_2_9 = Qt::CheckBox( $layout13 ); - $self->{shParam_2_9} = $shParam_2_9; - $shParam_2_9->setObjectName( "shParam_2_9" ); - $shParam_2_9->setEnabled( 0 ); - $shParam_2_9->setTristate( 0 ); - - $_1->addWidget( $shParam_2_9 ); - - - $horizontalLayout->addWidget( $sharingComp2 ); - - my $sharingComp3 = Qt::GroupBox( $buttonGroupSharing ); - $self->{sharingComp3} = $sharingComp3; - $sharingComp3->setObjectName( "sharingComp3" ); - $sharingComp3->setEnabled( 0 ); - $sizePolicy9->setHeightForWidth( $sharingComp3->sizePolicy()->hasHeightForWidth() ); - $sharingComp3->setSizePolicy( $sizePolicy9 ); - $sharingComp3->setAlignment( Qt::AlignJustify()|Qt::AlignVCenter() ); - my $comp3ShLabel = Qt::Label( $sharingComp3 ); - $self->{comp3ShLabel} = $comp3ShLabel; - $comp3ShLabel->setObjectName( "comp3ShLabel" ); - $comp3ShLabel->setGeometry( Qt::Rect(2, 30, 141, 20) ); - $comp3ShLabel->setWordWrap( 0 ); - my $layout15 = Qt::Widget( $sharingComp3 ); - $self->{layout15} = $layout15; - $layout15->setObjectName( "layout15" ); - $layout15->setGeometry( Qt::Rect(41, 58, 81, 266) ); - my $_3 = Qt::VBoxLayout( $layout15 ); - $self->{_3} = $_3; - $_3->setSpacing( 6 ); - $_3->setMargin( 11 ); - $_3->setObjectName( "_3" ); - $_3->setContentsMargins(0, 0, 0, 0 ); - my $shParam_3_1 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_1} = $shParam_3_1; - $shParam_3_1->setObjectName( "shParam_3_1" ); - - $_3->addWidget( $shParam_3_1 ); - - my $shParam_3_2 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_2} = $shParam_3_2; - $shParam_3_2->setObjectName( "shParam_3_2" ); - - $_3->addWidget( $shParam_3_2 ); - - my $shParam_3_3 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_3} = $shParam_3_3; - $shParam_3_3->setObjectName( "shParam_3_3" ); - - $_3->addWidget( $shParam_3_3 ); - - my $shParam_3_4 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_4} = $shParam_3_4; - $shParam_3_4->setObjectName( "shParam_3_4" ); - - $_3->addWidget( $shParam_3_4 ); - - my $shParam_3_5 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_5} = $shParam_3_5; - $shParam_3_5->setObjectName( "shParam_3_5" ); - - $_3->addWidget( $shParam_3_5 ); - - my $shParam_3_6 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_6} = $shParam_3_6; - $shParam_3_6->setObjectName( "shParam_3_6" ); - $shParam_3_6->setEnabled( 0 ); - $shParam_3_6->setTristate( 0 ); - - $_3->addWidget( $shParam_3_6 ); - - my $shParam_3_7 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_7} = $shParam_3_7; - $shParam_3_7->setObjectName( "shParam_3_7" ); - $shParam_3_7->setEnabled( 0 ); - $shParam_3_7->setTristate( 0 ); - - $_3->addWidget( $shParam_3_7 ); - - my $shParam_3_8 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_8} = $shParam_3_8; - $shParam_3_8->setObjectName( "shParam_3_8" ); - $shParam_3_8->setEnabled( 0 ); - $shParam_3_8->setTristate( 0 ); - - $_3->addWidget( $shParam_3_8 ); - - my $shParam_3_9 = Qt::CheckBox( $layout15 ); - $self->{shParam_3_9} = $shParam_3_9; - $shParam_3_9->setObjectName( "shParam_3_9" ); - $shParam_3_9->setEnabled( 0 ); - $shParam_3_9->setTristate( 0 ); - - $_3->addWidget( $shParam_3_9 ); - - - $horizontalLayout->addWidget( $sharingComp3 ); - $gridLayout_7->addLayout( $horizontalLayout, 0, 0, 1, 1 ); @@ -2046,8 +1760,8 @@ sub setupUi { my $groupTitle = Qt::GroupBox( $msrPage ); $self->{groupTitle} = $groupTitle; $groupTitle->setObjectName( "groupTitle" ); - $sizePolicy3->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); - $groupTitle->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); + $groupTitle->setSizePolicy( $sizePolicy2 ); my $gridLayout5 = Qt::GridLayout( $groupTitle ); $self->{gridLayout5} = $gridLayout5; $gridLayout5->setSpacing( 6 ); @@ -2060,8 +1774,8 @@ sub setupUi { my $titleLabel = Qt::Label( $groupTitle ); $self->{titleLabel} = $titleLabel; $titleLabel->setObjectName( "titleLabel" ); - $sizePolicy4->setHeightForWidth( $titleLabel->sizePolicy()->hasHeightForWidth() ); - $titleLabel->setSizePolicy( $sizePolicy4 ); + $sizePolicy3->setHeightForWidth( $titleLabel->sizePolicy()->hasHeightForWidth() ); + $titleLabel->setSizePolicy( $sizePolicy3 ); $titleLabel->setWordWrap( 0 ); $vboxLayout1->addWidget( $titleLabel ); @@ -2069,12 +1783,12 @@ sub setupUi { my $title = Qt::LineEdit( $groupTitle ); $self->{title} = $title; $title->setObjectName( "title" ); - my $sizePolicy10 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy10} = $sizePolicy10; - $sizePolicy10->setHorizontalStretch( 1 ); - $sizePolicy10->setVerticalStretch( 1 ); - $sizePolicy10->setHeightForWidth( $title->sizePolicy()->hasHeightForWidth() ); - $title->setSizePolicy( $sizePolicy10 ); + my $sizePolicy9 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy9} = $sizePolicy9; + $sizePolicy9->setHorizontalStretch( 1 ); + $sizePolicy9->setVerticalStretch( 1 ); + $sizePolicy9->setHeightForWidth( $title->sizePolicy()->hasHeightForWidth() ); + $title->setSizePolicy( $sizePolicy9 ); $vboxLayout1->addWidget( $title ); @@ -2092,8 +1806,8 @@ sub setupUi { my $fileName = Qt::LineEdit( $groupTitle ); $self->{fileName} = $fileName; $fileName->setObjectName( "fileName" ); - $sizePolicy3->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); - $fileName->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); + $fileName->setSizePolicy( $sizePolicy2 ); $hboxLayout->addWidget( $fileName ); @@ -2128,8 +1842,8 @@ sub setupUi { my $fourierBox = Qt::GroupBox( $fourierPage ); $self->{fourierBox} = $fourierBox; $fourierBox->setObjectName( "fourierBox" ); - $sizePolicy6->setHeightForWidth( $fourierBox->sizePolicy()->hasHeightForWidth() ); - $fourierBox->setSizePolicy( $sizePolicy6 ); + $sizePolicy5->setHeightForWidth( $fourierBox->sizePolicy()->hasHeightForWidth() ); + $fourierBox->setSizePolicy( $sizePolicy5 ); my $layout34 = Qt::Widget( $fourierBox ); $self->{layout34} = $layout34; $layout34->setObjectName( "layout34" ); @@ -2143,28 +1857,28 @@ sub setupUi { my $frqMax = Qt::LineEdit( $layout34 ); $self->{frqMax} = $frqMax; $frqMax->setObjectName( "frqMax" ); - $sizePolicy4->setHeightForWidth( $frqMax->sizePolicy()->hasHeightForWidth() ); - $frqMax->setSizePolicy( $sizePolicy4 ); + $sizePolicy3->setHeightForWidth( $frqMax->sizePolicy()->hasHeightForWidth() ); + $frqMax->setSizePolicy( $sizePolicy3 ); $gridLayout7->addWidget( $frqMax, 0, 6, 1, 1 ); my $funits = Qt::ComboBox( $layout34 ); $self->{funits} = $funits; $funits->setObjectName( "funits" ); - my $sizePolicy11 = Qt::SizePolicy( Qt::SizePolicy::Ignored(), Qt::SizePolicy::Preferred() ); - $self->{$sizePolicy11} = $sizePolicy11; - $sizePolicy11->setHorizontalStretch( 0 ); - $sizePolicy11->setVerticalStretch( 0 ); - $sizePolicy11->setHeightForWidth( $funits->sizePolicy()->hasHeightForWidth() ); - $funits->setSizePolicy( $sizePolicy11 ); + my $sizePolicy10 = Qt::SizePolicy( Qt::SizePolicy::Ignored(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy10} = $sizePolicy10; + $sizePolicy10->setHorizontalStretch( 0 ); + $sizePolicy10->setVerticalStretch( 0 ); + $sizePolicy10->setHeightForWidth( $funits->sizePolicy()->hasHeightForWidth() ); + $funits->setSizePolicy( $sizePolicy10 ); $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 ); + $sizePolicy3->setHeightForWidth( $fplot->sizePolicy()->hasHeightForWidth() ); + $fplot->setSizePolicy( $sizePolicy3 ); $gridLayout7->addWidget( $fplot, 2, 2, 1, 1 ); @@ -2199,8 +1913,8 @@ sub setupUi { my $fapodization = Qt::ComboBox( $layout34 ); $self->{fapodization} = $fapodization; $fapodization->setObjectName( "fapodization" ); - $sizePolicy4->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); - $fapodization->setSizePolicy( $sizePolicy4 ); + $sizePolicy3->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); + $fapodization->setSizePolicy( $sizePolicy3 ); $gridLayout7->addWidget( $fapodization, 1, 2, 1, 1 ); @@ -2235,8 +1949,8 @@ sub setupUi { my $fphase = Qt::LineEdit( $layout34 ); $self->{fphase} = $fphase; $fphase->setObjectName( "fphase" ); - $sizePolicy4->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); - $fphase->setSizePolicy( $sizePolicy4 ); + $sizePolicy3->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); + $fphase->setSizePolicy( $sizePolicy3 ); $gridLayout7->addWidget( $fphase, 1, 4, 1, 1 ); @@ -2257,8 +1971,8 @@ sub setupUi { my $frqMin = Qt::LineEdit( $layout34 ); $self->{frqMin} = $frqMin; $frqMin->setObjectName( "frqMin" ); - $sizePolicy4->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); - $frqMin->setSizePolicy( $sizePolicy4 ); + $sizePolicy3->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); + $frqMin->setSizePolicy( $sizePolicy3 ); $gridLayout7->addWidget( $frqMin, 0, 4, 1, 1 ); @@ -2281,8 +1995,8 @@ sub setupUi { my $rrfBox = Qt::GroupBox( $fourierPage ); $self->{rrfBox} = $rrfBox; $rrfBox->setObjectName( "rrfBox" ); - $sizePolicy6->setHeightForWidth( $rrfBox->sizePolicy()->hasHeightForWidth() ); - $rrfBox->setSizePolicy( $sizePolicy6 ); + $sizePolicy5->setHeightForWidth( $rrfBox->sizePolicy()->hasHeightForWidth() ); + $rrfBox->setSizePolicy( $sizePolicy5 ); my $layout35 = Qt::Widget( $rrfBox ); $self->{layout35} = $layout35; $layout35->setObjectName( "layout35" ); @@ -2633,12 +2347,12 @@ sub setupUi { $self->{t0Update} = $t0Update; $t0Update->setObjectName( "t0Update" ); $t0Update->setEnabled( 0 ); - my $sizePolicy12 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy12} = $sizePolicy12; - $sizePolicy12->setHorizontalStretch( 0 ); - $sizePolicy12->setVerticalStretch( 0 ); - $sizePolicy12->setHeightForWidth( $t0Update->sizePolicy()->hasHeightForWidth() ); - $t0Update->setSizePolicy( $sizePolicy12 ); + my $sizePolicy11 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy11} = $sizePolicy11; + $sizePolicy11->setHorizontalStretch( 0 ); + $sizePolicy11->setVerticalStretch( 0 ); + $sizePolicy11->setHeightForWidth( $t0Update->sizePolicy()->hasHeightForWidth() ); + $t0Update->setSizePolicy( $sizePolicy11 ); $hboxLayout2->addWidget( $t0Update ); @@ -2800,16 +2514,16 @@ sub setupUi { my $cParamsCombo = Qt::ComboBox( $tabPage ); $self->{cParamsCombo} = $cParamsCombo; $cParamsCombo->setObjectName( "cParamsCombo" ); - $sizePolicy12->setHeightForWidth( $cParamsCombo->sizePolicy()->hasHeightForWidth() ); - $cParamsCombo->setSizePolicy( $sizePolicy12 ); + $sizePolicy11->setHeightForWidth( $cParamsCombo->sizePolicy()->hasHeightForWidth() ); + $cParamsCombo->setSizePolicy( $sizePolicy11 ); $hboxLayout3->addWidget( $cParamsCombo ); my $textLabel1_4_6 = Qt::Label( $tabPage ); $self->{textLabel1_4_6} = $textLabel1_4_6; $textLabel1_4_6->setObjectName( "textLabel1_4_6" ); - $sizePolicy12->setHeightForWidth( $textLabel1_4_6->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4_6->setSizePolicy( $sizePolicy12 ); + $sizePolicy11->setHeightForWidth( $textLabel1_4_6->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_6->setSizePolicy( $sizePolicy11 ); $textLabel1_4_6->setWordWrap( 0 ); $hboxLayout3->addWidget( $textLabel1_4_6 ); @@ -2817,8 +2531,8 @@ sub setupUi { my $constraintLine = Qt::LineEdit( $tabPage ); $self->{constraintLine} = $constraintLine; $constraintLine->setObjectName( "constraintLine" ); - $sizePolicy3->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); - $constraintLine->setSizePolicy( $sizePolicy3 ); + $sizePolicy2->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); + $constraintLine->setSizePolicy( $sizePolicy2 ); $constraintLine->setMinimumSize( Qt::Size(0, 25) ); $hboxLayout3->addWidget( $constraintLine ); @@ -2826,8 +2540,8 @@ sub setupUi { my $addConstraint = Qt::PushButton( $tabPage ); $self->{addConstraint} = $addConstraint; $addConstraint->setObjectName( "addConstraint" ); - $sizePolicy12->setHeightForWidth( $addConstraint->sizePolicy()->hasHeightForWidth() ); - $addConstraint->setSizePolicy( $sizePolicy12 ); + $sizePolicy11->setHeightForWidth( $addConstraint->sizePolicy()->hasHeightForWidth() ); + $addConstraint->setSizePolicy( $sizePolicy11 ); $hboxLayout3->addWidget( $addConstraint ); @@ -2976,25 +2690,7 @@ sub setupUi { Qt::Widget::setTabOrder( $shParam_1_6, $shParam_1_7 ); Qt::Widget::setTabOrder( $shParam_1_7, $shParam_1_8 ); Qt::Widget::setTabOrder( $shParam_1_8, $shParam_1_9 ); - Qt::Widget::setTabOrder( $shParam_1_9, $shParam_2_1 ); - Qt::Widget::setTabOrder( $shParam_2_1, $shParam_2_2 ); - Qt::Widget::setTabOrder( $shParam_2_2, $shParam_2_3 ); - Qt::Widget::setTabOrder( $shParam_2_3, $shParam_2_4 ); - Qt::Widget::setTabOrder( $shParam_2_4, $shParam_2_5 ); - Qt::Widget::setTabOrder( $shParam_2_5, $shParam_2_6 ); - Qt::Widget::setTabOrder( $shParam_2_6, $shParam_2_7 ); - Qt::Widget::setTabOrder( $shParam_2_7, $shParam_2_8 ); - Qt::Widget::setTabOrder( $shParam_2_8, $shParam_2_9 ); - Qt::Widget::setTabOrder( $shParam_2_9, $shParam_3_1 ); - Qt::Widget::setTabOrder( $shParam_3_1, $shParam_3_2 ); - Qt::Widget::setTabOrder( $shParam_3_2, $shParam_3_3 ); - Qt::Widget::setTabOrder( $shParam_3_3, $shParam_3_4 ); - Qt::Widget::setTabOrder( $shParam_3_4, $shParam_3_5 ); - Qt::Widget::setTabOrder( $shParam_3_5, $shParam_3_6 ); - Qt::Widget::setTabOrder( $shParam_3_6, $shParam_3_7 ); - Qt::Widget::setTabOrder( $shParam_3_7, $shParam_3_8 ); - Qt::Widget::setTabOrder( $shParam_3_8, $shParam_3_9 ); - Qt::Widget::setTabOrder( $shParam_3_9, $initParamTable ); + Qt::Widget::setTabOrder( $shParam_1_9, $initParamTable ); Qt::Widget::setTabOrder( $initParamTable, $title ); Qt::Widget::setTabOrder( $title, $fileName ); Qt::Widget::setTabOrder( $fileName, $textMSROutput ); @@ -3186,7 +2882,7 @@ sub retranslateUi { $self->{textLabel1_5_2}->setText( Qt::Application::translate( 'MuSRFit4', "Error estimation", undef, Qt::Application::UnicodeUTF8() ) ); $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{fittingPage}), Qt::Application::translate( 'MuSRFit4', "Fitting", undef, Qt::Application::UnicodeUTF8() ) ); $self->{buttonGroupSharing}->setTitle( Qt::Application::translate( 'MuSRFit4', "Shared parameters among different runs", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{sharingComp1}->setTitle( Qt::Application::translate( 'MuSRFit4', "1st Component", undef, Qt::Application::UnicodeUTF8() ) ); + $self->{sharingComp1}->setTitle( Qt::Application::translate( 'MuSRFit4', "Component 1", undef, Qt::Application::UnicodeUTF8() ) ); $self->{shParam_1_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); $self->{shParam_1_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); $self->{shParam_1_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); @@ -3197,28 +2893,6 @@ sub retranslateUi { $self->{shParam_1_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); $self->{shParam_1_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); $self->{comp1ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType1", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{sharingComp2}->setTitle( Qt::Application::translate( 'MuSRFit4', "2nd Component", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{comp2ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType2", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_2_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_2_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_2_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_2_4}->setText( Qt::Application::translate( 'MuSRFit4', "Param4", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_2_5}->setText( Qt::Application::translate( 'MuSRFit4', "Param5", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_2_6}->setText( Qt::Application::translate( 'MuSRFit4', "Param6", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_2_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_2_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_2_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{sharingComp3}->setTitle( Qt::Application::translate( 'MuSRFit4', "3rd Component", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{comp3ShLabel}->setText( Qt::Application::translate( 'MuSRFit4', "FitType3", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_3_1}->setText( Qt::Application::translate( 'MuSRFit4', "Param1", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_3_2}->setText( Qt::Application::translate( 'MuSRFit4', "Param2", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_3_3}->setText( Qt::Application::translate( 'MuSRFit4', "Param3", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_3_4}->setText( Qt::Application::translate( 'MuSRFit4', "Param4", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_3_5}->setText( Qt::Application::translate( 'MuSRFit4', "Param5", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_3_6}->setText( Qt::Application::translate( 'MuSRFit4', "Param6", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_3_7}->setText( Qt::Application::translate( 'MuSRFit4', "Param7", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_3_8}->setText( Qt::Application::translate( 'MuSRFit4', "Param8", undef, Qt::Application::UnicodeUTF8() ) ); - $self->{shParam_3_9}->setText( Qt::Application::translate( 'MuSRFit4', "Param9", undef, Qt::Application::UnicodeUTF8() ) ); $self->{musrfit_tabs}->setTabText( $self->{musrfit_tabs}->indexOf( $self->{sharingPage}), Qt::Application::translate( 'MuSRFit4', "Sharing", undef, Qt::Application::UnicodeUTF8() ) ); my $initParamTable = $self->{initParamTable}; if ( $initParamTable->columnCount < 4 ) { From c62e4c1df614c8150fa7903ccbc9091c00c55950 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 12 Feb 2018 15:42:46 +0100 Subject: [PATCH 23/87] Export using msr2data when appropriate --- src/external/MuSRFitGUI/MSR.pm | 33 ++-- src/external/MuSRFitGUI/MuSRFit4.pm | 252 ++++++++++++++++------------ 2 files changed, 168 insertions(+), 117 deletions(-) diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm index c006d29d..538f39ad 100644 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -56,7 +56,7 @@ sub CreateMSRUni { # # Input in %All # Required: -# $All{"FitType1/2/3"} - Function types, 3 components +# $All{"FitTypei"} - Function types, i components # $All{"LRBF"} - Histograms, comma separated # $All{"Tis"} # $All{"Tfs"} @@ -86,10 +86,11 @@ sub CreateMSRUni { my $DEBUG = ""; # Start with empty array my @FitTypes = (); - - foreach ($All{"FitType1"},$All{"FitType2"},$All{"FitType3"}) { - if ($_ ne "None") { - @FitTypes=(@FitTypes,$_); + # loop over fitTypes + if (!defined($All{"numComps"})) {$All{"numComps"}=3;} + for (my $i=1;$i<=$All{"numComps"};$i++) { + if ( defined($All{"FitType$i"}) &&$All{"FitType$i"} ne "None" ) { + push( @FitTypes, $All{"FitType$i"} ); } } @@ -1047,10 +1048,15 @@ sub PrepParamTable { } my @Hists = split( /,/, $All{"LRBF"} ); - my @FitTypes =(); - foreach my $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) { - if ( $FitType ne "None" ) { push( @FitTypes, $FitType ); } + my @FitTypes = (); + # loop over fitTypes + if (!defined($All{"numComps"})) {$All{"numComps"}=3;} + for (my $i=1;$i<=$All{"numComps"};$i++) { + if ( defined($All{"FitType$i"}) &&$All{"FitType$i"} ne "None" ) { + push( @FitTypes, $All{"FitType$i"} ); + } } + # 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? @@ -1239,10 +1245,15 @@ sub ExportParams { } my @Hists = split( /,/, $All{"LRBF"} ); - my @FitTypes =(); - foreach my $FitType ($All{"FitType1"}, $All{"FitType2"}, $All{"FitType3"}) { - if ( $FitType ne "None" ) { push( @FitTypes, $FitType ); } + my @FitTypes = (); + # loop over fitTypes + if (!defined($All{"numComps"})) {$All{"numComps"}=3;} + for (my $i=1;$i<=$All{"numComps"};$i++) { + if ( defined($All{"FitType$i"}) &&$All{"FitType$i"} ne "None" ) { + push( @FitTypes, $All{"FitType$i"} ); + } } + # 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? diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm index 2a9604fe..3d2d448a 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.pm +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -43,10 +43,12 @@ use QtCore4::slots t0UpdateClicked => []; use Ui_MuSRFit4; +my $self = ""; + sub NEW { my ( $class, $parent ) = @_; $class->SUPER::NEW($parent); - this->{ui} = Ui_MuSRFit4->setupUi(this); + $self = Ui_MuSRFit4->setupUi(this); my %All=CreateAllInput(); } @@ -141,9 +143,18 @@ sub parametersExport() # Exports the fit parameters for a table format file # This works only after a fit call, i.e. a plot call is not sufficient! my %All=CreateAllInput(); + my @RUNS = (); + if ($All{"RUNSType"} ) { + @RUNS = split( /,/, $All{"RunFiles"}); + } else { + $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; + @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); + } # Add also a flag for header $All{"Header"}=1; + my $StupidName = $RUNS[0]."+global_tmpl.msr"; my $FILENAME=$All{"FILENAME"}.".dat"; + my $MSR = $All{"FILENAME"}.".msr"; my $file=Qt::FileDialog::getSaveFileName( this, "Export parameters to file", @@ -152,10 +163,21 @@ sub parametersExport() # If the user gave a filename the copy to it if ($file ne "") { - my $Text = MSR::ExportParams(\%All); - open( DATF,q{>},"$file" ); - print DATF $Text; - close(DATF); + if ($All{"FitAsyType"} eq "Asymmetry") { + # my style + my $Text = MSR::ExportParams(\%All); + open( DATF,q{>},"$file" ); + print DATF $Text; + close(DATF); + } else { + # msr2data style + my $RunList = join(" ",@RUNS); + my $cmd = "cp $MSR $StupidName; msr2data \[".$RunList."\] "." _tmpl new global data -o $file"; + my $pid = open(FTO,"$cmd 2>&1 |"); + while () { + $self->fitTextOutput->append("$_"); + } + } } } @@ -165,9 +187,18 @@ sub parametersAppend() # Appends the fit parameters for a table format file # This works only after a fit call, i.e. a plot call is not sufficient! my %All=CreateAllInput(); + my @RUNS = (); + if ($All{"RUNSType"} ) { + @RUNS = split( /,/, $All{"RunFiles"}); + } else { + $All{"RunNumbers"} =~ s/[\ \.\~\/\&\*\[\;\>\<\^\$\(\)\`\|\]\'\@]/,/g; + @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); + } # Add also a flag for header $All{"Header"}=0; + my $StupidName = $RUNS[0]."+global_tmpl.msr"; my $FILENAME=$All{"FILENAME"}.".dat"; + my $MSR = $All{"FILENAME"}.".msr"; my $file=Qt::FileDialog::getOpenFileName( this, "Append parameters to file", @@ -176,10 +207,21 @@ sub parametersAppend() # If the user gave a filename the copy to it if ($file ne "") { - my $Text = MSR::ExportParams(\%All); - open( DATF,q{>>},"$file" ); - print DATF $Text; - close(DATF); + if ($All{"FitAsyType"} eq "Asymmetry") { + my $Text = MSR::ExportParams(\%All); + open( DATF,q{>>},"$file" ); + print DATF $Text; + close(DATF); + } else { + # msr2data style + my $RunList = join(" ",@RUNS); + my $cmd = "cp $MSR $StupidName; msr2data \[".$RunList."\] "." _tmpl global data -o $file"; + my $pid = open(FTO,"$cmd 2>&1 |"); + while () { + $self->fitTextOutput->append("$_"); + } + close(FTO); + } } } @@ -261,47 +303,47 @@ sub CreateAllInput() # From RUNS Tab # Run data file - $All{"RunNumbers"} = this->{ui}->runNumbers->text(); - $All{"RunFiles"} = this->{ui}->runFiles->text(); - $All{"BeamLine"} = this->{ui}->beamLine->currentText; - $All{"RUNSType"} = this->{ui}->manualFile->isChecked(); - $All{"YEAR"} = this->{ui}->year->currentText; + $All{"RunNumbers"} = $self->runNumbers->text(); + $All{"RunFiles"} = $self->runFiles->text(); + $All{"BeamLine"} = $self->beamLine->currentText; + $All{"RUNSType"} = $self->manualFile->isChecked(); + $All{"YEAR"} = $self->year->currentText; if (!defined($All{"YEAR"}) || $All{"YEAR"} eq "") { # If year combobox is empty fill it up from 2004 up to current year my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(); my $current_year = 1900 + $yearOffset; # my @years = ($current_year..2004); -# this->{ui}->year->addItems(@years); +# $self->year->addItems(@years); for (my $i=$current_year;$i>=2004;$i--) { - this->{ui}->year->addItem($i); + $self->year->addItem($i); } } # Time range and BINS - $All{"Tis"} = this->{ui}->tis->text; - $All{"Tfs"} = this->{ui}->tfs->text; - $All{"BINS"} = this->{ui}->bins->text; - $All{"FitAsyType"} = this->{ui}->fitAsyType->currentText; + $All{"Tis"} = $self->tis->text; + $All{"Tfs"} = $self->tfs->text; + $All{"BINS"} = $self->bins->text; + $All{"FitAsyType"} = $self->fitAsyType->currentText; $All{"FitAsyType"} =~ s/ //g; - $All{"LRBF"} = this->{ui}->histsLRBF->text; + $All{"LRBF"} = $self->histsLRBF->text; my @Hists = split(/,/, $All{"LRBF"} ); # Lifetime corrections in enabled/visible only for SingleHis fits if ( $All{"FitAsyType"} eq "SingleHist" ) { - this->{ui}->ltc->setHidden(0); + $self->ltc->setHidden(0); $All{"fittype"}=0; } else { - this->{ui}->ltc->setHidden(1); + $self->ltc->setHidden(1); $All{"fittype"}=2; } # From Fitting Tab # Plot range - $All{"Xi"}=this->{ui}->xi->text; - $All{"Xf"}=this->{ui}->xf->text; - $All{"Yi"}=this->{ui}->yi->text; - $All{"Yf"}=this->{ui}->yf->text; - $All{"ViewBin"}=this->{ui}->viewBin->text; + $All{"Xi"}=$self->xi->text; + $All{"Xf"}=$self->xf->text; + $All{"Yi"}=$self->yi->text; + $All{"Yf"}=$self->yf->text; + $All{"ViewBin"}=$self->viewBin->text; # Life time correction - if (this->{ui}->ltc->isChecked()) { + if ($self->ltc->isChecked()) { $All{"ltc"}="y"; } else { $All{"ltc"}="n"; @@ -311,11 +353,11 @@ sub CreateAllInput() $All{"go"}="PLOT"; } # Get minimization process - $All{"Minimization"} = this->{ui}->minimization->currentText(); + $All{"Minimization"} = $self->minimization->currentText(); $All{"go"}=$All{"Minimization"}; # Get Error calculation process - $All{"ErrorCalc"} = this->{ui}->errorCalc->currentText(); + $All{"ErrorCalc"} = $self->errorCalc->currentText(); $All{"go"}=$All{"ErrorCalc"}; # Commands block @@ -331,23 +373,23 @@ sub CreateAllInput() } # From MSR File Tab - $All{"TITLE"}= this->{ui}->title->text; - $All{"FILENAME"}= this->{ui}->fileName->text; + $All{"TITLE"}= $self->title->text; + $All{"FILENAME"}= $self->fileName->text; # From Fourier Tab - $All{"FUNITS"}= this->{ui}->funits->currentText; - $All{"FAPODIZATION"}= this->{ui}->fapodization->currentText; - $All{"FPLOT"}= this->{ui}->fplot->currentText; - $All{"FPHASE"}=this->{ui}->fphase->text; + $All{"FUNITS"}= $self->funits->currentText; + $All{"FAPODIZATION"}= $self->fapodization->currentText; + $All{"FPLOT"}= $self->fplot->currentText; + $All{"FPHASE"}=$self->fphase->text; # Fourier range - $All{"FrqMin"}=this->{ui}->frqMin->text; - $All{"FrqMax"}=this->{ui}->frqMax->text; + $All{"FrqMin"}=$self->frqMin->text; + $All{"FrqMax"}=$self->frqMax->text; # Rotating reference frame parameters - $All{"RRFFrq"}=this->{ui}->rrfFrq->text; - $All{"RRFPack"}=this->{ui}->rrfPack->text; - $All{"RRFPhase"}=this->{ui}->rrfPhase->text; - $All{"RRFUnits"}=this->{ui}->rrfUnits->currentText; + $All{"RRFFrq"}=$self->rrfFrq->text; + $All{"RRFPack"}=$self->rrfPack->text; + $All{"RRFPhase"}=$self->rrfPhase->text; + $All{"RRFUnits"}=$self->rrfUnits->currentText; # Get values of t0 and Bg/Data bins if given my $NHist = 1; @@ -393,10 +435,10 @@ sub CreateAllInput() my $FT3=0; my @FitTypes =(); my $FT=0; - if (defined(this->{ui}->numComps)) { + if (defined($self->numComps)) { # new style, check the number of components - $numComps = this->{ui}->numComps->value; - if ($numComps != this->{ui}->columnView->count() ) { + $numComps = $self->numComps->value; + if ($numComps != $self->columnView->count() ) { addFitType(); } } else { @@ -425,12 +467,12 @@ sub CreateAllInput() my @Paramcomp = @$Paramcomp_ref; # Functions block - $All{"FunctionsBlock"}=this->{ui}->functionsBlock->toPlainText; + $All{"FunctionsBlock"}=$self->functionsBlock->toPlainText; # and the associated theory block - $All{"Func_T_Block"}=this->{ui}->theoryBlock->toPlainText; + $All{"Func_T_Block"}=$self->theoryBlock->toPlainText; # Shared settings are detected here - $All{"EnableSharing"} = this->{ui}->buttonGroupSharing->isChecked(); + $All{"EnableSharing"} = $self->buttonGroupSharing->isChecked(); # Make sure all sharing boxes exist #addSharingComp(); @@ -515,7 +557,7 @@ sub CreateAllInput() my $erradd = "d"; my $minadd = "_min"; my $maxadd = "_max"; - my $QTable=this->{ui}->initParamTable; + my $QTable=$self->initParamTable; # TODO: Should not go over all rows, only on parameters. if ($NParam > 0) { # Set appropriate number of rows @@ -543,7 +585,7 @@ sub CallMSRCreate() my %All=CreateAllInput(); # Check if the option for checking for existing files is selected - my $FileExistCheck= this->{ui}->fileExistCheck->isChecked(); + my $FileExistCheck= $self->fileExistCheck->isChecked(); my $FILENAME=$All{"FILENAME"}.".msr"; my $Answer=0; if ($All{"RunNumbers"} ne "" || $All{"RunFiles"} ne "") { @@ -595,7 +637,7 @@ sub CallMSRCreate() print $cmd."\n"; my $pid = open(FTO,"$cmd 2>&1 |"); while () { - this->{ui}->fitTextOutput->append("$_"); + $self->fitTextOutput->append("$_"); } close(FTO); # change the stupid name @@ -603,9 +645,8 @@ sub CallMSRCreate() # change stupid default runs line $cmd = "cp $StupidName $FILENAME; perl -pi -e 's/runs.*?(?=\n)/$NewRunLine/s' $FILENAME"; $pid = open(FTO,"$cmd 2>&1 |"); - print $cmd."\n"; while () { - this->{ui}->fitTextOutput->append("$_"); + $self->fitTextOutput->append("$_"); } close(FTO); # feed in values of parameters if they exist @@ -650,9 +691,9 @@ sub UpdateMSRFileInitTable() @lines = ; close(MSRF); } - this->{ui}->textMSROutput->setText(""); + $self->textMSROutput->setText(""); foreach my $line (@lines) { - this->{ui}->textMSROutput->insertPlainText("$line"); + $self->textMSROutput->insertPlainText("$line"); } (my $TBlock_ref, my $FPBlock_ref)=MSR::ExtractBlks(@lines); @@ -692,7 +733,7 @@ sub UpdateMSRFileInitTable() $maxvalue=1.0*$Param[7]; } # Now update the initialization tabel - my $QTable = this->{ui}->initParamTable; + my $QTable = $self->initParamTable; # print "PCount=$PCount and value=$value\n"; if (defined($QTable->item($PCount,0)) & defined($QTable->item($PCount,1)) & defined($QTable->item($PCount,2)) & defined($QTable->item($PCount,3))) { $QTable->setItem($PCount,0,Qt::TableWidgetItem()); @@ -745,7 +786,7 @@ sub ActivateShComp() # Make sure all sharing boxes exist addSharingComp(); - my $NShComps = this->{ui}->horizontalLayout->count(); + my $NShComps = $self->horizontalLayout->count(); my $sharingComp = ""; my $i = 1; # Hide all sharing components @@ -827,7 +868,7 @@ sub ActivateShComp() sub InitializeTab() { my %All=CreateAllInput(); - my $QTable = this->{ui}->initParamTable; + my $QTable = $self->initParamTable; my $NRows = $QTable->rowCount(); # Remove any rows in table @@ -875,7 +916,7 @@ sub TabChanged() { # TODO: First check if there are some runs given, otherwise disbale my %All=CreateAllInput(); - my $curTab = this->{ui}->musrfit_tabs->currentIndex(); + my $curTab = $self->musrfit_tabs->currentIndex(); if ($curTab >= 2 && $curTab <= 4) { # First make sure we have sharing initialized ActivateShComp(); @@ -906,7 +947,7 @@ sub GoFit() my $Warning = "Error: The number of histograms should be 2 for an asymmetry fit!"; my $WarningWindow = Qt::MessageBox::information( this, "Error",$Warning); } else { - this->{ui}->musrfit_tabs->setCurrentIndex(1); + $self->musrfit_tabs->setCurrentIndex(1); my $Answer=CallMSRCreate(); my $FILENAME=$All{"FILENAME"}.".msr"; if ($Answer) { @@ -914,13 +955,13 @@ sub GoFit() my $cmd="musrfit -t $FILENAME; musrview $FILENAME &"; my $pid = open(FTO,"$cmd 2>&1 |"); while () { - this->{ui}->fitTextOutput->insertPlainText("$_"); + $self->fitTextOutput->insertPlainText("$_"); } close(FTO); } else { - this->{ui}->fitTextOutput->insertPlainText("Cannot find MSR file!"); + $self->fitTextOutput->insertPlainText("Cannot find MSR file!"); } - this->{ui}->fitTextOutput->insertPlainText("-----------------------------------------------------------------------------------------------------------------------------"); + $self->fitTextOutput->insertPlainText("-----------------------------------------------------------------------------------------------------------------------------"); # update MSR File tab and initialization table UpdateMSRFileInitTable(); } @@ -947,8 +988,8 @@ sub GoPlot() my $cmd="musrview $FILENAME &"; my $pid = system($cmd); } else { - this->{ui}->fitTextOutput->insertPlainText("Cannot find MSR file!"); - this->{ui}->fitTextOutput->insertPlainText("-----------------------------------------------------------------------------------------------------------------------------"); + $self->fitTextOutput->insertPlainText("Cannot find MSR file!"); + $self->fitTextOutput->insertPlainText("-----------------------------------------------------------------------------------------------------------------------------"); } } } @@ -960,7 +1001,7 @@ sub ShowMuSRT0() { # Open musrt0 to check and adjust t0 , Bg and Data bins my %All=CreateAllInput(); - this->{ui}->musrfit_tabs->setCurrentIndex(6); + $self->musrfit_tabs->setCurrentIndex(6); # Create MSR file and then run musrt0 my $Answer=CallMSRCreate(); @@ -969,7 +1010,7 @@ sub ShowMuSRT0() if (-e $FILENAME) { my $cmd="musrt0 $FILENAME &"; my $pid = system($cmd); - this->{ui}->t0Update->setEnabled(1) + $self->t0Update->setEnabled(1) } else { print STDERR "Cannot find MSR file!\n"; } @@ -1000,28 +1041,28 @@ sub t0Update() sub RunSelectionToggle() { - my $ManualFile= this->{ui}->manualFile->isChecked(); + my $ManualFile= $self->manualFile->isChecked(); if ($ManualFile) { # Manual RUN selection - this->{ui}->runsMan->setEnabled(1); - this->{ui}->runsMan->setHidden(0); - this->{ui}->runNumbers->setText(""); - this->{ui}->runsAuto->setEnabled(0); - this->{ui}->runsAuto->setHidden(1); + $self->runsMan->setEnabled(1); + $self->runsMan->setHidden(0); + $self->runNumbers->setText(""); + $self->runsAuto->setEnabled(0); + $self->runsAuto->setHidden(1); } else { # Auto RUN selection - this->{ui}->runsMan->setEnabled(0); - this->{ui}->runsMan->setHidden(1); - this->{ui}->runFiles->setText(""); - this->{ui}->runsAuto->setEnabled(1); - this->{ui}->runsAuto->setHidden(0); + $self->runsMan->setEnabled(0); + $self->runsMan->setHidden(1); + $self->runFiles->setText(""); + $self->runsAuto->setEnabled(1); + $self->runsAuto->setHidden(0); } } sub fileBrowse() { - my $RunFiles=this->{ui}->runFiles->text(); + my $RunFiles=$self->runFiles->text(); print "Runs:$RunFiles\n"; my $files_ref=Qt::FileDialog::getOpenFileNames( "Data files (*.root *.bin)", @@ -1037,33 +1078,33 @@ sub fileBrowse() # Add files to existing list $RunFiles=join(",",$RunFiles,@files); } - this->{ui}->runFiles->setText($RunFiles); + $self->runFiles->setText($RunFiles); } sub AppendToFunctions() { - my $ParName=this->{ui}->cParamsCombo->currentText(); + my $ParName=$self->cParamsCombo->currentText(); my $Full_T_Block=""; my $Constraint=""; - if (defined(this->{ui}->theoryBlock->toPlainText)) { - $Full_T_Block=this->{ui}->theoryBlock->toPlainText; + if (defined($self->theoryBlock->toPlainText)) { + $Full_T_Block=$self->theoryBlock->toPlainText; } - if (defined(this->{ui}->constraintLine->text)) { - $Constraint=this->{ui}->constraintLine->text; + if (defined($self->constraintLine->text)) { + $Constraint=$self->constraintLine->text; } # Then clear the text - this->{ui}->constraintLine->setText(""); + $self->constraintLine->setText(""); # Check how many constraints (lines) in FUNCTIONS Block -# my $i=this->{ui}->functionsBlock->blockCount(); - my $fun_lines=this->{ui}->functionsBlock->toPlainText(); +# my $i=$self->functionsBlock->blockCount(); + my $fun_lines=$self->functionsBlock->toPlainText(); my $i= ($fun_lines =~ tr/\n//)+1; my $ConstLine="fun$i = $Constraint\n"; - this->{ui}->functionsBlock->insertPlainText($ConstLine); + $self->functionsBlock->insertPlainText($ConstLine); # Replace parameter in theory block with fun$i $Full_T_Block=~ s/$ParName/fun$i/; - this->{ui}->theoryBlock->setText($Full_T_Block); + $self->theoryBlock->setText($Full_T_Block); } sub InitializeFunctions() @@ -1086,10 +1127,10 @@ sub InitializeFunctions() # Initialize Parameters List in function block (constraints). my $ParametersList=""; - this->{ui}->parametersList->setText(""); + $self->parametersList->setText(""); # Counter for function block (with out Alpha etc.) my $ParCount=0; - this->{ui}->cParamsCombo->clear(); + $self->cParamsCombo->clear(); # Possibly use the parameters block to axtract names for the dropdown menu # this makes sense if we can use fun in map line. Check! @@ -1122,22 +1163,22 @@ sub InitializeFunctions() if (defined($Params[$i-1])) { my $CParam = $Params[$i-1]."_".$Component; if ($Params[$i-1] ne "Alpha" && $Params[$i-1] ne "No" && $Params[$i-1] ne "NBg") { - this->{ui}->cParamsCombo->addItem($CParam); + $self->cParamsCombo->addItem($CParam); $Full_T_Block=~ s/\b$Params[$i-1]\b/$CParam/; } # also enumerate the parameters as should be used in the FUNCTIONS Block $ParCount++; $ParametersList=$ParametersList."$CParam \t is \t par$ParCount\n"; - this->{ui}->parametersList->setText($ParametersList); + $self->parametersList->setText($ParametersList); } } $Component++; } # Set theory block in Constraints - this->{ui}->theoryBlock->setText($Full_T_Block); + $self->theoryBlock->setText($Full_T_Block); # Then clear the text - this->{ui}->constraintLine->setText(""); - this->{ui}->functionsBlock->setText(""); + $self->constraintLine->setText(""); + $self->functionsBlock->setText(""); } @@ -1177,7 +1218,7 @@ sub t0UpdateClicked() } # Finally, disable the update button - this->{ui}->t0Update->setEnabled(0); + $self->t0Update->setEnabled(0); # t0Update->setText("musrt0") } @@ -1199,18 +1240,18 @@ sub child { sub addFitType { # Input number of components - my $numComps = this->{ui}->numComps->value; + my $numComps = $self->numComps->value; # count number of exisitng components - my $NButtons = this->{ui}->columnView->count(); + my $NButtons = $self->columnView->count(); # create ComboBox in theoryFunction parent - my $fitType = Qt::ComboBox( this->{ui}->theoryFunction ); + my $fitType = Qt::ComboBox( $self->theoryFunction ); # do we have less components that we need if ($numComps > $NButtons) { # add as needed for (my $i=$NButtons+1;$i<=$numComps;$i++) { my $nameComp = "fitType$i"; - this->{ui}->columnView->addWidget( $fitType ); + $self->columnView->addWidget( $fitType ); $fitType->setObjectName( $nameComp ); $fitType->setMinimumSize( Qt::Size(0, 25) ); $fitType->setMaximumSize( Qt::Size(255, 25) ); @@ -1245,16 +1286,15 @@ sub addFitType { } else { for (my $i=$NButtons;$i > $numComps ;$i--) { # component is there, delete it - my $widget = this->{ui}->columnView->itemAt($i-1)->widget(); + my $widget = $self->columnView->itemAt($i-1)->widget(); $widget -> hide(); - this->{ui}->columnView->removeWidget($widget); + $self->columnView->removeWidget($widget); undef $widget; } } } sub addSharingComp { - my $self = this->{ui}; # Input number of components my $numComps = $self->numComps->value; # count number of exisitng components From 9eb908c795d3950897523a914c96c3bfa6fec36a Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 14 Feb 2018 23:20:14 +0100 Subject: [PATCH 24/87] Fixed some bugs in FUNCTIONS etc. --- src/external/MuSRFitGUI/MuSRFit4.pm | 134 ++++---- src/external/MuSRFitGUI/MuSRFit4.ui | 277 +++++++++++++---- src/external/MuSRFitGUI/Ui_MuSRFit4.pm | 407 +++++++++++++------------ 3 files changed, 497 insertions(+), 321 deletions(-) diff --git a/src/external/MuSRFitGUI/MuSRFit4.pm b/src/external/MuSRFitGUI/MuSRFit4.pm index 3d2d448a..451f92b0 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.pm +++ b/src/external/MuSRFitGUI/MuSRFit4.pm @@ -9,47 +9,50 @@ use QtCore4::isa qw( Qt::MainWindow ); #use QtCore4::isa qw( Qt::Widget ); use QtCore4::debug qw(ambiguous); use QtCore4::slots - fileOpen => [], +# fileOpen => [], fileSave => [], fileChangeDir => [], - filePrint => [], +# filePrint => [], fileExit => [], parametersExport => [], parametersAppend => [], - editUndo => [], - editRedo => [], - editCut => [], - editCopy => [], - editPaste => [], - helpIndex => [], - helpContents => [], +# editUndo => [], +# editRedo => [], +# editCut => [], +# editCopy => [], +# editPaste => [], +# helpIndex => [], +# helpContents => [], helpAbout => [], - CreateAllInput => [], - CallMSRCreate => [], - UpdateMSRFileInitTable => [], - ActivateT0Hists => [], +# CreateAllInput => [], +# UpdateMSRFileInitTable => [], +# ActivateT0Hists => [], ActivateShComp => [], - InitializeTab => [], +# InitializeTab => [], TabChanged => [], GoFit => [], GoPlot => [], ShowMuSRT0 => [], t0Update => [], RunSelectionToggle => [], - fileBrowse => [], +# fileBrowse => [], AppendToFunctions => [], InitializeFunctions => [], addFitType => [], + addSharingComp => [], + runsLineNotEmpy => [], t0UpdateClicked => []; use Ui_MuSRFit4; +use MSR; -my $self = ""; +our $self = ""; +our %All = (); sub NEW { my ( $class, $parent ) = @_; $class->SUPER::NEW($parent); $self = Ui_MuSRFit4->setupUi(this); - my %All=CreateAllInput(); + %All=CreateAllInput(); } # This file is part of MuSRFitGUI. @@ -89,7 +92,6 @@ sub fileOpen() sub fileSave() { - my %All=CreateAllInput(); my $FILENAME=$All{"FILENAME"}.".msr"; my $file=Qt::FileDialog::getSaveFileName( this, @@ -142,7 +144,6 @@ sub parametersExport() { # Exports the fit parameters for a table format file # This works only after a fit call, i.e. a plot call is not sufficient! - my %All=CreateAllInput(); my @RUNS = (); if ($All{"RUNSType"} ) { @RUNS = split( /,/, $All{"RunFiles"}); @@ -164,6 +165,8 @@ sub parametersExport() # If the user gave a filename the copy to it if ($file ne "") { if ($All{"FitAsyType"} eq "Asymmetry") { + # Update All from GUI + %All=CreateAllInput(); # my style my $Text = MSR::ExportParams(\%All); open( DATF,q{>},"$file" ); @@ -186,7 +189,6 @@ sub parametersAppend() { # Appends the fit parameters for a table format file # This works only after a fit call, i.e. a plot call is not sufficient! - my %All=CreateAllInput(); my @RUNS = (); if ($All{"RUNSType"} ) { @RUNS = split( /,/, $All{"RunFiles"}); @@ -208,6 +210,8 @@ sub parametersAppend() # If the user gave a filename the copy to it if ($file ne "") { if ($All{"FitAsyType"} eq "Asymmetry") { + # Update All values from GUI + %All=CreateAllInput(); my $Text = MSR::ExportParams(\%All); open( DATF,q{>>},"$file" ); print DATF $Text; @@ -297,12 +301,8 @@ Copyright 2009-2017 by Zaher Salman sub CreateAllInput() { - my %All=(); - - - -# From RUNS Tab -# Run data file + # From RUNS Tab + # Run data file $All{"RunNumbers"} = $self->runNumbers->text(); $All{"RunFiles"} = $self->runFiles->text(); $All{"BeamLine"} = $self->beamLine->currentText; @@ -581,25 +581,20 @@ sub CreateAllInput() sub CallMSRCreate() { - use MSR; - my %All=CreateAllInput(); - -# Check if the option for checking for existing files is selected + # Check if the option for checking for existing files is selected my $FileExistCheck= $self->fileExistCheck->isChecked(); my $FILENAME=$All{"FILENAME"}.".msr"; my $Answer=0; if ($All{"RunNumbers"} ne "" || $All{"RunFiles"} ne "") { if ( $FileExistCheck==1 ) { if (-e $FILENAME) { -# Warning: MSR file exists -# my $Warning = "Warning: MSR file $FILENAME Already exists!\nIf you continue it will overwriten."; + # Warning: MSR file exists my $Warning = "Warning: MSR file $FILENAME Already exists!\nDo you want to overwrite it?"; -# my $WarningWindow = Qt::MessageBox::information( this, "Warning",$Warning); -# $Answer =1,0 for yes and no + # $Answer =1,0 for yes and no $Answer= Qt::MessageBox::warning( this, "Warning",$Warning, "&No", "&Yes", undef, 1,1); } } else { -# Just overwrite file + # Just overwrite file $Answer=1; } @@ -607,13 +602,13 @@ sub CallMSRCreate() if ( $All{"FitAsyType"} eq "Asymmetry") { if ($All{"RUNSType"}) { my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSRUni(\%All); -# Open output file FILENAME.msr + # Open output file FILENAME.msr open( OUTF,q{>},"$FILENAME" ); print OUTF ("$FullMSRFile"); close(OUTF); } else { my ($Full_T_Block,$Paramcomp_ref,$FullMSRFile)= MSR::CreateMSRUni(\%All); -# Open output file FILENAME.msr + # Open output file FILENAME.msr open( OUTF,q{>},"$FILENAME" ); print OUTF ("$FullMSRFile"); close(OUTF); @@ -632,8 +627,12 @@ sub CallMSRCreate() my $NewRunLine = "runs ".join(" ",(1...$NSpectra)); # Use msr2data to generate global fit MSR file my $RunList = join(" ",@RUNS); - my $cmd = "msr2data \[".$RunList."\] "." _tmpl msr-".$RUNS[0]." global"; - # create the global file + my $StupidName = $RUNS[0]."+global_tmpl.msr"; + my $cmd = "cp $RUNS[0]_tmpl.msr $StupidName"; + #if ($#RUNS != 0) { + # For multiple runs create global file + $cmd = "msr2data \[".$RunList."\] "." _tmpl msr-".$RUNS[0]." global"; + #} print $cmd."\n"; my $pid = open(FTO,"$cmd 2>&1 |"); while () { @@ -641,7 +640,6 @@ sub CallMSRCreate() } close(FTO); # change the stupid name - my $StupidName = $RUNS[0]."+global_tmpl.msr"; # change stupid default runs line $cmd = "cp $StupidName $FILENAME; perl -pi -e 's/runs.*?(?=\n)/$NewRunLine/s' $FILENAME"; $pid = open(FTO,"$cmd 2>&1 |"); @@ -683,7 +681,6 @@ sub CallMSRCreate() sub UpdateMSRFileInitTable() { - my %All=CreateAllInput(); my $FILENAME=$All{"FILENAME"}; my @lines=(); if (-e "$FILENAME.msr") { @@ -755,7 +752,7 @@ sub UpdateMSRFileInitTable() sub ActivateT0Hists() { - my %All=CreateAllInput(); + $All{"LRBF"}=$self->histsLRBF->text; my @Hists = split(/,/, $All{"LRBF"} ); my $HistBox = ""; for (my $iHist=1; $iHist<=4; $iHist++) { @@ -779,7 +776,8 @@ sub ActivateT0Hists() sub ActivateShComp() { - my %All=CreateAllInput(); + # Update All from GUI + %All=CreateAllInput(); my @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); my @Hists = split( /,/, $All{"LRBF"} ); @@ -867,7 +865,8 @@ sub ActivateShComp() sub InitializeTab() { - my %All=CreateAllInput(); + # Update All values from GUI + %All=CreateAllInput(); my $QTable = $self->initParamTable; my $NRows = $QTable->rowCount(); @@ -914,8 +913,7 @@ sub InitializeTab() sub TabChanged() { -# TODO: First check if there are some runs given, otherwise disbale - my %All=CreateAllInput(); + # TODO: First check if there are some runs given, otherwise disbale my $curTab = $self->musrfit_tabs->currentIndex(); if ($curTab >= 2 && $curTab <= 4) { # First make sure we have sharing initialized @@ -923,22 +921,22 @@ sub TabChanged() # Here we need to apply sharing if selected... InitializeTab(); UpdateMSRFileInitTable(); - } elsif ($curTab == 7) { + } elsif ($curTab == 6) { # And also setup T0 and Bg bins ActivateT0Hists(); + } elsif ($curTab == 7) { + # Initialize FUNCTIONS block only if it has not been initialized yet + if ($All{"FunctionsBlock"} eq "" ) { + InitializeFunctions(); + } } - -# Initialize FUNCTIONS block only if it has not been initialized yet - if ($All{"Func_T_Block"} eq "" ) { - InitializeFunctions(); - } } sub GoFit() { # This function should be able to do both plot and fit, check who called you. - my %All=CreateAllInput(); + %All=CreateAllInput(); # Check here is the number of histograms makes sense # other wise give error. my @Hists = split( /,/, $All{"LRBF"} ); @@ -972,7 +970,7 @@ sub GoFit() sub GoPlot() { # This function should be able to do both plot and fit, check who called you. - my %All=CreateAllInput(); + %All=CreateAllInput(); # Check here is the number of histograms makes sense # other wise give error. my @Hists = split( /,/, $All{"LRBF"} ); @@ -999,10 +997,9 @@ sub GoPlot() sub ShowMuSRT0() { -# Open musrt0 to check and adjust t0 , Bg and Data bins - my %All=CreateAllInput(); + # Open musrt0 to check and adjust t0 , Bg and Data bins $self->musrfit_tabs->setCurrentIndex(6); -# Create MSR file and then run musrt0 + # Create MSR file and then run musrt0 my $Answer=CallMSRCreate(); if ($Answer) { @@ -1021,7 +1018,7 @@ sub ShowMuSRT0() sub t0Update() { - my %All = CreateAllInput(); + $All{"LRBF"}=$self->histsLRBF->text; my @Hists = split(/,/, $All{"LRBF"} ); # Get values of t0 and Bg/Data bins if given @@ -1030,9 +1027,6 @@ 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); -# } } $NHist++ } @@ -1063,7 +1057,6 @@ sub RunSelectionToggle() sub fileBrowse() { my $RunFiles=$self->runFiles->text(); - print "Runs:$RunFiles\n"; my $files_ref=Qt::FileDialog::getOpenFileNames( "Data files (*.root *.bin)", "./", @@ -1109,10 +1102,10 @@ sub AppendToFunctions() sub InitializeFunctions() { - my %All=CreateAllInput(); + # Update All values from GUI + %All=CreateAllInput(); my @RUNS = split( /,/, MSR::ExpandRunNumbers($All{"RunNumbers"}) ); my @Hists = split( /,/, $All{"LRBF"} ); - my @FitTypes =(); for (my $i=1;$i<=$All{"numComps"};$i++) { if ( $All{"FitType$i"} ne "None" ) { @@ -1186,8 +1179,8 @@ sub InitializeFunctions() sub t0UpdateClicked() { -# Read MSR file and get new values of t0,Bg and Data - my %All=CreateAllInput(); + # Read MSR file and get new values of t0,Bg and Data + #%All=CreateAllInput(); my $FILENAME=$All{"FILENAME"}; open (MSRF,q{<},"$FILENAME.msr" ); my @lines = ; @@ -1199,7 +1192,6 @@ sub t0UpdateClicked() my @Hists = split(/,/, $All{"LRBF"} ); my $NHist = $#Hists+1; - print "Histograms: $NHist\n"; my $FinHist = 1; # First T0s @@ -1339,11 +1331,17 @@ sub addSharingComp { $compShLabel->setWordWrap( 0 ); $self->horizontalLayout->addWidget( $sharingComps[$i] ); + # Connect slot + Qt::Object::connect($sharingComps[$i], SIGNAL 'currentIndexChanged()' , $self, SLOT 'InitializeFunctions()' ); $compShLabel->setText("FitType$i"); } else { - print "Exist, skip component $i\n"; + print "Exists, skip component $i\n"; } } } +sub runsLineNotEmpy() +{ +} + 1; diff --git a/src/external/MuSRFitGUI/MuSRFit4.ui b/src/external/MuSRFitGUI/MuSRFit4.ui index 832029cf..562ef4a9 100644 --- a/src/external/MuSRFitGUI/MuSRFit4.ui +++ b/src/external/MuSRFitGUI/MuSRFit4.ui @@ -6,8 +6,8 @@ 0 0 - 705 - 587 + 706 + 516 @@ -33,6 +33,12 @@ MuSRFitGUI + + + 0 + 0 + + @@ -57,12 +63,21 @@ 32767 + + + + + + + + + 0 - RUNS + RUNS @@ -70,12 +85,18 @@ 1 1 676 - 461 + 375 + + + 0 + 0 + + RUN Numbers @@ -95,7 +116,7 @@ 0 - 0 + 5 @@ -114,7 +135,7 @@ 16777215 - 25 + 29 @@ -148,7 +169,7 @@ 16777215 - 25 + 29 @@ -198,7 +219,7 @@ 16777215 - 25 + 29 @@ -322,6 +343,9 @@ + + 5 + @@ -358,7 +382,7 @@ 16777215 - 25 + 29 @@ -389,7 +413,7 @@ 16777215 - 25 + 29 @@ -419,13 +443,13 @@ 0 - 25 + 29 16777215 - 25 + 29 @@ -886,13 +910,13 @@ 0 - 25 + 29 16777215 - 25 + 29 @@ -928,7 +952,7 @@ 0 0 276 - 180 + 70 @@ -969,7 +993,7 @@ 0 0 380 - 215 + 109 @@ -978,7 +1002,7 @@ 10 10 355 - 180 + 192 @@ -988,6 +1012,9 @@ 5 + + 5 + @@ -1047,13 +1074,13 @@ 0 - 25 + 29 16777215 - 25 + 29 @@ -1072,13 +1099,13 @@ 0 - 25 + 29 16777215 - 25 + 29 @@ -1097,13 +1124,13 @@ 0 - 25 + 29 16777215 - 25 + 29 @@ -1122,7 +1149,7 @@ 0 - 25 + 29 @@ -1144,7 +1171,7 @@ 0 - 25 + 29 @@ -1166,7 +1193,7 @@ 0 - 25 + 29 @@ -1182,7 +1209,7 @@ 0 - 25 + 29 @@ -1192,7 +1219,7 @@ 0 - 25 + 29 @@ -1202,7 +1229,7 @@ 0 - 25 + 29 @@ -1212,7 +1239,7 @@ 0 - 25 + 29 @@ -1228,7 +1255,7 @@ 0 - 25 + 29 @@ -1250,7 +1277,7 @@ 0 - 25 + 29 @@ -1266,7 +1293,7 @@ 0 - 25 + 29 @@ -1276,7 +1303,7 @@ 0 - 25 + 29 @@ -1292,7 +1319,7 @@ 0 - 25 + 29 @@ -1315,6 +1342,9 @@ QLayout::SetDefaultConstraint + + 5 + @@ -1342,13 +1372,13 @@ 0 - 25 + 29 16777215 - 25 + 29 @@ -1395,13 +1425,13 @@ 0 - 25 + 29 16777215 - 25 + 29 @@ -1439,12 +1469,15 @@ + + 5 + 0 - 25 + 29 @@ -1470,7 +1503,7 @@ 0 - 25 + 29 @@ -1790,6 +1823,9 @@ + + 5 + @@ -2299,12 +2335,27 @@ 5 18 100 - 150 + 171 + + 5 + + + + 0 + 0 + + + + + 0 + 29 + + t0 @@ -2315,6 +2366,18 @@ + + + 0 + 0 + + + + + 0 + 29 + + Bg1 @@ -2325,6 +2388,18 @@ + + + 0 + 0 + + + + + 0 + 29 + + Bg2 @@ -2335,6 +2410,18 @@ + + + 0 + 0 + + + + + 0 + 29 + + Data 1 @@ -2345,6 +2432,18 @@ + + + 0 + 0 + + + + + 0 + 29 + + Data 2 @@ -2380,12 +2479,12 @@ 8 17 75 - 150 + 167 - 0 + 5 0 @@ -2429,12 +2528,12 @@ 8 17 75 - 150 + 167 - 0 + 5 0 @@ -2478,12 +2577,12 @@ 8 17 75 - 150 + 167 - 0 + 5 0 @@ -2527,12 +2626,12 @@ 8 17 75 - 150 + 167 - 0 + 5 0 @@ -3567,7 +3666,7 @@ 0 - 25 + 29 @@ -4085,7 +4184,7 @@ 0 0 - 705 + 706 27 @@ -4585,8 +4684,8 @@ InitializeFunctions() - 686 - 555 + 687 + 496 20 @@ -4601,8 +4700,8 @@ AppendToFunctions() - 686 - 329 + 687 + 299 20 @@ -4617,8 +4716,8 @@ ActivateShComp() - 38 - 200 + 48 + 125 20 @@ -4649,8 +4748,8 @@ t0UpdateClicked() - 687 - 556 + 688 + 497 20 @@ -4665,8 +4764,8 @@ ActivateShComp() - 38 - 200 + 48 + 125 20 @@ -4697,8 +4796,8 @@ t0Update() - 542 - 189 + 532 + 198 603 @@ -4722,6 +4821,54 @@ + + numComps + valueChanged(int) + MuSRFit4 + addSharingComp() + + + 251 + 343 + + + 711 + 372 + + + + + runNumbers + textEdited(QString) + MuSRFit4 + runsLineNotEmpy() + + + 228 + 150 + + + 709 + 181 + + + + + constraintLine + editingFinished() + MuSRFit4 + AppendToFunctions() + + + 461 + 294 + + + 712 + 217 + + + t0UpdateClicked() @@ -4743,5 +4890,7 @@ TabChanged() t0Update() addFitType() + addSharingComp() + runsLineNotEmpy() diff --git a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm index 4cdfc312..99b590d9 100644 --- a/src/external/MuSRFitGUI/Ui_MuSRFit4.pm +++ b/src/external/MuSRFitGUI/Ui_MuSRFit4.pm @@ -5,7 +5,7 @@ ################################################################################# ## Form generated from reading UI file 'MuSRFit4.ui' ## -## Created: Mon Feb 12 13:53:02 2018 +## Created: Wed Feb 14 22:53:49 2018 ## by: Qt User Interface Compiler version 4.8.7 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! @@ -905,7 +905,7 @@ sub setupUi { if ( !defined $muSRFit4->objectName() ) { $muSRFit4->setObjectName( "muSRFit4" ); } - $muSRFit4->resize( 705, 587 ); + $muSRFit4->resize( 706, 516 ); my $sizePolicy = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); $self->{$sizePolicy} = $sizePolicy; $sizePolicy->setHorizontalStretch( 1 ); @@ -991,6 +991,12 @@ sub setupUi { my $widget = Qt::Widget( $muSRFit4 ); $self->{widget} = $widget; $widget->setObjectName( "widget" ); + my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); + $self->{$sizePolicy1} = $sizePolicy1; + $sizePolicy1->setHorizontalStretch( 0 ); + $sizePolicy1->setVerticalStretch( 0 ); + $sizePolicy1->setHeightForWidth( $widget->sizePolicy()->hasHeightForWidth() ); + $widget->setSizePolicy( $sizePolicy1 ); my $gridLayout = Qt::GridLayout( $widget ); $self->{gridLayout} = $gridLayout; $gridLayout->setSpacing( 6 ); @@ -1004,13 +1010,16 @@ sub setupUi { $musrfit_tabs->setSizePolicy( $sizePolicy ); $musrfit_tabs->setMinimumSize( Qt::Size(600, 400) ); $musrfit_tabs->setMaximumSize( Qt::Size(32767, 32767) ); + $musrfit_tabs->setToolTip( "" ); + $musrfit_tabs->setAccessibleName( "" ); + $musrfit_tabs->setAccessibleDescription( "" ); my $runsPage = Qt::Widget( ); $self->{runsPage} = $runsPage; $runsPage->setObjectName( "runsPage" ); my $layoutWidget = Qt::Widget( $runsPage ); $self->{layoutWidget} = $layoutWidget; $layoutWidget->setObjectName( "layoutWidget" ); - $layoutWidget->setGeometry( Qt::Rect(1, 1, 676, 461) ); + $layoutWidget->setGeometry( Qt::Rect(1, 1, 676, 375) ); my $verticalLayout_2 = Qt::VBoxLayout( $layoutWidget ); $self->{verticalLayout_2} = $verticalLayout_2; $verticalLayout_2->setSpacing( 6 ); @@ -1020,6 +1029,12 @@ sub setupUi { my $runsAuto = Qt::GroupBox( $layoutWidget ); $self->{runsAuto} = $runsAuto; $runsAuto->setObjectName( "runsAuto" ); + my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy2} = $sizePolicy2; + $sizePolicy2->setHorizontalStretch( 0 ); + $sizePolicy2->setVerticalStretch( 0 ); + $sizePolicy2->setHeightForWidth( $runsAuto->sizePolicy()->hasHeightForWidth() ); + $runsAuto->setSizePolicy( $sizePolicy2 ); $runsAuto->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); my $gridLayout_3 = Qt::GridLayout( $runsAuto ); $self->{gridLayout_3} = $gridLayout_3; @@ -1028,21 +1043,21 @@ sub setupUi { $gridLayout_3->setObjectName( "gridLayout_3" ); my $runNumbers_2 = Qt::GridLayout( ); $self->{runNumbers_2} = $runNumbers_2; - $runNumbers_2->setSpacing( 0 ); + $runNumbers_2->setSpacing( 5 ); $runNumbers_2->setObjectName( "runNumbers_2" ); $runNumbers_2->setSizeConstraint( Qt::Layout::SetMinimumSize() ); $runNumbers_2->setContentsMargins(-1, 0, -1, 0 ); my $year = Qt::ComboBox( $runsAuto ); $self->{year} = $year; $year->setObjectName( "year" ); - my $sizePolicy1 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); - $self->{$sizePolicy1} = $sizePolicy1; - $sizePolicy1->setHorizontalStretch( 0 ); - $sizePolicy1->setVerticalStretch( 0 ); - $sizePolicy1->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); - $year->setSizePolicy( $sizePolicy1 ); + my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy3} = $sizePolicy3; + $sizePolicy3->setHorizontalStretch( 0 ); + $sizePolicy3->setVerticalStretch( 0 ); + $sizePolicy3->setHeightForWidth( $year->sizePolicy()->hasHeightForWidth() ); + $year->setSizePolicy( $sizePolicy3 ); $year->setMinimumSize( Qt::Size(0, 20) ); - $year->setMaximumSize( Qt::Size(16777215, 25) ); + $year->setMaximumSize( Qt::Size(16777215, 29) ); $year->setEditable( 0 ); $year->setInsertPolicy( Qt::ComboBox::InsertAtTop() ); $year->setAutoCompletion( 1 ); @@ -1053,14 +1068,14 @@ sub setupUi { my $runNumbers = Qt::LineEdit( $runsAuto ); $self->{runNumbers} = $runNumbers; $runNumbers->setObjectName( "runNumbers" ); - my $sizePolicy2 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy2} = $sizePolicy2; - $sizePolicy2->setHorizontalStretch( 0 ); - $sizePolicy2->setVerticalStretch( 0 ); - $sizePolicy2->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); - $runNumbers->setSizePolicy( $sizePolicy2 ); + my $sizePolicy4 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy4} = $sizePolicy4; + $sizePolicy4->setHorizontalStretch( 0 ); + $sizePolicy4->setVerticalStretch( 0 ); + $sizePolicy4->setHeightForWidth( $runNumbers->sizePolicy()->hasHeightForWidth() ); + $runNumbers->setSizePolicy( $sizePolicy4 ); $runNumbers->setMinimumSize( Qt::Size(0, 23) ); - $runNumbers->setMaximumSize( Qt::Size(16777215, 25) ); + $runNumbers->setMaximumSize( Qt::Size(16777215, 29) ); $runNumbers->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); $runNumbers_2->addWidget( $runNumbers, 0, 0, 1, 5 ); @@ -1072,22 +1087,22 @@ sub setupUi { my $beamLine = Qt::ComboBox( $runsAuto ); $self->{beamLine} = $beamLine; $beamLine->setObjectName( "beamLine" ); - $sizePolicy1->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); - $beamLine->setSizePolicy( $sizePolicy1 ); + $sizePolicy3->setHeightForWidth( $beamLine->sizePolicy()->hasHeightForWidth() ); + $beamLine->setSizePolicy( $sizePolicy3 ); $beamLine->setMinimumSize( Qt::Size(0, 20) ); - $beamLine->setMaximumSize( Qt::Size(16777215, 25) ); + $beamLine->setMaximumSize( Qt::Size(16777215, 29) ); $runNumbers_2->addWidget( $beamLine, 1, 2, 1, 1 ); my $yearLabel = Qt::Label( $runsAuto ); $self->{yearLabel} = $yearLabel; $yearLabel->setObjectName( "yearLabel" ); - my $sizePolicy3 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Preferred() ); - $self->{$sizePolicy3} = $sizePolicy3; - $sizePolicy3->setHorizontalStretch( 0 ); - $sizePolicy3->setVerticalStretch( 0 ); - $sizePolicy3->setHeightForWidth( $yearLabel->sizePolicy()->hasHeightForWidth() ); - $yearLabel->setSizePolicy( $sizePolicy3 ); + 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 ); @@ -1096,8 +1111,8 @@ sub setupUi { my $beamLineLabel = Qt::Label( $runsAuto ); $self->{beamLineLabel} = $beamLineLabel; $beamLineLabel->setObjectName( "beamLineLabel" ); - $sizePolicy3->setHeightForWidth( $beamLineLabel->sizePolicy()->hasHeightForWidth() ); - $beamLineLabel->setSizePolicy( $sizePolicy3 ); + $sizePolicy5->setHeightForWidth( $beamLineLabel->sizePolicy()->hasHeightForWidth() ); + $beamLineLabel->setSizePolicy( $sizePolicy5 ); $beamLineLabel->setMinimumSize( Qt::Size(0, 30) ); $beamLineLabel->setMaximumSize( Qt::Size(16777215, 30) ); $beamLineLabel->setWordWrap( 0 ); @@ -1113,12 +1128,12 @@ sub setupUi { my $runsMan = Qt::GroupBox( $layoutWidget ); $self->{runsMan} = $runsMan; $runsMan->setObjectName( "runsMan" ); - my $sizePolicy4 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Maximum() ); - $self->{$sizePolicy4} = $sizePolicy4; - $sizePolicy4->setHorizontalStretch( 1 ); - $sizePolicy4->setVerticalStretch( 1 ); - $sizePolicy4->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); - $runsMan->setSizePolicy( $sizePolicy4 ); + my $sizePolicy6 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Maximum() ); + $self->{$sizePolicy6} = $sizePolicy6; + $sizePolicy6->setHorizontalStretch( 1 ); + $sizePolicy6->setVerticalStretch( 1 ); + $sizePolicy6->setHeightForWidth( $runsMan->sizePolicy()->hasHeightForWidth() ); + $runsMan->setSizePolicy( $sizePolicy6 ); $runsMan->setMinimumSize( Qt::Size(0, 80) ); $runsMan->setBaseSize( Qt::Size(1, 1) ); $runsMan->setAlignment( Qt::AlignLeading()|Qt::AlignLeft()|Qt::AlignTop() ); @@ -1129,7 +1144,7 @@ sub setupUi { $gridLayout_4->setObjectName( "gridLayout_4" ); my $runFiles_2 = Qt::GridLayout( ); $self->{runFiles_2} = $runFiles_2; - $runFiles_2->setSpacing( 6 ); + $runFiles_2->setSpacing( 5 ); $runFiles_2->setObjectName( "runFiles_2" ); my $spacer3 = Qt::SpacerItem( 411, 21, Qt::SizePolicy::Expanding(), Qt::SizePolicy::Minimum() ); @@ -1139,10 +1154,10 @@ sub setupUi { $self->{runFiles} = $runFiles; $runFiles->setObjectName( "runFiles" ); $runFiles->setEnabled( 1 ); - $sizePolicy2->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); - $runFiles->setSizePolicy( $sizePolicy2 ); + $sizePolicy4->setHeightForWidth( $runFiles->sizePolicy()->hasHeightForWidth() ); + $runFiles->setSizePolicy( $sizePolicy4 ); $runFiles->setMinimumSize( Qt::Size(0, 23) ); - $runFiles->setMaximumSize( Qt::Size(16777215, 25) ); + $runFiles->setMaximumSize( Qt::Size(16777215, 29) ); $runFiles_2->addWidget( $runFiles, 0, 0, 1, 2 ); @@ -1150,10 +1165,10 @@ sub setupUi { $self->{browse} = $browse; $browse->setObjectName( "browse" ); $browse->setEnabled( 1 ); - $sizePolicy1->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); - $browse->setSizePolicy( $sizePolicy1 ); + $sizePolicy3->setHeightForWidth( $browse->sizePolicy()->hasHeightForWidth() ); + $browse->setSizePolicy( $sizePolicy3 ); $browse->setMinimumSize( Qt::Size(0, 20) ); - $browse->setMaximumSize( Qt::Size(16777215, 25) ); + $browse->setMaximumSize( Qt::Size(16777215, 29) ); $runFiles_2->addWidget( $browse, 1, 1, 1, 1 ); @@ -1178,8 +1193,8 @@ sub setupUi { my $comp1Label = Qt::Label( $layoutWidget ); $self->{comp1Label} = $comp1Label; $comp1Label->setObjectName( "comp1Label" ); - $comp1Label->setMinimumSize( Qt::Size(0, 25) ); - $comp1Label->setMaximumSize( Qt::Size(16777215, 25) ); + $comp1Label->setMinimumSize( Qt::Size(0, 29) ); + $comp1Label->setMaximumSize( Qt::Size(16777215, 29) ); my $palette = Qt::Palette(); my $brush = Qt::Brush(Qt::Color(0, 0, 0, 255)); $brush->setStyle( Qt::SolidPattern() ); @@ -1260,8 +1275,8 @@ sub setupUi { my $numComps = Qt::SpinBox( $layoutWidget ); $self->{numComps} = $numComps; $numComps->setObjectName( "numComps" ); - $numComps->setMinimumSize( Qt::Size(0, 25) ); - $numComps->setMaximumSize( Qt::Size(16777215, 25) ); + $numComps->setMinimumSize( Qt::Size(0, 29) ); + $numComps->setMaximumSize( Qt::Size(16777215, 29) ); $numComps->setMinimum( 1 ); $horizontalLayout_2->addWidget( $numComps ); @@ -1272,19 +1287,15 @@ sub setupUi { my $theoryFunction = Qt::ScrollArea( $layoutWidget ); $self->{theoryFunction} = $theoryFunction; $theoryFunction->setObjectName( "theoryFunction" ); - my $sizePolicy5 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Expanding() ); - $self->{$sizePolicy5} = $sizePolicy5; - $sizePolicy5->setHorizontalStretch( 0 ); - $sizePolicy5->setVerticalStretch( 0 ); - $sizePolicy5->setHeightForWidth( $theoryFunction->sizePolicy()->hasHeightForWidth() ); - $theoryFunction->setSizePolicy( $sizePolicy5 ); + $sizePolicy1->setHeightForWidth( $theoryFunction->sizePolicy()->hasHeightForWidth() ); + $theoryFunction->setSizePolicy( $sizePolicy1 ); $theoryFunction->setMinimumSize( Qt::Size(280, 0) ); $theoryFunction->setVerticalScrollBarPolicy( Qt::ScrollBarAsNeeded() ); $theoryFunction->setWidgetResizable( 1 ); my $scrollAreaWidgetContents = Qt::Widget( ); $self->{scrollAreaWidgetContents} = $scrollAreaWidgetContents; $scrollAreaWidgetContents->setObjectName( "scrollAreaWidgetContents" ); - $scrollAreaWidgetContents->setGeometry( Qt::Rect(0, 0, 276, 180) ); + $scrollAreaWidgetContents->setGeometry( Qt::Rect(0, 0, 276, 70) ); my $columnView = Qt::VBoxLayout( $scrollAreaWidgetContents ); $self->{columnView} = $columnView; $columnView->setObjectName( "columnView" ); @@ -1299,33 +1310,33 @@ sub setupUi { my $scrollArea = Qt::ScrollArea( $layoutWidget ); $self->{scrollArea} = $scrollArea; $scrollArea->setObjectName( "scrollArea" ); - $sizePolicy5->setHeightForWidth( $scrollArea->sizePolicy()->hasHeightForWidth() ); - $scrollArea->setSizePolicy( $sizePolicy5 ); + $sizePolicy1->setHeightForWidth( $scrollArea->sizePolicy()->hasHeightForWidth() ); + $scrollArea->setSizePolicy( $sizePolicy1 ); $scrollArea->setMinimumSize( Qt::Size(384, 0) ); $scrollArea->setWidgetResizable( 1 ); my $scrollAreaWidgetContents_2 = Qt::Widget( ); $self->{scrollAreaWidgetContents_2} = $scrollAreaWidgetContents_2; $scrollAreaWidgetContents_2->setObjectName( "scrollAreaWidgetContents_2" ); - $scrollAreaWidgetContents_2->setGeometry( Qt::Rect(0, 0, 380, 215) ); + $scrollAreaWidgetContents_2->setGeometry( Qt::Rect(0, 0, 380, 109) ); my $layoutWidget2 = Qt::Widget( $scrollAreaWidgetContents_2 ); $self->{layoutWidget2} = $layoutWidget2; $layoutWidget2->setObjectName( "layoutWidget2" ); - $layoutWidget2->setGeometry( Qt::Rect(10, 10, 355, 180) ); + $layoutWidget2->setGeometry( Qt::Rect(10, 10, 355, 192) ); my $gridLayout_1 = Qt::GridLayout( $layoutWidget2 ); $self->{gridLayout_1} = $gridLayout_1; - $gridLayout_1->setSpacing( 6 ); + $gridLayout_1->setSpacing( 5 ); $gridLayout_1->setMargin( 11 ); $gridLayout_1->setObjectName( "gridLayout_1" ); $gridLayout_1->setContentsMargins(5, 0, 5, 0 ); my $tisLabel = Qt::Label( $layoutWidget2 ); $self->{tisLabel} = $tisLabel; $tisLabel->setObjectName( "tisLabel" ); - my $sizePolicy6 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy6} = $sizePolicy6; - $sizePolicy6->setHorizontalStretch( 0 ); - $sizePolicy6->setVerticalStretch( 0 ); - $sizePolicy6->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); - $tisLabel->setSizePolicy( $sizePolicy6 ); + my $sizePolicy7 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy7} = $sizePolicy7; + $sizePolicy7->setHorizontalStretch( 0 ); + $sizePolicy7->setVerticalStretch( 0 ); + $sizePolicy7->setHeightForWidth( $tisLabel->sizePolicy()->hasHeightForWidth() ); + $tisLabel->setSizePolicy( $sizePolicy7 ); $tisLabel->setWordWrap( 0 ); $gridLayout_1->addWidget( $tisLabel, 0, 0, 1, 1 ); @@ -1333,8 +1344,8 @@ sub setupUi { my $tfsLabel = Qt::Label( $layoutWidget2 ); $self->{tfsLabel} = $tfsLabel; $tfsLabel->setObjectName( "tfsLabel" ); - $sizePolicy6->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); - $tfsLabel->setSizePolicy( $sizePolicy6 ); + $sizePolicy7->setHeightForWidth( $tfsLabel->sizePolicy()->hasHeightForWidth() ); + $tfsLabel->setSizePolicy( $sizePolicy7 ); $tfsLabel->setWordWrap( 0 ); $gridLayout_1->addWidget( $tfsLabel, 0, 1, 1, 1 ); @@ -1342,8 +1353,8 @@ sub setupUi { my $binsLabel = Qt::Label( $layoutWidget2 ); $self->{binsLabel} = $binsLabel; $binsLabel->setObjectName( "binsLabel" ); - $sizePolicy6->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); - $binsLabel->setSizePolicy( $sizePolicy6 ); + $sizePolicy7->setHeightForWidth( $binsLabel->sizePolicy()->hasHeightForWidth() ); + $binsLabel->setSizePolicy( $sizePolicy7 ); $binsLabel->setWordWrap( 0 ); $gridLayout_1->addWidget( $binsLabel, 0, 2, 1, 1 ); @@ -1351,43 +1362,43 @@ sub setupUi { my $tis = Qt::LineEdit( $layoutWidget2 ); $self->{tis} = $tis; $tis->setObjectName( "tis" ); - $sizePolicy2->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); - $tis->setSizePolicy( $sizePolicy2 ); - $tis->setMinimumSize( Qt::Size(0, 25) ); - $tis->setMaximumSize( Qt::Size(16777215, 25) ); + $sizePolicy4->setHeightForWidth( $tis->sizePolicy()->hasHeightForWidth() ); + $tis->setSizePolicy( $sizePolicy4 ); + $tis->setMinimumSize( Qt::Size(0, 29) ); + $tis->setMaximumSize( Qt::Size(16777215, 29) ); $gridLayout_1->addWidget( $tis, 1, 0, 1, 1 ); my $tfs = Qt::LineEdit( $layoutWidget2 ); $self->{tfs} = $tfs; $tfs->setObjectName( "tfs" ); - $sizePolicy2->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); - $tfs->setSizePolicy( $sizePolicy2 ); - $tfs->setMinimumSize( Qt::Size(0, 25) ); - $tfs->setMaximumSize( Qt::Size(16777215, 25) ); + $sizePolicy4->setHeightForWidth( $tfs->sizePolicy()->hasHeightForWidth() ); + $tfs->setSizePolicy( $sizePolicy4 ); + $tfs->setMinimumSize( Qt::Size(0, 29) ); + $tfs->setMaximumSize( Qt::Size(16777215, 29) ); $gridLayout_1->addWidget( $tfs, 1, 1, 1, 1 ); my $bins = Qt::LineEdit( $layoutWidget2 ); $self->{bins} = $bins; $bins->setObjectName( "bins" ); - $sizePolicy2->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); - $bins->setSizePolicy( $sizePolicy2 ); - $bins->setMinimumSize( Qt::Size(0, 25) ); - $bins->setMaximumSize( Qt::Size(16777215, 25) ); + $sizePolicy4->setHeightForWidth( $bins->sizePolicy()->hasHeightForWidth() ); + $bins->setSizePolicy( $sizePolicy4 ); + $bins->setMinimumSize( Qt::Size(0, 29) ); + $bins->setMaximumSize( Qt::Size(16777215, 29) ); $gridLayout_1->addWidget( $bins, 1, 2, 1, 1 ); my $textLabel1_4 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4} = $textLabel1_4; $textLabel1_4->setObjectName( "textLabel1_4" ); - my $sizePolicy7 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Minimum() ); - $self->{$sizePolicy7} = $sizePolicy7; - $sizePolicy7->setHorizontalStretch( 0 ); - $sizePolicy7->setVerticalStretch( 0 ); - $sizePolicy7->setHeightForWidth( $textLabel1_4->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4->setSizePolicy( $sizePolicy7 ); - $textLabel1_4->setMinimumSize( Qt::Size(0, 25) ); + my $sizePolicy8 = Qt::SizePolicy( Qt::SizePolicy::Preferred(), Qt::SizePolicy::Minimum() ); + $self->{$sizePolicy8} = $sizePolicy8; + $sizePolicy8->setHorizontalStretch( 0 ); + $sizePolicy8->setVerticalStretch( 0 ); + $sizePolicy8->setHeightForWidth( $textLabel1_4->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4->setSizePolicy( $sizePolicy8 ); + $textLabel1_4->setMinimumSize( Qt::Size(0, 29) ); $textLabel1_4->setWordWrap( 0 ); $gridLayout_1->addWidget( $textLabel1_4, 2, 0, 1, 1 ); @@ -1395,9 +1406,9 @@ sub setupUi { my $textLabel1_8 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_8} = $textLabel1_8; $textLabel1_8->setObjectName( "textLabel1_8" ); - $sizePolicy7->setHeightForWidth( $textLabel1_8->sizePolicy()->hasHeightForWidth() ); - $textLabel1_8->setSizePolicy( $sizePolicy7 ); - $textLabel1_8->setMinimumSize( Qt::Size(0, 25) ); + $sizePolicy8->setHeightForWidth( $textLabel1_8->sizePolicy()->hasHeightForWidth() ); + $textLabel1_8->setSizePolicy( $sizePolicy8 ); + $textLabel1_8->setMinimumSize( Qt::Size(0, 29) ); $textLabel1_8->setWordWrap( 0 ); $gridLayout_1->addWidget( $textLabel1_8, 2, 1, 1, 1 ); @@ -1405,9 +1416,9 @@ sub setupUi { my $textLabel1_4_2_2 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_2_2} = $textLabel1_4_2_2; $textLabel1_4_2_2->setObjectName( "textLabel1_4_2_2" ); - $sizePolicy7->setHeightForWidth( $textLabel1_4_2_2->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4_2_2->setSizePolicy( $sizePolicy7 ); - $textLabel1_4_2_2->setMinimumSize( Qt::Size(0, 25) ); + $sizePolicy8->setHeightForWidth( $textLabel1_4_2_2->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_2_2->setSizePolicy( $sizePolicy8 ); + $textLabel1_4_2_2->setMinimumSize( Qt::Size(0, 29) ); $textLabel1_4_2_2->setWordWrap( 0 ); $gridLayout_1->addWidget( $textLabel1_4_2_2, 2, 2, 1, 1 ); @@ -1415,28 +1426,28 @@ sub setupUi { my $xi = Qt::LineEdit( $layoutWidget2 ); $self->{xi} = $xi; $xi->setObjectName( "xi" ); - $xi->setMinimumSize( Qt::Size(0, 25) ); + $xi->setMinimumSize( Qt::Size(0, 29) ); $gridLayout_1->addWidget( $xi, 3, 0, 1, 1 ); my $xf = Qt::LineEdit( $layoutWidget2 ); $self->{xf} = $xf; $xf->setObjectName( "xf" ); - $xf->setMinimumSize( Qt::Size(0, 25) ); + $xf->setMinimumSize( Qt::Size(0, 29) ); $gridLayout_1->addWidget( $xf, 3, 1, 1, 1 ); my $viewBin = Qt::LineEdit( $layoutWidget2 ); $self->{viewBin} = $viewBin; $viewBin->setObjectName( "viewBin" ); - $viewBin->setMinimumSize( Qt::Size(0, 25) ); + $viewBin->setMinimumSize( Qt::Size(0, 29) ); $gridLayout_1->addWidget( $viewBin, 3, 2, 1, 1 ); my $textLabel1_4_2 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_2} = $textLabel1_4_2; $textLabel1_4_2->setObjectName( "textLabel1_4_2" ); - $textLabel1_4_2->setMinimumSize( Qt::Size(0, 25) ); + $textLabel1_4_2->setMinimumSize( Qt::Size(0, 29) ); $textLabel1_4_2->setWordWrap( 0 ); $gridLayout_1->addWidget( $textLabel1_4_2, 4, 0, 1, 1 ); @@ -1444,7 +1455,7 @@ sub setupUi { my $textLabel1_4_3 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_3} = $textLabel1_4_3; $textLabel1_4_3->setObjectName( "textLabel1_4_3" ); - $textLabel1_4_3->setMinimumSize( Qt::Size(0, 25) ); + $textLabel1_4_3->setMinimumSize( Qt::Size(0, 29) ); $textLabel1_4_3->setWordWrap( 0 ); $gridLayout_1->addWidget( $textLabel1_4_3, 4, 1, 1, 1 ); @@ -1452,9 +1463,9 @@ sub setupUi { my $textLabel1_4_4 = Qt::Label( $layoutWidget2 ); $self->{textLabel1_4_4} = $textLabel1_4_4; $textLabel1_4_4->setObjectName( "textLabel1_4_4" ); - $sizePolicy2->setHeightForWidth( $textLabel1_4_4->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4_4->setSizePolicy( $sizePolicy2 ); - $textLabel1_4_4->setMinimumSize( Qt::Size(0, 25) ); + $sizePolicy4->setHeightForWidth( $textLabel1_4_4->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_4->setSizePolicy( $sizePolicy4 ); + $textLabel1_4_4->setMinimumSize( Qt::Size(0, 29) ); $textLabel1_4_4->setWordWrap( 0 ); $gridLayout_1->addWidget( $textLabel1_4_4, 4, 2, 1, 1 ); @@ -1462,23 +1473,23 @@ sub setupUi { my $yi = Qt::LineEdit( $layoutWidget2 ); $self->{yi} = $yi; $yi->setObjectName( "yi" ); - $yi->setMinimumSize( Qt::Size(0, 25) ); + $yi->setMinimumSize( Qt::Size(0, 29) ); $gridLayout_1->addWidget( $yi, 5, 0, 1, 1 ); my $yf = Qt::LineEdit( $layoutWidget2 ); $self->{yf} = $yf; $yf->setObjectName( "yf" ); - $yf->setMinimumSize( Qt::Size(0, 25) ); + $yf->setMinimumSize( Qt::Size(0, 29) ); $gridLayout_1->addWidget( $yf, 5, 1, 1, 1 ); my $ltc = Qt::CheckBox( $layoutWidget2 ); $self->{ltc} = $ltc; $ltc->setObjectName( "ltc" ); - $sizePolicy2->setHeightForWidth( $ltc->sizePolicy()->hasHeightForWidth() ); - $ltc->setSizePolicy( $sizePolicy2 ); - $ltc->setMinimumSize( Qt::Size(0, 25) ); + $sizePolicy4->setHeightForWidth( $ltc->sizePolicy()->hasHeightForWidth() ); + $ltc->setSizePolicy( $sizePolicy4 ); + $ltc->setMinimumSize( Qt::Size(0, 29) ); $ltc->setChecked( 1 ); $gridLayout_1->addWidget( $ltc, 5, 2, 1, 1 ); @@ -1492,14 +1503,14 @@ sub setupUi { my $gridLayout_6 = Qt::GridLayout( ); $self->{gridLayout_6} = $gridLayout_6; - $gridLayout_6->setSpacing( 6 ); + $gridLayout_6->setSpacing( 5 ); $gridLayout_6->setObjectName( "gridLayout_6" ); $gridLayout_6->setSizeConstraint( Qt::Layout::SetDefaultConstraint() ); my $fitAsyTypeLabel = Qt::Label( $layoutWidget ); $self->{fitAsyTypeLabel} = $fitAsyTypeLabel; $fitAsyTypeLabel->setObjectName( "fitAsyTypeLabel" ); - $sizePolicy6->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); - $fitAsyTypeLabel->setSizePolicy( $sizePolicy6 ); + $sizePolicy7->setHeightForWidth( $fitAsyTypeLabel->sizePolicy()->hasHeightForWidth() ); + $fitAsyTypeLabel->setSizePolicy( $sizePolicy7 ); $fitAsyTypeLabel->setWordWrap( 0 ); $gridLayout_6->addWidget( $fitAsyTypeLabel, 0, 0, 1, 1 ); @@ -1507,18 +1518,18 @@ sub setupUi { my $fitAsyType = Qt::ComboBox( $layoutWidget ); $self->{fitAsyType} = $fitAsyType; $fitAsyType->setObjectName( "fitAsyType" ); - $sizePolicy6->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); - $fitAsyType->setSizePolicy( $sizePolicy6 ); - $fitAsyType->setMinimumSize( Qt::Size(0, 25) ); - $fitAsyType->setMaximumSize( Qt::Size(16777215, 25) ); + $sizePolicy7->setHeightForWidth( $fitAsyType->sizePolicy()->hasHeightForWidth() ); + $fitAsyType->setSizePolicy( $sizePolicy7 ); + $fitAsyType->setMinimumSize( Qt::Size(0, 29) ); + $fitAsyType->setMaximumSize( Qt::Size(16777215, 29) ); $gridLayout_6->addWidget( $fitAsyType, 0, 1, 1, 1 ); my $histsLRBFLabel = Qt::Label( $layoutWidget ); $self->{histsLRBFLabel} = $histsLRBFLabel; $histsLRBFLabel->setObjectName( "histsLRBFLabel" ); - $sizePolicy6->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); - $histsLRBFLabel->setSizePolicy( $sizePolicy6 ); + $sizePolicy7->setHeightForWidth( $histsLRBFLabel->sizePolicy()->hasHeightForWidth() ); + $histsLRBFLabel->setSizePolicy( $sizePolicy7 ); $histsLRBFLabel->setWordWrap( 0 ); $gridLayout_6->addWidget( $histsLRBFLabel, 0, 2, 1, 1 ); @@ -1526,10 +1537,10 @@ sub setupUi { my $histsLRBF = Qt::LineEdit( $layoutWidget ); $self->{histsLRBF} = $histsLRBF; $histsLRBF->setObjectName( "histsLRBF" ); - $sizePolicy6->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); - $histsLRBF->setSizePolicy( $sizePolicy6 ); - $histsLRBF->setMinimumSize( Qt::Size(0, 25) ); - $histsLRBF->setMaximumSize( Qt::Size(16777215, 25) ); + $sizePolicy7->setHeightForWidth( $histsLRBF->sizePolicy()->hasHeightForWidth() ); + $histsLRBF->setSizePolicy( $sizePolicy7 ); + $histsLRBF->setMinimumSize( Qt::Size(0, 29) ); + $histsLRBF->setMaximumSize( Qt::Size(16777215, 29) ); $gridLayout_6->addWidget( $histsLRBF, 0, 3, 1, 1 ); @@ -1555,12 +1566,12 @@ sub setupUi { $fitGrid->setObjectName( "fitGrid" ); my $fitLayout = Qt::GridLayout( ); $self->{fitLayout} = $fitLayout; - $fitLayout->setSpacing( 6 ); + $fitLayout->setSpacing( 5 ); $fitLayout->setObjectName( "fitLayout" ); my $errorCalc = Qt::ComboBox( $fittingPage ); $self->{errorCalc} = $errorCalc; $errorCalc->setObjectName( "errorCalc" ); - $errorCalc->setMinimumSize( Qt::Size(0, 25) ); + $errorCalc->setMinimumSize( Qt::Size(0, 29) ); $errorCalc->setMaximumSize( Qt::Size(150, 16777215) ); $fitLayout->addWidget( $errorCalc, 1, 1, 1, 1 ); @@ -1568,7 +1579,7 @@ sub setupUi { my $minimization = Qt::ComboBox( $fittingPage ); $self->{minimization} = $minimization; $minimization->setObjectName( "minimization" ); - $minimization->setMinimumSize( Qt::Size(0, 25) ); + $minimization->setMinimumSize( Qt::Size(0, 29) ); $minimization->setMaximumSize( Qt::Size(150, 16777215) ); $fitLayout->addWidget( $minimization, 0, 1, 1, 1 ); @@ -1613,8 +1624,8 @@ sub setupUi { my $buttonGroupSharing = Qt::GroupBox( $sharingPage ); $self->{buttonGroupSharing} = $buttonGroupSharing; $buttonGroupSharing->setObjectName( "buttonGroupSharing" ); - $sizePolicy5->setHeightForWidth( $buttonGroupSharing->sizePolicy()->hasHeightForWidth() ); - $buttonGroupSharing->setSizePolicy( $sizePolicy5 ); + $sizePolicy1->setHeightForWidth( $buttonGroupSharing->sizePolicy()->hasHeightForWidth() ); + $buttonGroupSharing->setSizePolicy( $sizePolicy1 ); $buttonGroupSharing->setAlignment( Qt::AlignLeading() ); $buttonGroupSharing->setCheckable( 1 ); $buttonGroupSharing->setChecked( 0 ); @@ -1631,12 +1642,12 @@ sub setupUi { $self->{sharingComp1} = $sharingComp1; $sharingComp1->setObjectName( "sharingComp1" ); $sharingComp1->setEnabled( 0 ); - my $sizePolicy8 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); - $self->{$sizePolicy8} = $sizePolicy8; - $sizePolicy8->setHorizontalStretch( 0 ); - $sizePolicy8->setVerticalStretch( 0 ); - $sizePolicy8->setHeightForWidth( $sharingComp1->sizePolicy()->hasHeightForWidth() ); - $sharingComp1->setSizePolicy( $sizePolicy8 ); + my $sizePolicy9 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::MinimumExpanding() ); + $self->{$sizePolicy9} = $sizePolicy9; + $sizePolicy9->setHorizontalStretch( 0 ); + $sizePolicy9->setVerticalStretch( 0 ); + $sizePolicy9->setHeightForWidth( $sharingComp1->sizePolicy()->hasHeightForWidth() ); + $sharingComp1->setSizePolicy( $sizePolicy9 ); $sharingComp1->setAlignment( Qt::AlignLeading() ); my $layout14 = Qt::Widget( $sharingComp1 ); $self->{layout14} = $layout14; @@ -1760,8 +1771,8 @@ sub setupUi { my $groupTitle = Qt::GroupBox( $msrPage ); $self->{groupTitle} = $groupTitle; $groupTitle->setObjectName( "groupTitle" ); - $sizePolicy2->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); - $groupTitle->setSizePolicy( $sizePolicy2 ); + $sizePolicy4->setHeightForWidth( $groupTitle->sizePolicy()->hasHeightForWidth() ); + $groupTitle->setSizePolicy( $sizePolicy4 ); my $gridLayout5 = Qt::GridLayout( $groupTitle ); $self->{gridLayout5} = $gridLayout5; $gridLayout5->setSpacing( 6 ); @@ -1769,13 +1780,13 @@ sub setupUi { $gridLayout5->setObjectName( "gridLayout5" ); my $vboxLayout1 = Qt::VBoxLayout( ); $self->{vboxLayout1} = $vboxLayout1; - $vboxLayout1->setSpacing( 6 ); + $vboxLayout1->setSpacing( 5 ); $vboxLayout1->setObjectName( "vboxLayout1" ); my $titleLabel = Qt::Label( $groupTitle ); $self->{titleLabel} = $titleLabel; $titleLabel->setObjectName( "titleLabel" ); - $sizePolicy3->setHeightForWidth( $titleLabel->sizePolicy()->hasHeightForWidth() ); - $titleLabel->setSizePolicy( $sizePolicy3 ); + $sizePolicy5->setHeightForWidth( $titleLabel->sizePolicy()->hasHeightForWidth() ); + $titleLabel->setSizePolicy( $sizePolicy5 ); $titleLabel->setWordWrap( 0 ); $vboxLayout1->addWidget( $titleLabel ); @@ -1783,12 +1794,12 @@ sub setupUi { my $title = Qt::LineEdit( $groupTitle ); $self->{title} = $title; $title->setObjectName( "title" ); - my $sizePolicy9 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy9} = $sizePolicy9; - $sizePolicy9->setHorizontalStretch( 1 ); - $sizePolicy9->setVerticalStretch( 1 ); - $sizePolicy9->setHeightForWidth( $title->sizePolicy()->hasHeightForWidth() ); - $title->setSizePolicy( $sizePolicy9 ); + my $sizePolicy10 = Qt::SizePolicy( Qt::SizePolicy::Expanding(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy10} = $sizePolicy10; + $sizePolicy10->setHorizontalStretch( 1 ); + $sizePolicy10->setVerticalStretch( 1 ); + $sizePolicy10->setHeightForWidth( $title->sizePolicy()->hasHeightForWidth() ); + $title->setSizePolicy( $sizePolicy10 ); $vboxLayout1->addWidget( $title ); @@ -1806,8 +1817,8 @@ sub setupUi { my $fileName = Qt::LineEdit( $groupTitle ); $self->{fileName} = $fileName; $fileName->setObjectName( "fileName" ); - $sizePolicy2->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); - $fileName->setSizePolicy( $sizePolicy2 ); + $sizePolicy4->setHeightForWidth( $fileName->sizePolicy()->hasHeightForWidth() ); + $fileName->setSizePolicy( $sizePolicy4 ); $hboxLayout->addWidget( $fileName ); @@ -1842,8 +1853,8 @@ sub setupUi { my $fourierBox = Qt::GroupBox( $fourierPage ); $self->{fourierBox} = $fourierBox; $fourierBox->setObjectName( "fourierBox" ); - $sizePolicy5->setHeightForWidth( $fourierBox->sizePolicy()->hasHeightForWidth() ); - $fourierBox->setSizePolicy( $sizePolicy5 ); + $sizePolicy1->setHeightForWidth( $fourierBox->sizePolicy()->hasHeightForWidth() ); + $fourierBox->setSizePolicy( $sizePolicy1 ); my $layout34 = Qt::Widget( $fourierBox ); $self->{layout34} = $layout34; $layout34->setObjectName( "layout34" ); @@ -1857,28 +1868,28 @@ sub setupUi { my $frqMax = Qt::LineEdit( $layout34 ); $self->{frqMax} = $frqMax; $frqMax->setObjectName( "frqMax" ); - $sizePolicy3->setHeightForWidth( $frqMax->sizePolicy()->hasHeightForWidth() ); - $frqMax->setSizePolicy( $sizePolicy3 ); + $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 $sizePolicy10 = Qt::SizePolicy( Qt::SizePolicy::Ignored(), Qt::SizePolicy::Preferred() ); - $self->{$sizePolicy10} = $sizePolicy10; - $sizePolicy10->setHorizontalStretch( 0 ); - $sizePolicy10->setVerticalStretch( 0 ); - $sizePolicy10->setHeightForWidth( $funits->sizePolicy()->hasHeightForWidth() ); - $funits->setSizePolicy( $sizePolicy10 ); + my $sizePolicy11 = Qt::SizePolicy( Qt::SizePolicy::Ignored(), Qt::SizePolicy::Preferred() ); + $self->{$sizePolicy11} = $sizePolicy11; + $sizePolicy11->setHorizontalStretch( 0 ); + $sizePolicy11->setVerticalStretch( 0 ); + $sizePolicy11->setHeightForWidth( $funits->sizePolicy()->hasHeightForWidth() ); + $funits->setSizePolicy( $sizePolicy11 ); $gridLayout7->addWidget( $funits, 0, 2, 1, 1 ); my $fplot = Qt::ComboBox( $layout34 ); $self->{fplot} = $fplot; $fplot->setObjectName( "fplot" ); - $sizePolicy3->setHeightForWidth( $fplot->sizePolicy()->hasHeightForWidth() ); - $fplot->setSizePolicy( $sizePolicy3 ); + $sizePolicy5->setHeightForWidth( $fplot->sizePolicy()->hasHeightForWidth() ); + $fplot->setSizePolicy( $sizePolicy5 ); $gridLayout7->addWidget( $fplot, 2, 2, 1, 1 ); @@ -1913,8 +1924,8 @@ sub setupUi { my $fapodization = Qt::ComboBox( $layout34 ); $self->{fapodization} = $fapodization; $fapodization->setObjectName( "fapodization" ); - $sizePolicy3->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); - $fapodization->setSizePolicy( $sizePolicy3 ); + $sizePolicy5->setHeightForWidth( $fapodization->sizePolicy()->hasHeightForWidth() ); + $fapodization->setSizePolicy( $sizePolicy5 ); $gridLayout7->addWidget( $fapodization, 1, 2, 1, 1 ); @@ -1949,8 +1960,8 @@ sub setupUi { my $fphase = Qt::LineEdit( $layout34 ); $self->{fphase} = $fphase; $fphase->setObjectName( "fphase" ); - $sizePolicy3->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); - $fphase->setSizePolicy( $sizePolicy3 ); + $sizePolicy5->setHeightForWidth( $fphase->sizePolicy()->hasHeightForWidth() ); + $fphase->setSizePolicy( $sizePolicy5 ); $gridLayout7->addWidget( $fphase, 1, 4, 1, 1 ); @@ -1971,8 +1982,8 @@ sub setupUi { my $frqMin = Qt::LineEdit( $layout34 ); $self->{frqMin} = $frqMin; $frqMin->setObjectName( "frqMin" ); - $sizePolicy3->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); - $frqMin->setSizePolicy( $sizePolicy3 ); + $sizePolicy5->setHeightForWidth( $frqMin->sizePolicy()->hasHeightForWidth() ); + $frqMin->setSizePolicy( $sizePolicy5 ); $gridLayout7->addWidget( $frqMin, 0, 4, 1, 1 ); @@ -1995,8 +2006,8 @@ sub setupUi { my $rrfBox = Qt::GroupBox( $fourierPage ); $self->{rrfBox} = $rrfBox; $rrfBox->setObjectName( "rrfBox" ); - $sizePolicy5->setHeightForWidth( $rrfBox->sizePolicy()->hasHeightForWidth() ); - $rrfBox->setSizePolicy( $sizePolicy5 ); + $sizePolicy1->setHeightForWidth( $rrfBox->sizePolicy()->hasHeightForWidth() ); + $rrfBox->setSizePolicy( $sizePolicy1 ); my $layout35 = Qt::Widget( $rrfBox ); $self->{layout35} = $layout35; $layout35->setObjectName( "layout35" ); @@ -2091,16 +2102,19 @@ sub setupUi { my $layout16_2 = Qt::Widget( $groupHist0 ); $self->{layout16_2} = $layout16_2; $layout16_2->setObjectName( "layout16_2" ); - $layout16_2->setGeometry( Qt::Rect(5, 18, 100, 150) ); + $layout16_2->setGeometry( Qt::Rect(5, 18, 100, 171) ); my $vboxLayout2 = Qt::VBoxLayout( $layout16_2 ); $self->{vboxLayout2} = $vboxLayout2; - $vboxLayout2->setSpacing( 6 ); + $vboxLayout2->setSpacing( 5 ); $vboxLayout2->setMargin( 11 ); $vboxLayout2->setObjectName( "vboxLayout2" ); $vboxLayout2->setContentsMargins(0, 0, 0, 0 ); my $textLabel2 = Qt::Label( $layout16_2 ); $self->{textLabel2} = $textLabel2; $textLabel2->setObjectName( "textLabel2" ); + $sizePolicy7->setHeightForWidth( $textLabel2->sizePolicy()->hasHeightForWidth() ); + $textLabel2->setSizePolicy( $sizePolicy7 ); + $textLabel2->setMinimumSize( Qt::Size(0, 29) ); $textLabel2->setWordWrap( 0 ); $vboxLayout2->addWidget( $textLabel2 ); @@ -2108,6 +2122,9 @@ sub setupUi { my $textLabel2_2_2_3 = Qt::Label( $layout16_2 ); $self->{textLabel2_2_2_3} = $textLabel2_2_2_3; $textLabel2_2_2_3->setObjectName( "textLabel2_2_2_3" ); + $sizePolicy7->setHeightForWidth( $textLabel2_2_2_3->sizePolicy()->hasHeightForWidth() ); + $textLabel2_2_2_3->setSizePolicy( $sizePolicy7 ); + $textLabel2_2_2_3->setMinimumSize( Qt::Size(0, 29) ); $textLabel2_2_2_3->setWordWrap( 0 ); $vboxLayout2->addWidget( $textLabel2_2_2_3 ); @@ -2115,6 +2132,9 @@ sub setupUi { my $textLabel2_2_2 = Qt::Label( $layout16_2 ); $self->{textLabel2_2_2} = $textLabel2_2_2; $textLabel2_2_2->setObjectName( "textLabel2_2_2" ); + $sizePolicy7->setHeightForWidth( $textLabel2_2_2->sizePolicy()->hasHeightForWidth() ); + $textLabel2_2_2->setSizePolicy( $sizePolicy7 ); + $textLabel2_2_2->setMinimumSize( Qt::Size(0, 29) ); $textLabel2_2_2->setWordWrap( 0 ); $vboxLayout2->addWidget( $textLabel2_2_2 ); @@ -2122,6 +2142,9 @@ sub setupUi { my $textLabel2_2_2_2 = Qt::Label( $layout16_2 ); $self->{textLabel2_2_2_2} = $textLabel2_2_2_2; $textLabel2_2_2_2->setObjectName( "textLabel2_2_2_2" ); + $sizePolicy7->setHeightForWidth( $textLabel2_2_2_2->sizePolicy()->hasHeightForWidth() ); + $textLabel2_2_2_2->setSizePolicy( $sizePolicy7 ); + $textLabel2_2_2_2->setMinimumSize( Qt::Size(0, 29) ); $textLabel2_2_2_2->setWordWrap( 0 ); $vboxLayout2->addWidget( $textLabel2_2_2_2 ); @@ -2129,6 +2152,9 @@ sub setupUi { my $textLabel2_2_2_2_2 = Qt::Label( $layout16_2 ); $self->{textLabel2_2_2_2_2} = $textLabel2_2_2_2_2; $textLabel2_2_2_2_2->setObjectName( "textLabel2_2_2_2_2" ); + $sizePolicy7->setHeightForWidth( $textLabel2_2_2_2_2->sizePolicy()->hasHeightForWidth() ); + $textLabel2_2_2_2_2->setSizePolicy( $sizePolicy7 ); + $textLabel2_2_2_2_2->setMinimumSize( Qt::Size(0, 29) ); $textLabel2_2_2_2_2->setWordWrap( 0 ); $vboxLayout2->addWidget( $textLabel2_2_2_2_2 ); @@ -2145,10 +2171,10 @@ sub setupUi { my $layout18 = Qt::Widget( $groupHist1 ); $self->{layout18} = $layout18; $layout18->setObjectName( "layout18" ); - $layout18->setGeometry( Qt::Rect(8, 17, 75, 150) ); + $layout18->setGeometry( Qt::Rect(8, 17, 75, 167) ); my $vboxLayout3 = Qt::VBoxLayout( $layout18 ); $self->{vboxLayout3} = $vboxLayout3; - $vboxLayout3->setSpacing( 0 ); + $vboxLayout3->setSpacing( 5 ); $vboxLayout3->setMargin( 0 ); $vboxLayout3->setObjectName( "vboxLayout3" ); $vboxLayout3->setContentsMargins(0, 0, 0, 0 ); @@ -2194,10 +2220,10 @@ sub setupUi { my $layout18_2 = Qt::Widget( $groupHist2 ); $self->{layout18_2} = $layout18_2; $layout18_2->setObjectName( "layout18_2" ); - $layout18_2->setGeometry( Qt::Rect(8, 17, 75, 150) ); + $layout18_2->setGeometry( Qt::Rect(8, 17, 75, 167) ); my $vboxLayout4 = Qt::VBoxLayout( $layout18_2 ); $self->{vboxLayout4} = $vboxLayout4; - $vboxLayout4->setSpacing( 0 ); + $vboxLayout4->setSpacing( 5 ); $vboxLayout4->setMargin( 0 ); $vboxLayout4->setObjectName( "vboxLayout4" ); $vboxLayout4->setContentsMargins(0, 0, 0, 0 ); @@ -2243,10 +2269,10 @@ sub setupUi { my $layout18_3 = Qt::Widget( $groupHist3 ); $self->{layout18_3} = $layout18_3; $layout18_3->setObjectName( "layout18_3" ); - $layout18_3->setGeometry( Qt::Rect(8, 17, 75, 150) ); + $layout18_3->setGeometry( Qt::Rect(8, 17, 75, 167) ); my $vboxLayout5 = Qt::VBoxLayout( $layout18_3 ); $self->{vboxLayout5} = $vboxLayout5; - $vboxLayout5->setSpacing( 0 ); + $vboxLayout5->setSpacing( 5 ); $vboxLayout5->setMargin( 0 ); $vboxLayout5->setObjectName( "vboxLayout5" ); $vboxLayout5->setContentsMargins(0, 0, 0, 0 ); @@ -2292,10 +2318,10 @@ sub setupUi { my $layout18_4 = Qt::Widget( $groupHist4 ); $self->{layout18_4} = $layout18_4; $layout18_4->setObjectName( "layout18_4" ); - $layout18_4->setGeometry( Qt::Rect(8, 17, 75, 150) ); + $layout18_4->setGeometry( Qt::Rect(8, 17, 75, 167) ); my $vboxLayout6 = Qt::VBoxLayout( $layout18_4 ); $self->{vboxLayout6} = $vboxLayout6; - $vboxLayout6->setSpacing( 0 ); + $vboxLayout6->setSpacing( 5 ); $vboxLayout6->setMargin( 0 ); $vboxLayout6->setObjectName( "vboxLayout6" ); $vboxLayout6->setContentsMargins(0, 0, 0, 0 ); @@ -2347,12 +2373,12 @@ sub setupUi { $self->{t0Update} = $t0Update; $t0Update->setObjectName( "t0Update" ); $t0Update->setEnabled( 0 ); - my $sizePolicy11 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Fixed() ); - $self->{$sizePolicy11} = $sizePolicy11; - $sizePolicy11->setHorizontalStretch( 0 ); - $sizePolicy11->setVerticalStretch( 0 ); - $sizePolicy11->setHeightForWidth( $t0Update->sizePolicy()->hasHeightForWidth() ); - $t0Update->setSizePolicy( $sizePolicy11 ); + my $sizePolicy12 = Qt::SizePolicy( Qt::SizePolicy::Fixed(), Qt::SizePolicy::Fixed() ); + $self->{$sizePolicy12} = $sizePolicy12; + $sizePolicy12->setHorizontalStretch( 0 ); + $sizePolicy12->setVerticalStretch( 0 ); + $sizePolicy12->setHeightForWidth( $t0Update->sizePolicy()->hasHeightForWidth() ); + $t0Update->setSizePolicy( $sizePolicy12 ); $hboxLayout2->addWidget( $t0Update ); @@ -2514,16 +2540,16 @@ sub setupUi { my $cParamsCombo = Qt::ComboBox( $tabPage ); $self->{cParamsCombo} = $cParamsCombo; $cParamsCombo->setObjectName( "cParamsCombo" ); - $sizePolicy11->setHeightForWidth( $cParamsCombo->sizePolicy()->hasHeightForWidth() ); - $cParamsCombo->setSizePolicy( $sizePolicy11 ); + $sizePolicy12->setHeightForWidth( $cParamsCombo->sizePolicy()->hasHeightForWidth() ); + $cParamsCombo->setSizePolicy( $sizePolicy12 ); $hboxLayout3->addWidget( $cParamsCombo ); my $textLabel1_4_6 = Qt::Label( $tabPage ); $self->{textLabel1_4_6} = $textLabel1_4_6; $textLabel1_4_6->setObjectName( "textLabel1_4_6" ); - $sizePolicy11->setHeightForWidth( $textLabel1_4_6->sizePolicy()->hasHeightForWidth() ); - $textLabel1_4_6->setSizePolicy( $sizePolicy11 ); + $sizePolicy12->setHeightForWidth( $textLabel1_4_6->sizePolicy()->hasHeightForWidth() ); + $textLabel1_4_6->setSizePolicy( $sizePolicy12 ); $textLabel1_4_6->setWordWrap( 0 ); $hboxLayout3->addWidget( $textLabel1_4_6 ); @@ -2531,17 +2557,17 @@ sub setupUi { my $constraintLine = Qt::LineEdit( $tabPage ); $self->{constraintLine} = $constraintLine; $constraintLine->setObjectName( "constraintLine" ); - $sizePolicy2->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); - $constraintLine->setSizePolicy( $sizePolicy2 ); - $constraintLine->setMinimumSize( Qt::Size(0, 25) ); + $sizePolicy4->setHeightForWidth( $constraintLine->sizePolicy()->hasHeightForWidth() ); + $constraintLine->setSizePolicy( $sizePolicy4 ); + $constraintLine->setMinimumSize( Qt::Size(0, 29) ); $hboxLayout3->addWidget( $constraintLine ); my $addConstraint = Qt::PushButton( $tabPage ); $self->{addConstraint} = $addConstraint; $addConstraint->setObjectName( "addConstraint" ); - $sizePolicy11->setHeightForWidth( $addConstraint->sizePolicy()->hasHeightForWidth() ); - $addConstraint->setSizePolicy( $sizePolicy11 ); + $sizePolicy12->setHeightForWidth( $addConstraint->sizePolicy()->hasHeightForWidth() ); + $addConstraint->setSizePolicy( $sizePolicy12 ); $hboxLayout3->addWidget( $addConstraint ); @@ -2644,7 +2670,7 @@ sub setupUi { $self->{menuBar} = $menuBar; $menuBar->setObjectName( "menuBar" ); $menuBar->setEnabled( 1 ); - $menuBar->setGeometry( Qt::Rect(0, 0, 705, 27) ); + $menuBar->setGeometry( Qt::Rect(0, 0, 706, 27) ); my $fileMenu = Qt::Menu( $menuBar ); $self->{fileMenu} = $fileMenu; $fileMenu->setObjectName( "fileMenu" ); @@ -2779,6 +2805,9 @@ sub setupUi { Qt::Object::connect($menuBar, SIGNAL 'triggered(QAction*)' , $muSRFit4, SLOT 'RunSelectionToggle()' ); Qt::Object::connect($beamLine, SIGNAL 'currentIndexChanged(int)' , $muSRFit4, SLOT 't0Update()' ); Qt::Object::connect($numComps, SIGNAL 'valueChanged(int)' , $muSRFit4, SLOT 'addFitType()' ); + Qt::Object::connect($numComps, SIGNAL 'valueChanged(int)' , $muSRFit4, SLOT 'addSharingComp()' ); + Qt::Object::connect($runNumbers, SIGNAL 'textEdited(QString)' , $muSRFit4, SLOT 'runsLineNotEmpy()' ); + Qt::Object::connect($constraintLine, SIGNAL 'editingFinished()' , $muSRFit4, SLOT 'AppendToFunctions()' ); $musrfit_tabs->setCurrentIndex( 0 ); From beab905ecdbeedbdf6296d5a2d89f76c506708d3 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 16 Feb 2018 08:52:14 +0100 Subject: [PATCH 25/87] Added Bessel functions. --- src/external/MuSRFitGUI/MSR.pm | 81 +++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm index 538f39ad..d8e202af 100644 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -89,9 +89,9 @@ sub CreateMSRUni { # loop over fitTypes if (!defined($All{"numComps"})) {$All{"numComps"}=3;} for (my $i=1;$i<=$All{"numComps"};$i++) { - if ( defined($All{"FitType$i"}) &&$All{"FitType$i"} ne "None" ) { - push( @FitTypes, $All{"FitType$i"} ); - } + if ( defined($All{"FitType$i"}) &&$All{"FitType$i"} ne "None" ) { + push( @FitTypes, $All{"FitType$i"} ); + } } my @Hists = split( /,/, $All{"LRBF"} ); @@ -124,8 +124,8 @@ sub CreateMSRUni { # 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"}; + $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; } @@ -673,12 +673,13 @@ sub CreateTheory { "statExpKTLF", "Frq Aa", "dynExpKTLF", "Frq Aa Lam", "combiLGKT", "Del 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", + "spinGlass", "Lam gam q", + "rdAnisoHf", "Frq Lam", + "TFieldCos", "Phi Frq", + "Bessel", "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" @@ -732,13 +733,13 @@ sub CreateTheory { $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'} ); + $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'} ); } @@ -748,18 +749,26 @@ sub CreateTheory { $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 + $Parameters = join( $SPACE, $Parameters, $THEORY{'TFieldCos'} ); + } + + # Oscillationg Bessel Gaussian + elsif ( $FitType eq "GaussianBessel" ) { + $T_Block = $T_Block . "\n" . "simpleGss " . $THEORY{'simpleGss'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'simpleGss'} ); + $T_Block = $T_Block . "\n" . "Bessel " . $THEORY{'Bessel'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'Bessel'} ); + } + + # Oscillationg Bessel Exponential + elsif ( $FitType eq "ExponentialBessel" ) { + $T_Block = $T_Block . "\n" . "simplExpo " . $THEORY{'simplExpo'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'simplExpo'} ); + $T_Block = $T_Block . "\n" . "Bessel " . $THEORY{'Bessel'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'Bessel'} ); + } + + # Static Lorentzian KT elsif ( $FitType eq "SLKT" ) { $T_Block = $T_Block . "\n" . "statExpKT " . $THEORY{'statExpKT'}; $Parameters = join( $SPACE, $Parameters, $THEORY{'statExpKT'} ); @@ -1052,9 +1061,9 @@ sub PrepParamTable { # loop over fitTypes if (!defined($All{"numComps"})) {$All{"numComps"}=3;} for (my $i=1;$i<=$All{"numComps"};$i++) { - if ( defined($All{"FitType$i"}) &&$All{"FitType$i"} ne "None" ) { - push( @FitTypes, $All{"FitType$i"} ); - } + if ( defined($All{"FitType$i"}) &&$All{"FitType$i"} ne "None" ) { + push( @FitTypes, $All{"FitType$i"} ); + } } # Get theory block to determine the size of the table @@ -1249,9 +1258,9 @@ sub ExportParams { # loop over fitTypes if (!defined($All{"numComps"})) {$All{"numComps"}=3;} for (my $i=1;$i<=$All{"numComps"};$i++) { - if ( defined($All{"FitType$i"}) &&$All{"FitType$i"} ne "None" ) { - push( @FitTypes, $All{"FitType$i"} ); - } + if ( defined($All{"FitType$i"}) &&$All{"FitType$i"} ne "None" ) { + push( @FitTypes, $All{"FitType$i"} ); + } } # Get theory block to determine the size of the table From c7d28a599b08e8fd984e624fc495b227cc152b42 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 4 Apr 2018 09:55:14 +0200 Subject: [PATCH 26/87] Correction due to merge. --- src/external/MuSRFitGUI/MSR.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm index f2a3adfe..87b4d120 100644 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -278,7 +278,6 @@ sub CreateMSRUni { } if ($All{"Data1$NHist"} ne $EMPTY && $All{"Data2$NHist"} ne $EMPTY) { $Data_Line =$Data_Line." ".$All{"Data1$NHist"}." ".$All{"Data2$NHist"}; -<<<<<<< HEAD } if ($All{"t0$NHist"} ne $EMPTY) { $T0_Line=$T0_Line." ".$All{"t0$NHist"}; From 831b66c9d4f200af0659bb703c1575eb44b2276e Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 22 May 2018 13:38:29 +0000 Subject: [PATCH 27/87] Add web app --- README | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README b/README index 9c6eabfc..f3f65c10 100644 --- a/README +++ b/README @@ -18,18 +18,19 @@ Currently it allows the following things: * allows to implement more sophisticated user functions (e.g. GL vortex lattice, Meissner screening including low-energy muon stopping profiles) -Currently supported platforms: +Currently supported platforms * Linux * Mac OS X * Windows - not really, only for the very brave ones +* Any platform - http://musruser.psi.ch/cgi-bin/musrfit.cgi Documentation -For a more exhaustive user documentation see: +For a more extensive user documentation see: http://lmu.web.psi.ch/musrfit/user/MUSR/WebHome.html Contact - + From d9049c73ba8a24d38900f02f48fa955b6217e6ac Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 22 May 2018 13:42:04 +0000 Subject: [PATCH 28/87] Cosmetics --- README | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README b/README index f3f65c10..4037bd97 100644 --- a/README +++ b/README @@ -1,4 +1,5 @@ README +------ musrfit - muSR data analysis package @@ -19,6 +20,7 @@ Currently it allows the following things: (e.g. GL vortex lattice, Meissner screening including low-energy muon stopping profiles) Currently supported platforms +----------------------------- * Linux * Mac OS X @@ -26,6 +28,7 @@ Currently supported platforms * Any platform - http://musruser.psi.ch/cgi-bin/musrfit.cgi Documentation +------------- For a more extensive user documentation see: From 51265b5556c8bc85348dfbd76d6e67f7d6b554be Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sat, 9 Jun 2018 08:24:34 +0000 Subject: [PATCH 29/87] README edited online with Bitbucket --- README | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README b/README index 4037bd97..1f43d866 100644 --- a/README +++ b/README @@ -7,16 +7,16 @@ Contents -------- This is a data analysis package to analyze time differential muSR and beta-NMR data. -Currently it allows the following things: +Currently it allows the following, -* setting up most commonly used fitting functions for muSR and beta-NMR -* fitting data, including global fits -* showing the fit results and the residuals -* showing the Fourier transform of the data -* extracting easily the fitting parameters to be used in other programs (gnuplot, qtiplot/origin, ...) -* allows to generate fitting input files for follow-up runs -* allows to generate global fitting input files based on a single run template -* allows to implement more sophisticated user functions +* set up most commonly used fitting functions for muSR and beta-NMR +* fit data, including global fits +* show the fit results and the residuals +* show the Fourier transform of the data +* easily extract the fit parameters and import in other programs (gnuplot, qtiplot/origin, ...) +* generate input fitting files for follow-up runs +* generate global input fitting files based on a single run template +* implement more sophisticated user functions (e.g. GL vortex lattice, Meissner screening including low-energy muon stopping profiles) Currently supported platforms @@ -24,8 +24,8 @@ Currently supported platforms * Linux * Mac OS X -* Windows - not really, only for the very brave ones -* Any platform - http://musruser.psi.ch/cgi-bin/musrfit.cgi +* Windows - not really, only for experts +* Web based implementation - http://musruser.psi.ch/cgi-bin/musrfit.cgi Documentation ------------- From 989cd1fc9d11631ebb9811ca80dbae69792c7685 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sat, 9 Jun 2018 13:30:12 +0000 Subject: [PATCH 30/87] Correct grammer --- INSTALL | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/INSTALL b/INSTALL index 2a96191f..5cce2650 100644 --- a/INSTALL +++ b/INSTALL @@ -2,19 +2,19 @@ # INSTALL #--------------------------------------------------------------------- -There are currently 2 wasy to build musrfit: +There are currently two ways to build musrfit, -1) via the automake tool chain (this will phase out until 2019) -2) via the cmake tool chain (this will be the default starting from now) +1) using automake tool chain (this will be phased out until 2019) +2) using cmake tool chain (this will be the default starting from now) -In the following it is assumed that the system variable ROOTSYS is already -defined and pointing to the place where CERN/ROOT is installed. +In what follows we assume that the system variable ROOTSYS is already +defined and points to the installation directory of CERN/ROOT. #---------------------------------- -# Install via automake tool chain +# Install using automake tool chain #---------------------------------- -To get it build: +To get it built: sh autogen.sh ./configure --prefix=$ROOTSYS (or where ever musrfit should be installed) @@ -22,25 +22,25 @@ To get it build: make install (as superuser -- maybe) /sbin/ldconfig (as superuser) -configure comes with a couple of options. For details either execute +configure comes with a couple of options. For details execute ./configure --help or check under http://lmu.web.psi.ch/musrfit/user/MUSR/MusrFitSetup.html -for a more detailed description. +for a detailed description. -An example with NeXus support and BMWlibs needed would look like this +For example, to include NeXus support and BNMRlibs, sh autogen.sh - ./configure --enable-NeXus --enable-BMWlibs --prefix=$ROOTSYS + ./configure --enable-NeXus --enable-BNMRlibs --prefix=$ROOTSYS make make install (as superuser -- maybe) /sbin/ldconfig (as superuser) -In the optimal case, everything is set up ;-) +If all goes well, you should be good to go ;-) #---------------------------------- -# Install via cmake tool chain +# Install using cmake tool chain #---------------------------------- cmake minimal required version is 3.6. @@ -55,8 +55,7 @@ directory and make install (as superuser -- maybe) /sbin/ldconfig (as superuser) -cmake configuration allows a couple of switches. For details check the user -docu under +cmake configuration allows a couple of switches. For details check the documentation at http://lmu.web.psi.ch/musrfit/user/MUSR/MusrFitSetup.html @@ -69,16 +68,16 @@ An example with NeXus support and BMWlibs needed would look like this make install (as superuser -- maybe) /sbin/ldconfig (as superuser) -In the optimal case, everything is set up ;-) +If all goes well, you should be good to go ;-) #---------------------------------- -# Link to the docu +# Link to the documentation #---------------------------------- -More information about the software requirements and the installation can be found at: +More information regarding software requirements and installation can be found at -http://lmu.web.psi.ch/musrfit/user/MUSR/MusrFitSetup.html + http://lmu.web.psi.ch/musrfit/user/MUSR/MusrFitSetup.html #--------------------------------------------------------------------- -# this is the end ... +# good luck ... #--------------------------------------------------------------------- From 3cdf3d356e039c1ed6599d46c6179abced914a01 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 15 Aug 2018 20:17:13 +0200 Subject: [PATCH 31/87] Optimization and clean up --- src/external/libBNMR/TBNMR.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/external/libBNMR/TBNMR.cpp b/src/external/libBNMR/TBNMR.cpp index 245f820c..fb7223bb 100644 --- a/src/external/libBNMR/TBNMR.cpp +++ b/src/external/libBNMR/TBNMR.cpp @@ -10,8 +10,8 @@ ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2010 by Zaher Salman * - * zaher.salman@psi.ch * + * Copyright (C) 2010 by Zaher Salman * + * zaher.salman@psi.ch * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -20,7 +20,7 @@ * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * 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 * @@ -109,12 +109,8 @@ double MLRes::operator()(double x, const vector &par) const { // par[0] time of beam off // par[1] is the relaxation rate // par[2] is the exponent - double tau_p; double y; - tau_p = (tau_Li/(1.+par[1]*tau_Li)); - - if ( x >= 0 && x <= par[0] ) { TF1 sexp("sexp", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 10000.0); sexp.SetParameters(x, par[1], par[2],tau_Li); From e2a59af6e125b46ef7062a4149fc7b38b6fca101 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 15 Aug 2018 20:35:06 +0200 Subject: [PATCH 32/87] Start branch to develop full featured beta-NMR support --- src/classes/PMsrHandler.cpp | 16 ++- src/classes/PMusrCanvas.cpp | 15 ++- src/classes/PRunListCollection.cpp | 156 +++++++++++++++++++++++++++++ src/include/PMusr.h | 3 + src/include/PRunListCollection.h | 6 ++ 5 files changed, 194 insertions(+), 2 deletions(-) diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index a1b20238..8685c8ba 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -632,6 +632,9 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) case MSR_FITTYPE_MU_MINUS: fout << left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << endl ; break; + case MSR_FITTYPE_BNMR: + fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + break; case MSR_FITTYPE_NON_MUSR: fout << left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << endl ; break; @@ -796,6 +799,9 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) case MSR_FITTYPE_MU_MINUS: fout << left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << endl ; break; + case MSR_FITTYPE_BNMR: + fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + break; case MSR_FITTYPE_NON_MUSR: fout << left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << endl ; break; @@ -1705,6 +1711,9 @@ Int_t PMsrHandler::WriteMsrFile(const Char_t *filename, map *co case MSR_FITTYPE_MU_MINUS: fout << left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << endl ; break; + case MSR_FITTYPE_BNMR: + fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + break; case MSR_FITTYPE_NON_MUSR: fout << left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << endl ; break; @@ -1896,6 +1905,9 @@ Int_t PMsrHandler::WriteMsrFile(const Char_t *filename, map *co case MSR_FITTYPE_MU_MINUS: fout << left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << endl ; break; + case MSR_FITTYPE_BNMR: + fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + break; case MSR_FITTYPE_NON_MUSR: fout << left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << endl ; break; @@ -2965,6 +2977,7 @@ Bool_t PMsrHandler::HandleGlobalEntry(PMsrLines &lines) (fittype == MSR_FITTYPE_ASYM) || (fittype == MSR_FITTYPE_ASYM_RRF) || (fittype == MSR_FITTYPE_MU_MINUS) || + (fittype == MSR_FITTYPE_BNMR) || (fittype == MSR_FITTYPE_NON_MUSR)) { global.SetFitType(fittype); } else { @@ -3306,6 +3319,7 @@ Bool_t PMsrHandler::HandleRunEntry(PMsrLines &lines) (fittype == MSR_FITTYPE_ASYM) || (fittype == MSR_FITTYPE_ASYM_RRF) || (fittype == MSR_FITTYPE_MU_MINUS) || + (fittype == MSR_FITTYPE_BNMR) || (fittype == MSR_FITTYPE_NON_MUSR)) { param.SetFitType(fittype); } else { @@ -5865,7 +5879,7 @@ Bool_t PMsrHandler::CheckHistoGrouping() Bool_t result = true; for (UInt_t i=0; i> PMsrHandler::CheckHistoGrouping: **ERROR** # of forward histos != # of backward histos."; cerr << endl << ">> Run #" << i+1; diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index c6240b7c..7e632b0f 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -742,6 +742,18 @@ void PMusrCanvas::UpdateDataTheoryPad() // handle data HandleDataSet(i, runNo, data); break; + case MSR_FITTYPE_BNMR: + data = fRunList->GetAsymmetryBNMR(runNo, PRunListCollection::kRunNo); + if (!data) { // something wrong + fValid = false; + // error message + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a beta-NMR asymmetry plot"; + cerr << endl; + return; + } + // handle data + HandleDataSet(i, runNo, data); + break; case MSR_FITTYPE_NON_MUSR: data = fRunList->GetNonMusr(runNo, PRunListCollection::kRunNo); if (!data) { // something wrong @@ -910,7 +922,8 @@ void PMusrCanvas::UpdateInfoPad() tstr += grouping; tstr += TString(","); } else if ((runs[runNo].GetFitType() == MSR_FITTYPE_ASYM) || - (runs[runNo].GetFitType() == MSR_FITTYPE_ASYM_RRF)) { + (runs[runNo].GetFitType() == MSR_FITTYPE_ASYM_RRF) || + (runs[runNo].GetFitType() == MSR_FITTYPE_BNMR)) { tstr += TString("h:"); TString grouping; fMsrHandler->GetGroupingString(runNo, "forward", grouping); diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index e11bb0c6..dc95aac2 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -76,6 +76,12 @@ PRunListCollection::~PRunListCollection() } fRunAsymmetryRRFList.clear(); + for (UInt_t i=0; iCleanUp(); + fRunAsymmetryBNMRList[i]->~PRunAsymmetryBNMR(); + } + fRunAsymmetryBNMRList.clear(); + for (UInt_t i=0; iCleanUp(); fRunMuMinusList[i]->~PRunMuMinus(); @@ -133,6 +139,11 @@ Bool_t PRunListCollection::Add(Int_t runNo, EPMusrHandleTag tag) if (!fRunAsymmetryRRFList[fRunAsymmetryRRFList.size()-1]->IsValid()) success = false; break; + case PRUN_ASYMMETRY_BNMR: + fRunAsymmetryBNMRList.push_back(new PRunAsymmetryBNMR(fMsrInfo, fData, runNo, tag)); + if (!fRunAsymmetryBNMRList[fRunAsymmetryBNMRList.size()-1]->IsValid()) + success = false; + break; case PRUN_MU_MINUS: fRunMuMinusList.push_back(new PRunMuMinus(fMsrInfo, fData, runNo, tag)); if (!fRunMuMinusList[fRunMuMinusList.size()-1]->IsValid()) @@ -175,6 +186,8 @@ void PRunListCollection::SetFitRange(const TString fitRange) fRunAsymmetryList[i]->SetFitRangeBin(fitRange); for (UInt_t i=0; iSetFitRangeBin(fitRange); + for (UInt_t i=0; iSetFitRangeBin(fitRange); for (UInt_t i=0; iSetFitRangeBin(fitRange); for (UInt_t i=0; iSetFitRange(fitRange); for (UInt_t i=0; iSetFitRange(fitRange); + for (UInt_t i=0; iSetFitRange(fitRange); for (UInt_t i=0; iSetFitRange(fitRange); for (UInt_t i=0; i& p return chisq; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMRChisq (public) +//-------------------------------------------------------------------------- +/** + *

Calculates chi-square of all asymmetry BNMR runs of a msr-file. + * + * return: + * - chi-square of all asymmetry BNMR runs of the msr-file + * + * \param par fit parameter vector + */ +Double_t PRunListCollection::GetAsymmetryBNMRChisq(const std::vector& par) const +{ + Double_t chisq = 0.0; + + for (UInt_t i=0; iCalcChiSquare(par); + + return chisq; +} + //-------------------------------------------------------------------------- // GetMuMinusChisq (public) //-------------------------------------------------------------------------- @@ -380,6 +416,9 @@ Double_t PRunListCollection::GetSingleHistoChisqExpected(const std::vectorCalcChiSquareExpected(par); break; + case PRUN_ASYMMETRY_BNMR: + expectedChisq = fRunAsymmetryBNMRList[subIdx]->CalcChiSquareExpected(par); + break; case PRUN_MU_MINUS: expectedChisq = fRunMuMinusList[subIdx]->CalcChiSquareExpected(par); break; @@ -441,6 +480,9 @@ Double_t PRunListCollection::GetSingleRunChisq(const std::vector& par, case PRUN_ASYMMETRY_RRF: chisq = fRunAsymmetryRRFList[subIdx]->CalcChiSquare(par); break; + case PRUN_ASYMMETRY_BNMR: + chisq = fRunAsymmetryBNMRList[subIdx]->CalcChiSquare(par); + break; case PRUN_MU_MINUS: chisq = fRunMuMinusList[subIdx]->CalcChiSquare(par); break; @@ -540,6 +582,28 @@ Double_t PRunListCollection::GetAsymmetryRRFMaximumLikelihood(const std::vector< return mlh; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMRMaximumLikelihood (public) +//-------------------------------------------------------------------------- +/** + *

Since it is not clear yet how to handle asymmetry fits with max likelihood + * the chi square will be used! + * + * return: + * - chi-square of all asymmetry BNMR runs of the msr-file + * + * \param par fit parameter vector + */ +Double_t PRunListCollection::GetAsymmetryBNMRMaximumLikelihood(const std::vector& par) const +{ + Double_t mlh = 0.0; + + for (UInt_t i=0; iCalcChiSquare(par); + + return mlh; +} + //-------------------------------------------------------------------------- // GetMuMinusMaximumLikelihood (public) //-------------------------------------------------------------------------- @@ -721,6 +785,9 @@ UInt_t PRunListCollection::GetNoOfBinsFitted(const UInt_t idx) const case PRUN_ASYMMETRY_RRF: result = fRunAsymmetryRRFList[subIdx]->GetNoOfFitBins(); break; + case PRUN_ASYMMETRY_BNMR: + result = fRunAsymmetryBNMRList[subIdx]->GetNoOfFitBins(); + break; case PRUN_MU_MINUS: result = fRunMuMinusList[subIdx]->GetNoOfFitBins(); break; @@ -760,6 +827,9 @@ UInt_t PRunListCollection::GetTotalNoOfBinsFitted() const for (UInt_t i=0; iGetNoOfFitBins(); + for (UInt_t i=0; iGetNoOfFitBins(); + for (UInt_t i=0; iGetNoOfFitBins(); @@ -898,6 +968,49 @@ PRunData* PRunListCollection::GetAsymmetry(UInt_t index, EDataSwitch tag) return data; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMR (public) +//-------------------------------------------------------------------------- +/** + *

Get a processed asymmetry data set. + * + * return: + * - pointer to the run data set (processed data) if data set is found + * - null pointer otherwise + * + * \param index msr-file run index + * \param tag kIndex -> data at index, kRunNo -> data of given run no + */ +PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) +{ + PRunData *data = 0; + + switch (tag) { + case kIndex: // called from musrfit when dumping the data + if (index > fRunAsymmetryList.size()) { + cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; + cerr << endl; + return 0; + } + + fRunAsymmetryList[index]->CalcTheory(); + data = fRunAsymmetryList[index]->GetData(); + break; + case kRunNo: // called from PMusrCanvas + for (UInt_t i=0; iGetRunNo() == index) { + data = fRunAsymmetryList[i]->GetData(); + break; + } + } + break; + default: // error + break; + } + + return data; +} + //-------------------------------------------------------------------------- // GetAsymmetryRRF (public) //-------------------------------------------------------------------------- @@ -941,6 +1054,49 @@ PRunData* PRunListCollection::GetAsymmetryRRF(UInt_t index, EDataSwitch tag) return data; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMR (public) +//-------------------------------------------------------------------------- +/** + *

Get a processed asymmetry BNMR data set. + * + * return: + * - pointer to the run data set (processed data) if data set is found + * - null pointer otherwise + * + * \param index msr-file run index + * \param tag kIndex -> data at index, kRunNo -> data of given run no + */ +PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) +{ + PRunData *data = 0; + + switch (tag) { + case kIndex: // called from musrfit when dumping the data + if (index > fRunAsymmetryBNMRList.size()) { + cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; + cerr << endl; + return 0; + } + + fRunAsymmetryBNMRList[index]->CalcTheory(); + data = fRunAsymmetryBNMRList[index]->GetData(); + break; + case kRunNo: // called from PMusrCanvas + for (UInt_t i=0; iGetRunNo() == index) { + data = fRunAsymmetryBNMRList[i]->GetData(); + break; + } + } + break; + default: // error + break; + } + + return data; +} + //-------------------------------------------------------------------------- // GetMuMinus (public) //-------------------------------------------------------------------------- diff --git a/src/include/PMusr.h b/src/include/PMusr.h index 11884323..cd9d6375 100644 --- a/src/include/PMusr.h +++ b/src/include/PMusr.h @@ -57,6 +57,7 @@ using namespace std; #define PRUN_ASYMMETRY 2 #define PRUN_ASYMMETRY_RRF 3 #define PRUN_MU_MINUS 4 +#define PRUN_ASYMMETRY_BNMR 5 #define PRUN_NON_MUSR 8 // muon life time in (us), see PRL99, 032001 (2007) @@ -99,6 +100,7 @@ using namespace std; #define MSR_FITTYPE_ASYM 2 #define MSR_FITTYPE_ASYM_RRF 3 #define MSR_FITTYPE_MU_MINUS 4 +#define MSR_FITTYPE_BNMR 5 #define MSR_FITTYPE_NON_MUSR 8 //------------------------------------------------------------- @@ -108,6 +110,7 @@ using namespace std; #define MSR_PLOT_ASYM 2 #define MSR_PLOT_ASYM_RRF 3 #define MSR_PLOT_MU_MINUS 4 +#define MSR_PLOT_BNMR 5 #define MSR_PLOT_NON_MUSR 8 //------------------------------------------------------------- diff --git a/src/include/PRunListCollection.h b/src/include/PRunListCollection.h index 1c22ee51..4d3a83ef 100644 --- a/src/include/PRunListCollection.h +++ b/src/include/PRunListCollection.h @@ -40,6 +40,7 @@ using namespace std; #include "PRunSingleHistoRRF.h" #include "PRunAsymmetry.h" #include "PRunAsymmetryRRF.h" +#include "PRunAsymmetryBNMR.h" #include "PRunMuMinus.h" #include "PRunNonMusr.h" @@ -63,6 +64,7 @@ class PRunListCollection virtual Double_t GetSingleHistoRRFChisq(const std::vector& par) const; virtual Double_t GetAsymmetryChisq(const std::vector& par) const; virtual Double_t GetAsymmetryRRFChisq(const std::vector& par) const; + virtual Double_t GetAsymmetryBNMRChisq(const std::vector& par) const; virtual Double_t GetMuMinusChisq(const std::vector& par) const; virtual Double_t GetNonMusrChisq(const std::vector& par) const; @@ -73,6 +75,7 @@ class PRunListCollection virtual Double_t GetSingleHistoRRFMaximumLikelihood(const std::vector& par) const; virtual Double_t GetAsymmetryMaximumLikelihood(const std::vector& par) const; virtual Double_t GetAsymmetryRRFMaximumLikelihood(const std::vector& par) const; + virtual Double_t GetAsymmetryBNMRMaximumLikelihood(const std::vector& par) const; virtual Double_t GetMuMinusMaximumLikelihood(const std::vector& par) const; virtual Double_t GetNonMusrMaximumLikelihood(const std::vector& par) const; @@ -86,6 +89,7 @@ class PRunListCollection virtual UInt_t GetNoOfSingleHistoRRF() const { return fRunSingleHistoRRFList.size(); } ///< returns the number of single histogram RRF data sets present in the msr-file virtual UInt_t GetNoOfAsymmetry() const { return fRunAsymmetryList.size(); } ///< returns the number of asymmetry data sets present in the msr-file virtual UInt_t GetNoOfAsymmetryRRF() const { return fRunAsymmetryRRFList.size(); } ///< returns the number of asymmetry RRF data sets present in the msr-file + virtual UInt_t GetNoOfAsymmetryBNMR() const { return fRunAsymmetryBNMRList.size(); } ///< returns the number of asymmetry BNMR data sets present in the msr-file virtual UInt_t GetNoOfMuMinus() const { return fRunMuMinusList.size(); } ///< returns the number of mu minus data sets present in the msr-file virtual UInt_t GetNoOfNonMusr() const { return fRunNonMusrList.size(); } ///< returns the number of non-muSR data sets present in the msr-file @@ -93,6 +97,7 @@ class PRunListCollection virtual PRunData* GetSingleHistoRRF(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetAsymmetry(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetAsymmetryRRF(UInt_t index, EDataSwitch tag=kIndex); + virtual PRunData* GetAsymmetryBNMR(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetMuMinus(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetNonMusr(UInt_t index, EDataSwitch tag=kIndex); @@ -111,6 +116,7 @@ class PRunListCollection vector fRunSingleHistoRRFList; ///< stores all processed single histogram RRF data vector fRunAsymmetryList; ///< stores all processed asymmetry data vector fRunAsymmetryRRFList; ///< stores all processed asymmetry RRF data + vector fRunAsymmetryBNMRList; ///< stores all processed asymmetry BNMR data vector fRunMuMinusList; ///< stores all processed mu-minus data vector fRunNonMusrList; ///< stores all processed non-muSR data }; From 4e54d9c0b966e5160d88d87cc061c86933fd4de6 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 15 Aug 2018 21:35:56 +0200 Subject: [PATCH 33/87] First successful compilation of AsymmetryBNMR --- src/classes/CMakeLists.txt | 1 + src/classes/Makefile.am | 2 + src/classes/PRunAsymmetryBNMR.cpp | 1869 ++++++++++++++++++++++++++++ src/classes/PRunListCollection.cpp | 43 - src/include/PRunAsymmetryBNMR.h | 89 ++ 5 files changed, 1961 insertions(+), 43 deletions(-) create mode 100644 src/classes/PRunAsymmetryBNMR.cpp create mode 100644 src/include/PRunAsymmetryBNMR.h diff --git a/src/classes/CMakeLists.txt b/src/classes/CMakeLists.txt index f64feace..40eb0378 100644 --- a/src/classes/CMakeLists.txt +++ b/src/classes/CMakeLists.txt @@ -65,6 +65,7 @@ add_library(PMusr SHARED PMusrT0Dict.cxx PPrepFourier.cpp PRunAsymmetry.cpp + PRunAsymmetryBNMR.cpp PRunAsymmetryRRF.cpp PRunBase.cpp PRunDataHandler.cpp diff --git a/src/classes/Makefile.am b/src/classes/Makefile.am index 77cb1d8f..fa3a0fba 100644 --- a/src/classes/Makefile.am +++ b/src/classes/Makefile.am @@ -15,6 +15,7 @@ h_sources = \ ../include/PMusrT0.h \ ../include/PPrepFourier.h \ ../include/PRunAsymmetry.h \ + ../include/PRunAsymmetryBNMR.h \ ../include/PRunAsymmetryRRF.h \ ../include/PRunBase.h \ ../include/PRunDataHandler.h \ @@ -61,6 +62,7 @@ cpp_sources = \ PMusrT0.cpp \ PPrepFourier.cpp \ PRunAsymmetry.cpp \ + PRunAsymmetryBNMR.cpp \ PRunAsymmetryRRF.cpp \ PRunBase.cpp \ PRunDataHandler.cpp \ diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp new file mode 100644 index 00000000..b55052a0 --- /dev/null +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -0,0 +1,1869 @@ +/*************************************************************************** + + PRunAsymmetryBNMR.cpp + + Author: Andreas Suter + e-mail: andreas.suter@psi.ch + +***************************************************************************/ + +/*************************************************************************** + * Copyright (C) 2007-2016 by Andreas Suter * + * andreas.suter@psi.ch * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_GOMP +#include +#endif + +#include + +#include +using namespace std; + +#include +#include +#include + +#include "PMusr.h" +#include "PRunAsymmetryBNMR.h" + +//-------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------- +/** + *

Constructor + */ +PRunAsymmetryBNMR::PRunAsymmetryBNMR() : PRunBase() +{ + fNoOfFitBins = 0; + fPacking = -1; + + // the 2 following variables are need in case fit range is given in bins, and since + // the fit range can be changed in the command block, these variables need to be accessible + fGoodBins[0] = -1; + fGoodBins[1] = -1; + + fStartTimeBin = -1; + fEndTimeBin = -1; +} + +//-------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------- +/** + *

Constructor + * + * \param msrInfo pointer to the msr-file handler + * \param rawData raw run data + * \param runNo number of the run within the msr-file + * \param tag tag showing what shall be done: kFit == fitting, kView == viewing + */ +PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag) : PRunBase(msrInfo, rawData, runNo, tag) +{ + // the 2 following variables are need in case fit range is given in bins, and since + // the fit range can be changed in the command block, these variables need to be accessible + fGoodBins[0] = -1; + fGoodBins[1] = -1; + + fStartTimeBin = -1; + fEndTimeBin = -1; + + fPacking = fRunInfo->GetPacking(); + if (fPacking == -1) { // i.e. packing is NOT given in the RUN-block, it must be given in the GLOBAL-block + fPacking = fMsrInfo->GetMsrGlobal()->GetPacking(); + } + if (fPacking == -1) { // this should NOT happen, somethin is severely wrong + cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **SEVERE ERROR**: Couldn't find any packing information!"; + cerr << endl << ">> This is very bad :-(, will quit ..."; + cerr << endl; + fValid = false; + return; + } + + // check if alpha and/or beta is fixed -------------------- + + PMsrParamList *param = msrInfo->GetMsrParamList(); + + // check if alpha is given + if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given + cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; + cerr << endl; + fValid = false; + return; + } + // check if alpha parameter is within proper bounds + if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); + cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + cerr << endl; + fValid = false; + return; + } + // check if alpha is fixed + Bool_t alphaFixedToOne = false; + if (((*param)[fRunInfo->GetAlphaParamNo()-1].fStep == 0.0) && + ((*param)[fRunInfo->GetAlphaParamNo()-1].fValue == 1.0)) + alphaFixedToOne = true; + + // check if beta is given + Bool_t betaFixedToOne = false; + if (fRunInfo->GetBetaParamNo() == -1) { // no beta given hence assuming beta == 1 + betaFixedToOne = true; + } else if ((fRunInfo->GetBetaParamNo() < 0) || (fRunInfo->GetBetaParamNo() > (Int_t)param->size())) { // check if beta parameter is within proper bounds + cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** beta parameter no = " << fRunInfo->GetBetaParamNo(); + cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + cerr << endl; + fValid = false; + return; + } else { // check if beta is fixed + if (((*param)[fRunInfo->GetBetaParamNo()-1].fStep == 0.0) && + ((*param)[fRunInfo->GetBetaParamNo()-1].fValue == 1.0)) + betaFixedToOne = true; + } + + // set fAlphaBetaTag + if (alphaFixedToOne && betaFixedToOne) // alpha == 1, beta == 1 + fAlphaBetaTag = 1; + else if (!alphaFixedToOne && betaFixedToOne) // alpha != 1, beta == 1 + fAlphaBetaTag = 2; + else if (alphaFixedToOne && !betaFixedToOne) // alpha == 1, beta != 1 + fAlphaBetaTag = 3; + else + fAlphaBetaTag = 4; + + // calculate fData + if (!PrepareData()) + fValid = false; +} + +//-------------------------------------------------------------------------- +// Destructor +//-------------------------------------------------------------------------- +/** + *

Destructor. + */ +PRunAsymmetryBNMR::~PRunAsymmetryBNMR() +{ + fForward.clear(); + fForwardErr.clear(); + fBackward.clear(); + fBackwardErr.clear(); +} + +//-------------------------------------------------------------------------- +// CalcChiSquare (public) +//-------------------------------------------------------------------------- +/** + *

Calculate chi-square. + * + * return: + * - chisq value + * + * \param par parameter vector iterated by minuit2 + */ +Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) +{ + Double_t chisq = 0.0; + Double_t diff = 0.0; + Double_t asymFcnValue = 0.0; + Double_t a, b, f; + + // calculate functions + for (Int_t i=0; iGetNoOfFuncs(); i++) { + fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); + } + + // calculate chi square + Double_t time(1.0); + Int_t i; + + // Calculate the theory function once to ensure one function evaluation for the current set of parameters. + // This is needed for the LF and user functions where some non-thread-save calculations only need to be calculated once + // for a given set of parameters---which should be done outside of the parallelized loop. + // For all other functions it means a tiny and acceptable overhead. + asymFcnValue = fTheory->Func(time, par, fFuncValues); + + #ifdef HAVE_GOMP + Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs(); + if (chunk < 10) + chunk = 10; + #pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,a,b,f) schedule(dynamic,chunk) reduction(+:chisq) + #endif + for (i=fStartTimeBin; iFunc(time, par, fFuncValues); + break; + case 2: // alpha != 1, beta == 1 + a = par[fRunInfo->GetAlphaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)); + break; + case 3: // alpha == 1, beta != 1 + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0)); + break; + case 4: // alpha != 1, beta != 1 + a = par[fRunInfo->GetAlphaParamNo()-1]; + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0)); + break; + default: + asymFcnValue = 0.0; + break; + } + diff = fData.GetValue()->at(i) - asymFcnValue; + chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i)); + } + + return chisq; +} + +//-------------------------------------------------------------------------- +// CalcChiSquareExpected (public) +//-------------------------------------------------------------------------- +/** + *

Calculate expected chi-square. Currently not implemented since not clear what to be done. + * + * return: + * - chisq value == 0.0 + * + * \param par parameter vector iterated by minuit2 + */ +Double_t PRunAsymmetryBNMR::CalcChiSquareExpected(const std::vector& par) +{ + return 0.0; +} + +//-------------------------------------------------------------------------- +// CalcMaxLikelihood (public) +//-------------------------------------------------------------------------- +/** + *

NOT IMPLEMENTED!! + * + * \param par parameter vector iterated by minuit2 + */ +Double_t PRunAsymmetryBNMR::CalcMaxLikelihood(const std::vector& par) +{ + cout << endl << "PRunAsymmetryBNMR::CalcMaxLikelihood(): not implemented yet ..." << endl; + + return 1.0; +} + +//-------------------------------------------------------------------------- +// GetNoOfFitBins (public) +//-------------------------------------------------------------------------- +/** + *

Calculate the number of fitted bins for the current fit range. + * + * return: number of fitted bins. + */ +UInt_t PRunAsymmetryBNMR::GetNoOfFitBins() +{ + CalcNoOfFitBins(); + + return fNoOfFitBins; +} + +//-------------------------------------------------------------------------- +// SetFitRangeBin (public) +//-------------------------------------------------------------------------- +/** + *

Allows to change the fit range on the fly. Used in the COMMAND block. + * The syntax of the string is: FIT_RANGE fgb[+n00] lgb[-n01] [fgb[+n10] lgb[-n11] ... fgb[+nN0] lgb[-nN1]]. + * If only one pair of fgb/lgb is given, it is used for all runs in the RUN block section. + * If multiple fgb/lgb's are given, the number N has to be the number of RUN blocks in + * the msr-file. + * + *

nXY are offsets which can be used to shift, limit the fit range. + * + * \param fitRange string containing the necessary information. + */ +void PRunAsymmetryBNMR::SetFitRangeBin(const TString fitRange) +{ + TObjArray *tok = 0; + TObjString *ostr = 0; + TString str; + Ssiz_t idx = -1; + Int_t offset = 0; + + tok = fitRange.Tokenize(" \t"); + + if (tok->GetEntries() == 3) { // structure FIT_RANGE fgb+n0 lgb-n1 + // handle fgb+n0 entry + ostr = (TObjString*) tok->At(1); + str = ostr->GetString(); + // check if there is an offset present + idx = str.First("+"); + if (idx != -1) { // offset present + str.Remove(0, idx+1); + if (str.IsFloat()) // if str is a valid number, convert is to an integer + offset = str.Atoi(); + } + fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; + + // handle lgb-n1 entry + ostr = (TObjString*) tok->At(2); + str = ostr->GetString(); + // check if there is an offset present + idx = str.First("-"); + if (idx != -1) { // offset present + str.Remove(0, idx+1); + if (str.IsFloat()) // if str is a valid number, convert is to an integer + offset = str.Atoi(); + } + fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; + } else if ((tok->GetEntries() > 3) && (tok->GetEntries() % 2 == 1)) { // structure FIT_RANGE fgb[+n00] lgb[-n01] [fgb[+n10] lgb[-n11] ... fgb[+nN0] lgb[-nN1]] + Int_t pos = 2*(fRunNo+1)-1; + + if (pos + 1 >= tok->GetEntries()) { + cerr << endl << ">> PRunAsymmetryBNMR::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + cerr << endl << ">> will ignore it. Sorry ..." << endl; + } else { + // handle fgb+n0 entry + ostr = (TObjString*) tok->At(pos); + str = ostr->GetString(); + // check if there is an offset present + idx = str.First("+"); + if (idx != -1) { // offset present + str.Remove(0, idx+1); + if (str.IsFloat()) // if str is a valid number, convert is to an integer + offset = str.Atoi(); + } + fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; + + // handle lgb-n1 entry + ostr = (TObjString*) tok->At(pos+1); + str = ostr->GetString(); + // check if there is an offset present + idx = str.First("-"); + if (idx != -1) { // offset present + str.Remove(0, idx+1); + if (str.IsFloat()) // if str is a valid number, convert is to an integer + offset = str.Atoi(); + } + fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; + } + } else { // error + cerr << endl << ">> PRunAsymmetryBNMR::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + cerr << endl << ">> will ignore it. Sorry ..." << endl; + } + + // clean up + if (tok) { + delete tok; + } +} + +//-------------------------------------------------------------------------- +// CalcNoOfFitBins (protected) +//-------------------------------------------------------------------------- +/** + *

Calculate the number of fitted bins for the current fit range. + */ +void PRunAsymmetryBNMR::CalcNoOfFitBins() +{ + // In order not having to loop over all bins and to stay consistent with the chisq method, calculate the start and end bins explicitly + fStartTimeBin = static_cast(ceil((fFitStartTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())); + if (fStartTimeBin < 0) + fStartTimeBin = 0; + fEndTimeBin = static_cast(floor((fFitEndTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())) + 1; + if (fEndTimeBin > static_cast(fData.GetValue()->size())) + fEndTimeBin = fData.GetValue()->size(); + + if (fEndTimeBin > fStartTimeBin) + fNoOfFitBins = fEndTimeBin - fStartTimeBin; + else + fNoOfFitBins = 0; +} + +//-------------------------------------------------------------------------- +// CalcTheory (protected) +//-------------------------------------------------------------------------- +/** + *

Calculate theory for a given set of fit-parameters. + */ +void PRunAsymmetryBNMR::CalcTheory() +{ + // feed the parameter vector + std::vector par; + PMsrParamList *paramList = fMsrInfo->GetMsrParamList(); + for (UInt_t i=0; isize(); i++) + par.push_back((*paramList)[i].fValue); + + // calculate functions + for (Int_t i=0; iGetNoOfFuncs(); i++) { + fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); + } + + // calculate asymmetry + Double_t asymFcnValue = 0.0; + Double_t a, b, f; + Double_t time; + for (UInt_t i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + switch (fAlphaBetaTag) { + case 1: // alpha == 1, beta == 1 + asymFcnValue = fTheory->Func(time, par, fFuncValues); + break; + case 2: // alpha != 1, beta == 1 + a = par[fRunInfo->GetAlphaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)); + break; + case 3: // alpha == 1, beta != 1 + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0)); + break; + case 4: // alpha != 1, beta != 1 + a = par[fRunInfo->GetAlphaParamNo()-1]; + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0)); + break; + default: + asymFcnValue = 0.0; + break; + } + fData.AppendTheoryValue(asymFcnValue); + } + + // clean up + par.clear(); +} + +//-------------------------------------------------------------------------- +// PrepareData (protected) +//-------------------------------------------------------------------------- +/** + *

Prepare data for fitting or viewing. What is already processed at this stage: + * - get all needed forward/backward histograms + * - get time resolution + * - get start/stop fit time + * - get t0's and perform necessary cross checks (e.g. if t0 of msr-file (if present) are consistent with t0 of the data files, etc.) + * - add runs (if addruns are present) + * - group histograms (if grouping is present) + * - subtract background + * + * Error propagation for \f$ A_i = (f_i^{\rm c}-b_i^{\rm c})/(f_i^{\rm c}+b_i^{\rm c})\f$: + * \f[ \Delta A_i = \pm\frac{2}{(f_i^{\rm c}+b_i^{\rm c})^2}\left[ + * (b_i^{\rm c})^2 (\Delta f_i^{\rm c})^2 + + * (\Delta b_i^{\rm c})^2 (f_i^{\rm c})^2\right]^{1/2}\f] + * + * return: + * - true if everthing went smooth + * - false, otherwise. + */ +Bool_t PRunAsymmetryBNMR::PrepareData() +{ + // keep the Global block info + PMsrGlobalBlock *globalBlock = fMsrInfo->GetMsrGlobal(); + + // get forward/backward histo from PRunDataHandler object ------------------------ + // get the correct run + PRawRunData *runData = fRawData->GetRunData(*(fRunInfo->GetRunName())); + if (!runData) { // run not found + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; + cerr << endl; + return false; + } + + // collect histogram numbers + PUIntVector forwardHistoNo; + PUIntVector backwardHistoNo; + for (UInt_t i=0; iGetForwardHistoNoSize(); i++) { + forwardHistoNo.push_back(fRunInfo->GetForwardHistoNo(i)); + + if (!runData->IsPresent(forwardHistoNo[i])) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; + cerr << endl << ">> forwardHistoNo found = " << forwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + cerr << endl << ">> Will quit :-("; + cerr << endl; + // clean up + forwardHistoNo.clear(); + backwardHistoNo.clear(); + return false; + } + } + for (UInt_t i=0; iGetBackwardHistoNoSize(); i++) { + backwardHistoNo.push_back(fRunInfo->GetBackwardHistoNo(i)); + + if (!runData->IsPresent(backwardHistoNo[i])) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; + cerr << endl << ">> backwardHistoNo found = " << backwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + cerr << endl << ">> Will quit :-("; + cerr << endl; + // clean up + forwardHistoNo.clear(); + backwardHistoNo.clear(); + return false; + } + } + if (forwardHistoNo.size() != backwardHistoNo.size()) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; + cerr << endl << ">> # of forward histograms different from # of backward histograms."; + cerr << endl << ">> Will quit :-("; + cerr << endl; + // clean up + forwardHistoNo.clear(); + backwardHistoNo.clear(); + return false; + } + + // keep the time resolution in (us) + fTimeResolution = runData->GetTimeResolution()/1.0e3; + cout.precision(10); + cout << endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; + + // get all the proper t0's and addt0's for the current RUN block + if (!GetProperT0(runData, globalBlock, forwardHistoNo, backwardHistoNo)) { + return false; + } + + // keep the histo of each group at this point (addruns handled below) + vector forward, backward; + forward.resize(forwardHistoNo.size()); // resize to number of groups + backward.resize(backwardHistoNo.size()); // resize to numer of groups + for (UInt_t i=0; iGetDataBin(forwardHistoNo[i])->size()); + backward[i].resize(runData->GetDataBin(backwardHistoNo[i])->size()); + forward[i] = *runData->GetDataBin(forwardHistoNo[i]); + backward[i] = *runData->GetDataBin(backwardHistoNo[i]); + } + + // check if addrun's are present, and if yes add data + // check if there are runs to be added to the current one + if (fRunInfo->GetRunNameSize() > 1) { // runs to be added present + PRawRunData *addRunData; + for (UInt_t i=1; iGetRunNameSize(); i++) { + // get run to be added to the main one + addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); + if (addRunData == 0) { // couldn't get run + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + cerr << endl; + return false; + } + + // add forward run + UInt_t addRunSize; + for (UInt_t k=0; kGetDataBin(forwardHistoNo[k])->size(); + for (UInt_t j=0; jGetDataBin(forwardHistoNo[k])->size(); j++) { // loop over the bin indices + // make sure that the index stays in the proper range + if (((Int_t)j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k] >= 0) && (j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k] < addRunSize)) { + forward[k][j] += addRunData->GetDataBin(forwardHistoNo[k])->at(j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k]); + } + } + } + + // add backward run + for (UInt_t k=0; kGetDataBin(backwardHistoNo[k])->size(); + for (UInt_t j=0; jGetDataBin(backwardHistoNo[k])->size(); j++) { // loop over the bin indices + // make sure that the index stays in the proper range + if (((Int_t)j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1] >= 0) && (j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1] < addRunSize)) { + backward[k][j] += addRunData->GetDataBin(backwardHistoNo[k])->at(j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1]); + } + } + } + } + } + + // set forward/backward histo data of the first group + fForward.resize(forward[0].size()); + fBackward.resize(backward[0].size()); + for (UInt_t i=0; iGetDataBin(forwardHistoNo[i])->size(); j++) { // loop over the bin indices + // make sure that the index stays within proper range + if ((j+fT0s[2*i]-fT0s[0] >= 0) && (j+fT0s[2*i]-fT0s[0] < runData->GetDataBin(forwardHistoNo[i])->size())) { + fForward[j] += forward[i][j+(Int_t)fT0s[2*i]-(Int_t)fT0s[0]]; + } + } + } + + // group histograms, add all the remaining backward histograms of the group + for (UInt_t i=1; iGetDataBin(backwardHistoNo[i])->size(); j++) { // loop over the bin indices + // make sure that the index stays within proper range + if ((j+fT0s[2*i+1]-fT0s[1] >= 0) && (j+fT0s[2*i+1]-fT0s[1] < runData->GetDataBin(backwardHistoNo[i])->size())) { + fBackward[j] += backward[i][j+(Int_t)fT0s[2*i+1]-(Int_t)fT0s[1]]; + } + } + } + + // subtract background from histogramms ------------------------------------------ + if (fRunInfo->GetBkgFix(0) == PMUSR_UNDEFINED) { // no fixed background given + if (fRunInfo->GetBkgRange(0) >= 0) { // background range given + if (!SubtractEstimatedBkg()) + return false; + } else { // no background given to do the job, try to estimate it + fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.1), 0); + fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); + fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.1), 2); + fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.6), 3); + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **WARNING** Neither fix background nor background bins are given!"; + cerr << endl << ">> Will try the following:"; + cerr << endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); + cerr << endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); + cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; + cerr << endl; + if (!SubtractEstimatedBkg()) + return false; + } + } else { // fixed background given + if (!SubtractFixBkg()) + return false; + } + + UInt_t histoNo[2] = {forwardHistoNo[0], backwardHistoNo[0]}; + + // get the data range (fgb/lgb) for the current RUN block + if (!GetProperDataRange(runData, histoNo)) { + return false; + } + + // get the fit range for the current RUN block + GetProperFitRange(globalBlock); + + // everything looks fine, hence fill data set + Bool_t status; + switch(fHandleTag) { + case kFit: + status = PrepareFitData(); + break; + case kView: + if (fMsrInfo->GetMsrPlotList()->at(0).fRRFPacking == 0) + status = PrepareViewData(runData, histoNo); + else + status = PrepareRRFViewData(runData, histoNo); + break; + default: + status = false; + break; + } + + // clean up + forwardHistoNo.clear(); + backwardHistoNo.clear(); + + return status; +} + +//-------------------------------------------------------------------------- +// SubtractFixBkg (private) +//-------------------------------------------------------------------------- +/** + *

Subtracts a fixed background from the raw data. The background is given + * in units of (1/bin); for the Asymmetry representation (1/ns) doesn't make too much sense. + * The error propagation is done the following way: it is assumed that the error of the background + * is Poisson like, i.e. \f$\Delta\mathrm{bkg} = \sqrt{\mathrm{bkg}}\f$. + * + * Error propagation: + * \f[ \Delta f_i^{\rm c} = \pm\left[ (\Delta f_i)^2 + (\Delta \mathrm{bkg})^2 \right]^{1/2} = + * \pm\left[ f_i + \mathrm{bkg} \right]^{1/2}, \f] + * where \f$ f_i^{\rm c} \f$ is the background corrected histogram, \f$ f_i \f$ the raw histogram + * and \f$ \mathrm{bkg} \f$ the fix given background. + * + * return: + * - true + * + */ +Bool_t PRunAsymmetryBNMR::SubtractFixBkg() +{ + Double_t dval; + for (UInt_t i=0; iGetBkgFix(0); + + // keep the error, and make sure that the bin is NOT empty + if (fBackward[i] != 0.0) + dval = TMath::Sqrt(fBackward[i]); + else + dval = 1.0; + fBackwardErr.push_back(dval); + fBackward[i] -= fRunInfo->GetBkgFix(1); + } + + return true; +} + +//-------------------------------------------------------------------------- +// SubtractEstimatedBkg (private) +//-------------------------------------------------------------------------- +/** + *

Subtracts the background which is estimated from a given interval (typically before t0). + * + * The background corrected histogramms are: + * \f$ f_i^{\rm c} = f_i - \mathrm{bkg} \f$, where \f$ f_i \f$ is the raw data histogram, + * \f$ \mathrm{bkg} \f$ the background estimate, and \f$ f_i^{\rm c} \f$ background corrected + * histogram. The error on \f$ f_i^{\rm c} \f$ is + * \f[ \Delta f_i^{\rm c} = \pm \sqrt{ (\Delta f_i)^2 + (\Delta \mathrm{bkg})^2 } = + * \pm \sqrt{f_i + (\Delta \mathrm{bkg})^2} \f] + * The background error \f$ \Delta \mathrm{bkg} \f$ is + * \f[ \Delta \mathrm{bkg} = \pm\frac{1}{N}\left[\sum_{i=0}^N (\Delta f_i)^2\right]^{1/2} = + * \pm\frac{1}{N}\left[\sum_{i=0}^N f_i \right]^{1/2},\f] + * where \f$N\f$ is the number of bins over which the background is formed. + * + * return: + * - true + */ +Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() +{ + Double_t beamPeriod = 0.0; + + // check if data are from PSI, RAL, or TRIUMF + if (fRunInfo->GetInstitute()->Contains("psi")) + beamPeriod = ACCEL_PERIOD_PSI; + else if (fRunInfo->GetInstitute()->Contains("ral")) + beamPeriod = ACCEL_PERIOD_RAL; + else if (fRunInfo->GetInstitute()->Contains("triumf")) + beamPeriod = ACCEL_PERIOD_TRIUMF; + else + beamPeriod = 0.0; + + // check if start and end are in proper order + Int_t start[2] = {fRunInfo->GetBkgRange(0), fRunInfo->GetBkgRange(2)}; + Int_t end[2] = {fRunInfo->GetBkgRange(1), fRunInfo->GetBkgRange(3)}; + for (UInt_t i=0; i<2; i++) { + if (end[i] < start[i]) { + cout << endl << "PRunAsymmetryBNMR::SubtractEstimatedBkg(): end = " << end[i] << " > start = " << start[i] << "! Will swap them!"; + UInt_t keep = end[i]; + end[i] = start[i]; + start[i] = keep; + } + } + + // calculate proper background range + for (UInt_t i=0; i<2; i++) { + if (beamPeriod != 0.0) { + Double_t timeBkg = (Double_t)(end[i]-start[i])*(fTimeResolution*fPacking); // length of the background intervall in time + UInt_t fullCycles = (UInt_t)(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall + // correct the end of the background intervall such that the background is as close as possible to a multiple of the proton cylce + end[i] = start[i] + (UInt_t) ((fullCycles*beamPeriod)/(fTimeResolution*fPacking)); + cout << "PRunAsymmetryBNMR::SubtractEstimatedBkg(): Background " << start[i] << ", " << end[i] << endl; + if (end[i] == start[i]) + end[i] = fRunInfo->GetBkgRange(2*i+1); + } + } + + // check if start is within histogram bounds + if ((start[0] < 0) || (start[0] >= fForward.size()) || + (start[1] < 0) || (start[1] >= fBackward.size())) { + cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + cerr << endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; + return false; + } + + // check if end is within histogram bounds + if ((end[0] < 0) || (end[0] >= fForward.size()) || + (end[1] < 0) || (end[1] >= fBackward.size())) { + cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + cerr << endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; + return false; + } + + // calculate background + Double_t bkg[2] = {0.0, 0.0}; + Double_t errBkg[2] = {0.0, 0.0}; + + // forward + for (UInt_t i=start[0]; i<=end[0]; i++) + bkg[0] += fForward[i]; + errBkg[0] = TMath::Sqrt(bkg[0])/(end[0] - start[0] + 1); + bkg[0] /= static_cast(end[0] - start[0] + 1); + cout << endl << ">> estimated forward histo background: " << bkg[0]; + + // backward + for (UInt_t i=start[1]; i<=end[1]; i++) + bkg[1] += fBackward[i]; + errBkg[1] = TMath::Sqrt(bkg[1])/(end[1] - start[1] + 1); + bkg[1] /= static_cast(end[1] - start[1] + 1); + cout << endl << ">> estimated backward histo background: " << bkg[1] << endl; + + // correct error for forward, backward + Double_t errVal = 0.0; + for (UInt_t i=0; i 0.0) + errVal = TMath::Sqrt(fForward[i]+errBkg[0]*errBkg[0]); + else + errVal = 1.0; + fForwardErr.push_back(errVal); + if (fBackward[i] > 0.0) + errVal = TMath::Sqrt(fBackward[i]+errBkg[1]*errBkg[1]); + else + errVal = 1.0; + fBackwardErr.push_back(errVal); + } + + // subtract background from data + for (UInt_t i=0; iSetBkgEstimated(bkg[0], 0); + fRunInfo->SetBkgEstimated(bkg[1], 1); + + return true; +} + +//-------------------------------------------------------------------------- +// PrepareFitData (protected) +//-------------------------------------------------------------------------- +/** + *

Take the pre-processed data (i.e. grouping and addrun are preformed) and form the asymmetry for fitting. + * Before forming the asymmetry, the following checks will be performed: + * -# check if data range is given, if not try to estimate one. + * -# check that if a data range is present, that it makes any sense. + * -# check that 'first good bin'-'t0' is the same for forward and backward histogram. If not adjust it. + * -# pack data (rebin). + * -# if packed forward size != backward size, truncate the longer one such that an asymmetry can be formed. + * -# calculate the asymmetry: \f$ A_i = (f_i^c-b_i^c)/(f_i^c+b_i^c) \f$ + * -# calculate the asymmetry errors: \f$ \delta A_i = 2 \sqrt{(b_i^c)^2 (\delta f_i^c)^2 + (\delta b_i^c)^2 (f_i^c)^2}/(f_i^c+b_i^c)^2\f$ + */ +Bool_t PRunAsymmetryBNMR::PrepareFitData() +{ + // transform raw histo data. This is done the following way (for details see the manual): + // first rebin the data, than calculate the asymmetry + + // everything looks fine, hence fill packed forward and backward histo + PRunData forwardPacked; + PRunData backwardPacked; + Double_t value = 0.0; + Double_t error = 0.0; + // forward + for (Int_t i=fGoodBins[0]; i 1 + if (((i-fGoodBins[0]) % fPacking == 0) && (i != fGoodBins[0])) { // fill data + // in order that after rebinning the fit does not need to be redone (important for plots) + // the value is normalize to per bin + value /= fPacking; + forwardPacked.AppendValue(value); + if (value == 0.0) + forwardPacked.AppendErrorValue(1.0); + else + forwardPacked.AppendErrorValue(TMath::Sqrt(error)/fPacking); + value = 0.0; + error = 0.0; + } + value += fForward[i]; + error += fForwardErr[i]*fForwardErr[i]; + } + } + // backward + for (Int_t i=fGoodBins[2]; i 1 + if (((i-fGoodBins[2]) % fPacking == 0) && (i != fGoodBins[2])) { // fill data + // in order that after rebinning the fit does not need to be redone (important for plots) + // the value is normalize to per bin + value /= fPacking; + backwardPacked.AppendValue(value); + if (value == 0.0) + backwardPacked.AppendErrorValue(1.0); + else + backwardPacked.AppendErrorValue(TMath::Sqrt(error)/fPacking); + value = 0.0; + error = 0.0; + } + value += fBackward[i]; + error += fBackwardErr[i]*fBackwardErr[i]; + } + } + + // check if packed forward and backward hist have the same size, otherwise take the minimum size + UInt_t noOfBins = forwardPacked.GetValue()->size(); + if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { + if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) + noOfBins = backwardPacked.GetValue()->size(); + } + + // form asymmetry including error propagation + Double_t asym; + Double_t f, b, ef, eb; + // fill data time start, and step + // data start at data_start-t0 shifted by (pack-1)/2 + fData.SetDataTimeStart(fTimeResolution*((Double_t)fGoodBins[0]-fT0s[0]+(Double_t)(fPacking-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*(Double_t)fPacking); + for (UInt_t i=0; iat(i); + b = backwardPacked.GetValue()->at(i); + ef = forwardPacked.GetError()->at(i); + eb = backwardPacked.GetError()->at(i); + // check that there are indeed bins + if (f+b != 0.0) + asym = (f-b) / (f+b); + else + asym = 0.0; + fData.AppendValue(asym); + // calculate the error + if (f+b != 0.0) + error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); + else + error = 1.0; + fData.AppendErrorValue(error); + } + + CalcNoOfFitBins(); + + // clean up + fForward.clear(); + fForwardErr.clear(); + fBackward.clear(); + fBackwardErr.clear(); + + return true; +} + +//-------------------------------------------------------------------------- +// PrepareViewData (protected) +//-------------------------------------------------------------------------- +/** + *

Take the pre-processed data (i.e. grouping and addrun are preformed) and form the asymmetry for view representation. + * Before forming the asymmetry, the following checks will be performed: + * -# check if view packing is whished. + * -# check if data range is given, if not try to estimate one. + * -# check that data range is present, that it makes any sense. + * -# check that 'first good bin'-'t0' is the same for forward and backward histogram. If not adjust it. + * -# pack data (rebin). + * -# if packed forward size != backward size, truncate the longer one such that an asymmetry can be formed. + * -# calculate the asymmetry: \f$ A_i = (\alpha f_i^c-b_i^c)/(\alpha \beta f_i^c+b_i^c) \f$ + * -# calculate the asymmetry errors: \f$ \delta A_i = 2 \sqrt{(b_i^c)^2 (\delta f_i^c)^2 + (\delta b_i^c)^2 (f_i^c)^2}/(f_i^c+b_i^c)^2\f$ + * -# calculate the theory vector. + * + * \param runData raw run data needed to perform some crosschecks + * \param histoNo histogram number (within a run). histoNo[0]: forward histogram number, histNo[1]: backward histogram number + */ +Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]) +{ + // check if view_packing is wished + Int_t packing = fPacking; + if (fMsrInfo->GetMsrPlotList()->at(0).fViewPacking > 0) { + packing = fMsrInfo->GetMsrPlotList()->at(0).fViewPacking; + } + + // feed the parameter vector + std::vector par; + PMsrParamList *paramList = fMsrInfo->GetMsrParamList(); + for (UInt_t i=0; isize(); i++) + par.push_back((*paramList)[i].fValue); + + // transform raw histo data. This is done the following way (for details see the manual): + // first rebin the data, than calculate the asymmetry + + // first get start data, end data, and t0 + Int_t start[2] = {fGoodBins[0], fGoodBins[2]}; + Int_t end[2] = {fGoodBins[1], fGoodBins[3]}; + Int_t t0[2] = {(Int_t)fT0s[0], (Int_t)fT0s[1]}; + + // check if the data ranges and t0's between forward/backward are compatible + Int_t fgb[2]; + if (start[0]-t0[0] != start[1]-t0[1]) { // wrong fgb aligning + if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { + fgb[0] = start[0]; + fgb[1] = t0[1] + start[0]-t0[0]; + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **WARNING** needed to shift backward fgb from "; + cerr << start[1] << " to " << fgb[1] << endl; + } else { + fgb[0] = t0[0] + start[1]-t0[1]; + fgb[1] = start[1]; + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **WARNING** needed to shift forward fgb from "; + cerr << start[0] << " to " << fgb[0] << endl; + } + } else { // fgb aligning is correct + fgb[0] = start[0]; + fgb[1] = start[1]; + } + + Int_t val = fgb[0]-packing*(fgb[0]/packing); + do { + if (fgb[1] - fgb[0] < 0) + val += packing; + } while (val + fgb[1] - fgb[0] < 0); + + start[0] = val; + start[1] = val + fgb[1] - fgb[0]; + + // make sure that there are equal number of rebinned bins in forward and backward + UInt_t noOfBins0 = (runData->GetDataBin(histoNo[0])->size()-start[0])/packing; + UInt_t noOfBins1 = (runData->GetDataBin(histoNo[1])->size()-start[1])/packing; + if (noOfBins0 > noOfBins1) + noOfBins0 = noOfBins1; + end[0] = start[0] + noOfBins0 * packing; + end[1] = start[1] + noOfBins0 * packing; + + // check if start, end, and t0 make any sense + // 1st check if start and end are in proper order + for (UInt_t i=0; i<2; i++) { + if (end[i] < start[i]) { // need to swap them + Int_t keep = end[i]; + end[i] = start[i]; + start[i] = keep; + } + // 2nd check if start is within proper bounds + if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 3rd check if end is within proper bounds + if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 4th check if t0 is within proper bounds + if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** t0 data bin doesn't make any sense!"; + cerr << endl; + return false; + } + } + + // everything looks fine, hence fill packed forward and backward histo + PRunData forwardPacked; + PRunData backwardPacked; + Double_t value = 0.0; + Double_t error = 0.0; + + // forward + for (Int_t i=start[0]; i 1 + if (((i-start[0]) % packing == 0) && (i != start[0])) { // fill data + // in order that after rebinning the fit does not need to be redone (important for plots) + // the value is normalize to per bin + value /= packing; + forwardPacked.AppendValue(value); + if (value == 0.0) + forwardPacked.AppendErrorValue(1.0); + else + forwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); + value = 0.0; + error = 0.0; + } + value += fForward[i]; + error += fForwardErr[i]*fForwardErr[i]; + } + } + + // backward + for (Int_t i=start[1]; i 1 + if (((i-start[1]) % packing == 0) && (i != start[1])) { // fill data + // in order that after rebinning the fit does not need to be redone (important for plots) + // the value is normalize to per bin + value /= packing; + backwardPacked.AppendValue(value); + if (value == 0.0) + backwardPacked.AppendErrorValue(1.0); + else + backwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); + value = 0.0; + error = 0.0; + } + value += fBackward[i]; + error += fBackwardErr[i]*fBackwardErr[i]; + } + } + + // check if packed forward and backward hist have the same size, otherwise take the minimum size + UInt_t noOfBins = forwardPacked.GetValue()->size(); + if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { + if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) + noOfBins = backwardPacked.GetValue()->size(); + } + + // form asymmetry including error propagation + Double_t asym; + Double_t f, b, ef, eb, alpha = 1.0, beta = 1.0; + // set data time start, and step + // data start at data_start-t0 + fData.SetDataTimeStart(fTimeResolution*((Double_t)start[0]-t0[0]+(Double_t)(packing-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*(Double_t)packing); + + // get the proper alpha and beta + switch (fAlphaBetaTag) { + case 1: // alpha == 1, beta == 1 + alpha = 1.0; + beta = 1.0; + break; + case 2: // alpha != 1, beta == 1 + alpha = par[fRunInfo->GetAlphaParamNo()-1]; + beta = 1.0; + break; + case 3: // alpha == 1, beta != 1 + alpha = 1.0; + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; + case 4: // alpha != 1, beta != 1 + alpha = par[fRunInfo->GetAlphaParamNo()-1]; + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; + default: + break; + } + + for (UInt_t i=0; isize(); i++) { + // to make the formulae more readable + f = forwardPacked.GetValue()->at(i); + b = backwardPacked.GetValue()->at(i); + ef = forwardPacked.GetError()->at(i); + eb = backwardPacked.GetError()->at(i); + // check that there are indeed bins + if (f+b != 0.0) + asym = (alpha*f-b) / (alpha*beta*f+b); + else + asym = 0.0; + fData.AppendValue(asym); + // calculate the error + if (f+b != 0.0) + error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); + else + error = 1.0; + fData.AppendErrorValue(error); + } + + CalcNoOfFitBins(); + + // clean up + fForward.clear(); + fForwardErr.clear(); + fBackward.clear(); + fBackwardErr.clear(); + + // fill theory vector for kView + // calculate functions + for (Int_t i=0; iGetNoOfFuncs(); i++) { + fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); + } + + // calculate theory + Double_t time; + UInt_t size = runData->GetDataBin(histoNo[0])->size(); + Double_t factor = 1.0; + if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo[0])->size()) { + size = fData.GetValue()->size() * 10; + factor = (Double_t)runData->GetDataBin(histoNo[0])->size() / (Double_t)size; + } + fData.SetTheoryTimeStart(fData.GetDataTimeStart()); + fData.SetTheoryTimeStep(fTimeResolution*factor); + for (UInt_t i=0; iFunc(time, par, fFuncValues); + if (fabs(value) > 10.0) { // dirty hack needs to be fixed!! + value = 0.0; + } + fData.AppendTheoryValue(value); + } + + // clean up + par.clear(); + + return true; +} + +//-------------------------------------------------------------------------- +// PrepareRRFViewData (protected) +//-------------------------------------------------------------------------- +/** + *

Prepares the RRF data set for visual representation. This is done the following way: + * -# make all necessary checks + * -# build the asymmetry, \f$ A(t) \f$, WITHOUT packing. + * -# \f$ A_R(t) = A(t) \cdot 2 \cos(\omega_R t + \phi_R) \f$ + * -# do the packing of \f$ A_R(t) \f$ + * -# calculate theory, \f$ T(t) \f$, as close as possible to the time resolution [compatible with the RRF frequency] + * -# \f$ T_R(t) = T(t) \cdot 2 \cos(\omega_R t + \phi_R) \f$ + * -# do the packing of \f$ T_R(t) \f$ + * -# calculate the Kaiser FIR filter coefficients + * -# filter \f$ T_R(t) \f$. + * + * \param runData raw run data needed to perform some crosschecks + * \param histoNo array of the histo numbers form which to build the asymmetry + */ +Bool_t PRunAsymmetryBNMR::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]) +{ + // feed the parameter vector + std::vector par; + PMsrParamList *paramList = fMsrInfo->GetMsrParamList(); + for (UInt_t i=0; isize(); i++) + par.push_back((*paramList)[i].fValue); + + // ------------------------------------------------------------ + // 1. make all necessary checks + // ------------------------------------------------------------ + + // first get start data, end data, and t0 + Int_t start[2] = {fGoodBins[0], fGoodBins[2]}; + Int_t end[2] = {fGoodBins[1], fGoodBins[3]}; + Int_t t0[2] = {(Int_t)fT0s[0], (Int_t)fT0s[1]}; + UInt_t packing = fMsrInfo->GetMsrPlotList()->at(0).fRRFPacking; + + // check if the data ranges and t0's between forward/backward are compatible + Int_t fgb[2]; + if (start[0]-t0[0] != start[1]-t0[1]) { // wrong fgb aligning + if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { + fgb[0] = start[0]; + fgb[1] = t0[1] + start[0]-t0[0]; + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **WARNING** needed to shift backward fgb from "; + cerr << start[1] << " to " << fgb[1] << endl; + } else { + fgb[0] = t0[0] + start[1]-t0[1]; + fgb[1] = start[1]; + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **WARNING** needed to shift forward fgb from "; + cerr << start[1] << " to " << fgb[0] << endl; + } + } else { // fgb aligning is correct + fgb[0] = start[0]; + fgb[1] = start[1]; + } + + Int_t val = fgb[0]-packing*(fgb[0]/packing); + do { + if (fgb[1] - fgb[0] < 0) + val += packing; + } while (val + fgb[1] - fgb[0] < 0); + + start[0] = val; + start[1] = val + fgb[1] - fgb[0]; + + // make sure that there are equal number of rebinned bins in forward and backward + UInt_t noOfBins0 = runData->GetDataBin(histoNo[0])->size()-start[0]; + UInt_t noOfBins1 = runData->GetDataBin(histoNo[1])->size()-start[1]; + if (noOfBins0 > noOfBins1) + noOfBins0 = noOfBins1; + end[0] = start[0] + noOfBins0; + end[1] = start[1] + noOfBins0; + + // check if start, end, and t0 make any sense + // 1st check if start and end are in proper order + for (UInt_t i=0; i<2; i++) { + if (end[i] < start[i]) { // need to swap them + Int_t keep = end[i]; + end[i] = start[i]; + start[i] = keep; + } + // 2nd check if start is within proper bounds + if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** start data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 3rd check if end is within proper bounds + if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** end data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 4th check if t0 is within proper bounds + if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** t0 data bin doesn't make any sense!"; + cerr << endl; + return false; + } + } + + // ------------------------------------------------------------ + // 2. build the asymmetry [A(t)] WITHOUT packing. + // ------------------------------------------------------------ + + PDoubleVector forward, forwardErr; + PDoubleVector backward, backwardErr; + Double_t error = 0.0; + // forward + for (Int_t i=start[0]; i backward.size()) + noOfBins = backward.size(); + } + + // form asymmetry including error propagation + PDoubleVector asymmetry, asymmetryErr; + Double_t asym; + Double_t f, b, ef, eb, alpha = 1.0, beta = 1.0; + + // get the proper alpha and beta + switch (fAlphaBetaTag) { + case 1: // alpha == 1, beta == 1 + alpha = 1.0; + beta = 1.0; + break; + case 2: // alpha != 1, beta == 1 + alpha = par[fRunInfo->GetAlphaParamNo()-1]; + beta = 1.0; + break; + case 3: // alpha == 1, beta != 1 + alpha = 1.0; + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; + case 4: // alpha != 1, beta != 1 + alpha = par[fRunInfo->GetAlphaParamNo()-1]; + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; + default: + break; + } + + for (UInt_t i=0; iGetMsrPlotList()->at(0).fRRFUnit) { + case RRF_UNIT_kHz: + gammaRRF = TMath::TwoPi()*1.0e-3; + break; + case RRF_UNIT_MHz: + gammaRRF = TMath::TwoPi(); + break; + case RRF_UNIT_Mcs: + gammaRRF = 1.0; + break; + case RRF_UNIT_G: + gammaRRF = GAMMA_BAR_MUON*TMath::TwoPi(); + break; + case RRF_UNIT_T: + gammaRRF = GAMMA_BAR_MUON*TMath::TwoPi()*1.0e4; + break; + default: + gammaRRF = TMath::TwoPi(); + break; + } + wRRF = gammaRRF * fMsrInfo->GetMsrPlotList()->at(0).fRRFFreq; + phaseRRF = fMsrInfo->GetMsrPlotList()->at(0).fRRFPhase / 180.0 * TMath::Pi(); + + for (UInt_t i=0; i(start[0])-t0[0]+static_cast(i)); + asymmetry[i] *= 2.0*TMath::Cos(wRRF*time+phaseRRF); + } + + // ------------------------------------------------------------ + // 4. do the packing of A_R(t) + // ------------------------------------------------------------ + Double_t value = 0.0; + error = 0.0; + for (UInt_t i=0; i(packing-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*static_cast(packing)); + + // ------------------------------------------------------------ + // 5. calculate theory [T(t)] as close as possible to the time resolution [compatible with the RRF frequency] + // 6. T_R(t) = T(t) * 2 cos(w_R t + phi_R) + // ------------------------------------------------------------ + UInt_t rebinRRF = static_cast((TMath::Pi()/2.0/wRRF)/fTimeResolution); // RRF time resolution / data time resolution + fData.SetTheoryTimeStart(fData.GetDataTimeStart()); + fData.SetTheoryTimeStep(TMath::Pi()/2.0/wRRF/rebinRRF); // = theory time resolution as close as possible to the data time resolution compatible with wRRF + + // calculate functions + for (Int_t i=0; iGetNoOfFuncs(); i++) { + fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); + } + + Double_t theoryValue; + for (UInt_t i=0; i(i)*fData.GetTheoryTimeStep(); + theoryValue = fTheory->Func(time, par, fFuncValues); + theoryValue *= 2.0*TMath::Cos(wRRF * time + phaseRRF); + + if (fabs(theoryValue) > 10.0) { // dirty hack needs to be fixed!! + theoryValue = 0.0; + } + + fData.AppendTheoryValue(theoryValue); + } + + // ------------------------------------------------------------ + // 7. do the packing of T_R(t) + // ------------------------------------------------------------ + + PDoubleVector theo; + Double_t dval = 0.0; + for (UInt_t i=0; isize(); i++) { + if ((i % rebinRRF == 0) && (i != 0)) { + theo.push_back(dval/rebinRRF); + dval = 0.0; + } + dval += fData.GetTheory()->at(i); + } + fData.ReplaceTheory(theo); + theo.clear(); + + // set the theory time start and step size + fData.SetTheoryTimeStart(fData.GetTheoryTimeStart()+static_cast(rebinRRF-1)*fData.GetTheoryTimeStep()/2.0); + fData.SetTheoryTimeStep(rebinRRF*fData.GetTheoryTimeStep()); + + // ------------------------------------------------------------ + // 8. calculate the Kaiser FIR filter coefficients + // ------------------------------------------------------------ + CalculateKaiserFilterCoeff(wRRF, 60.0, 0.2); // w_c = wRRF, A = -20 log_10(delta), Delta w / w_c = (w_s - w_p) / (2 w_c) + + // ------------------------------------------------------------ + // 9. filter T_R(t) + // ------------------------------------------------------------ + FilterTheo(); + + // clean up + par.clear(); + forward.clear(); + forwardErr.clear(); + backward.clear(); + backwardErr.clear(); + asymmetry.clear(); + asymmetryErr.clear(); + + return true; +} + +//-------------------------------------------------------------------------- +// GetProperT0 (private) +//-------------------------------------------------------------------------- +/** + *

Get the proper t0 for the single histogram run. + * -# the t0 vector size = number of detectors (grouping) for forward. + * -# initialize t0's with -1 + * -# fill t0's from RUN block + * -# if t0's are missing (i.e. t0 == -1), try to fill from the GLOBAL block. + * -# if t0's are missing, try t0's from the data file + * -# if t0's are missing, try to estimate them + * + * \param runData pointer to the current RUN block entry from the msr-file + * \param globalBlock pointer to the GLOBLA block entry from the msr-file + * \param forwardHistoNo histogram number vector of forward; forwardHistoNo = msr-file forward + redGreen_offset - 1 + * \param backwardHistoNo histogram number vector of backwardward; backwardHistoNo = msr-file backward + redGreen_offset - 1 + * + * return: + * - true if everthing went smooth + * - false, otherwise. + */ +Bool_t PRunAsymmetryBNMR::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlock, PUIntVector &forwardHistoNo, PUIntVector &backwardHistoNo) +{ + // feed all T0's + // first init T0's, T0's are stored as (forward T0, backward T0, etc.) + fT0s.clear(); + fT0s.resize(2*forwardHistoNo.size()); + for (UInt_t i=0; iGetT0BinSize(); i++) { + fT0s[i] = fRunInfo->GetT0Bin(i); + } + + // fill in the missing T0's from the GLOBAL block section (if present) + for (UInt_t i=0; iGetT0BinSize(); i++) { + if (fT0s[i] == -1) { // i.e. not given in the RUN block section + fT0s[i] = globalBlock->GetT0Bin(i); + } + } + + // fill in the missing T0's from the data file, if not already present in the msr-file + for (UInt_t i=0; iGetT0Bin(forwardHistoNo[i]) > 0.0) { + fT0s[2*i] = runData->GetT0Bin(forwardHistoNo[i]); + fRunInfo->SetT0Bin(fT0s[2*i], 2*i); + } + } + for (UInt_t i=0; iGetT0Bin(backwardHistoNo[i]) > 0.0) { + fT0s[2*i+1] = runData->GetT0Bin(backwardHistoNo[i]); + fRunInfo->SetT0Bin(fT0s[2*i+1], 2*i+1); + } + } + + // fill in the T0's gaps, i.e. in case the T0's are NEITHER in the msr-file and NOR in the data file + for (UInt_t i=0; iGetT0BinEstimated(forwardHistoNo[i]); + fRunInfo->SetT0Bin(fT0s[2*i], 2*i); + + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); + cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl; + } + } + for (UInt_t i=0; iGetT0BinEstimated(backwardHistoNo[i]); + fRunInfo->SetT0Bin(fT0s[2*i+1], 2*i+1); + + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); + cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl; + } + } + + // check if t0 is within proper bounds + for (UInt_t i=0; i (Int_t)runData->GetDataBin(forwardHistoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **ERROR** t0 data bin (" << fT0s[2*i] << ") doesn't make any sense!"; + cerr << endl << ">> forwardHistoNo " << forwardHistoNo[i]; + cerr << endl; + return false; + } + if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > (Int_t)runData->GetDataBin(backwardHistoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!"; + cerr << endl << ">> backwardHistoNo " << backwardHistoNo[i]; + cerr << endl; + return false; + } + } + + // check if addrun's are present, and if yes add the necessary t0's + if (fRunInfo->GetRunNameSize() > 1) { // runs to be added present + PRawRunData *addRunData; + fAddT0s.resize(fRunInfo->GetRunNameSize()-1); // resize to the number of addruns + for (UInt_t i=1; iGetRunNameSize(); i++) { + // get run to be added to the main one + addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); + if (addRunData == 0) { // couldn't get run + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + cerr << endl; + return false; + } + + // feed all T0's + // first init T0's, T0's are stored as (forward T0, backward T0, etc.) + fAddT0s[i-1].clear(); + fAddT0s[i-1].resize(2*forwardHistoNo.size()); + for (UInt_t j=0; jGetAddT0BinSize(i); j++) { + fAddT0s[i-1][j] = fRunInfo->GetAddT0Bin(i, j); + } + + // fill in the T0's from the data file, if not already present in the msr-file + for (UInt_t j=0; jGetT0Bin(forwardHistoNo[j]) > 0.0) { + fAddT0s[i-1][2*j] = addRunData->GetT0Bin(forwardHistoNo[j]); + fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j], i-1, 2*j); + } + } + for (UInt_t j=0; jGetT0Bin(backwardHistoNo[j]) > 0.0) { + fAddT0s[i-1][2*j+1] = addRunData->GetT0Bin(backwardHistoNo[j]); + fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j+1], i-1, 2*j+1); + } + } + + // fill in the T0's gaps, i.e. in case the T0's are NOT in the msr-file and NOT in the data file + for (UInt_t j=0; jGetT0BinEstimated(forwardHistoNo[j]); + fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j], i-1, 2*j); + + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl; + } + } + for (UInt_t j=0; jGetT0BinEstimated(backwardHistoNo[j]); + fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j+1], i-1, 2*j+1); + + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl; + } + } + } + } + + return true; +} + +//-------------------------------------------------------------------------- +// GetProperDataRange (private) +//-------------------------------------------------------------------------- +/** + *

Get the proper data range, i.e. first/last good bin (fgb/lgb). + * -# get fgb/lgb from the RUN block + * -# if fgb/lgb still undefined, try to get it from the GLOBAL block + * -# if fgb/lgb still undefined, try to estimate them. + * + * \param runData raw run data needed to perform some crosschecks + * \param histoNo histogram number (within a run). histoNo[0]: forward histogram number, histNo[1]: backward histogram number + * + * return: + * - true if everthing went smooth + * - false, otherwise. + */ +Bool_t PRunAsymmetryBNMR::GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2]) +{ + // first get start/end data + Int_t start[2] = {fRunInfo->GetDataRange(0), fRunInfo->GetDataRange(2)}; + Int_t end[2] = {fRunInfo->GetDataRange(1), fRunInfo->GetDataRange(3)}; + // check if data range has been provided in the RUN block. If not, try the GLOBAL block + if (start[0] == -1) { + start[0] = fMsrInfo->GetMsrGlobal()->GetDataRange(0); + } + if (start[1] == -1) { + start[1] = fMsrInfo->GetMsrGlobal()->GetDataRange(2); + } + if (end[0] == -1) { + end[0] = fMsrInfo->GetMsrGlobal()->GetDataRange(1); + } + if (end[1] == -1) { + end[1] = fMsrInfo->GetMsrGlobal()->GetDataRange(3); + } + + Double_t t0[2] = {fT0s[0], fT0s[1]}; + Int_t offset = (Int_t)(10.0e-3/fTimeResolution); // needed in case first good bin is not given, default = 10ns + + // check if data range has been provided, and if not try to estimate them + if (start[0] < 0) { + start[0] = (Int_t)t0[0]+offset; + fRunInfo->SetDataRange(start[0], 0); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + cerr << endl; + } + if (start[1] < 0) { + start[1] = (Int_t)t0[1]+offset; + fRunInfo->SetDataRange(start[1], 2); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + cerr << endl; + } + if (end[0] < 0) { + end[0] = runData->GetDataBin(histoNo[0])->size(); + fRunInfo->SetDataRange(end[0], 1); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + cerr << endl; + } + if (end[1] < 0) { + end[1] = runData->GetDataBin(histoNo[1])->size(); + fRunInfo->SetDataRange(end[1], 3); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + cerr << endl; + } + + // check if start, end, and t0 make any sense + // 1st check if start and end are in proper order + for (UInt_t i=0; i<2; i++) { + if (end[i] < start[i]) { // need to swap them + Int_t keep = end[i]; + end[i] = start[i]; + start[i] = keep; + } + // 2nd check if start is within proper bounds + if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** start data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 3rd check if end is within proper bounds + if (end[i] < 0) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** end data bin (" << end[i] << ") doesn't make any sense!"; + cerr << endl; + return false; + } + if (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size()) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** end data bin (" << end[i] << ") > histo length (" << (Int_t)runData->GetDataBin(histoNo[i])->size() << ")."; + cerr << endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << endl; + cerr << endl; + end[i] = (Int_t)runData->GetDataBin(histoNo[i])->size()-1; + } + // 4th check if t0 is within proper bounds + if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** t0 data bin doesn't make any sense!"; + cerr << endl; + return false; + } + } + + // check that start-t0 is the same for forward as for backward, otherwise take max(start[i]-t0[i]) + if (fabs(static_cast(start[0])-t0[0]) > fabs(static_cast(start[1])-t0[1])){ + start[1] = static_cast(t0[1] + static_cast(start[0]) - t0[0]); + end[1] = static_cast(t0[1] + static_cast(end[0]) - t0[0]); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange **WARNING** needed to shift backward data range."; + cerr << endl << ">> given: " << fRunInfo->GetDataRange(2) << ", " << fRunInfo->GetDataRange(3); + cerr << endl << ">> used : " << start[1] << ", " << end[1]; + cerr << endl; + } + if (fabs(static_cast(start[0])-t0[0]) < fabs(static_cast(start[1])-t0[1])){ + start[0] = static_cast(t0[0] + static_cast(start[1]) - t0[1]); + end[0] = static_cast(t0[0] + static_cast(end[1]) - t0[1]); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange **WARNING** needed to shift forward data range."; + cerr << endl << ">> given: " << fRunInfo->GetDataRange(0) << ", " << fRunInfo->GetDataRange(1); + cerr << endl << ">> used : " << start[0] << ", " << end[0]; + cerr << endl; + } + + // keep good bins for potential latter use + fGoodBins[0] = start[0]; + fGoodBins[1] = end[0]; + fGoodBins[2] = start[1]; + fGoodBins[3] = end[1]; + + return true; +} + +//-------------------------------------------------------------------------- +// GetProperFitRange (private) +//-------------------------------------------------------------------------- +/** + *

Get the proper fit range. There are two possible fit range commands: + * fit given in (usec), or + * fit fgb+offset_0 lgb-offset_1 given in (bins), therefore it works the following way: + * -# get fit range assuming given in time from RUN block + * -# if fit range in RUN block is given in bins, replace start/end + * -# if fit range is NOT given yet, try fit range assuming given in time from GLOBAL block + * -# if fit range in GLOBAL block is given in bins, replace start/end + * -# if still no fit range is given, use fgb/lgb. + * + * \param globalBlock pointer to the GLOBAL block information form the msr-file. + */ +void PRunAsymmetryBNMR::GetProperFitRange(PMsrGlobalBlock *globalBlock) +{ + // set fit start/end time; first check RUN Block + fFitStartTime = fRunInfo->GetFitRange(0); + fFitEndTime = fRunInfo->GetFitRange(1); + // if fit range is given in bins (and not time), the fit start/end time can be calculated at this point now + if (fRunInfo->IsFitRangeInBin()) { + fFitStartTime = (fGoodBins[0] + fRunInfo->GetFitRangeOffset(0) - fT0s[0]) * fTimeResolution; // (fgb+n0-t0)*dt + fFitEndTime = (fGoodBins[1] - fRunInfo->GetFitRangeOffset(1) - fT0s[0]) * fTimeResolution; // (lgb-n1-t0)*dt + // write these times back into the data structure. This way it is available when writting the log-file + fRunInfo->SetFitRange(fFitStartTime, 0); + fRunInfo->SetFitRange(fFitEndTime, 1); + } + if (fFitStartTime == PMUSR_UNDEFINED) { // fit start/end NOT found in the RUN block, check GLOBAL block + fFitStartTime = globalBlock->GetFitRange(0); + fFitEndTime = globalBlock->GetFitRange(1); + // if fit range is given in bins (and not time), the fit start/end time can be calculated at this point now + if (globalBlock->IsFitRangeInBin()) { + fFitStartTime = (fGoodBins[0] + globalBlock->GetFitRangeOffset(0) - fT0s[0]) * fTimeResolution; // (fgb+n0-t0)*dt + fFitEndTime = (fGoodBins[1] - globalBlock->GetFitRangeOffset(1) - fT0s[0]) * fTimeResolution; // (lgb-n1-t0)*dt + // write these times back into the data structure. This way it is available when writting the log-file + globalBlock->SetFitRange(fFitStartTime, 0); + globalBlock->SetFitRange(fFitEndTime, 1); + } + } + if ((fFitStartTime == PMUSR_UNDEFINED) || (fFitEndTime == PMUSR_UNDEFINED)) { + fFitStartTime = (fGoodBins[0] - fT0s[0]) * fTimeResolution; // (fgb-t0)*dt + fFitEndTime = (fGoodBins[1] - fT0s[0]) * fTimeResolution; // (lgb-t0)*dt + cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << endl; + cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; + } +} diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index dc95aac2..2419521e 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -1054,49 +1054,6 @@ PRunData* PRunListCollection::GetAsymmetryRRF(UInt_t index, EDataSwitch tag) return data; } -//-------------------------------------------------------------------------- -// GetAsymmetryBNMR (public) -//-------------------------------------------------------------------------- -/** - *

Get a processed asymmetry BNMR data set. - * - * return: - * - pointer to the run data set (processed data) if data set is found - * - null pointer otherwise - * - * \param index msr-file run index - * \param tag kIndex -> data at index, kRunNo -> data of given run no - */ -PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) -{ - PRunData *data = 0; - - switch (tag) { - case kIndex: // called from musrfit when dumping the data - if (index > fRunAsymmetryBNMRList.size()) { - cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; - cerr << endl; - return 0; - } - - fRunAsymmetryBNMRList[index]->CalcTheory(); - data = fRunAsymmetryBNMRList[index]->GetData(); - break; - case kRunNo: // called from PMusrCanvas - for (UInt_t i=0; iGetRunNo() == index) { - data = fRunAsymmetryBNMRList[i]->GetData(); - break; - } - } - break; - default: // error - break; - } - - return data; -} - //-------------------------------------------------------------------------- // GetMuMinus (public) //-------------------------------------------------------------------------- diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h new file mode 100644 index 00000000..ec2f80a7 --- /dev/null +++ b/src/include/PRunAsymmetryBNMR.h @@ -0,0 +1,89 @@ +/*************************************************************************** + + PRunAsymmetry.h + + Author: Andreas Suter + e-mail: andreas.suter@psi.ch + +***************************************************************************/ + +/*************************************************************************** + * Copyright (C) 2007-2016 by Andreas Suter * + * andreas.suter@psi.ch * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _PRUNASYMMETRYBNMR_H_ +#define _PRUNASYMMETRYBNMR_H_ + +#include "PRunBase.h" + +//--------------------------------------------------------------------------- +/** + *

Class handling the asymmetry fit. + */ +class PRunAsymmetryBNMR : public PRunBase +{ + public: + PRunAsymmetryBNMR(); + PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag); + virtual ~PRunAsymmetryBNMR(); + + virtual Double_t CalcChiSquare(const std::vector& par); + virtual Double_t CalcChiSquareExpected(const std::vector& par); + virtual Double_t CalcMaxLikelihood(const std::vector& par); + virtual void CalcTheory(); + + virtual UInt_t GetNoOfFitBins(); + + virtual void SetFitRangeBin(const TString fitRange); + + virtual Int_t GetStartTimeBin() { return fStartTimeBin; } + virtual Int_t GetEndTimeBin() { return fEndTimeBin; } + virtual Int_t GetPacking() { return fPacking; } + + protected: + virtual void CalcNoOfFitBins(); + virtual Bool_t PrepareData(); + virtual Bool_t PrepareFitData(); + virtual Bool_t PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]); + virtual Bool_t PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]); + + private: + UInt_t fAlphaBetaTag; ///< \f$ 1 \to \alpha = \beta = 1\f$; \f$ 2 \to \alpha \neq 1, \beta = 1\f$; \f$ 3 \to \alpha = 1, \beta \neq 1\f$; \f$ 4 \to \alpha \neq 1, \beta \neq 1\f$. + UInt_t fNoOfFitBins; ///< number of bins to be be fitted + Int_t fPacking; ///< packing for this particular run. Either given in the RUN- or GLOBAL-block. + + PDoubleVector fForward; ///< forward histo data + PDoubleVector fForwardErr; ///< forward histo errors + PDoubleVector fBackward; ///< backward histo data + PDoubleVector fBackwardErr; ///< backward histo errors + + Int_t fGoodBins[4]; ///< keep first/last good bins. 0=fgb, 1=lgb (forward); 2=fgb, 3=lgb (backward) + + Int_t fStartTimeBin; ///< bin at which the fit starts + Int_t fEndTimeBin; ///< bin at which the fit ends + + Bool_t SubtractFixBkg(); + Bool_t SubtractEstimatedBkg(); + + virtual Bool_t GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlock, PUIntVector &forwardHisto, PUIntVector &backwardHistoNo); + virtual Bool_t GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2]); + virtual void GetProperFitRange(PMsrGlobalBlock *globalBlock); +}; + +#endif // _PRUNASYMMETRYBNMR_H_ From b044d97a55db70074867bbe1b77b4612de836da9 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Thu, 16 Aug 2018 23:17:39 +0200 Subject: [PATCH 34/87] More work towards implementation of beta-NMR asymmetry calculation --- src/classes/PMsrHandler.cpp | 60 +++++++++++++++++++++++++++++ src/classes/PMusrCanvas.cpp | 11 ++++++ src/classes/PRunAsymmetryBNMR.cpp | 1 + src/external/libBNMR/ExpRlx-MUD.msr | 6 +-- src/include/PMusrCanvas.h | 2 +- 5 files changed, 76 insertions(+), 4 deletions(-) diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index 8685c8ba..031c0088 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -1162,6 +1162,9 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) case MSR_PLOT_MU_MINUS: fout << "PLOT " << fPlots[plotNo].fPlotType << " (mu minus plot)" << endl; break; + case MSR_PLOT_BNMR: + fout << "PLOT " << fPlots[plotNo].fPlotType << " (beta-NMR asymmetry plot)" << endl; + break; case MSR_PLOT_NON_MUSR: fout << "PLOT " << fPlots[plotNo].fPlotType << " (non muSR plot)" << endl; break; @@ -2259,6 +2262,9 @@ Int_t PMsrHandler::WriteMsrFile(const Char_t *filename, map *co case MSR_PLOT_MU_MINUS: fout << "PLOT " << fPlots[i].fPlotType << " (mu minus plot)" << endl; break; + case MSR_PLOT_BNMR: + fout << "PLOT " << fPlots[i].fPlotType << " (beta-NMR asymmetry plot)" << endl; + break; case MSR_PLOT_NON_MUSR: fout << "PLOT " << fPlots[i].fPlotType << " (non muSR plot)" << endl; break; @@ -4264,6 +4270,7 @@ Bool_t PMsrHandler::HandlePlotEntry(PMsrLines &lines) case MSR_PLOT_SINGLE_HISTO: // like: runs 1 5 13 case MSR_PLOT_SINGLE_HISTO_RRF: case MSR_PLOT_ASYM: + case MSR_PLOT_BNMR: case MSR_PLOT_ASYM_RRF: case MSR_PLOT_NON_MUSR: case MSR_PLOT_MU_MINUS: @@ -4681,6 +4688,7 @@ Bool_t PMsrHandler::HandlePlotEntry(PMsrLines &lines) cerr << endl << ">> 2=forward-backward asym,"; cerr << endl << ">> 3=forward-backward RRF asym,"; cerr << endl << ">> 4=mu minus single histo,"; + cerr << endl << ">> 5=forward-backward beta-NMR asym,"; cerr << endl << ">> 8=non muSR."; cerr << endl << ">> is the list of runs, e.g. runs 1 3"; cerr << endl << ">> range is optional"; @@ -5532,6 +5540,58 @@ Bool_t PMsrHandler::CheckRunBlockIntegrity() fRuns[i].SetPacking(1); } break; + case PRUN_ASYMMETRY_BNMR: + // check alpha + if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> alpha parameter number missing which is needed for an asymmetry fit."; + cerr << endl << ">> Consider to check the manual ;-)" << endl; + return false; + } + // check that there is a forward parameter number + if (fRuns[i].GetForwardHistoNo() == -1) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> forward histogram number not defined. Necessary for asymmetry fits." << endl; + return false; + } + // check that there is a backward parameter number + if (fRuns[i].GetBackwardHistoNo() == -1) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> backward histogram number not defined. Necessary for asymmetry fits." << endl; + return false; + } + // check fit range + if (!fRuns[i].IsFitRangeInBin()) { // fit range given as times in usec + if ((fRuns[i].GetFitRange(0) == PMUSR_UNDEFINED) || (fRuns[i].GetFitRange(1) == PMUSR_UNDEFINED)) { + if ((fGlobal.GetFitRange(0) == PMUSR_UNDEFINED) || (fGlobal.GetFitRange(1) == PMUSR_UNDEFINED)) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> Fit range is not defined, also NOT present in the GLOBAL block. Necessary for asymmetry fits." << endl; + return false; + } + } + } + // check number of T0's provided + if ((fRuns[i].GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize()) && + (fGlobal.GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize())) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << " in forward. Needs to be fixed." << endl; + cerr << endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << ". Needs to be fixed." << endl; + return false; + } + if ((fRuns[i].GetT0BinSize() > 2*fRuns[i].GetBackwardHistoNoSize()) && + (fGlobal.GetT0BinSize() > 2*fRuns[i].GetBackwardHistoNoSize())) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << " in backward. Needs to be fixed." << endl; + cerr << endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << ". Needs to be fixed." << endl; + return false; + } + // check packing + if ((fRuns[i].GetPacking() == -1) && (fGlobal.GetPacking() == -1)) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **WARNING** in RUN block number " << i+1; + cerr << endl << ">> Packing is neither defined here, nor in the GLOBAL block, will set it to 1." << endl; + fRuns[i].SetPacking(1); + } + break; case PRUN_ASYMMETRY_RRF: // check alpha if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index 7e632b0f..f94af908 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -1618,6 +1618,7 @@ void PMusrCanvas::ExportData(const Char_t *fileName) case MSR_PLOT_SINGLE_HISTO: case MSR_PLOT_SINGLE_HISTO_RRF: case MSR_PLOT_ASYM: + case MSR_PLOT_BNMR: case MSR_PLOT_ASYM_RRF: case MSR_PLOT_MU_MINUS: if (fDifferenceView) { // difference view plot @@ -2778,6 +2779,8 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) // make sure that for asymmetry the y-range is initialized reasonably if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) dataSet.dataRange->SetYRange(-0.4, 0.4); + if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR) + dataSet.dataRange->SetYRange(-0.4, 0.4); // extract necessary range information if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() == 0) && !fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fUseFitRanges) { // no range information at all @@ -2792,6 +2795,7 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) fXmax = end; } if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) || + (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR) || (fMsrHandler->GetMsrRunList()->at(runNo).IsLifetimeCorrected())) { fYRangePresent = true; fYmin = -0.4; @@ -2840,6 +2844,7 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) // make sure that for asymmetry the y-range is initialized reasonably if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) || + (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR) || (fMsrHandler->GetMsrRunList()->at(runNo).IsLifetimeCorrected())) { dataSet.dataRange->SetYRange(-0.4, 0.4); } @@ -4714,6 +4719,9 @@ void PMusrCanvas::PlotData(Bool_t unzoom) case MSR_PLOT_ASYM: yAxisTitle = "Asymmetry"; break; + case MSR_PLOT_BNMR: + yAxisTitle = "Asymmetry"; + break; case MSR_PLOT_MU_MINUS: yAxisTitle = "N(t) per bin"; break; @@ -6136,6 +6144,9 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) case MSR_PLOT_ASYM: yAxisTitle = ""; break; + case MSR_PLOT_BNMR: + yAxisTitle = ""; + break; case MSR_PLOT_MU_MINUS: yAxisTitle = " per bin"; break; diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index b55052a0..a3ff5a29 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -535,6 +535,7 @@ Bool_t PRunAsymmetryBNMR::PrepareData() } // keep the time resolution in (us) + // possibility to rescale for betaNMR fTimeResolution = runData->GetTimeResolution()/1.0e3; cout.precision(10); cout << endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; diff --git a/src/external/libBNMR/ExpRlx-MUD.msr b/src/external/libBNMR/ExpRlx-MUD.msr index ef423491..404a46ef 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx-MUD.msr @@ -24,7 +24,7 @@ fun1 = 0.5 * map1 * map2 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) -fittype 2 (asymmetry fit) +fittype 5 (asymmetry fit) alpha 1 forward 3 backward 4 @@ -37,7 +37,7 @@ fit 0.5 8 packing 5 RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) -fittype 2 (asymmetry fit) +fittype 5 (asymmetry fit) alpha 1 forward 5 backward 6 @@ -57,7 +57,7 @@ HESSE SAVE ############################################################### -PLOT 2 (asymmetry plot) +PLOT 5 (asymmetry plot) runs 1 2 use_fit_ranges view_packing 10 diff --git a/src/include/PMusrCanvas.h b/src/include/PMusrCanvas.h index a3b1cffa..f50b8b57 100644 --- a/src/include/PMusrCanvas.h +++ b/src/include/PMusrCanvas.h @@ -246,7 +246,7 @@ class PMusrCanvas : public TObject, public TQObject Bool_t fDifferenceView; ///< tag showing that the shown data, fourier, are the difference between data and theory Int_t fCurrentPlotView; ///< tag showing what the current plot view is: data, fourier, ... Int_t fPreviousPlotView; ///< tag showing the previous plot view - Int_t fPlotType; ///< plot type tag: -1 == undefined, MSR_PLOT_SINGLE_HISTO == single histogram, MSR_PLOT_ASYM == asymmetry, MSR_PLOT_MU_MINUS == mu minus (not yet implemented), MSR_PLOT_NON_MUSR == non-muSR + Int_t fPlotType; ///< plot type tag: -1 == undefined, MSR_PLOT_SINGLE_HISTO == single histogram, MSR_PLOT_ASYM == asymmetry, MSR_PLOT_BNMR == beta-NMR asymmetry, MSR_PLOT_MU_MINUS == mu minus (not yet implemented), MSR_PLOT_NON_MUSR == non-muSR Int_t fPlotNumber; ///< plot number Bool_t fXRangePresent, fYRangePresent; ///< flag indicating if x-/y-range is present From 758f338972b412296d7cfb503255ca37cdada75d Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 17 Aug 2018 16:08:04 +0200 Subject: [PATCH 35/87] First working duplicate asymmetry class for beta-NMR. --- src/classes/PMusrCanvas.cpp | 4 +- src/classes/PRunListCollection.cpp | 12 +-- src/musrt0.cpp | 164 +++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+), 9 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index f94af908..60d067a2 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -2777,9 +2777,7 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) size = data->GetValue()->size(); dataSet.dataRange->SetXRange(start, end); // full possible range // make sure that for asymmetry the y-range is initialized reasonably - if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) - dataSet.dataRange->SetYRange(-0.4, 0.4); - if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR) + if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) || (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR)) dataSet.dataRange->SetYRange(-0.4, 0.4); // extract necessary range information if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() == 0) && diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index 2419521e..6733062c 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -987,19 +987,19 @@ PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) switch (tag) { case kIndex: // called from musrfit when dumping the data - if (index > fRunAsymmetryList.size()) { + if (index > fRunAsymmetryBNMRList.size()) { cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; cerr << endl; return 0; } - fRunAsymmetryList[index]->CalcTheory(); - data = fRunAsymmetryList[index]->GetData(); + fRunAsymmetryBNMRList[index]->CalcTheory(); + data = fRunAsymmetryBNMRList[index]->GetData(); break; case kRunNo: // called from PMusrCanvas - for (UInt_t i=0; iGetRunNo() == index) { - data = fRunAsymmetryList[i]->GetData(); + for (UInt_t i=0; iGetRunNo() == index) { + data = fRunAsymmetryBNMRList[i]->GetData(); break; } } diff --git a/src/musrt0.cpp b/src/musrt0.cpp index dab51fa7..d300ef7a 100644 --- a/src/musrt0.cpp +++ b/src/musrt0.cpp @@ -636,6 +636,169 @@ Int_t main(Int_t argc, Char_t *argv[]) } } } + break; + case MSR_FITTYPE_BNMR: + if ((runList->at(i).GetRunNameSize() == 1) && (runList->at(i).GetForwardHistoNoSize() == 1)) { // no addruns / no grouping + // handle forward histo + // get histo number + histoNo = runList->at(i).GetForwardHistoNo(); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 0); + // set data range as well if firstGoodBinOffset is given + if (firstGoodBinOffsetPresent) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 0); + runList->at(i).SetDataRange(end, 1); + } + // handle backward histo + // get histo number + histoNo = runList->at(i).GetBackwardHistoNo(); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 1); + // set data range as well if firstGoodBinOffset is given + if (firstGoodBinOffsetPresent) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 2); + runList->at(i).SetDataRange(end, 3); + } + } else if ((runList->at(i).GetRunNameSize() > 1) && (runList->at(i).GetForwardHistoNoSize() == 1)) { // addruns / no grouping + // handle forward histo + // get histo number + histoNo = runList->at(i).GetForwardHistoNo(); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 0); + // set data range as well if firstGoodBinOffset is given + if (firstGoodBinOffsetPresent) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 0); + runList->at(i).SetDataRange(end, 1); + } + // handle addruns + for (UInt_t j=1; jat(i).GetRunNameSize(); j++) { + runName = runList->at(i).GetRunName(j); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetAddT0Bin(t0Bin, j-1, 0); + } + // handle backward histo + // get histo number + histoNo = runList->at(i).GetBackwardHistoNo(); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 1); + // set data range as well if firstGoodBinOffset is given + if (firstGoodBinOffsetPresent) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 2); + runList->at(i).SetDataRange(end, 3); + } + // handle addruns + for (UInt_t j=1; jat(i).GetRunNameSize(); j++) { + runName = runList->at(i).GetRunName(j); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetAddT0Bin(t0Bin, j-1, 1); + } + } else if ((runList->at(i).GetRunNameSize() == 1) && (runList->at(i).GetForwardHistoNoSize() > 1)) { // no addruns / grouping + // handle forward histo + for (UInt_t j=0; jat(i).GetForwardHistoNoSize(); j++) { + // get histo number + histoNo = runList->at(i).GetForwardHistoNo(j); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 2*j); + if (firstGoodBinOffsetPresent && (j==0)) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 0); + runList->at(i).SetDataRange(end, 1); + } + } + // handle backward histo + for (UInt_t j=0; jat(i).GetBackwardHistoNoSize(); j++) { + // get histo number + histoNo = runList->at(i).GetBackwardHistoNo(j); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 2*j+1); + if (firstGoodBinOffsetPresent && (j==0)) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 2); + runList->at(i).SetDataRange(end, 3); + } + } + } else { // addruns / grouping + // handle forward histo + for (UInt_t j=0; jat(i).GetForwardHistoNoSize(); j++) { + // get histo number + histoNo = runList->at(i).GetForwardHistoNo(j); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 2*j); + if (firstGoodBinOffsetPresent && (j==0)) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 0); + runList->at(i).SetDataRange(end, 1); + } + // handle addruns + for (UInt_t k=1; kat(i).GetRunNameSize(); k++) { + runName = runList->at(i).GetRunName(k); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetAddT0Bin(t0Bin, k-1, 2*j); + } + } + // handle backward histo + for (UInt_t j=0; jat(i).GetBackwardHistoNoSize(); j++) { + // get histo number + histoNo = runList->at(i).GetBackwardHistoNo(j); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 2*j+1); + if (firstGoodBinOffsetPresent && (j==0)) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 2); + runList->at(i).SetDataRange(end, 3); + } + // handle addruns + for (UInt_t k=1; kat(i).GetRunNameSize(); k++) { + runName = runList->at(i).GetRunName(k); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetAddT0Bin(t0Bin, k-1, 2*j+1); + } + } + } break; default: break; @@ -797,6 +960,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } break; case MSR_FITTYPE_ASYM: + case MSR_FITTYPE_BNMR: case MSR_FITTYPE_ASYM_RRF: if ((runList->at(i).GetRunNameSize() == 1) && (runList->at(i).GetForwardHistoNoSize() == 1)) { // no addruns / no grouping // feed necessary data forward From ef653c11b234b245faeedbdd628552897dece9c9 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sat, 18 Aug 2018 14:17:41 +0200 Subject: [PATCH 36/87] Resolve conflict from Jonas' commits --- src/external/libBNMR/TBNMR.cpp | 74 +++++++--------------------------- src/external/libBNMR/TBNMR.h | 45 +++++---------------- 2 files changed, 26 insertions(+), 93 deletions(-) diff --git a/src/external/libBNMR/TBNMR.cpp b/src/external/libBNMR/TBNMR.cpp index fb7223bb..b1f7b042 100644 --- a/src/external/libBNMR/TBNMR.cpp +++ b/src/external/libBNMR/TBNMR.cpp @@ -10,8 +10,8 @@ ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2010 by Zaher Salman * - * zaher.salman@psi.ch * + * Copyright (C) 2010 by Zaher Salman * + * zaher.salman@psi.ch * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -20,7 +20,7 @@ * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * 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 * @@ -30,29 +30,15 @@ ***************************************************************************/ #include "TBNMR.h" -#include "TF1.h" -#include "Math/WrappedTF1.h" -#include "Math/GaussIntegrator.h" #define tau_Li 1210 #define gamma_Li 6.3018 // In units kHz/mT #define PI 3.14159265358979323846 #define TWOPI 6.28318530717958647692 -ClassImp(TBNMR) // for the ROOT-dictionary -ClassImp(ExpRlx) +ClassImp(ExpRlx) // for the ROOT-dictionary ClassImp(SExpRlx) -ClassImp(MLRes) -double TBNMR::operator()(double x, const vector &par) const { - assert(par.size()==1); // make sure the number of parameters handed to the function is correct - - double arg(par[0]*x); - - if(!arg) - return 1.0; - return sin(arg)/arg; -} double ExpRlx::operator()(double x, const vector &par) const { assert(par.size()==2); // make sure the number of parameters handed to the function is correct @@ -75,55 +61,25 @@ double ExpRlx::operator()(double x, const vector &par) const { return y; } + +//initialize Integrators +TF1 SExpRlx::sexp1=TF1("sexp", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); +TF1 SExpRlx::sexp2=TF1("sexp", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); + double SExpRlx::operator()(double x, const vector &par) const { assert(par.size()==3); // make sure the number of parameters handed to the function is correct // par[0] time of beam off // par[1] is the relaxation rate // par[2] is the exponent - double tau_p; - double y; - tau_p = (tau_Li/(1.+par[1]*tau_Li)); - - - if ( x >= 0 && x <= par[0] ) { - TF1 sexp("sexp", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); - sexp.SetParameters(x, par[1], par[2],tau_Li); - sexp.SetNpx(1000); - y=sexp.Integral(0.0,x)/(1-exp(-x/tau_Li))/tau_Li; + if ( x >= 0 && x <= par[0] ) { + sexp1.SetParameters(x, par[1], par[2],tau_Li); + return sexp1.Integral(0.0,x)/(1-exp(-x/tau_Li))/tau_Li; } else if ( x > par[0] ) { - TF1 sexp("sexp", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); - sexp.SetParameters(x, par[1], par[2], par[0],tau_Li); - sexp.SetNpx(1000); - y=sexp.Integral(0.0,par[0])/(1-exp(-par[0]/tau_Li))/tau_Li; - } else { - y = 0; + sexp2.SetParameters(x, par[1], par[2], par[0],tau_Li); + return sexp2.Integral(0.0,par[0])/(1-exp(-par[0]/tau_Li))/tau_Li; } - return y; -} - -double MLRes::operator()(double x, const vector &par) const { - assert(par.size()==3); // make sure the number of parameters handed to the function is correct - - // par[0] time of beam off - // par[1] is the relaxation rate - // par[2] is the exponent - double y; - - if ( x >= 0 && x <= par[0] ) { - TF1 sexp("sexp", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 10000.0); - sexp.SetParameters(x, par[1], par[2],tau_Li); - sexp.SetNpx(1000); - y=sexp.Integral(0.0,x)/(1-exp(-x/tau_Li))/tau_Li; - } else if ( x > par[0] ) { - TF1 sexp("sexp", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 10000.0); - sexp.SetParameters(x, par[1], par[2], par[0],tau_Li); - sexp.SetNpx(1000); - y=sexp.Integral(0.0,par[0])/(1-exp(-par[0]/tau_Li))/tau_Li; - } else { - y = 0; - } - return y; + return 0; } diff --git a/src/external/libBNMR/TBNMR.h b/src/external/libBNMR/TBNMR.h index 2304ff99..24d95172 100644 --- a/src/external/libBNMR/TBNMR.h +++ b/src/external/libBNMR/TBNMR.h @@ -31,29 +31,18 @@ #include "PUserFcnBase.h" +#include "TF1.h" +#include "Math/WrappedTF1.h" +#include "Math/GaussIntegrator.h" #include #include #include +#ifndef LIBBNMRH +#define LIBBNMRH + using namespace std; -class TBNMR : public PUserFcnBase { - -public: - // default constructor and destructor - TBNMR(){} - ~TBNMR(){} - - Bool_t NeedGlobalPart() const { return false; } - void SetGlobalPart(vector &globalPart, UInt_t idx) { } - Bool_t GlobalPartIsValid() const { return true; } - - // function operator - double operator()(double, const vector&) const; - - // definition of the class for the ROOT-dictionary - ClassDef(TBNMR,1) -}; class ExpRlx : public PUserFcnBase { @@ -77,7 +66,7 @@ class SExpRlx : public PUserFcnBase { public: // default constructor and destructor - SExpRlx(){} + SExpRlx(){sexp1.SetNpx(1000); sexp2.SetNpx(1000);} ~SExpRlx(){} Bool_t NeedGlobalPart() const { return false; } @@ -86,25 +75,13 @@ public: // function operator double operator()(double, const vector&) const; +private: + static TF1 sexp1; + static TF1 sexp2; // definition of the class for the ROOT-dictionary ClassDef(SExpRlx,1) }; -class MLRes : public PUserFcnBase { -public: - // default constructor and destructor - MLRes(){} - ~MLRes(){} - - Bool_t NeedGlobalPart() const { return false; } - void SetGlobalPart(vector &globalPart, UInt_t idx) { } - Bool_t GlobalPartIsValid() const { return true; } - - // function operator - double operator()(double, const vector&) const; - - // definition of the class for the ROOT-dictionary - ClassDef(MLRes,1) -}; +#endif //LIBBNMRH From e5c1450fc87d0cadc953d93740700bfe1824bd87 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sat, 18 Aug 2018 23:45:28 +0200 Subject: [PATCH 37/87] Fixed chisqr calculation bug in BNMR --- src/classes/PFitterFcn.cpp | 2 ++ src/external/libBNMR/ExpRlx-MUD.msr | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/classes/PFitterFcn.cpp b/src/classes/PFitterFcn.cpp index 07c4831a..378fd55d 100644 --- a/src/classes/PFitterFcn.cpp +++ b/src/classes/PFitterFcn.cpp @@ -80,6 +80,7 @@ Double_t PFitterFcn::operator()(const std::vector& par) const value += fRunListCollection->GetSingleHistoRRFChisq(par); value += fRunListCollection->GetAsymmetryChisq(par); value += fRunListCollection->GetAsymmetryRRFChisq(par); + value += fRunListCollection->GetAsymmetryBNMRChisq(par); value += fRunListCollection->GetMuMinusChisq(par); value += fRunListCollection->GetNonMusrChisq(par); } else { // max likelihood @@ -87,6 +88,7 @@ Double_t PFitterFcn::operator()(const std::vector& par) const value += fRunListCollection->GetSingleHistoRRFMaximumLikelihood(par); value += fRunListCollection->GetAsymmetryMaximumLikelihood(par); value += fRunListCollection->GetAsymmetryRRFMaximumLikelihood(par); + value += fRunListCollection->GetAsymmetryBNMRMaximumLikelihood(par); value += fRunListCollection->GetMuMinusMaximumLikelihood(par); value += fRunListCollection->GetNonMusrMaximumLikelihood(par); } diff --git a/src/external/libBNMR/ExpRlx-MUD.msr b/src/external/libBNMR/ExpRlx-MUD.msr index 404a46ef..da4e9a70 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx-MUD.msr @@ -24,7 +24,7 @@ fun1 = 0.5 * map1 * map2 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) -fittype 5 (asymmetry fit) +fittype 5 (beta-NMR fit) alpha 1 forward 3 backward 4 @@ -37,7 +37,7 @@ fit 0.5 8 packing 5 RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) -fittype 5 (asymmetry fit) +fittype 5 (beta-NMR fit) alpha 1 forward 5 backward 6 @@ -57,7 +57,7 @@ HESSE SAVE ############################################################### -PLOT 5 (asymmetry plot) +PLOT 5 (beta-NMR asymmetry plot) runs 1 2 use_fit_ranges view_packing 10 @@ -68,9 +68,9 @@ FOURIER units MHz # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s' fourier_power 12 apodization STRONG # NONE, WEAK, MEDIUM, STRONG -plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE +plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2015-04-14 11:00:19 +STATISTIC --- 2018-08-18 23:43:35 chisq = 399.5, NDF = 290, chisq/NDF = 1.377736 From 782451e825694cec49b4c3144979a45bc84d1649 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sun, 19 Aug 2018 23:37:48 +0200 Subject: [PATCH 38/87] Start substract asymmetry implementation. --- src/classes/PRunAsymmetryBNMR.cpp | 738 +++++++++++------------------- src/include/PRunAsymmetryBNMR.h | 12 +- 2 files changed, 286 insertions(+), 464 deletions(-) diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index a3ff5a29..07bb2c3c 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -164,10 +164,15 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD */ PRunAsymmetryBNMR::~PRunAsymmetryBNMR() { - fForward.clear(); - fForwardErr.clear(); - fBackward.clear(); - fBackwardErr.clear(); + fForwardp.clear(); + fForwardpErr.clear(); + fBackwardp.clear(); + fBackwardpErr.clear(); + + fForwardm.clear(); + fForwardmErr.clear(); + fBackwardm.clear(); + fBackwardmErr.clear(); } //-------------------------------------------------------------------------- @@ -595,32 +600,34 @@ Bool_t PRunAsymmetryBNMR::PrepareData() } // set forward/backward histo data of the first group - fForward.resize(forward[0].size()); - fBackward.resize(backward[0].size()); - for (UInt_t i=0; iGetDataBin(forwardHistoNo[i])->size(); j++) { // loop over the bin indices - // make sure that the index stays within proper range - if ((j+fT0s[2*i]-fT0s[0] >= 0) && (j+fT0s[2*i]-fT0s[0] < runData->GetDataBin(forwardHistoNo[i])->size())) { - fForward[j] += forward[i][j+(Int_t)fT0s[2*i]-(Int_t)fT0s[0]]; - } - } - } + // // group histograms, add all the remaining forward histograms of the group + // for (UInt_t i=1; iGetDataBin(forwardHistoNo[i])->size(); j++) { // loop over the bin indices + // // make sure that the index stays within proper range + // if ((j+fT0s[2*i]-fT0s[0] >= 0) && (j+fT0s[2*i]-fT0s[0] < runData->GetDataBin(forwardHistoNo[i])->size())) { + // fForward[j] += forward[i][j+(Int_t)fT0s[2*i]-(Int_t)fT0s[0]]; + // } + // } + // } - // group histograms, add all the remaining backward histograms of the group - for (UInt_t i=1; iGetDataBin(backwardHistoNo[i])->size(); j++) { // loop over the bin indices - // make sure that the index stays within proper range - if ((j+fT0s[2*i+1]-fT0s[1] >= 0) && (j+fT0s[2*i+1]-fT0s[1] < runData->GetDataBin(backwardHistoNo[i])->size())) { - fBackward[j] += backward[i][j+(Int_t)fT0s[2*i+1]-(Int_t)fT0s[1]]; - } - } - } + // // group histograms, add all the remaining backward histograms of the group + // for (UInt_t i=1; iGetDataBin(backwardHistoNo[i])->size(); j++) { // loop over the bin indices + // // make sure that the index stays within proper range + // if ((j+fT0s[2*i+1]-fT0s[1] >= 0) && (j+fT0s[2*i+1]-fT0s[1] < runData->GetDataBin(backwardHistoNo[i])->size())) { + // fBackward[j] += backward[i][j+(Int_t)fT0s[2*i+1]-(Int_t)fT0s[1]]; + // } + // } + // } // subtract background from histogramms ------------------------------------------ if (fRunInfo->GetBkgFix(0) == PMUSR_UNDEFINED) { // no fixed background given @@ -663,10 +670,7 @@ Bool_t PRunAsymmetryBNMR::PrepareData() status = PrepareFitData(); break; case kView: - if (fMsrInfo->GetMsrPlotList()->at(0).fRRFPacking == 0) - status = PrepareViewData(runData, histoNo); - else - status = PrepareRRFViewData(runData, histoNo); + status = PrepareViewData(runData, histoNo); break; default: status = false; @@ -783,64 +787,90 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() } // check if start is within histogram bounds - if ((start[0] < 0) || (start[0] >= fForward.size()) || - (start[1] < 0) || (start[1] >= fBackward.size())) { + if ((start[0] < 0) || (start[0] >= fForwardp.size()) || + (start[1] < 0) || (start[1] >= fBackwardp.size())) { cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + cerr << endl << ">> histo lengths (f/b) = (" << fForwardp.size() << "/" << fBackwardp.size() << ")."; cerr << endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; return false; } // check if end is within histogram bounds - if ((end[0] < 0) || (end[0] >= fForward.size()) || - (end[1] < 0) || (end[1] >= fBackward.size())) { + if ((end[0] < 0) || (end[0] >= fForwardp.size()) || + (end[1] < 0) || (end[1] >= fBackwardp.size())) { cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + cerr << endl << ">> histo lengths (f/b) = (" << fForwardp.size() << "/" << fBackwardp.size() << ")."; cerr << endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; return false; } // calculate background - Double_t bkg[2] = {0.0, 0.0}; - Double_t errBkg[2] = {0.0, 0.0}; + Double_t bkgp[2] = {0.0, 0.0}; + Double_t errBkgp[2] = {0.0, 0.0}; + Double_t bkgn[2] = {0.0, 0.0}; + Double_t errBkgn[2] = {0.0, 0.0}; // forward - for (UInt_t i=start[0]; i<=end[0]; i++) - bkg[0] += fForward[i]; - errBkg[0] = TMath::Sqrt(bkg[0])/(end[0] - start[0] + 1); - bkg[0] /= static_cast(end[0] - start[0] + 1); - cout << endl << ">> estimated forward histo background: " << bkg[0]; + for (UInt_t i=start[0]; i<=end[0]; i++) { + bkgp[0] += fForwardp[i]; + bkgm[0] += fForwardm[i]; + } + errBkgp[0] = TMath::Sqrt(bkgp[0])/(end[0] - start[0] + 1); + bkgp[0] /= static_cast(end[0] - start[0] + 1); + cout << endl << ">> estimated pos hel forward histo background: " << bkgp[0]; + errBkgm[0] = TMath::Sqrt(bkgp[0])/(end[0] - start[0] + 1); + bkgm[0] /= static_cast(end[0] - start[0] + 1); + cout << endl << ">> estimated neg hel forward histo background: " << bkgm[0]; // backward - for (UInt_t i=start[1]; i<=end[1]; i++) - bkg[1] += fBackward[i]; - errBkg[1] = TMath::Sqrt(bkg[1])/(end[1] - start[1] + 1); - bkg[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated backward histo background: " << bkg[1] << endl; + for (UInt_t i=start[1]; i<=end[1]; i++) { + bkgp[1] += fBackwardp[i]; + bkgm[1] += fBackwardm[i]; + } + errBkgp[1] = TMath::Sqrt(bkgp[1])/(end[1] - start[1] + 1); + bkgp[1] /= static_cast(end[1] - start[1] + 1); + cout << endl << ">> estimated pos hel backward histo background: " << bkgp[1] << endl; + errBkgm[1] = TMath::Sqrt(bkgm[1])/(end[1] - start[1] + 1); + bkgm[1] /= static_cast(end[1] - start[1] + 1); + cout << endl << ">> estimated neg hel backward histo background: " << bkgm[1] << endl; // correct error for forward, backward Double_t errVal = 0.0; - for (UInt_t i=0; i 0.0) - errVal = TMath::Sqrt(fForward[i]+errBkg[0]*errBkg[0]); + for (UInt_t i=0; i 0.0) + errVal = TMath::Sqrt(fForwardp[i]+errBkgp[0]*errBkgp[0]); else errVal = 1.0; - fForwardErr.push_back(errVal); - if (fBackward[i] > 0.0) - errVal = TMath::Sqrt(fBackward[i]+errBkg[1]*errBkg[1]); + fForwardpErr.push_back(errVal); + if (fBackwardp[i] > 0.0) + errVal = TMath::Sqrt(fBackwardp[i]+errBkgp[1]*errBkgp[1]); else errVal = 1.0; - fBackwardErr.push_back(errVal); + fBackwardpErr.push_back(errVal); + if (fForwardm[i] > 0.0) + errVal = TMath::Sqrt(fForwardm[i]+errBkgm[0]*errBkgm[0]); + else + errVal = 1.0; + fForwardmErr.push_back(errVal); + if (fBackwardm[i] > 0.0) + errVal = TMath::Sqrt(fBackwardm[i]+errBkgm[1]*errBkgm[1]); + else + errVal = 1.0; + fBackwardmErr.push_back(errVal); } // subtract background from data - for (UInt_t i=0; iSetBkgEstimated(bkg[0], 0); - fRunInfo->SetBkgEstimated(bkg[1], 1); + fRunInfo->SetBkgEstimated(bkgp[0], 0); + fRunInfo->SetBkgEstimated(bkgp[1], 1); + fRunInfo->SetBkgEstimated(bkgm[0], 3); + fRunInfo->SetBkgEstimated(bkgm[1], 4); return true; } @@ -865,96 +895,143 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() // first rebin the data, than calculate the asymmetry // everything looks fine, hence fill packed forward and backward histo - PRunData forwardPacked; - PRunData backwardPacked; - Double_t value = 0.0; - Double_t error = 0.0; + PRunData forwardpPacked; + PRunData backwardpPacked; + PRunData forwardmPacked; + PRunData backwarmpPacked; + Double_t valuep = 0.0; + Double_t errorp = 0.0; + Double_t valuem = 0.0; + Double_t errorm = 0.0; // forward for (Int_t i=fGoodBins[0]; i 1 if (((i-fGoodBins[0]) % fPacking == 0) && (i != fGoodBins[0])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin - value /= fPacking; - forwardPacked.AppendValue(value); - if (value == 0.0) - forwardPacked.AppendErrorValue(1.0); - else - forwardPacked.AppendErrorValue(TMath::Sqrt(error)/fPacking); - value = 0.0; - error = 0.0; + valuep /= fPacking; + valuem /= fPacking; + forwardpPacked.AppendValue(valuep); + forwardmPacked.AppendValue(valuem); + if (valuep == 0.0) { + forwardpPacked.AppendErrorValue(1.0); + } else { + forwardpPacked.AppendErrorValue(TMath::Sqrt(errorp)/fPacking); + } + if (valuem == 0.0) { + forwardmPacked.AppendErrorValue(1.0); + } else { + forwardmPacked.AppendErrorValue(TMath::Sqrt(errorm)/fPacking); + } + valuep = 0.0; + errorp = 0.0; + valuem = 0.0; + errorm = 0.0; } - value += fForward[i]; - error += fForwardErr[i]*fForwardErr[i]; + valuep += fForwardp[i]; + errorp += fForwardpErr[i]*fForwardpErr[i]; + valuem += fForwardm[i]; + errorm += fForwardmErr[i]*fForwardmErr[i]; } } // backward for (Int_t i=fGoodBins[2]; i 1 if (((i-fGoodBins[2]) % fPacking == 0) && (i != fGoodBins[2])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin - value /= fPacking; - backwardPacked.AppendValue(value); - if (value == 0.0) - backwardPacked.AppendErrorValue(1.0); - else - backwardPacked.AppendErrorValue(TMath::Sqrt(error)/fPacking); - value = 0.0; - error = 0.0; + valuep /= fPacking; + valuem /= fPacking; + backwardpPacked.AppendValue(valuep); + backwardmPacked.AppendValue(valuem); + if (valuep == 0.0) { + backwardpPacked.AppendErrorValue(1.0); + } else { + backwardpPacked.AppendErrorValue(TMath::Sqrt(errorp)/fPacking); + } + if (valuem == 0.0) { + backwardmPacked.AppendErrorValue(1.0); + } else { + backwardmPacked.AppendErrorValue(TMath::Sqrt(errorm)/fPacking); + } + valuep = 0.0; + errorp = 0.0; + valuem = 0.0; + errorm = 0.0; } - value += fBackward[i]; - error += fBackwardErr[i]*fBackwardErr[i]; + valuep += fBackwardp[i]; + errorp += fBackwardpErr[i]*fBackwardpErr[i]; + valuem += fBackwardm[i]; + errorm += fBackwardmErr[i]*fBackwardmErr[i]; } } // check if packed forward and backward hist have the same size, otherwise take the minimum size - UInt_t noOfBins = forwardPacked.GetValue()->size(); - if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { - if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) - noOfBins = backwardPacked.GetValue()->size(); + UInt_t noOfBins = forwardpPacked.GetValue()->size(); + if (forwardpPacked.GetValue()->size() != backwardpPacked.GetValue()->size()) { + if (forwardpPacked.GetValue()->size() > backwardpPacked.GetValue()->size()) + noOfBins = backwardpPacked.GetValue()->size(); } // form asymmetry including error propagation - Double_t asym; - Double_t f, b, ef, eb; + Double_t asym,error; + Double_t fp, bp, efp, ebp; + Double_t fm, bm, efm, ebm; // fill data time start, and step // data start at data_start-t0 shifted by (pack-1)/2 fData.SetDataTimeStart(fTimeResolution*((Double_t)fGoodBins[0]-fT0s[0]+(Double_t)(fPacking-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*(Double_t)fPacking); for (UInt_t i=0; iat(i); - b = backwardPacked.GetValue()->at(i); - ef = forwardPacked.GetError()->at(i); - eb = backwardPacked.GetError()->at(i); + fp = forwardpPacked.GetValue()->at(i); + bp = backwardpPacked.GetValue()->at(i); + efp = forwardpPacked.GetError()->at(i); + ebp = backwardpPacked.GetError()->at(i); + fm = forwardmPacked.GetValue()->at(i); + bm = backwardmPacked.GetValue()->at(i); + efm = forwardmPacked.GetError()->at(i); + ebm = backwardmPacked.GetError()->at(i); // check that there are indeed bins - if (f+b != 0.0) - asym = (f-b) / (f+b); + if (fp+bp != 0.0) + asym = (fp-bp) / (fp+bp) - (fm-bm) / (fm+bm); else asym = 0.0; fData.AppendValue(asym); // calculate the error - if (f+b != 0.0) - error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); + if (fp+bp != 0.0) + errorp = 2.0/((fp+bp)*(fp+bp))*TMath::Sqrt(bp*bp*efp*efp+ebp*ebp*fp*fp); else - error = 1.0; + errorp = 1.0; + if (fm+bm != 0.0) + errorm = 2.0/((fm+bm)*(fm+bm))*TMath::Sqrt(bm*bm*efm*efm+ebm*ebm*fm*fm); + else + errorp = 1.0; + + error = TMath::Sqrt(errorp*errorp+errorm*errorm); fData.AppendErrorValue(error); } CalcNoOfFitBins(); // clean up - fForward.clear(); - fForwardErr.clear(); - fBackward.clear(); - fBackwardErr.clear(); + fForwardp.clear(); + fForwardpErr.clear(); + fBackwardp.clear(); + fBackwardpErr.clear(); + fForwardm.clear(); + fForwardmErr.clear(); + fBackwardm.clear(); + fBackwardmErr.clear(); return true; } @@ -1065,67 +1142,100 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 } // everything looks fine, hence fill packed forward and backward histo - PRunData forwardPacked; - PRunData backwardPacked; - Double_t value = 0.0; - Double_t error = 0.0; + PRunData forwardpPacked; + PRunData backwardpPacked; + PRunData forwardmPacked; + PRunData backwardmPacked; + Double_t valuep = 0.0; + Double_t errorp = 0.0; + Double_t valuem = 0.0; + Double_t errorm = 0.0; // forward for (Int_t i=start[0]; i 1 if (((i-start[0]) % packing == 0) && (i != start[0])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin - value /= packing; - forwardPacked.AppendValue(value); - if (value == 0.0) - forwardPacked.AppendErrorValue(1.0); - else - forwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); - value = 0.0; - error = 0.0; + valuep /= packing; + forwardpPacked.AppendValue(valuep); + valuem /= packing; + forwardmPacked.AppendValue(valuem); + if (valuep == 0.0) { + forwardpPacked.AppendErrorValue(1.0); + } else { + forwardpPacked.AppendErrorValue(TMath::Sqrt(errorp)/packing); + } + if (valuem == 0.0) { + forwardmPacked.AppendErrorValue(1.0); + } else { + forwardmPacked.AppendErrorValue(TMath::Sqrt(errorm)/packing); + } + valuep = 0.0; + errorp = 0.0; + valuem = 0.0; + errorm = 0.0; } - value += fForward[i]; - error += fForwardErr[i]*fForwardErr[i]; + valuep += fForwardp[i]; + errorp += fForwardpErr[i]*fForwardpErr[i]; + valuem += fForwardm[i]; + errorm += fForwardmErr[i]*fForwardmErr[i]; } } // backward for (Int_t i=start[1]; i 1 if (((i-start[1]) % packing == 0) && (i != start[1])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin - value /= packing; - backwardPacked.AppendValue(value); - if (value == 0.0) - backwardPacked.AppendErrorValue(1.0); - else - backwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); - value = 0.0; - error = 0.0; + valuep /= packing; + valuem /= packing; + backwardpPacked.AppendValue(valuep); + backwardmPacked.AppendValue(valuem); + if (valuep == 0.0) { + backwardpPacked.AppendErrorValue(1.0); + } else { + backwardpPacked.AppendErrorValue(TMath::Sqrt(errorp)/packing); + } + if (valuem == 0.0) { + backwardmPacked.AppendErrorValue(1.0); + } else { + backwardmPacked.AppendErrorValue(TMath::Sqrt(errorm)/packing); + } + valuep = 0.0; + errorp = 0.0; + valuem = 0.0; + errorm = 0.0; } - value += fBackward[i]; - error += fBackwardErr[i]*fBackwardErr[i]; + valuep += fBackwardp[i]; + errorp += fBackwardpErr[i]*fBackwardpErr[i]; + valuem += fBackwardm[i]; + errorm += fBackwardmErr[i]*fBackwardmErr[i]; } } // check if packed forward and backward hist have the same size, otherwise take the minimum size - UInt_t noOfBins = forwardPacked.GetValue()->size(); - if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { - if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) - noOfBins = backwardPacked.GetValue()->size(); + UInt_t noOfBins = forwardpPacked.GetValue()->size(); + if (forwardpPacked.GetValue()->size() != backwardpPacked.GetValue()->size()) { + if (forwardpPacked.GetValue()->size() > backwardpPacked.GetValue()->size()) + noOfBins = backwardpPacked.GetValue()->size(); } // form asymmetry including error propagation Double_t asym; - Double_t f, b, ef, eb, alpha = 1.0, beta = 1.0; + Double_t fp, bp, efp, ebp, alpha = 1.0, beta = 1.0; + Double_t fm, bm, efm, ebm; // set data time start, and step // data start at data_start-t0 fData.SetDataTimeStart(fTimeResolution*((Double_t)start[0]-t0[0]+(Double_t)(packing-1)/2.0)); @@ -1153,33 +1263,46 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 break; } - for (UInt_t i=0; isize(); i++) { + for (UInt_t i=0; isize(); i++) { // to make the formulae more readable - f = forwardPacked.GetValue()->at(i); - b = backwardPacked.GetValue()->at(i); - ef = forwardPacked.GetError()->at(i); - eb = backwardPacked.GetError()->at(i); + fp = forwardpPacked.GetValue()->at(i); + bp = backwardpPacked.GetValue()->at(i); + efp = forwardpPacked.GetError()->at(i); + ebp = backwardpPacked.GetError()->at(i); + fm = forwardmPacked.GetValue()->at(i); + bm = backwardmPacked.GetValue()->at(i); + efm = forwardmPacked.GetError()->at(i); + ebm = backwardmPacked.GetError()->at(i); // check that there are indeed bins - if (f+b != 0.0) - asym = (alpha*f-b) / (alpha*beta*f+b); + if (fp+bp != 0.0) + asym = (alpha*fp-bp) / (alpha*beta*fp+bp) - (alpha*fm-bm) / (alpha*beta*fm+bm); else asym = 0.0; fData.AppendValue(asym); // calculate the error - if (f+b != 0.0) - error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); + if (fp+bp != 0.0) + errorp = 2.0/((fp+bp)*(fp+bp))*TMath::Sqrt(bp*bp*efp*efp+ebp*ebp*fp*fp); else - error = 1.0; + errorp = 1.0; + if (fm+bm != 0.0) + errorm = 2.0/((fm+bm)*(fm+bm))*TMath::Sqrt(bm*bm*efm*efm+ebm*ebm*fm*fm); + else + errorm = 1.0; + error = TMath::Sqrt(errorp*errorp+errorm*errorm); fData.AppendErrorValue(error); } CalcNoOfFitBins(); // clean up - fForward.clear(); - fForwardErr.clear(); - fBackward.clear(); - fBackwardErr.clear(); + fForwardp.clear(); + fForwardpErr.clear(); + fBackwardp.clear(); + fBackwardpErr.clear(); + fForwardm.clear(); + fForwardmErr.clear(); + fBackwardm.clear(); + fBackwardmErr.clear(); // fill theory vector for kView // calculate functions @@ -1212,311 +1335,6 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 return true; } -//-------------------------------------------------------------------------- -// PrepareRRFViewData (protected) -//-------------------------------------------------------------------------- -/** - *

Prepares the RRF data set for visual representation. This is done the following way: - * -# make all necessary checks - * -# build the asymmetry, \f$ A(t) \f$, WITHOUT packing. - * -# \f$ A_R(t) = A(t) \cdot 2 \cos(\omega_R t + \phi_R) \f$ - * -# do the packing of \f$ A_R(t) \f$ - * -# calculate theory, \f$ T(t) \f$, as close as possible to the time resolution [compatible with the RRF frequency] - * -# \f$ T_R(t) = T(t) \cdot 2 \cos(\omega_R t + \phi_R) \f$ - * -# do the packing of \f$ T_R(t) \f$ - * -# calculate the Kaiser FIR filter coefficients - * -# filter \f$ T_R(t) \f$. - * - * \param runData raw run data needed to perform some crosschecks - * \param histoNo array of the histo numbers form which to build the asymmetry - */ -Bool_t PRunAsymmetryBNMR::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]) -{ - // feed the parameter vector - std::vector par; - PMsrParamList *paramList = fMsrInfo->GetMsrParamList(); - for (UInt_t i=0; isize(); i++) - par.push_back((*paramList)[i].fValue); - - // ------------------------------------------------------------ - // 1. make all necessary checks - // ------------------------------------------------------------ - - // first get start data, end data, and t0 - Int_t start[2] = {fGoodBins[0], fGoodBins[2]}; - Int_t end[2] = {fGoodBins[1], fGoodBins[3]}; - Int_t t0[2] = {(Int_t)fT0s[0], (Int_t)fT0s[1]}; - UInt_t packing = fMsrInfo->GetMsrPlotList()->at(0).fRRFPacking; - - // check if the data ranges and t0's between forward/backward are compatible - Int_t fgb[2]; - if (start[0]-t0[0] != start[1]-t0[1]) { // wrong fgb aligning - if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { - fgb[0] = start[0]; - fgb[1] = t0[1] + start[0]-t0[0]; - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **WARNING** needed to shift backward fgb from "; - cerr << start[1] << " to " << fgb[1] << endl; - } else { - fgb[0] = t0[0] + start[1]-t0[1]; - fgb[1] = start[1]; - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **WARNING** needed to shift forward fgb from "; - cerr << start[1] << " to " << fgb[0] << endl; - } - } else { // fgb aligning is correct - fgb[0] = start[0]; - fgb[1] = start[1]; - } - - Int_t val = fgb[0]-packing*(fgb[0]/packing); - do { - if (fgb[1] - fgb[0] < 0) - val += packing; - } while (val + fgb[1] - fgb[0] < 0); - - start[0] = val; - start[1] = val + fgb[1] - fgb[0]; - - // make sure that there are equal number of rebinned bins in forward and backward - UInt_t noOfBins0 = runData->GetDataBin(histoNo[0])->size()-start[0]; - UInt_t noOfBins1 = runData->GetDataBin(histoNo[1])->size()-start[1]; - if (noOfBins0 > noOfBins1) - noOfBins0 = noOfBins1; - end[0] = start[0] + noOfBins0; - end[1] = start[1] + noOfBins0; - - // check if start, end, and t0 make any sense - // 1st check if start and end are in proper order - for (UInt_t i=0; i<2; i++) { - if (end[i] < start[i]) { // need to swap them - Int_t keep = end[i]; - end[i] = start[i]; - start[i] = keep; - } - // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; - return false; - } - // 3rd check if end is within proper bounds - if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** end data bin doesn't make any sense!"; - cerr << endl; - return false; - } - // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** t0 data bin doesn't make any sense!"; - cerr << endl; - return false; - } - } - - // ------------------------------------------------------------ - // 2. build the asymmetry [A(t)] WITHOUT packing. - // ------------------------------------------------------------ - - PDoubleVector forward, forwardErr; - PDoubleVector backward, backwardErr; - Double_t error = 0.0; - // forward - for (Int_t i=start[0]; i backward.size()) - noOfBins = backward.size(); - } - - // form asymmetry including error propagation - PDoubleVector asymmetry, asymmetryErr; - Double_t asym; - Double_t f, b, ef, eb, alpha = 1.0, beta = 1.0; - - // get the proper alpha and beta - switch (fAlphaBetaTag) { - case 1: // alpha == 1, beta == 1 - alpha = 1.0; - beta = 1.0; - break; - case 2: // alpha != 1, beta == 1 - alpha = par[fRunInfo->GetAlphaParamNo()-1]; - beta = 1.0; - break; - case 3: // alpha == 1, beta != 1 - alpha = 1.0; - beta = par[fRunInfo->GetBetaParamNo()-1]; - break; - case 4: // alpha != 1, beta != 1 - alpha = par[fRunInfo->GetAlphaParamNo()-1]; - beta = par[fRunInfo->GetBetaParamNo()-1]; - break; - default: - break; - } - - for (UInt_t i=0; iGetMsrPlotList()->at(0).fRRFUnit) { - case RRF_UNIT_kHz: - gammaRRF = TMath::TwoPi()*1.0e-3; - break; - case RRF_UNIT_MHz: - gammaRRF = TMath::TwoPi(); - break; - case RRF_UNIT_Mcs: - gammaRRF = 1.0; - break; - case RRF_UNIT_G: - gammaRRF = GAMMA_BAR_MUON*TMath::TwoPi(); - break; - case RRF_UNIT_T: - gammaRRF = GAMMA_BAR_MUON*TMath::TwoPi()*1.0e4; - break; - default: - gammaRRF = TMath::TwoPi(); - break; - } - wRRF = gammaRRF * fMsrInfo->GetMsrPlotList()->at(0).fRRFFreq; - phaseRRF = fMsrInfo->GetMsrPlotList()->at(0).fRRFPhase / 180.0 * TMath::Pi(); - - for (UInt_t i=0; i(start[0])-t0[0]+static_cast(i)); - asymmetry[i] *= 2.0*TMath::Cos(wRRF*time+phaseRRF); - } - - // ------------------------------------------------------------ - // 4. do the packing of A_R(t) - // ------------------------------------------------------------ - Double_t value = 0.0; - error = 0.0; - for (UInt_t i=0; i(packing-1)/2.0)); - fData.SetDataTimeStep(fTimeResolution*static_cast(packing)); - - // ------------------------------------------------------------ - // 5. calculate theory [T(t)] as close as possible to the time resolution [compatible with the RRF frequency] - // 6. T_R(t) = T(t) * 2 cos(w_R t + phi_R) - // ------------------------------------------------------------ - UInt_t rebinRRF = static_cast((TMath::Pi()/2.0/wRRF)/fTimeResolution); // RRF time resolution / data time resolution - fData.SetTheoryTimeStart(fData.GetDataTimeStart()); - fData.SetTheoryTimeStep(TMath::Pi()/2.0/wRRF/rebinRRF); // = theory time resolution as close as possible to the data time resolution compatible with wRRF - - // calculate functions - for (Int_t i=0; iGetNoOfFuncs(); i++) { - fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); - } - - Double_t theoryValue; - for (UInt_t i=0; i(i)*fData.GetTheoryTimeStep(); - theoryValue = fTheory->Func(time, par, fFuncValues); - theoryValue *= 2.0*TMath::Cos(wRRF * time + phaseRRF); - - if (fabs(theoryValue) > 10.0) { // dirty hack needs to be fixed!! - theoryValue = 0.0; - } - - fData.AppendTheoryValue(theoryValue); - } - - // ------------------------------------------------------------ - // 7. do the packing of T_R(t) - // ------------------------------------------------------------ - - PDoubleVector theo; - Double_t dval = 0.0; - for (UInt_t i=0; isize(); i++) { - if ((i % rebinRRF == 0) && (i != 0)) { - theo.push_back(dval/rebinRRF); - dval = 0.0; - } - dval += fData.GetTheory()->at(i); - } - fData.ReplaceTheory(theo); - theo.clear(); - - // set the theory time start and step size - fData.SetTheoryTimeStart(fData.GetTheoryTimeStart()+static_cast(rebinRRF-1)*fData.GetTheoryTimeStep()/2.0); - fData.SetTheoryTimeStep(rebinRRF*fData.GetTheoryTimeStep()); - - // ------------------------------------------------------------ - // 8. calculate the Kaiser FIR filter coefficients - // ------------------------------------------------------------ - CalculateKaiserFilterCoeff(wRRF, 60.0, 0.2); // w_c = wRRF, A = -20 log_10(delta), Delta w / w_c = (w_s - w_p) / (2 w_c) - - // ------------------------------------------------------------ - // 9. filter T_R(t) - // ------------------------------------------------------------ - FilterTheo(); - - // clean up - par.clear(); - forward.clear(); - forwardErr.clear(); - backward.clear(); - backwardErr.clear(); - asymmetry.clear(); - asymmetryErr.clear(); - - return true; -} //-------------------------------------------------------------------------- // GetProperT0 (private) diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h index ec2f80a7..3e3201d9 100644 --- a/src/include/PRunAsymmetryBNMR.h +++ b/src/include/PRunAsymmetryBNMR.h @@ -68,10 +68,14 @@ class PRunAsymmetryBNMR : public PRunBase UInt_t fNoOfFitBins; ///< number of bins to be be fitted Int_t fPacking; ///< packing for this particular run. Either given in the RUN- or GLOBAL-block. - PDoubleVector fForward; ///< forward histo data - PDoubleVector fForwardErr; ///< forward histo errors - PDoubleVector fBackward; ///< backward histo data - PDoubleVector fBackwardErr; ///< backward histo errors + PDoubleVector fForwardp; ///< pos hel forward histo data + PDoubleVector fForwardpErr; ///< pos hel forward histo errors + PDoubleVector fBackwardp; ///< pos hel backward histo data + PDoubleVector fBackwardpErr; ///< pos hel backward histo errors + PDoubleVector fForwardm; ///< neg hel forward histo data + PDoubleVector fForwardmErr; ///< neg hel forward histo errors + PDoubleVector fBackwardm; ///< neg hel backward histo data + PDoubleVector fBackwardmErr; ///< neg hel backward histo errors Int_t fGoodBins[4]; ///< keep first/last good bins. 0=fgb, 1=lgb (forward); 2=fgb, 3=lgb (backward) From 52a5bc25b14e79833ac01cbf880eee676ae42236 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sun, 19 Aug 2018 23:40:55 +0200 Subject: [PATCH 39/87] Start substract asymmetry implementation. --- src/include/PRunAsymmetryBNMR.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h index 3e3201d9..a1fc5377 100644 --- a/src/include/PRunAsymmetryBNMR.h +++ b/src/include/PRunAsymmetryBNMR.h @@ -61,7 +61,6 @@ class PRunAsymmetryBNMR : public PRunBase virtual Bool_t PrepareData(); virtual Bool_t PrepareFitData(); virtual Bool_t PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]); - virtual Bool_t PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]); private: UInt_t fAlphaBetaTag; ///< \f$ 1 \to \alpha = \beta = 1\f$; \f$ 2 \to \alpha \neq 1, \beta = 1\f$; \f$ 3 \to \alpha = 1, \beta \neq 1\f$; \f$ 4 \to \alpha \neq 1, \beta \neq 1\f$. From e9ec126d9e3d26e8af69ba96e51655f36b497c92 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 20 Aug 2018 17:51:39 +0200 Subject: [PATCH 40/87] Beta-NMR helicity subtraction seems to work in the new class. Still needs debugging and tests. Some of the changes from Jonas were reverted since SExp does not work otherwise. --- src/classes/PRunAsymmetryBNMR.cpp | 70 ++++++++++++++-------------- src/external/libBNMR/ExpRlx-MUD.msr | 42 ++++++----------- src/external/libBNMR/SExpRlx-MUD.msr | 61 ++++++++++++++++++++++++ src/external/libBNMR/TBNMR.cpp | 42 +++++++---------- src/external/libBNMR/TBNMR.h | 9 ++-- 5 files changed, 131 insertions(+), 93 deletions(-) create mode 100644 src/external/libBNMR/SExpRlx-MUD.msr diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 07bb2c3c..f9aa4cfe 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -539,11 +539,11 @@ Bool_t PRunAsymmetryBNMR::PrepareData() return false; } - // keep the time resolution in (us) + // keep the time resolution in (ms) // possibility to rescale for betaNMR fTimeResolution = runData->GetTimeResolution()/1.0e3; cout.precision(10); - cout << endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; + cout << endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ms)" << endl; // get all the proper t0's and addt0's for the current RUN block if (!GetProperT0(runData, globalBlock, forwardHistoNo, backwardHistoNo)) { @@ -602,6 +602,8 @@ Bool_t PRunAsymmetryBNMR::PrepareData() // set forward/backward histo data of the first group fForwardp.resize(forward[0].size()); fBackwardp.resize(backward[0].size()); + fForwardm.resize(forward[0].size()); + fBackwardm.resize(backward[0].size()); for (UInt_t i=0; iGetDataBin(forwardHistoNo[i])->size(); j++) { // loop over the bin indices - // // make sure that the index stays within proper range - // if ((j+fT0s[2*i]-fT0s[0] >= 0) && (j+fT0s[2*i]-fT0s[0] < runData->GetDataBin(forwardHistoNo[i])->size())) { - // fForward[j] += forward[i][j+(Int_t)fT0s[2*i]-(Int_t)fT0s[0]]; - // } - // } - // } - - // // group histograms, add all the remaining backward histograms of the group - // for (UInt_t i=1; iGetDataBin(backwardHistoNo[i])->size(); j++) { // loop over the bin indices - // // make sure that the index stays within proper range - // if ((j+fT0s[2*i+1]-fT0s[1] >= 0) && (j+fT0s[2*i+1]-fT0s[1] < runData->GetDataBin(backwardHistoNo[i])->size())) { - // fBackward[j] += backward[i][j+(Int_t)fT0s[2*i+1]-(Int_t)fT0s[1]]; - // } - // } - // } - // subtract background from histogramms ------------------------------------------ if (fRunInfo->GetBkgFix(0) == PMUSR_UNDEFINED) { // no fixed background given if (fRunInfo->GetBkgRange(0) >= 0) { // background range given @@ -706,22 +688,40 @@ Bool_t PRunAsymmetryBNMR::PrepareData() Bool_t PRunAsymmetryBNMR::SubtractFixBkg() { Double_t dval; - for (UInt_t i=0; iGetBkgFix(0); + fForwardpErr.push_back(dval); + fForwardp[i] -= fRunInfo->GetBkgFix(0); // keep the error, and make sure that the bin is NOT empty - if (fBackward[i] != 0.0) - dval = TMath::Sqrt(fBackward[i]); + if (fForwardm[i] != 0.0) + dval = TMath::Sqrt(fForwardm[i]); else dval = 1.0; - fBackwardErr.push_back(dval); - fBackward[i] -= fRunInfo->GetBkgFix(1); + fForwardmErr.push_back(dval); + fForwardm[i] -= fRunInfo->GetBkgFix(1); + + // keep the error, and make sure that the bin is NOT empty + if (fBackwardp[i] != 0.0) + dval = TMath::Sqrt(fBackwardp[i]); + else + dval = 1.0; + fBackwardpErr.push_back(dval); + fBackwardp[i] -= fRunInfo->GetBkgFix(2); + + // keep the error, and make sure that the bin is NOT empty + if (fBackwardm[i] != 0.0) + dval = TMath::Sqrt(fBackwardm[i]); + else + dval = 1.0; + fBackwardmErr.push_back(dval); + fBackwardm[i] -= fRunInfo->GetBkgFix(3); } return true; @@ -807,8 +807,8 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() // calculate background Double_t bkgp[2] = {0.0, 0.0}; Double_t errBkgp[2] = {0.0, 0.0}; - Double_t bkgn[2] = {0.0, 0.0}; - Double_t errBkgn[2] = {0.0, 0.0}; + Double_t bkgm[2] = {0.0, 0.0}; + Double_t errBkgm[2] = {0.0, 0.0}; // forward for (UInt_t i=start[0]; i<=end[0]; i++) { @@ -898,7 +898,7 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() PRunData forwardpPacked; PRunData backwardpPacked; PRunData forwardmPacked; - PRunData backwarmpPacked; + PRunData backwardmPacked; Double_t valuep = 0.0; Double_t errorp = 0.0; Double_t valuem = 0.0; @@ -1150,6 +1150,8 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 Double_t errorp = 0.0; Double_t valuem = 0.0; Double_t errorm = 0.0; + Double_t value = 0.0; + Double_t error = 0.0; // forward for (Int_t i=start[0]; i &par) const { assert(par.size()==2); // make sure the number of parameters handed to the function is correct - // par[0] time of beam off - // par[1] is the relaxation rate + // par[0] time of beam on (pulse length) in seconds + // par[1] is the relaxation rate in 1/s double tau_p; - double y; - tau_p = (tau_Li/(1.+par[1]*tau_Li)); - + + // x should be in seconds, otherwise it should be rescaled here if ( x <= par[0] && x >= 0) { - y=(tau_p/tau_Li)*(1-exp(-x/tau_p))/(1-exp(-x/tau_Li)); + return (tau_p/tau_Li)*(1-exp(-x/tau_p))/(1-exp(-x/tau_Li)); } else if ( x > par[0] ){ - y=(tau_p/tau_Li)*(1-exp(-par[0]/tau_p))/(1-exp(-par[0]/tau_Li))*exp(-par[1]*(x-par[0])); - } else { - y = 0; - } - - return y; + return (tau_p/tau_Li)*(1-exp(-par[0]/tau_p))/(1-exp(-par[0]/tau_Li))*exp(-par[1]*(x-par[0])); + } + return 0; } - -//initialize Integrators -TF1 SExpRlx::sexp1=TF1("sexp", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); -TF1 SExpRlx::sexp2=TF1("sexp", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); - double SExpRlx::operator()(double x, const vector &par) const { assert(par.size()==3); // make sure the number of parameters handed to the function is correct - // par[0] time of beam off - // par[1] is the relaxation rate + // par[0] beam of beam on (pulse length) in seconds + // par[1] is the relaxation rate in 1/s // par[2] is the exponent + // x should be in seconds, otherwise it should be rescaled here if ( x >= 0 && x <= par[0] ) { + TF1 sexp1("sexp1", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20.0); sexp1.SetParameters(x, par[1], par[2],tau_Li); + sexp1.SetNpx(1000); return sexp1.Integral(0.0,x)/(1-exp(-x/tau_Li))/tau_Li; } else if ( x > par[0] ) { + TF1 sexp2("sexp2", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20.0); sexp2.SetParameters(x, par[1], par[2], par[0],tau_Li); + sexp2.SetNpx(1000); return sexp2.Integral(0.0,par[0])/(1-exp(-par[0]/tau_Li))/tau_Li; - } + } return 0; } diff --git a/src/external/libBNMR/TBNMR.h b/src/external/libBNMR/TBNMR.h index 24d95172..042feb03 100644 --- a/src/external/libBNMR/TBNMR.h +++ b/src/external/libBNMR/TBNMR.h @@ -41,6 +41,10 @@ #ifndef LIBBNMRH #define LIBBNMRH +#define tau_Li 1.210 // In seconds +#define PI 3.14159265358979323846 +#define TWOPI 6.28318530717958647692 + using namespace std; @@ -66,7 +70,7 @@ class SExpRlx : public PUserFcnBase { public: // default constructor and destructor - SExpRlx(){sexp1.SetNpx(1000); sexp2.SetNpx(1000);} + SExpRlx(){} ~SExpRlx(){} Bool_t NeedGlobalPart() const { return false; } @@ -75,9 +79,6 @@ public: // function operator double operator()(double, const vector&) const; -private: - static TF1 sexp1; - static TF1 sexp2; // definition of the class for the ROOT-dictionary ClassDef(SExpRlx,1) From fa7e74e56096ad354f4c79095e50fee3d922b6ee Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 20 Aug 2018 20:04:43 +0200 Subject: [PATCH 41/87] Remove beta-NMR ascci based templates to avoid confusion. --- src/external/libBNMR/45377.dat | 96 ---------------------------- src/external/libBNMR/ExpRlx.msr | 45 ------------- src/external/libBNMR/SExpRlx-MUD.msr | 14 ++-- src/external/libBNMR/SExpRlx.msr | 46 ------------- 4 files changed, 7 insertions(+), 194 deletions(-) delete mode 100644 src/external/libBNMR/45377.dat delete mode 100644 src/external/libBNMR/ExpRlx.msr delete mode 100644 src/external/libBNMR/SExpRlx.msr diff --git a/src/external/libBNMR/45377.dat b/src/external/libBNMR/45377.dat deleted file mode 100644 index 36f5f791..00000000 --- a/src/external/libBNMR/45377.dat +++ /dev/null @@ -1,96 +0,0 @@ -DATA - 592.75 0.0466642055 0.00075601151 - 693.25 0.042699595 0.0007136273 - 793.75 0.03943051 0.000679583922 - 894.25 0.0366291886 0.000652378784 - 994.75 0.0355316716 0.000664640277 - 1095.25 0.033304272 0.000610910492 - 1195.75 0.0322397741 0.000595454518 - 1296.25 0.0308209315 0.000581648459 - 1396.75 0.0301227967 0.000569861788 - 1497.25 0.0289808195 0.000559611024 - 1597.75 0.0284020831 0.000550685264 - 1698.25 0.0272996592 0.000542785334 - 1798.75 0.0259033059 0.000536112979 - 1899.25 0.0257421462 0.000529928146 - 1999.75 0.0252476607 0.000524276201 - 2100.25 0.0252439822 0.00049508141 - 2200.75 0.0244494569 0.000514789454 - 2301.25 0.0248826473 0.000510792766 - 2401.75 0.0252364689 0.000507093213 - 2502.25 0.024077753 0.000503959631 - 2602.75 0.0239705744 0.000501170092 - 2703.25 0.023648613 0.000498351823 - 2803.75 0.0236132062 0.000496113677 - 2904.25 0.0232728359 0.000494038794 - 3004.75 0.0229806315 0.00049216698 - 3105.25 0.0226408705 0.000490122174 - 3205.75 0.022949639 0.000488517677 - 3306.25 0.0236152274 0.000487206227 - 3406.75 0.022514855 0.000485776619 - 3507.25 0.0232919509 0.000484617162 - 3607.75 0.0227762445 0.000483435077 - 3708.25 0.0225740091 0.000482352785 - 3808.75 0.0217810425 0.000481423643 - 3909.25 0.0210459719 0.000480488676 - 4009.75 0.0200829485 0.0004835672 - 4110.25 0.0144273479 0.000480165881 - 4210.75 0.0104726937 0.000526210282 - 4311.25 0.00977670745 0.000548717033 - 4411.75 0.00734786823 0.000572069626 - 4512.25 0.0071749696 0.000596458669 - 4612.75 0.0061713664 0.000621795033 - 4713.25 0.00457656715 0.000648552578 - 4813.75 0.00253947053 0.000676064828 - 4914.25 0.00298436429 0.000705158693 - 5014.75 0.00520775648 0.000735097152 - 5115.25 0.00372267868 0.000766213043 - 5215.75 0.00284020846 0.000798853062 - 5316.25 0.00158717036 0.000832862333 - 5416.75 0.00200819085 0.000868342561 - 5517.25 0.0044706107 0.000905327348 - 5617.75 0.00135523051 0.000943421323 - 5718.25 0.000261760966 0.000983714257 - 5818.75 0.000210009562 0.00102515713 - 5919.25 -0.000157024642 0.00106890614 - 6019.75 0.000611697915 0.00111378026 - 6120.25 0.000353532075 0.00111004546 - 6220.75 0.00120570511 0.00121565301 - 6321.25 -0.00126499964 0.00126730997 - 6421.75 0.0029594966 0.00132005144 - 6522.25 -0.00180278144 0.00137777581 - 6622.75 0.00154819637 0.00143478041 - 6723.25 0.00137296473 0.00149757271 - 6823.75 -0.000271202669 0.00155948172 - 6924.25 -0.00306837271 0.00162568622 - 7024.75 0.00346602562 0.00169188976 - 7125.25 -8.40576554E-05 0.00176525436 - 7225.75 0.00141055893 0.00183909095 - 7326.25 -0.00170315946 0.00191744238 - 7426.75 0.00399357243 0.00199844555 - 7527.25 0.00378603394 0.00208493839 - 7627.75 -0.0015303158 0.00216992033 - 7728.25 -0.000931658073 0.00226567509 - 7828.75 0.0011671311 0.00235924947 - 7929.25 0.00147725609 0.00245769641 - 8029.75 -0.00100983925 0.00256942322 - 8130.25 -0.00329542124 0.00255286858 - 8230.75 0.000636890228 0.00279597795 - 8331.25 -0.000814018633 0.00291290155 - 8431.75 0.000101912547 0.00303673191 - 8532.25 0.00311038784 0.0031603991 - 8632.75 0.000473049572 0.00329964113 - 8733.25 8.36732E-05 0.00343974064 - 8833.75 0.000275585165 0.00358184548 - 8934.25 0.0059381551 0.00373021006 - 9034.75 -0.0014588358 0.0038926573 - 9135.25 -0.00158156038 0.00405870998 - 9235.75 -0.00125287442 0.00422594705 - 9336.25 -0.00212622165 0.00439704849 - 9436.75 -0.00477056006 0.0045911195 - 9537.25 -0.00229735693 0.00479087708 - 9637.75 0.00575469607 0.00498561109 - 9738.25 -7.52893075E-05 0.00519483122 - 9838.75 -0.00368605583 0.0054198485 - 9939.25 -0.00862419517 0.00564201231 - 10039.75 -0.0323936833 0.0181186246 diff --git a/src/external/libBNMR/ExpRlx.msr b/src/external/libBNMR/ExpRlx.msr deleted file mode 100644 index 2b3f52ac..00000000 --- a/src/external/libBNMR/ExpRlx.msr +++ /dev/null @@ -1,45 +0,0 @@ -Title -############################################################### -FITPARAMETER -# Nr. Name Value Step Pos_Error Boundaries - 1 Asy1 0.0812706 0.00149848 none 0 none - 2 T 4000 0 none 0 none - 3 Lam1 0.00239816 6.05947e-05 none 0 none - -############################################################### -THEORY -asymmetry 1 -userFcn /usr/local/lib/libBNMR.so ExpRlx 2 3 - -############################################################### -RUN 45377 MUE4 PSI ASCII (name beamline institute data-file-format) -fittype 8 (non muSR fit) -map 0 0 0 0 0 0 0 0 0 0 -xy-data 1 2 -fit 0.00 8000.00 -packing 1 - -############################################################### -COMMANDS -STRATEGY 1 -MINIMIZE -#MINOS -SAVE -END RETURN - -############################################################### -PLOT 8 (non muSR plot) -runs 1 -range 0.00 8000.00 - -############################################################### -FOURIER -units MHz # units either 'Gauss', 'MHz', or 'Mc/s' -fourier_power 12 -apodization STRONG # NONE, WEAK, MEDIUM, STRONG -plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE -phase 8.50 -#range FRQMIN FRQMAX -############################################################### -STATISTIC --- 2010-09-02 17:44:20 - chisq = 186.322493286053, NDF = 72, chisq/NDF = 2.5878124067507362 diff --git a/src/external/libBNMR/SExpRlx-MUD.msr b/src/external/libBNMR/SExpRlx-MUD.msr index fd76633d..f689af83 100644 --- a/src/external/libBNMR/SExpRlx-MUD.msr +++ b/src/external/libBNMR/SExpRlx-MUD.msr @@ -5,10 +5,10 @@ FITPARAMETER ############################################################### # No Name Value Err Min Max 1 Alpha 1 0 none - 2 Asy 0.108 0.011 none 0 0.2 + 2 Asy 0.1152 0.0099 none 0 0.2 3 T 1 0 none - 4 Rlx 3.63 0.89 none 0 15000 - 5 Beta 0.452 0.039 none 0.3 2 + 4 Rlx 4.19 0.91 none 0 15000 + 5 Beta 0.432 0.032 none 0.3 2 ############################################################### THEORY @@ -27,12 +27,12 @@ fittype 5 (beta-NMR fit) alpha 1 forward 3 5 backward 4 6 -data 11 800 11 800 +data 11 1000 11 1000 #backgr.fix 0 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 t0 10.0 10.0 10.0 10.0 map 0 0 0 0 0 0 0 0 0 0 -fit 0.5 8 +fit 0.2 10 packing 5 ############################################################### @@ -57,5 +57,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 17:48:41 - chisq = 177.2, NDF = 144, chisq/NDF = 1.230711 +STATISTIC --- 2018-08-20 19:54:17 + chisq = 181.6, NDF = 150, chisq/NDF = 1.210991 diff --git a/src/external/libBNMR/SExpRlx.msr b/src/external/libBNMR/SExpRlx.msr deleted file mode 100644 index 636583f8..00000000 --- a/src/external/libBNMR/SExpRlx.msr +++ /dev/null @@ -1,46 +0,0 @@ -Title -############################################################### -FITPARAMETER -# Nr. Name Value Step Pos_Error Boundaries - 1 Asy1 0.262789 0.0465582 none 0 none - 2 T 4000 0 none 0 none - 3 Lam1 0.0233569 0.0094885 none 0 none - 4 Bet1 0.399259 0.0353915 none 0 none - -############################################################### -THEORY -asymmetry 1 -userFcn /usr/local/lib/libBNMR.so SExpRlx 2 3 4 - -############################################################### -RUN 45377 MUE4 PSI ASCII (name beamline institute data-file-format) -fittype 8 (non muSR fit) -map 0 0 0 0 0 0 0 0 0 0 -xy-data 1 2 -fit 0.00 8000.00 -packing 1 - -############################################################### -COMMANDS -STRATEGY 1 -MINIMIZE -#MINOS -SAVE -END RETURN - -############################################################### -PLOT 8 (non muSR plot) -runs 1 -range 0.00 8000.00 - -############################################################### -FOURIER -units MHz # units either 'Gauss', 'MHz', or 'Mc/s' -fourier_power 12 -apodization STRONG # NONE, WEAK, MEDIUM, STRONG -plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE -phase 8.50 -#range FRQMIN FRQMAX -############################################################### -STATISTIC --- 2010-09-02 17:51:10 - chisq = 93.71265965991455, NDF = 71, chisq/NDF = 1.319896614928374 From af4040228b3cb4cdf2b0d4a0bc8865de8ed4aba9 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 20 Aug 2018 22:04:50 +0200 Subject: [PATCH 42/87] Template files for two helicities and subtracted helicities updated. --- src/external/libBNMR/ExpRlx-hel.msr | 72 ++++++++++++++++++ .../libBNMR/{ExpRlx-MUD.msr => ExpRlx.msr} | 21 ++---- src/external/libBNMR/SExpRlx-hel.msr | 73 +++++++++++++++++++ .../libBNMR/{SExpRlx-MUD.msr => SExpRlx.msr} | 23 ++---- 4 files changed, 160 insertions(+), 29 deletions(-) create mode 100644 src/external/libBNMR/ExpRlx-hel.msr rename src/external/libBNMR/{ExpRlx-MUD.msr => ExpRlx.msr} (77%) create mode 100644 src/external/libBNMR/SExpRlx-hel.msr rename src/external/libBNMR/{SExpRlx-MUD.msr => SExpRlx.msr} (74%) diff --git a/src/external/libBNMR/ExpRlx-hel.msr b/src/external/libBNMR/ExpRlx-hel.msr new file mode 100644 index 00000000..048996bc --- /dev/null +++ b/src/external/libBNMR/ExpRlx-hel.msr @@ -0,0 +1,72 @@ +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s +############################################################### +FITPARAMETER +############################################################### +# No Name Value Err Min Max + 1 Alpha 1.11592 0.00035 none + 2 Asy 0.05869 0.00091 none 0 0.2 + 3 T 1 0 none + 4 Rlx 1.142 0.023 none 0 15000 + 5 One 1 0 none + 6 FlHel -1.047 0.022 none -2 0 + +############################################################### +THEORY +############################################################### +asymmetry fun1 +userFcn .libs/libBNMR.so ExpRlx 3 4 + +############################################################### +FUNCTIONS +############################################################### +fun1 = 0.5 * map1 * map2 + +############################################################### +RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) +fittype 2 (asymmetry fit) +alpha 1 +forward 3 +backward 4 +data 11 1000 11 1000 +background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 +t0 10.0 10.0 10.0 10.0 +map 2 5 0 0 0 0 0 0 0 0 +fit 0.2 9 +packing 5 + +RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) +fittype 2 (asymmetry fit) +alpha 1 +forward 5 +backward 6 +data 11 1000 11 1000 +background 1 9 1 9 # estimated bkg: 11.6250 / 15.6250 +t0 10.0 10.0 10.0 10.0 +map 2 6 0 0 0 0 0 0 0 0 +fit 0.2 9 +packing 5 + +############################################################### +COMMANDS +MINIMIZE +HESSE +SAVE + +############################################################### +PLOT 2 (asymmetry plot) +runs 1 2 +use_fit_ranges +view_packing 10 + + +############################################################### +FOURIER +units MHz # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s' +fourier_power 12 +apodization STRONG # NONE, WEAK, MEDIUM, STRONG +plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL +phase 8 +#range FRQMIN FRQMAX +############################################################### +STATISTIC --- 2018-08-20 22:01:15 + chisq = 566.6, NDF = 346, chisq/NDF = 1.637584 diff --git a/src/external/libBNMR/ExpRlx-MUD.msr b/src/external/libBNMR/ExpRlx.msr similarity index 77% rename from src/external/libBNMR/ExpRlx-MUD.msr rename to src/external/libBNMR/ExpRlx.msr index 909af362..eb356304 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx.msr @@ -1,13 +1,12 @@ - -# Run Numbers: 1111 +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s ############################################################### FITPARAMETER ############################################################### # No Name Value Err Min Max 1 Alpha 1 0 none - 2 Asy 0.05615 0.00073 none + 2 Asy 0.05992 0.00063 none 0 0.2 3 T 1 0 none - 4 Rlx 1.046 0.024 none + 4 Rlx 1.143 0.023 none 0 100 ############################################################### THEORY @@ -15,23 +14,17 @@ THEORY asymmetry 2 userFcn .libs/libBNMR.so ExpRlx 3 4 -############################################################### -#FUNCTIONS -############################################################### -#fun1 = 0.5 * map1 * map2 - ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) fittype 5 (beta-NMR fit) alpha 1 forward 3 5 backward 4 6 -data 11 800 11 800 -#backgr.fix 0 +data 11 1000 11 1000 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 t0 10.0 10.0 10.0 10.0 map 0 0 0 0 0 0 0 0 0 0 -fit 0.5 8 +fit 0.2 9 packing 5 ############################################################### @@ -56,5 +49,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 17:31:40 - chisq = 309.1, NDF = 145, chisq/NDF = 2.131395 +STATISTIC --- 2018-08-20 22:02:02 + chisq = 419.1, NDF = 173, chisq/NDF = 2.422357 diff --git a/src/external/libBNMR/SExpRlx-hel.msr b/src/external/libBNMR/SExpRlx-hel.msr new file mode 100644 index 00000000..7165dd2c --- /dev/null +++ b/src/external/libBNMR/SExpRlx-hel.msr @@ -0,0 +1,73 @@ +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s +############################################################### +FITPARAMETER +############################################################### +# No Name Value Err Min Max + 1 Alpha 1.11589 0.00037 none + 2 Asy 0.1121 0.0094 none 0 0.2 + 3 T 1 0 none + 4 Rlx 4.12 0.87 none 0 15000 + 5 Beta 0.434 0.031 none 0.3 2 + 6 One 1 0 none + 7 FlHel -1.048 0.023 none -2 0 + +############################################################### +THEORY +############################################################### +asymmetry fun1 +userFcn .libs/libBNMR.so SExpRlx 3 4 5 + +############################################################### +FUNCTIONS +############################################################### +fun1 = 0.5 * map1 * map2 + +############################################################### +RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) +fittype 2 (asymmetry fit) +alpha 1 +forward 3 +backward 4 +data 11 1000 11 1000 +background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 +t0 10.0 10.0 10.0 10.0 +map 2 6 0 0 0 0 0 0 0 0 +fit 0.2 9 +packing 5 + +RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) +fittype 2 (asymmetry fit) +alpha 1 +forward 5 +backward 6 +data 11 1000 11 1000 +background 1 9 1 9 # estimated bkg: 11.6250 / 15.6250 +t0 10.0 10.0 10.0 10.0 +map 2 7 0 0 0 0 0 0 0 0 +fit 0.2 9 +packing 5 + +############################################################### +COMMANDS +MINIMIZE +HESSE +SAVE + +############################################################### +PLOT 2 (asymmetry plot) +runs 1 2 +use_fit_ranges +view_packing 10 + + +############################################################### +FOURIER +units MHz # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s' +fourier_power 12 +apodization STRONG # NONE, WEAK, MEDIUM, STRONG +plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL +phase 8 +#range FRQMIN FRQMAX +############################################################### +STATISTIC --- 2018-08-20 21:59:04 + chisq = 358.6, NDF = 345, chisq/NDF = 1.039300 diff --git a/src/external/libBNMR/SExpRlx-MUD.msr b/src/external/libBNMR/SExpRlx.msr similarity index 74% rename from src/external/libBNMR/SExpRlx-MUD.msr rename to src/external/libBNMR/SExpRlx.msr index f689af83..a530e625 100644 --- a/src/external/libBNMR/SExpRlx-MUD.msr +++ b/src/external/libBNMR/SExpRlx.msr @@ -1,14 +1,13 @@ - -# Run Numbers: 1111 +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s ############################################################### FITPARAMETER ############################################################### # No Name Value Err Min Max 1 Alpha 1 0 none - 2 Asy 0.1152 0.0099 none 0 0.2 + 2 Asy 0.1148 0.0096 none 0 0.2 3 T 1 0 none - 4 Rlx 4.19 0.91 none 0 15000 - 5 Beta 0.432 0.032 none 0.3 2 + 4 Rlx 4.16 0.88 none 0 100 + 5 Beta 0.433 0.031 none 0.3 2 ############################################################### THEORY @@ -16,23 +15,17 @@ THEORY asymmetry 2 userFcn .libs/libBNMR.so SExpRlx 3 4 5 -############################################################### -#FUNCTIONS -############################################################### -#fun1 = 0.5 * map1 * map2 - ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) fittype 5 (beta-NMR fit) alpha 1 forward 3 5 backward 4 6 -data 11 1000 11 1000 -#backgr.fix 0 +data 11 1000 11 1000 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 t0 10.0 10.0 10.0 10.0 map 0 0 0 0 0 0 0 0 0 0 -fit 0.2 10 +fit 0.2 9 packing 5 ############################################################### @@ -57,5 +50,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 19:54:17 - chisq = 181.6, NDF = 150, chisq/NDF = 1.210991 +STATISTIC --- 2018-08-20 21:59:14 + chisq = 210.2, NDF = 172, chisq/NDF = 1.222196 From b8dc67fa1adc97c18bc7c19f2a488d5a8df21e20 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 21 Aug 2018 10:32:57 +0200 Subject: [PATCH 43/87] Fix x-axis label bug (reported by Gerland Morris). --- src/classes/PMusrCanvas.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index 60d067a2..a5a3ec2d 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -4690,7 +4690,8 @@ void PMusrCanvas::PlotData(Bool_t unzoom) // set x-axis label PMsrRunList runs = *fMsrHandler->GetMsrRunList(); TString setup = fRunList->GetSetup(*runs[0].GetRunName()); - if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { + // For BNMR/BNQR runs use seconds + if (fPlotType == MSR_PLOT_BNMR) { fHistoFrame->GetXaxis()->SetTitle("time (s)"); } else { fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); @@ -4984,7 +4985,8 @@ void PMusrCanvas::PlotDifference(Bool_t unzoom) // set x-axis label PMsrRunList runs = *fMsrHandler->GetMsrRunList(); TString setup = fRunList->GetSetup(*runs[0].GetRunName()); - if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { + // For BNMR/BNQR runs use seconds + if (fPlotType == MSR_PLOT_BNMR) { fHistoFrame->GetXaxis()->SetTitle("time (s)"); } else { fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); @@ -6105,7 +6107,8 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) if (fCurrentPlotView == PV_DATA) { PMsrRunList runs = *fMsrHandler->GetMsrRunList(); TString setup = fRunList->GetSetup(*runs[0].GetRunName()); - if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { + // For BNMR/BNQR runs use seconds + if (fPlotType == MSR_PLOT_BNMR) { xAxisTitle = TString("time (s)"); } else { xAxisTitle = TString("time (#mus)"); From dfea8334b78612d5bb900f966a6d5a06150fd871 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 24 Aug 2018 13:03:28 +0200 Subject: [PATCH 44/87] Possible fix for alpha problem for beta-NMR asymmetry calculation. To be tested. --- src/classes/PMusrCanvas.cpp | 24 ++++++++++++------------ src/classes/PRunAsymmetryBNMR.cpp | 14 +++++++------- src/classes/PRunListCollection.cpp | 2 +- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index a5a3ec2d..9e607797 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -718,6 +718,18 @@ void PMusrCanvas::UpdateDataTheoryPad() // handle data HandleDataSet(i, runNo, data); break; + case MSR_FITTYPE_BNMR: + data = fRunList->GetAsymmetryBNMR(runNo, PRunListCollection::kRunNo); + if (!data) { // something wrong + fValid = false; + // error message + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a beta-NMR asymmetry plot"; + cerr << endl; + return; + } + // handle data + HandleDataSet(i, runNo, data); + break; case MSR_FITTYPE_ASYM_RRF: data = fRunList->GetAsymmetryRRF(runNo, PRunListCollection::kRunNo); if (!data) { // something wrong @@ -742,18 +754,6 @@ void PMusrCanvas::UpdateDataTheoryPad() // handle data HandleDataSet(i, runNo, data); break; - case MSR_FITTYPE_BNMR: - data = fRunList->GetAsymmetryBNMR(runNo, PRunListCollection::kRunNo); - if (!data) { // something wrong - fValid = false; - // error message - cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a beta-NMR asymmetry plot"; - cerr << endl; - return; - } - // handle data - HandleDataSet(i, runNo, data); - break; case MSR_FITTYPE_NON_MUSR: data = fRunList->GetNonMusr(runNo, PRunListCollection::kRunNo); if (!data) { // something wrong diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index f9aa4cfe..0de439aa 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -222,19 +222,19 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) break; case 2: // alpha != 1, beta == 1 a = par[fRunInfo->GetAlphaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)); + f = fTheory->Func(time, par, fFuncValues)/2; + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); break; case 3: // alpha == 1, beta != 1 b = par[fRunInfo->GetBetaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0)); + f = fTheory->Func(time, par, fFuncValues)/2; + asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0))-f*(b+1.0)/(2.0+f*(b-1.0)); break; case 4: // alpha != 1, beta != 1 a = par[fRunInfo->GetAlphaParamNo()-1]; b = par[fRunInfo->GetBetaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0)); + f = fTheory->Func(time, par, fFuncValues)/2; + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); break; default: asymFcnValue = 0.0; @@ -1276,7 +1276,7 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 efm = forwardmPacked.GetError()->at(i); ebm = backwardmPacked.GetError()->at(i); // check that there are indeed bins - if (fp+bp != 0.0) + if (fp+bp != 0.0) asym = (alpha*fp-bp) / (alpha*beta*fp+bp) - (alpha*fm-bm) / (alpha*beta*fm+bm); else asym = 0.0; diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index 6733062c..4fc9e032 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -972,7 +972,7 @@ PRunData* PRunListCollection::GetAsymmetry(UInt_t index, EDataSwitch tag) // GetAsymmetryBNMR (public) //-------------------------------------------------------------------------- /** - *

Get a processed asymmetry data set. + *

Get a processed asymmetry from beta-NMR data set. * * return: * - pointer to the run data set (processed data) if data set is found From b5f5d26e9c571832ff9308e0d3bb842a833d3189 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 24 Aug 2018 14:08:28 +0200 Subject: [PATCH 45/87] Added estimation for the value of alpha from integrated counts. --- src/classes/PRunAsymmetryBNMR.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 0de439aa..5fa90517 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -903,8 +903,15 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() Double_t errorp = 0.0; Double_t valuem = 0.0; Double_t errorm = 0.0; + + Double_t SumF[2] = {0.0, 0.0}; + Double_t SumB[2] = {0.0, 0.0}; + Double_t alphaest = 1; + // forward for (Int_t i=fGoodBins[0]; i> PRunAsymmetryBNMR::PrepareFitData(): alpha estimate=" << alphaest << endl; + // check if packed forward and backward hist have the same size, otherwise take the minimum size UInt_t noOfBins = forwardpPacked.GetValue()->size(); if (forwardpPacked.GetValue()->size() != backwardpPacked.GetValue()->size()) { From f81c6aa2bf76647c9c543e6e5f5f919c64054717 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 24 Aug 2018 17:42:23 +0200 Subject: [PATCH 46/87] Deal with missing alpha line for beta-NMR. --- src/classes/PMsrHandler.cpp | 12 ++++++------ src/classes/PRunAsymmetryBNMR.cpp | 31 +++++++++++++++---------------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index 031c0088..08faad67 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -5542,12 +5542,12 @@ Bool_t PMsrHandler::CheckRunBlockIntegrity() break; case PRUN_ASYMMETRY_BNMR: // check alpha - if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> alpha parameter number missing which is needed for an asymmetry fit."; - cerr << endl << ">> Consider to check the manual ;-)" << endl; - return false; - } + // if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { + // cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + // cerr << endl << ">> alpha parameter number missing which is needed for an asymmetry fit."; + // cerr << endl << ">> Consider to check the manual ;-)" << endl; + // return false; + // } // check that there is a forward parameter number if (fRuns[i].GetForwardHistoNo() == -1) { cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 5fa90517..83d27d2a 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -105,26 +105,25 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD PMsrParamList *param = msrInfo->GetMsrParamList(); // check if alpha is given + Bool_t alphaFixedToOne = false; if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given - cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; - cerr << endl; - fValid = false; - return; - } - // check if alpha parameter is within proper bounds - if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { + // cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; + // cerr << endl; + // fValid = false; + // return; + alphaFixedToOne = true; + } else if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { // check if alpha parameter is within proper bounds cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; cerr << endl; fValid = false; return; + } else { // check if alpha is fixed + if (((*param)[fRunInfo->GetAlphaParamNo()-1].fStep == 0.0) && + ((*param)[fRunInfo->GetAlphaParamNo()-1].fValue == 1.0)) + alphaFixedToOne = true; } - // check if alpha is fixed - Bool_t alphaFixedToOne = false; - if (((*param)[fRunInfo->GetAlphaParamNo()-1].fStep == 0.0) && - ((*param)[fRunInfo->GetAlphaParamNo()-1].fValue == 1.0)) - alphaFixedToOne = true; - + // check if beta is given Bool_t betaFixedToOne = false; if (fRunInfo->GetBetaParamNo() == -1) { // no beta given hence assuming beta == 1 @@ -222,18 +221,18 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) break; case 2: // alpha != 1, beta == 1 a = par[fRunInfo->GetAlphaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues)/2; + f = fTheory->Func(time, par, fFuncValues)/2.0; asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); break; case 3: // alpha == 1, beta != 1 b = par[fRunInfo->GetBetaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues)/2; + f = fTheory->Func(time, par, fFuncValues)/2.0; asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0))-f*(b+1.0)/(2.0+f*(b-1.0)); break; case 4: // alpha != 1, beta != 1 a = par[fRunInfo->GetAlphaParamNo()-1]; b = par[fRunInfo->GetBetaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues)/2; + f = fTheory->Func(time, par, fFuncValues)/2.0; asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); break; default: From 8c2537efae09826cd2c6f9aa0f755a3d282dd072 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sat, 25 Aug 2018 23:06:57 +0200 Subject: [PATCH 47/87] Estimate alpha for beta-NMR asymmetry calculation from the ratio of B/F counts if no alpha line is given in the run block. --- src/classes/PMusr.cpp | 13 ++++ src/classes/PRunAsymmetryBNMR.cpp | 123 ++++++++++++++++++++++++------ src/include/PMusr.h | 5 ++ src/include/PRunAsymmetryBNMR.h | 1 + 4 files changed, 120 insertions(+), 22 deletions(-) diff --git a/src/classes/PMusr.cpp b/src/classes/PMusr.cpp index a84f4765..6a2142df 100644 --- a/src/classes/PMusr.cpp +++ b/src/classes/PMusr.cpp @@ -1879,6 +1879,19 @@ void PMsrRunBlock::SetMapGlobal(UInt_t idx, Int_t ival) return; } +//-------------------------------------------------------------------------- +// SetEstimatedAlpha (public) +//-------------------------------------------------------------------------- +/** + *

set the value of estimated alpha at position idx + * + * \param alpha is the estimated value + */ +void PMsrRunBlock::SetEstimatedAlpha(Double_t dval) +{ + fAlpha = dval; +} + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // implementation PStringNumberList //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 83d27d2a..8afa4937 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -106,12 +106,13 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD // check if alpha is given Bool_t alphaFixedToOne = false; + Bool_t alphaSetDefault = false; if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given // cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; // cerr << endl; // fValid = false; // return; - alphaFixedToOne = true; + alphaSetDefault = true; } else if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { // check if alpha parameter is within proper bounds cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; @@ -141,12 +142,16 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD } // set fAlphaBetaTag - if (alphaFixedToOne && betaFixedToOne) // alpha == 1, beta == 1 + if (alphaFixedToOne && betaFixedToOne) // alpha == 1, beta == 1 fAlphaBetaTag = 1; - else if (!alphaFixedToOne && betaFixedToOne) // alpha != 1, beta == 1 + else if (!alphaFixedToOne && betaFixedToOne & !alphaSetDefault) // alpha != 1, beta == 1 fAlphaBetaTag = 2; - else if (alphaFixedToOne && !betaFixedToOne) // alpha == 1, beta != 1 + else if (alphaFixedToOne && !betaFixedToOne) // alpha == 1, beta != 1 fAlphaBetaTag = 3; + else if (!alphaFixedToOne && betaFixedToOne & alphaSetDefault) // alpha ??, beta == 1 + fAlphaBetaTag = 5; + else if (!alphaFixedToOne && !betaFixedToOne & alphaSetDefault) // alpha ??, beta != 1 + fAlphaBetaTag = 6; else fAlphaBetaTag = 4; @@ -198,7 +203,7 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) } // calculate chi square - Double_t time(1.0); + Double_t time(1.0),alphaest; Int_t i; // Calculate the theory function once to ensure one function evaluation for the current set of parameters. @@ -206,6 +211,7 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) // for a given set of parameters---which should be done outside of the parallelized loop. // For all other functions it means a tiny and acceptable overhead. asymFcnValue = fTheory->Func(time, par, fFuncValues); + alphaest = fRunInfo->GetEstimatedAlpha(); #ifdef HAVE_GOMP Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs(); @@ -235,6 +241,17 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) f = fTheory->Func(time, par, fFuncValues)/2.0; asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); break; + case 5: // alpha ?? , beta == 1 + a = alphaest; + f = fTheory->Func(time, par, fFuncValues)/2.0; + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); + break; + case 6: // alpha ??, beta != 1 + a = alphaest; + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues)/2.0; + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); + break; default: asymFcnValue = 0.0; break; @@ -425,8 +442,12 @@ void PRunAsymmetryBNMR::CalcTheory() // calculate asymmetry Double_t asymFcnValue = 0.0; - Double_t a, b, f; + Double_t a, b, f, alphaest; Double_t time; + + // Get estimated alpha + alphaest = fRunInfo->GetEstimatedAlpha(); + for (UInt_t i=0; isize(); i++) { time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); switch (fAlphaBetaTag) { @@ -436,18 +457,29 @@ void PRunAsymmetryBNMR::CalcTheory() case 2: // alpha != 1, beta == 1 a = par[fRunInfo->GetAlphaParamNo()-1]; f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)); + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); break; case 3: // alpha == 1, beta != 1 b = par[fRunInfo->GetBetaParamNo()-1]; f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0)); + asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0))-f*(b+1.0)/(2.0+f*(b-1.0)); break; case 4: // alpha != 1, beta != 1 a = par[fRunInfo->GetAlphaParamNo()-1]; b = par[fRunInfo->GetBetaParamNo()-1]; f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0)); + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); + break; + case 5: // alpha ?? , beta == 1 + a = alphaest; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); + break; + case 6: // alpha ??, beta != 1 + a = alphaest; + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); break; default: asymFcnValue = 0.0; @@ -871,6 +903,14 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() fRunInfo->SetBkgEstimated(bkgm[0], 3); fRunInfo->SetBkgEstimated(bkgm[1], 4); + cout << "I am here 1 " << endl; + // Get estimate for alpha once + Double_t alpha; + alpha = EstimateAlpha(); + cout << "I am here 2 " << alpha << endl; + fRunInfo->SetEstimatedAlpha(alpha); + + return true; } @@ -903,14 +943,8 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() Double_t valuem = 0.0; Double_t errorm = 0.0; - Double_t SumF[2] = {0.0, 0.0}; - Double_t SumB[2] = {0.0, 0.0}; - Double_t alphaest = 1; - // forward for (Int_t i=fGoodBins[0]; i> PRunAsymmetryBNMR::PrepareFitData(): alpha estimate=" << alphaest << endl; - // check if packed forward and backward hist have the same size, otherwise take the minimum size UInt_t noOfBins = forwardpPacked.GetValue()->size(); if (forwardpPacked.GetValue()->size() != backwardpPacked.GetValue()->size()) { @@ -1249,13 +1277,16 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 // form asymmetry including error propagation Double_t asym; - Double_t fp, bp, efp, ebp, alpha = 1.0, beta = 1.0; + Double_t fp, bp, efp, ebp, alpha, beta = 1.0; Double_t fm, bm, efm, ebm; // set data time start, and step // data start at data_start-t0 fData.SetDataTimeStart(fTimeResolution*((Double_t)start[0]-t0[0]+(Double_t)(packing-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*(Double_t)packing); + // Get estimate for alpha once + alpha = EstimateAlpha(); + // get the proper alpha and beta switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 @@ -1274,6 +1305,14 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 alpha = par[fRunInfo->GetAlphaParamNo()-1]; beta = par[fRunInfo->GetBetaParamNo()-1]; break; + case 5: // alpha ?? , beta == 1 + // use estimated value + beta = 1.0; + break; + case 6: // alpha ??, beta != 1 + // use estimated value + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; default: break; } @@ -1701,3 +1740,43 @@ void PRunAsymmetryBNMR::GetProperFitRange(PMsrGlobalBlock *globalBlock) cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; } } + + +//-------------------------------------------------------------------------- +// EstimateAlpha (private) +//-------------------------------------------------------------------------- +/** + *

Get an estimate for alpha from the forward and backward histograms + * + * \param globalBlock pointer to the GLOBAL block information form the msr-file. + */ +Double_t PRunAsymmetryBNMR::EstimateAlpha() +{ + + Double_t SumF[2] = {0.0, 0.0}; + Double_t SumB[2] = {0.0, 0.0}; + Double_t alpha = 1; + + + // forward + for (Int_t i=0; i> PRunAsymmetryBNMR::EstimateAlpha(): alpha estimate=" << alpha << endl; + + return alpha; +} diff --git a/src/include/PMusr.h b/src/include/PMusr.h index cd9d6375..357cf6b4 100644 --- a/src/include/PMusr.h +++ b/src/include/PMusr.h @@ -570,6 +570,7 @@ class PMsrGlobalBlock { virtual Double_t GetFitRange(UInt_t idx); virtual Int_t GetFitRangeOffset(UInt_t idx); virtual Int_t GetPacking() { return fPacking; } + virtual Double_t GetEstimatedAlpha() { return fAlpha; } virtual void SetGlobalPresent(Bool_t bval) { fGlobalPresent = bval; } virtual void SetRRFFreq(Double_t freq, const char *unit); @@ -598,6 +599,7 @@ class PMsrGlobalBlock { Double_t fFitRange[2]; ///< fit range in (us) Int_t fFitRangeOffset[2]; ///< if fit range is given in bins it can have the form fit fgb+n0 lgb-n1. This variable holds the n0 and n1. Int_t fPacking; ///< packing/rebinning + Double_t fAlpha; ///< estimated alpha value from F/B counts }; //------------------------------------------------------------- @@ -645,6 +647,7 @@ class PMsrRunBlock { virtual Double_t GetFitRange(UInt_t idx); virtual Int_t GetFitRangeOffset(UInt_t idx); virtual Int_t GetPacking() { return fPacking; } + virtual Double_t GetEstimatedAlpha() { return fAlpha; } virtual Int_t GetXDataIndex() { return fXYDataIndex[0]; } virtual Int_t GetYDataIndex() { return fXYDataIndex[1]; } virtual TString* GetXDataLabel() { return &fXYDataLabel[0]; } @@ -667,6 +670,7 @@ class PMsrRunBlock { virtual void SetForwardHistoNo(Int_t histoNo, Int_t idx=-1); virtual void SetBackwardHistoNo(Int_t histoNo, Int_t idx=-1); virtual void SetBkgEstimated(Double_t dval, Int_t idx); + virtual void SetEstimatedAlpha(Double_t dval); virtual void SetBkgFix(Double_t dval, Int_t idx); virtual void SetBkgRange(Int_t ival, Int_t idx); virtual void SetDataRange(Int_t ival, Int_t idx); @@ -707,6 +711,7 @@ class PMsrRunBlock { Bool_t fFitRangeInBins; ///< flag telling if fit range is given in time or in bins Double_t fFitRange[2]; ///< fit range in (us) Int_t fFitRangeOffset[2]; ///< if fit range is given in bins it can have the form fit fgb+n0 lgb-n1. This variable holds the n0 and n1. + Double_t fAlpha; ///< estimated alpha value from F/B counts Int_t fPacking; ///< packing/rebinning Int_t fXYDataIndex[2]; ///< used to get the data indices when using db-files (fit type 8) TString fXYDataLabel[2]; ///< used to get the indices via labels when using db-files (fit type 8) diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h index a1fc5377..5ed85c9f 100644 --- a/src/include/PRunAsymmetryBNMR.h +++ b/src/include/PRunAsymmetryBNMR.h @@ -87,6 +87,7 @@ class PRunAsymmetryBNMR : public PRunBase virtual Bool_t GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlock, PUIntVector &forwardHisto, PUIntVector &backwardHistoNo); virtual Bool_t GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2]); virtual void GetProperFitRange(PMsrGlobalBlock *globalBlock); + virtual Double_t EstimateAlpha(); }; #endif // _PRUNASYMMETRYBNMR_H_ From e19289d0c38d09787172339c0e3669bf20dd5e2c Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sat, 25 Aug 2018 23:51:08 +0200 Subject: [PATCH 48/87] Cleanup --- src/classes/PRunAsymmetryBNMR.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 8afa4937..63b3c271 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -860,10 +860,10 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() } errBkgp[1] = TMath::Sqrt(bkgp[1])/(end[1] - start[1] + 1); bkgp[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated pos hel backward histo background: " << bkgp[1] << endl; + cout << endl << ">> estimated pos hel backward histo background: " << bkgp[1]; errBkgm[1] = TMath::Sqrt(bkgm[1])/(end[1] - start[1] + 1); bkgm[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated neg hel backward histo background: " << bkgm[1] << endl; + cout << endl << ">> estimated neg hel backward histo background: " << bkgm[1]; // correct error for forward, backward Double_t errVal = 0.0; @@ -903,11 +903,9 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() fRunInfo->SetBkgEstimated(bkgm[0], 3); fRunInfo->SetBkgEstimated(bkgm[1], 4); - cout << "I am here 1 " << endl; // Get estimate for alpha once Double_t alpha; alpha = EstimateAlpha(); - cout << "I am here 2 " << alpha << endl; fRunInfo->SetEstimatedAlpha(alpha); From e428554f7e9c24d1921fa9491b6b8b218e311100 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sun, 26 Aug 2018 11:33:13 +0200 Subject: [PATCH 49/87] Added documentation relevant to beta-NMR asymmetry fits, fittype 5. --- doc/html/_sources/user-manual.txt | 78 +++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 9 deletions(-) diff --git a/doc/html/_sources/user-manual.txt b/doc/html/_sources/user-manual.txt index 4fd2b4d2..fb1f67f3 100644 --- a/doc/html/_sources/user-manual.txt +++ b/doc/html/_sources/user-manual.txt @@ -845,7 +845,7 @@ Currently the supported GLOBAL block entries are: * ``rrf_freq`` for fittype 1, 3 * ``rrf_packing`` for fittype 1, 3 * ``rrf_phase`` for fittype 1, 3 -* ``packing`` for fittype 0, 2, 4 +* ``packing`` for fittype 0, 2, 4, 5 For a detailed discussion of these entries see the section :ref:`RUN block `. @@ -1039,6 +1039,8 @@ In order to describe the operations needed for fitting and plotting, quite some Asymmetry RRF Fit (only for online analysis) **4** MuMinus Fit. This is a single histogram fit especially for negative muon |mgr|\SR + **5** + beta-NMR Asymmetry Fit **8** Non-|mgr|\SR Fit @@ -1051,8 +1053,8 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: alpha-beta .. _msr-alpha-beta: -**alpha, beta** (fit type 2, 3) - These parameters are used to correct the asymmetry for different detector efficiencies, solid angles and initial asymmetries. They are defined as :math:`\alpha = N_{0,b}/N_{0,f}` and :math:`\beta = A_{0,b}/A_{0,f}`. If the parameters are not specified in the :ref:`RUN block `, for each one the value of 1 is assumed. Example for alpha with fit parameter number 1: +**alpha, beta** (fit type 2, 3, 5) + These parameters are used to correct the asymmetry for different detector efficiencies, solid angles and initial asymmetries. They are defined as :math:`\alpha = N_{0,b}/N_{0,f}` and :math:`\beta = A_{0,b}/A_{0,f}`. If the parameters are not specified in the :ref:`RUN block `, for each one the value of 1 is assumed (for fittype 5 alpha is estimated from the ration of sum of Bp+Bm and Fp+Fm). Example for alpha with fit parameter number 1: :: @@ -1131,10 +1133,19 @@ In order to describe the operations needed for fitting and plotting, quite some forward 1-3 backward 7-9 +**forward, backward** (fit type 5) + Numbers of the histograms in the data file that should be taken to calculate the asymmetry. Two forward and backward histograms should be given indicationg positive and negative helicities. The asymmetry from opposite helicities will be subtracted. Examples: + + :: + + # build forward/backward asymmetry with histogram 1 and 3 then subtract asymmetry built with histograms 2 and 4 + forward 1 2 + backward 3 4 + .. index:: backgr.fix .. _msr-backgr.fix: -**backgr.fix** (fit types 0, 1, 2, 3) +**backgr.fix** (fit types 0, 1, 2, 3, 5) A fixed constant background in counts per nanosecond or per bin (see :ref:`below `) may be given at this point. The background is specified for all histograms in the order :math:`B_f B_b [B_r B_l]`. If this keyword is present, *any* information on a ``background`` line is ignored. @@ -1152,7 +1163,7 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: background-asymmetry .. _msr-background-asymmetry: -**background** (fit types 2, 3) +**background** (fit types 2, 3, 5) The numbers of the first and the last channel of an interval from which the constant background should be calculated are specified here. For all the histograms this is done together in the following order: :math:`k_{f,\rm first} k_{f,\rm last} k_{b,\rm first} k_{b, \rm last} [k_{r,\rm first} k_{r,\rm last} k_{l,\rm first} k_{l,\rm last}]`. In case histograms are being grouped, the specified channels are interpreted with respect to the first histograms. Example: @@ -1176,7 +1187,7 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: data-asymmetry .. _msr-data-asymmetry: -**data** (fit type 2, 3) +**data** (fit type 2, 3, 5) The numbers of the first and the last channel of an interval from which the data is taken are specified here. Typically these channels are referred to as first good bin / last good bin (fgb/lgb). For all the histograms this is done together in the following order: :math:`k_{f,\rm first} k_{f,\rm last} k_{b,\rm first} k_{b, \rm last} [k_{r,\rm first} k_{r,\rm last} k_{l,\rm first} k_{l,\rm last}]`. @@ -1200,8 +1211,8 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: t0-asymmetry .. _msr-t0-asymmetry: -**t0** (fit type 2, 3) - The numbers of time-zero channels of the histograms in the order :math:`t_{0,f} t_{0,b}`. Example: +**t0** (fit type 2, 3, 5) + The numbers of time-zero channels of the histograms in the order :math:`t_{0,f} t_{0,b}`. For fit type 5, the time-zero is the channel of the start of beam pulse. Example: :: @@ -1219,7 +1230,7 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: addt0-asymmetry .. _msr-addt0-asymmetry: -**addt0** (fit type 2, 3) +**addt0** (fit type 2, 3, 5) The numbers of time-zero channels of the histograms in the order :math:`t_{0,f} t_{0,b} [t_{0,r} t_{0,l}]`. If grouping of histograms is present (see :ref:`forward `) the same syntax as for :ref:`t0 ` applies. If one addt0 is given, the total number of addt0's needs to be equal to the total number of :ref:`ADDRUN `\'s! @@ -1782,6 +1793,55 @@ where :math:`i` runs over the different lifetime channels of :math:`\mu^{-}`, an Since MuMinus is quite generic, the full functional depends has to be written in the :ref:`THEORY Block `. +.. index:: bnmr-asymmetry-fit +.. _bnmr-asymmetry-fit: + +beta-NMR Asymmetry Fit (fit type 5) ++++++++++++++++++++++++++++++++++++ + +For a beta-NMR asymmetry fit (fit type 5) four histograms are needed, two for positive and two for negative helicities. These are given by the :ref:`forward ` and :ref:`backward ` keywords +in the :ref:`RUN block `. Additionally, the parameters :ref:`alpha ` and :ref:`beta ` which relate the detector +efficiencies, solid angles and initial asymmetries of the two detectors can be supplied. The constant background for the two histograms is either given by +:ref:`background-determined intervals ` or specified through :ref:`backgr.fix ` in the :ref:`RUN-block `. + +The experimental asymmetry :math:`a(k)` then is calculated from the four histograms: + +.. math:: + + a(k)=\frac{\left[N_{\mathrm{fp}}(k)-B_{\mathrm{fp}}\right]-\left[N_{\mathrm{bp}}(k)-B_{\mathrm{bp}}\right]}{\left[N_{\mathrm{fp}}(k)-B_{\mathrm{fp}}\right]+\left[N_{\mathrm{bp}}(k)-B_{\mathrm{bp}}\right]} + - \frac{\left[N_{\mathrm{fm}}(k)-B_{\mathrm{fm}}\right]-\left[N_{\mathrm{bm}}(k)-B_{\mathrm{bm}}\right]}{\left[N_{\mathrm{fm}}(k)-B_{\mathrm{fm}}\right]+\left[N_{\mathrm{bm}}(k)-B_{\mathrm{bm}}\right]}, + +with + + * :math:`N_{\mathrm{fp}}(k)`: counts in the **forward** histogram channel with positive helicity :math:`k` + * :math:`N_{\mathrm{bp}}(k)`: counts in the **backward** histogram channel with positive helicity :math:`k` + * :math:` B_{\mathrm{fp}}`: constant background in the **forward** histogram with positive helicity (RUN block: :ref:`backgr.fix ` or :ref:`background `) + * :math:` B_{\mathrm{bp}}`: constant background in the **backward** histogram with positive helicity (RUN block: :ref:`backgr.fix ` or :ref:`background `) + * :math:`N_{\mathrm{fm}}(k)`: counts in the **forward** histogram channel with negative helicity :math:`k` + * :math:`N_{\mathrm{bm}}(k)`: counts in the **backward** histogram channel with negative helicity :math:`k` + * :math:` B_{\mathrm{fm}}`: constant background in the **forward** histogram with negative helicity (RUN block: :ref:`backgr.fix ` or :ref:`background `) + * :math:` B_{\mathrm{bm}}`: constant background in the **backward** histogram with negative helicity (RUN block: :ref:`backgr.fix ` or :ref:`background `) + +This theoretical asymmetry :math:`a(t)` is used to fit the function + +.. math:: + + a(t)=\frac{(\alpha\beta +1)A(t)-(\alpha -1)}{(\alpha +1)-(\alpha\beta -1)A(t)} - \frac{(\alpha -1)-(\alpha\beta 1)A(t)}{(\alpha +1)+(\alpha\beta -1)Am(t)}, + +where + + * :math:`\alpha`: accounts for the different detector efficiencies and solid angles (RUN block: :ref:`alpha `). + * :math:`\beta`: accounts for the different detector asymmetries (RUN block: :ref:`beta `). + * :math:`A(t)`: is the depolarization function as given in the :ref:`THEORY block `. + +For the graphical representation in plot type 5 the equation above is rearranged to get :math:`A(t)`: + +.. math:: + + A(t)=\frac{(\alpha -1)+(\alpha +1)a(t)}{(\alpha\beta +1)+(\alpha\beta -1)a(t)}-\frac{(\alpha +1)a(t)-(\alpha -1)}{(\alpha\beta +1)+(1-\alpha\beta)a(t)}=\frac{\alpha\left[N_{\mathrm{fp}}(t)-B_{\mathrm{fp}}\right]-\left[N_{\mathrm{bp}}(t)-B_{\mathrm{bp}}\right]}{\alpha\beta\left[N_{\mathrm{fp}}(t)-B_{\mathrm{fp}}\right]+\left[N_{\mathrm{bp}}(t)-B_{\mathrm{bp}}\right]} -\frac{\alpha\left[N_{\mathrm{fm}}(t)-B_{\mathrm{fm}}\right]-\left[N_{\mathrm{bm}}(t)-B_{\mathrm{bm}}\right]}{\alpha\beta\left[N_{\mathrm{fm}}(t)-B_{\mathrm{fm}}\right]+\left[N_{\mathrm{bm}}(t)-B_{\mathrm{bm}}\right]} + +and plotted together with the function given in the THEORY block. + .. index:: non-musr-fit .. _non-musr-fit: From 2cd81cf2354b7f3cff89a62c5f99a7822614bcc9 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 15 Oct 2018 10:16:41 +0200 Subject: [PATCH 50/87] More recent working version --- src/external/MuSRFitGUI/MSR.pm | 50 +++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm index 87b4d120..cb8c6086 100644 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -27,10 +27,11 @@ my $SUMM_DIR="/afs/psi.ch/project/nemu/data/summ/"; 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/", - "ALC","/afs/psi.ch/project/bulkmusr/olddata/list/", - "HAL","/afs/psi.ch/project/bulkmusr/olddata/list/", - "LTF","/afs/psi.ch/project/bulkmusr/olddata/list/"); + "GPD","/afs/psi.ch/project/bulkmusr/olddata/list/", + "ALC","/afs/psi.ch/project/bulkmusr/olddata/list/", + "HAL","/afs/psi.ch/project/bulkmusr/olddata/list/", + "LTF","/afs/psi.ch/project/bulkmusr/olddata/list/", + "ALL","/afs/psi.ch/project/bulkmusr/olddata/list/"); # Information available since my %MinYears=("LEM","2001", @@ -662,12 +663,13 @@ sub CreateTheory { # Start from this theory line for the different fitting functions my %THEORY = ( - "asymmetry", "Asy", - "simplExpo", "Lam", - "generExpo", "Lam Bet", - "simpleGss", "Sgm", - "statGssKT", "Sgm", - "statGssKTLF", "Frqg Sgm", + "asymmetry", "Asy", + "simplExpo", "Lam", + "generExpo", "Lam Bet", + "abragam", "Del Lam", + "simpleGss", "Sgm", + "statGssKT", "Sgm", + "statGssKTLF", "Frqg Sgm", "dynGssKTLF", "Frql Sgm Lam", "statExpKT", "Lam", "statExpKTLF", "Frq Aa", @@ -680,10 +682,9 @@ sub CreateTheory { "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" - ); + "Meissner", "Phi Energy Field DeadLayer Lambda", + "skewedGss", "Phi Frq Sgmm Sgmp" + ); ####################################################################### # Generate the full THEORY block @@ -752,6 +753,14 @@ sub CreateTheory { $Parameters = join( $SPACE, $Parameters, $THEORY{'TFieldCos'} ); } + # Oscillationg Abragam function + elsif ( $FitType eq "AbragamCos" ) { + $T_Block = $T_Block . "\n" . "abragam " . $THEORY{'abragam'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'abragam'} ); + $T_Block = $T_Block . "\n" . "TFieldCos " . $THEORY{'TFieldCos'}; + $Parameters = join( $SPACE, $Parameters, $THEORY{'TFieldCos'} ); + } + # Oscillationg Bessel Gaussian elsif ( $FitType eq "GaussianBessel" ) { $T_Block = $T_Block . "\n" . "simpleGss " . $THEORY{'simpleGss'}; @@ -1015,8 +1024,16 @@ sub T0BgData { ($RV{"t0"},$RV{"Bg1"},$RV{"Bg2"},$RV{"Data1"},$RV{"Data2"})=split(/,/,$HistParams); } elsif ($BeamLine eq "GPS") { - my $HistParams=$GPS{$Hists[0]}; - ($RV{"t0"},$RV{"Bg1"},$RV{"Bg2"},$RV{"Data1"},$RV{"Data2"})=split(/,/,$HistParams); + my $HistParams=$GPS{$Hists[0]}; + ($RV{"t0"},$RV{"Bg1"},$RV{"Bg2"},$RV{"Data1"},$RV{"Data2"})=split(/,/,$HistParams); + } + elsif ($BeamLine eq "GPD") { + my $HistParams=$GPD{$Hists[0]}; + ($RV{"t0"},$RV{"Bg1"},$RV{"Bg2"},$RV{"Data1"},$RV{"Data2"})=split(/,/,$HistParams); + } + else { + my $HistParams=$GPS{$Hists[0]}; + ($RV{"t0"},$RV{"Bg1"},$RV{"Bg2"},$RV{"Data1"},$RV{"Data2"})=split(/,/,$HistParams); } return $RV{$Name}; @@ -1262,6 +1279,7 @@ sub ExportParams { push( @FitTypes, $All{"FitType$i"} ); } } + # 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? From 8207aea183703c59eec398946535a3baafaa3661 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 15 Oct 2018 10:19:02 +0200 Subject: [PATCH 51/87] Changes to template files --- src/external/libBNMR/ExpRlx.msr | 2 +- src/external/libBNMR/SExpRlx.msr | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/external/libBNMR/ExpRlx.msr b/src/external/libBNMR/ExpRlx.msr index eb356304..59c94244 100644 --- a/src/external/libBNMR/ExpRlx.msr +++ b/src/external/libBNMR/ExpRlx.msr @@ -17,7 +17,7 @@ userFcn .libs/libBNMR.so ExpRlx 3 4 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) fittype 5 (beta-NMR fit) -alpha 1 +#alpha 1 forward 3 5 backward 4 6 data 11 1000 11 1000 diff --git a/src/external/libBNMR/SExpRlx.msr b/src/external/libBNMR/SExpRlx.msr index a530e625..5ed46968 100644 --- a/src/external/libBNMR/SExpRlx.msr +++ b/src/external/libBNMR/SExpRlx.msr @@ -3,8 +3,8 @@ LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s FITPARAMETER ############################################################### # No Name Value Err Min Max - 1 Alpha 1 0 none - 2 Asy 0.1148 0.0096 none 0 0.2 + 1 Alpha 0.9 1.0 none + 2 Asy 0.115 0.011 none 0 0.2 3 T 1 0 none 4 Rlx 4.16 0.88 none 0 100 5 Beta 0.433 0.031 none 0.3 2 @@ -13,7 +13,7 @@ FITPARAMETER THEORY ############################################################### asymmetry 2 -userFcn .libs/libBNMR.so SExpRlx 3 4 5 +userFcn libBNMR SExpRlx 3 4 5 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) @@ -50,5 +50,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 21:59:14 - chisq = 210.2, NDF = 172, chisq/NDF = 1.222196 +STATISTIC --- 2018-08-24 16:52:40 + chisq = 210.2, NDF = 171, chisq/NDF = 1.229343 From 33d0e51a056f296b25b66ef56bf0c1c6713b6497 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 13 Mar 2019 10:46:53 +0100 Subject: [PATCH 52/87] Resolving conflict. --- INSTALL | 2 ++ 1 file changed, 2 insertions(+) diff --git a/INSTALL b/INSTALL index 5cce2650..6f77a8bf 100644 --- a/INSTALL +++ b/INSTALL @@ -43,6 +43,8 @@ If all goes well, you should be good to go ;-) # Install using cmake tool chain #---------------------------------- +In the following it is assumed that the system variable ROOTSYS is already defined and pointing to the place where CERN/ROOT is installed. + cmake minimal required version is 3.6. musrfit supports only out-of-source cmake build! Hence, go to the musrfit From d66b132a0b58997af84b14290abb1445630c1367 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 13 Mar 2019 10:50:28 +0100 Subject: [PATCH 53/87] Resolving conflict. --- INSTALL | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/INSTALL b/INSTALL index 6f77a8bf..5e9fabd5 100644 --- a/INSTALL +++ b/INSTALL @@ -2,49 +2,13 @@ # INSTALL #--------------------------------------------------------------------- -There are currently two ways to build musrfit, - -1) using automake tool chain (this will be phased out until 2019) -2) using cmake tool chain (this will be the default starting from now) - In what follows we assume that the system variable ROOTSYS is already defined and points to the installation directory of CERN/ROOT. -#---------------------------------- -# Install using automake tool chain -#---------------------------------- - -To get it built: - - sh autogen.sh - ./configure --prefix=$ROOTSYS (or where ever musrfit should be installed) - make - make install (as superuser -- maybe) - /sbin/ldconfig (as superuser) - -configure comes with a couple of options. For details execute - - ./configure --help - -or check under http://lmu.web.psi.ch/musrfit/user/MUSR/MusrFitSetup.html -for a detailed description. - -For example, to include NeXus support and BNMRlibs, - - sh autogen.sh - ./configure --enable-NeXus --enable-BNMRlibs --prefix=$ROOTSYS - make - make install (as superuser -- maybe) - /sbin/ldconfig (as superuser) - -If all goes well, you should be good to go ;-) - #---------------------------------- # Install using cmake tool chain #---------------------------------- -In the following it is assumed that the system variable ROOTSYS is already defined and pointing to the place where CERN/ROOT is installed. - cmake minimal required version is 3.6. musrfit supports only out-of-source cmake build! Hence, go to the musrfit From 95ea5b6f68196f324abcd98dd47a4b952f76cb5d Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 13 Mar 2019 10:52:05 +0100 Subject: [PATCH 54/87] Resolving conflict. --- INSTALL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index 5e9fabd5..980fd14c 100644 --- a/INSTALL +++ b/INSTALL @@ -2,7 +2,7 @@ # INSTALL #--------------------------------------------------------------------- -In what follows we assume that the system variable ROOTSYS is already +In the following it is assumed that the system variable ROOTSYS is already defined and points to the installation directory of CERN/ROOT. #---------------------------------- From a00b93f6cde975f6ab9aa444c30fb328b626c372 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 13 Mar 2019 10:53:13 +0100 Subject: [PATCH 55/87] Resolving conflict. --- INSTALL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index 980fd14c..a8d15685 100644 --- a/INSTALL +++ b/INSTALL @@ -6,7 +6,7 @@ In the following it is assumed that the system variable ROOTSYS is already defined and points to the installation directory of CERN/ROOT. #---------------------------------- -# Install using cmake tool chain +# Install via cmake tool chain #---------------------------------- cmake minimal required version is 3.6. From ffae09354eb61ead0b7fb85937632320ebbb9784 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 13 Mar 2019 10:54:33 +0100 Subject: [PATCH 56/87] Resolving conflict. --- INSTALL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index a8d15685..94bdd8c3 100644 --- a/INSTALL +++ b/INSTALL @@ -3,7 +3,7 @@ #--------------------------------------------------------------------- In the following it is assumed that the system variable ROOTSYS is already -defined and points to the installation directory of CERN/ROOT. +defined and defined and pointing to the place where CERN/ROOT is installed. #---------------------------------- # Install via cmake tool chain From 05a62506d8be8ac8ac580370b916539cf0f791e5 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 13 Mar 2019 10:55:36 +0100 Subject: [PATCH 57/87] Resolving conflict. --- INSTALL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index 94bdd8c3..7e1dc31b 100644 --- a/INSTALL +++ b/INSTALL @@ -3,7 +3,7 @@ #--------------------------------------------------------------------- In the following it is assumed that the system variable ROOTSYS is already -defined and defined and pointing to the place where CERN/ROOT is installed. +defined and pointing to the place where CERN/ROOT is installed. #---------------------------------- # Install via cmake tool chain From 6c88bce19c71e7562f1f7cec2da3d4e368d2756a Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 5 Apr 2019 10:14:16 +0200 Subject: [PATCH 58/87] Removed automake file to resolve conflict --- src/classes/Makefile.am | 122 ---------------------------------------- 1 file changed, 122 deletions(-) delete mode 100644 src/classes/Makefile.am diff --git a/src/classes/Makefile.am b/src/classes/Makefile.am deleted file mode 100644 index fa3a0fba..00000000 --- a/src/classes/Makefile.am +++ /dev/null @@ -1,122 +0,0 @@ -## Process this file with automake to create Makefile.in - -h_sources = \ - ../include/PFitterFcn.h \ - ../include/PFitter.h \ - ../include/PFourier.h \ - ../include/PFourierCanvas.h \ - ../include/PFunctionGrammar.h \ - ../include/PFunction.h \ - ../include/PFunctionHandler.h \ - ../include/PMsr2Data.h \ - ../include/PMsrHandler.h \ - ../include/PMusrCanvas.h \ - ../include/PMusr.h \ - ../include/PMusrT0.h \ - ../include/PPrepFourier.h \ - ../include/PRunAsymmetry.h \ - ../include/PRunAsymmetryBNMR.h \ - ../include/PRunAsymmetryRRF.h \ - ../include/PRunBase.h \ - ../include/PRunDataHandler.h \ - ../include/PRunListCollection.h \ - ../include/PRunNonMusr.h \ - ../include/PRunMuMinus.h \ - ../include/PRunSingleHisto.h \ - ../include/PRunSingleHistoRRF.h \ - ../include/PStartupHandler.h \ - ../include/PTheory.h - -h_sources_userFcn = \ - ../include/PUserFcnBase.h - -h_linkdef = \ - ../include/PFourierCanvasLinkDef.h \ - ../include/PMusrCanvasLinkDef.h \ - ../include/PMusrT0LinkDef.h \ - ../include/PStartupHandlerLinkDef.h - -h_linkdef_userFcn = \ - ../include/PUserFcnBaseLinkDef.h - -dict_h_sources = \ - PFourierCanvasDict.h \ - PMusrCanvasDict.h \ - PMusrT0Dict.h \ - PStartupHandlerDict.h - -dict_h_sources_userFcn = \ - PUserFcnBaseDict.h - -cpp_sources = \ - PFitter.cpp \ - PFitterFcn.cpp \ - PFourier.cpp \ - PFourierCanvas.cpp \ - PFunction.cpp \ - PFunctionHandler.cpp \ - PMsr2Data.cpp \ - PMsrHandler.cpp \ - PMusrCanvas.cpp \ - PMusr.cpp \ - PMusrT0.cpp \ - PPrepFourier.cpp \ - PRunAsymmetry.cpp \ - PRunAsymmetryBNMR.cpp \ - PRunAsymmetryRRF.cpp \ - PRunBase.cpp \ - PRunDataHandler.cpp \ - PRunListCollection.cpp \ - PRunNonMusr.cpp \ - PRunMuMinus.cpp \ - PRunSingleHisto.cpp \ - PRunSingleHistoRRF.cpp \ - PStartupHandler.cpp \ - PTheory.cpp - -cpp_sources_userFcn = \ - PUserFcnBase.cpp - -dict_cpp_sources = \ - PFourierCanvasDict.cpp \ - PMusrCanvasDict.cpp \ - PMusrT0Dict.cpp \ - PStartupHandlerDict.cpp - -dict_cpp_sources_userFcn = \ - PUserFcnBaseDict.cpp - -pcmdir = $(libdir) -pcm_DATA = \ - PFourierCanvasDict_rdict.pcm \ - PMusrCanvasDict_rdict.pcm \ - PMusrT0Dict_rdict.pcm \ - PStartupHandlerDict_rdict.pcm \ - PUserFcnBaseDict_rdict.pcm - -include_HEADERS = $(h_sources) $(h_sources_userFcn) -noinst_HEADERS = $(h_linkdef) $(dict_h_sources) $(h_linkdef_userFcn) $(dict_h_sources_userFcn) - -AM_CPPFLAGS = -I$(top_srcdir)/src/include $(MUSR_ROOT_CFLAGS) $(PSIBIN_CFLAGS) $(MUD_CFLAGS) $(LEM_CFLAGS) $(FFTW3_CFLAGS) $(GSL_CFLAGS) $(BOOST_CFLAGS) -I$(ROOTINCDIR) $(PNEXUS_CXXFLAGS) $(NEXUS_CFLAGS) -AM_CXXFLAGS = $(LOCAL_LIB_CXXFLAGS) - -BUILT_SOURCES = $(dict_cpp_sources) $(dict_h_sources) $(dict_cpp_sources_userFcn) $(dict_h_sources_userFcn) -AM_LDFLAGS = $(LOCAL_LIB_LDFLAGS) -L@ROOTLIBDIR@ -CLEANFILES = *Dict.cpp *Dict.h *Dict* *~ core - -%Dict.cpp %Dict.h: ../include/%.h ../include/%LinkDef.h - @ROOTCLING@ -v -f $*Dict.cpp -c -p $(AM_CPPFLAGS) $^ - -lib_LTLIBRARIES = libPUserFcnBase.la libPMusr.la - -libPUserFcnBase_la_SOURCES = $(h_sources_userFcn) $(cpp_sources_userFcn) $(dict_h_sources_userFcn) $(dict_cpp_sources_userFcn) -libPUserFcnBase_la_LIBADD = $(ROOT_LIBS) -libPUserFcnBase_la_LDFLAGS = -version-info $(MUSR_LIBRARY_VERSION) -release $(MUSR_RELEASE) $(AM_LDFLAGS) - -libPMusr_la_SOURCES = $(h_sources) $(cpp_sources) $(dict_h_sources) $(dict_cpp_sources) -libPMusr_la_LIBADD = libPUserFcnBase.la $(MUSR_ROOT_LIBS) $(LEM_LIBS) $(PSIBIN_LIBS) $(MUD_LIBS) $(PNEXUS_LIBS) $(FFTW3_LIBS) $(GSL_LIBS) $(ROOT_LIBS) -libPMusr_la_LDFLAGS = -version-info $(MUSR_LIBRARY_VERSION) -release $(MUSR_RELEASE) $(AM_LDFLAGS) - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = PUserFcnBase.pc PMusr.pc - From 904471b664268c0ed3abebbbf80892978cb396e6 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Thu, 25 Apr 2019 17:27:03 +0200 Subject: [PATCH 59/87] Resolve conflicts manually. --- src/classes/PRunAsymmetry.cpp | 353 ++++---- src/classes/PRunAsymmetryRRF.cpp | 337 ++++---- src/classes/PRunDataHandler.cpp | 1263 ++++++++++++++-------------- src/classes/PRunMuMinus.cpp | 184 ++-- src/classes/PRunSingleHisto.cpp | 324 +++---- src/classes/PRunSingleHistoRRF.cpp | 227 ++--- 6 files changed, 1342 insertions(+), 1346 deletions(-) diff --git a/src/classes/PRunAsymmetry.cpp b/src/classes/PRunAsymmetry.cpp index 0dc60e35..2616ea1b 100644 --- a/src/classes/PRunAsymmetry.cpp +++ b/src/classes/PRunAsymmetry.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2007-2016 by Andreas Suter * + * Copyright (C) 2007-2019 by Andreas Suter * * andreas.suter@psi.ch * * * * This program is free software; you can redistribute it and/or modify * @@ -38,7 +38,6 @@ #include #include -using namespace std; #include #include @@ -93,9 +92,9 @@ PRunAsymmetry::PRunAsymmetry(PMsrHandler *msrInfo, PRunDataHandler *rawData, UIn fPacking = fMsrInfo->GetMsrGlobal()->GetPacking(); } if (fPacking == -1) { // this should NOT happen, somethin is severely wrong - cerr << endl << ">> PRunAsymmetry::PRunAsymmetry(): **SEVERE ERROR**: Couldn't find any packing information!"; - cerr << endl << ">> This is very bad :-(, will quit ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PRunAsymmetry(): **SEVERE ERROR**: Couldn't find any packing information!"; + std::cerr << std::endl << ">> This is very bad :-(, will quit ..."; + std::cerr << std::endl; fValid = false; return; } @@ -106,16 +105,16 @@ PRunAsymmetry::PRunAsymmetry(PMsrHandler *msrInfo, PRunDataHandler *rawData, UIn // check if alpha is given if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given - cerr << endl << ">> PRunAsymmetry::PRunAsymmetry(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PRunAsymmetry(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; + std::cerr << std::endl; fValid = false; return; } // check if alpha parameter is within proper bounds - if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { - cerr << endl << ">> PRunAsymmetry::PRunAsymmetry(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); - cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; - cerr << endl; + if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > static_cast(param->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::PRunAsymmetry(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); + std::cerr << std::endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + std::cerr << std::endl; fValid = false; return; } @@ -129,10 +128,10 @@ PRunAsymmetry::PRunAsymmetry(PMsrHandler *msrInfo, PRunDataHandler *rawData, UIn Bool_t betaFixedToOne = false; if (fRunInfo->GetBetaParamNo() == -1) { // no beta given hence assuming beta == 1 betaFixedToOne = true; - } else if ((fRunInfo->GetBetaParamNo() < 0) || (fRunInfo->GetBetaParamNo() > (Int_t)param->size())) { // check if beta parameter is within proper bounds - cerr << endl << ">> PRunAsymmetry::PRunAsymmetry(): **ERROR** beta parameter no = " << fRunInfo->GetBetaParamNo(); - cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; - cerr << endl; + } else if ((fRunInfo->GetBetaParamNo() < 0) || (fRunInfo->GetBetaParamNo() > static_cast(param->size()))) { // check if beta parameter is within proper bounds + std::cerr << std::endl << ">> PRunAsymmetry::PRunAsymmetry(): **ERROR** beta parameter no = " << fRunInfo->GetBetaParamNo(); + std::cerr << std::endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + std::cerr << std::endl; fValid = false; return; } else { // check if beta is fixed @@ -210,7 +209,7 @@ Double_t PRunAsymmetry::CalcChiSquare(const std::vector& par) #pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,a,b,f) schedule(dynamic,chunk) reduction(+:chisq) #endif for (i=fStartTimeBin; i(i)*fData.GetDataTimeStep(); switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 asymFcnValue = fTheory->Func(time, par, fFuncValues); @@ -268,7 +267,7 @@ Double_t PRunAsymmetry::CalcChiSquareExpected(const std::vector& par) */ Double_t PRunAsymmetry::CalcMaxLikelihood(const std::vector& par) { - cout << endl << "PRunAsymmetry::CalcMaxLikelihood(): not implemented yet ..." << endl; + std::cout << std::endl << "PRunAsymmetry::CalcMaxLikelihood(): not implemented yet ..." << std::endl; return 1.0; } @@ -304,8 +303,8 @@ UInt_t PRunAsymmetry::GetNoOfFitBins() */ void PRunAsymmetry::SetFitRangeBin(const TString fitRange) { - TObjArray *tok = 0; - TObjString *ostr = 0; + TObjArray *tok = nullptr; + TObjString *ostr = nullptr; TString str; Ssiz_t idx = -1; Int_t offset = 0; @@ -314,7 +313,7 @@ void PRunAsymmetry::SetFitRangeBin(const TString fitRange) if (tok->GetEntries() == 3) { // structure FIT_RANGE fgb+n0 lgb-n1 // handle fgb+n0 entry - ostr = (TObjString*) tok->At(1); + ostr = dynamic_cast(tok->At(1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -326,7 +325,7 @@ void PRunAsymmetry::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(2); + ostr = dynamic_cast(tok->At(2)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -340,11 +339,11 @@ void PRunAsymmetry::SetFitRangeBin(const TString fitRange) Int_t pos = 2*(fRunNo+1)-1; if (pos + 1 >= tok->GetEntries()) { - cerr << endl << ">> PRunAsymmetry::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunAsymmetry::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } else { // handle fgb+n0 entry - ostr = (TObjString*) tok->At(pos); + ostr = static_cast(tok->At(pos)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -356,7 +355,7 @@ void PRunAsymmetry::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(pos+1); + ostr = static_cast(tok->At(pos+1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -368,8 +367,8 @@ void PRunAsymmetry::SetFitRangeBin(const TString fitRange) fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; } } else { // error - cerr << endl << ">> PRunAsymmetry::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunAsymmetry::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } // clean up @@ -395,7 +394,7 @@ void PRunAsymmetry::CalcNoOfFitBins() fEndTimeBin = fData.GetValue()->size(); if (fEndTimeBin > fStartTimeBin) - fNoOfFitBins = fEndTimeBin - fStartTimeBin; + fNoOfFitBins = static_cast(fEndTimeBin - fStartTimeBin); else fNoOfFitBins = 0; } @@ -424,7 +423,7 @@ void PRunAsymmetry::CalcTheory() Double_t a, b, f; Double_t time; for (UInt_t i=0; isize(); i++) { - time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + time = fData.GetDataTimeStart() + static_cast(i)*fData.GetDataTimeStep(); switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 asymFcnValue = fTheory->Func(time, par, fFuncValues); @@ -487,8 +486,8 @@ Bool_t PRunAsymmetry::PrepareData() // get the correct run PRawRunData *runData = fRawData->GetRunData(*(fRunInfo->GetRunName())); if (!runData) { // run not found - cerr << endl << ">> PRunAsymmetry::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; + std::cerr << std::endl; return false; } @@ -499,10 +498,10 @@ Bool_t PRunAsymmetry::PrepareData() forwardHistoNo.push_back(fRunInfo->GetForwardHistoNo(i)); if (!runData->IsPresent(forwardHistoNo[i])) { - cerr << endl << ">> PRunAsymmetry::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> forwardHistoNo found = " << forwardHistoNo[i] << ", which is NOT present in the data file!?!?"; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> forwardHistoNo found = " << forwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; // clean up forwardHistoNo.clear(); backwardHistoNo.clear(); @@ -513,10 +512,10 @@ Bool_t PRunAsymmetry::PrepareData() backwardHistoNo.push_back(fRunInfo->GetBackwardHistoNo(i)); if (!runData->IsPresent(backwardHistoNo[i])) { - cerr << endl << ">> PRunAsymmetry::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> backwardHistoNo found = " << backwardHistoNo[i] << ", which is NOT present in the data file!?!?"; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> backwardHistoNo found = " << backwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; // clean up forwardHistoNo.clear(); backwardHistoNo.clear(); @@ -524,10 +523,10 @@ Bool_t PRunAsymmetry::PrepareData() } } if (forwardHistoNo.size() != backwardHistoNo.size()) { - cerr << endl << ">> PRunAsymmetry::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> # of forward histograms different from # of backward histograms."; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> # of forward histograms different from # of backward histograms."; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; // clean up forwardHistoNo.clear(); backwardHistoNo.clear(); @@ -536,8 +535,8 @@ Bool_t PRunAsymmetry::PrepareData() // keep the time resolution in (us) fTimeResolution = runData->GetTimeResolution()/1.0e3; - cout.precision(10); - cout << endl << ">> PRunAsymmetry::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; + std::cout.precision(10); + std::cout << std::endl << ">> PRunAsymmetry::PrepareData(): time resolution=" << std::fixed << runData->GetTimeResolution() << "(ns)" << std::endl; // get all the proper t0's and addt0's for the current RUN block if (!GetProperT0(runData, globalBlock, forwardHistoNo, backwardHistoNo)) { @@ -545,7 +544,7 @@ Bool_t PRunAsymmetry::PrepareData() } // keep the histo of each group at this point (addruns handled below) - vector forward, backward; + std::vector forward, backward; forward.resize(forwardHistoNo.size()); // resize to number of groups backward.resize(backwardHistoNo.size()); // resize to numer of groups for (UInt_t i=0; iGetRunNameSize(); i++) { // get run to be added to the main one addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunAsymmetry::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunAsymmetry::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -574,8 +573,9 @@ Bool_t PRunAsymmetry::PrepareData() addRunSize = addRunData->GetDataBin(forwardHistoNo[k])->size(); for (UInt_t j=0; jGetDataBin(forwardHistoNo[k])->size(); j++) { // loop over the bin indices // make sure that the index stays in the proper range - if (((Int_t)j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k] >= 0) && (j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k] < addRunSize)) { - forward[k][j] += addRunData->GetDataBin(forwardHistoNo[k])->at(j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k]); + if ((static_cast(j)+static_cast(fAddT0s[i-1][2*k])-static_cast(fT0s[2*k]) >= 0) && + (j+static_cast(fAddT0s[i-1][2*k])-static_cast(fT0s[2*k]) < addRunSize)) { + forward[k][j] += addRunData->GetDataBin(forwardHistoNo[k])->at(j+static_cast(fAddT0s[i-1][2*k])-static_cast(fT0s[2*k])); } } } @@ -585,8 +585,9 @@ Bool_t PRunAsymmetry::PrepareData() addRunSize = addRunData->GetDataBin(backwardHistoNo[k])->size(); for (UInt_t j=0; jGetDataBin(backwardHistoNo[k])->size(); j++) { // loop over the bin indices // make sure that the index stays in the proper range - if (((Int_t)j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1] >= 0) && (j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1] < addRunSize)) { - backward[k][j] += addRunData->GetDataBin(backwardHistoNo[k])->at(j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1]); + if ((static_cast(j)+static_cast(fAddT0s[i-1][2*k+1])-static_cast(fT0s[2*k+1]) >= 0) && + (j+static_cast(fAddT0s[i-1][2*k+1])-static_cast(fT0s[2*k+1]) < addRunSize)) { + backward[k][j] += addRunData->GetDataBin(backwardHistoNo[k])->at(j+static_cast(fAddT0s[i-1][2*k+1])-static_cast(fT0s[2*k+1])); } } } @@ -606,7 +607,7 @@ Bool_t PRunAsymmetry::PrepareData() for (UInt_t j=0; jGetDataBin(forwardHistoNo[i])->size(); j++) { // loop over the bin indices // make sure that the index stays within proper range if ((j+fT0s[2*i]-fT0s[0] >= 0) && (j+fT0s[2*i]-fT0s[0] < runData->GetDataBin(forwardHistoNo[i])->size())) { - fForward[j] += forward[i][j+(Int_t)fT0s[2*i]-(Int_t)fT0s[0]]; + fForward[j] += forward[i][j+static_cast(fT0s[2*i])-static_cast(fT0s[0])]; } } } @@ -616,7 +617,7 @@ Bool_t PRunAsymmetry::PrepareData() for (UInt_t j=0; jGetDataBin(backwardHistoNo[i])->size(); j++) { // loop over the bin indices // make sure that the index stays within proper range if ((j+fT0s[2*i+1]-fT0s[1] >= 0) && (j+fT0s[2*i+1]-fT0s[1] < runData->GetDataBin(backwardHistoNo[i])->size())) { - fBackward[j] += backward[i][j+(Int_t)fT0s[2*i+1]-(Int_t)fT0s[1]]; + fBackward[j] += backward[i][j+static_cast(fT0s[2*i+1])-static_cast(fT0s[1])]; } } } @@ -631,12 +632,12 @@ Bool_t PRunAsymmetry::PrepareData() fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.1), 2); fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.6), 3); - cerr << endl << ">> PRunAsymmetry::PrepareData(): **WARNING** Neither fix background nor background bins are given!"; - cerr << endl << ">> Will try the following:"; - cerr << endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); - cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PrepareData(): **WARNING** Neither fix background nor background bins are given!"; + std::cerr << std::endl << ">> Will try the following:"; + std::cerr << std::endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); + std::cerr << std::endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + std::cerr << std::endl; if (!SubtractEstimatedBkg()) return false; } @@ -761,7 +762,7 @@ Bool_t PRunAsymmetry::SubtractEstimatedBkg() Int_t end[2] = {fRunInfo->GetBkgRange(1), fRunInfo->GetBkgRange(3)}; for (UInt_t i=0; i<2; i++) { if (end[i] < start[i]) { - cout << endl << "PRunAsymmetry::SubtractEstimatedBkg(): end = " << end[i] << " > start = " << start[i] << "! Will swap them!"; + std::cout << std::endl << "PRunAsymmetry::SubtractEstimatedBkg(): end = " << end[i] << " > start = " << start[i] << "! Will swap them!"; UInt_t keep = end[i]; end[i] = start[i]; start[i] = keep; @@ -771,11 +772,11 @@ Bool_t PRunAsymmetry::SubtractEstimatedBkg() // calculate proper background range for (UInt_t i=0; i<2; i++) { if (beamPeriod != 0.0) { - Double_t timeBkg = (Double_t)(end[i]-start[i])*(fTimeResolution*fPacking); // length of the background intervall in time - UInt_t fullCycles = (UInt_t)(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall + Double_t timeBkg = static_cast(end[i]-start[i])*(fTimeResolution*fPacking); // length of the background intervall in time + UInt_t fullCycles = static_cast(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall // correct the end of the background intervall such that the background is as close as possible to a multiple of the proton cylce - end[i] = start[i] + (UInt_t) ((fullCycles*beamPeriod)/(fTimeResolution*fPacking)); - cout << "PRunAsymmetry::SubtractEstimatedBkg(): Background " << start[i] << ", " << end[i] << endl; + end[i] = start[i] + static_cast((fullCycles*beamPeriod)/(fTimeResolution*fPacking)); + std::cout << "PRunAsymmetry::SubtractEstimatedBkg(): Background " << start[i] << ", " << end[i] << std::endl; if (end[i] == start[i]) end[i] = fRunInfo->GetBkgRange(2*i+1); } @@ -784,18 +785,18 @@ Bool_t PRunAsymmetry::SubtractEstimatedBkg() // check if start is within histogram bounds if ((start[0] < 0) || (start[0] >= fForward.size()) || (start[1] < 0) || (start[1] >= fBackward.size())) { - cerr << endl << ">> PRunAsymmetry::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; - cerr << endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; + std::cerr << std::endl << ">> PRunAsymmetry::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + std::cerr << std::endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; return false; } // check if end is within histogram bounds if ((end[0] < 0) || (end[0] >= fForward.size()) || (end[1] < 0) || (end[1] >= fBackward.size())) { - cerr << endl << ">> PRunAsymmetry::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; - cerr << endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; + std::cerr << std::endl << ">> PRunAsymmetry::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + std::cerr << std::endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; return false; } @@ -808,14 +809,14 @@ Bool_t PRunAsymmetry::SubtractEstimatedBkg() bkg[0] += fForward[i]; errBkg[0] = TMath::Sqrt(bkg[0])/(end[0] - start[0] + 1); bkg[0] /= static_cast(end[0] - start[0] + 1); - cout << endl << ">> estimated forward histo background: " << bkg[0]; + std::cout << std::endl << ">> estimated forward histo background: " << bkg[0]; // backward for (UInt_t i=start[1]; i<=end[1]; i++) bkg[1] += fBackward[i]; errBkg[1] = TMath::Sqrt(bkg[1])/(end[1] - start[1] + 1); bkg[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated backward histo background: " << bkg[1] << endl; + std::cout << std::endl << ">> estimated backward histo background: " << bkg[1] << std::endl; // correct error for forward, backward Double_t errVal = 0.0; @@ -925,8 +926,8 @@ Bool_t PRunAsymmetry::PrepareFitData() Double_t f, b, ef, eb; // fill data time start, and step // data start at data_start-t0 shifted by (pack-1)/2 - fData.SetDataTimeStart(fTimeResolution*((Double_t)fGoodBins[0]-fT0s[0]+(Double_t)(fPacking-1)/2.0)); - fData.SetDataTimeStep(fTimeResolution*(Double_t)fPacking); + fData.SetDataTimeStart(fTimeResolution*(static_cast(fGoodBins[0])-fT0s[0]+static_cast(fPacking-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*static_cast(fPacking)); for (UInt_t i=0; iat(i); @@ -997,7 +998,7 @@ Bool_t PRunAsymmetry::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]) // first get start data, end data, and t0 Int_t start[2] = {fGoodBins[0], fGoodBins[2]}; Int_t end[2] = {fGoodBins[1], fGoodBins[3]}; - Int_t t0[2] = {(Int_t)fT0s[0], (Int_t)fT0s[1]}; + Int_t t0[2] = {static_cast(fT0s[0]), static_cast(fT0s[1])}; // check if the data ranges and t0's between forward/backward are compatible Int_t fgb[2]; @@ -1005,13 +1006,13 @@ Bool_t PRunAsymmetry::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]) if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { fgb[0] = start[0]; fgb[1] = t0[1] + start[0]-t0[0]; - cerr << endl << ">> PRunAsymmetry::PrepareViewData(): **WARNING** needed to shift backward fgb from "; - cerr << start[1] << " to " << fgb[1] << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PrepareViewData(): **WARNING** needed to shift backward fgb from "; + std::cerr << start[1] << " to " << fgb[1] << std::endl; } else { fgb[0] = t0[0] + start[1]-t0[1]; fgb[1] = start[1]; - cerr << endl << ">> PRunAsymmetry::PrepareViewData(): **WARNING** needed to shift forward fgb from "; - cerr << start[0] << " to " << fgb[0] << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PrepareViewData(): **WARNING** needed to shift forward fgb from "; + std::cerr << start[0] << " to " << fgb[0] << std::endl; } } else { // fgb aligning is correct fgb[0] = start[0]; @@ -1044,21 +1045,21 @@ Bool_t PRunAsymmetry::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]) start[i] = keep; } // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start[i] < 0) || (start[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds - if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; - cerr << endl; + if ((end[i] < 0) || (end[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::PrepareViewData(): **ERROR** t0 data bin doesn't make any sense!"; - cerr << endl; + if ((t0[i] < 0) || (t0[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::PrepareViewData(): **ERROR** t0 data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -1127,8 +1128,8 @@ Bool_t PRunAsymmetry::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]) Double_t f, b, ef, eb, alpha = 1.0, beta = 1.0; // set data time start, and step // data start at data_start-t0 - fData.SetDataTimeStart(fTimeResolution*((Double_t)start[0]-t0[0]+(Double_t)(packing-1)/2.0)); - fData.SetDataTimeStep(fTimeResolution*(Double_t)packing); + fData.SetDataTimeStart(fTimeResolution*(static_cast(start[0])-t0[0]+static_cast(packing-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*static_cast(packing)); // get the proper alpha and beta switch (fAlphaBetaTag) { @@ -1192,12 +1193,12 @@ Bool_t PRunAsymmetry::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]) Double_t factor = 1.0; if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo[0])->size()) { size = fData.GetValue()->size() * 10; - factor = (Double_t)runData->GetDataBin(histoNo[0])->size() / (Double_t)size; + factor = static_cast(runData->GetDataBin(histoNo[0])->size()) / static_cast(size); } fData.SetTheoryTimeStart(fData.GetDataTimeStart()); fData.SetTheoryTimeStep(fTimeResolution*factor); for (UInt_t i=0; i(i)*fTimeResolution*factor; value = fTheory->Func(time, par, fFuncValues); if (fabs(value) > 10.0) { // dirty hack needs to be fixed!! value = 0.0; @@ -1244,7 +1245,7 @@ Bool_t PRunAsymmetry::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2] // first get start data, end data, and t0 Int_t start[2] = {fGoodBins[0], fGoodBins[2]}; Int_t end[2] = {fGoodBins[1], fGoodBins[3]}; - Int_t t0[2] = {(Int_t)fT0s[0], (Int_t)fT0s[1]}; + Int_t t0[2] = {static_cast(fT0s[0]), static_cast(fT0s[1])}; UInt_t packing = fMsrInfo->GetMsrPlotList()->at(0).fRRFPacking; // check if the data ranges and t0's between forward/backward are compatible @@ -1253,13 +1254,13 @@ Bool_t PRunAsymmetry::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2] if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { fgb[0] = start[0]; fgb[1] = t0[1] + start[0]-t0[0]; - cerr << endl << ">> PRunAsymmetry::PrepareRRFViewData(): **WARNING** needed to shift backward fgb from "; - cerr << start[1] << " to " << fgb[1] << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PrepareRRFViewData(): **WARNING** needed to shift backward fgb from "; + std::cerr << start[1] << " to " << fgb[1] << std::endl; } else { fgb[0] = t0[0] + start[1]-t0[1]; fgb[1] = start[1]; - cerr << endl << ">> PRunAsymmetry::PrepareRRFViewData(): **WARNING** needed to shift forward fgb from "; - cerr << start[1] << " to " << fgb[0] << endl; + std::cerr << std::endl << ">> PRunAsymmetry::PrepareRRFViewData(): **WARNING** needed to shift forward fgb from "; + std::cerr << start[1] << " to " << fgb[0] << std::endl; } } else { // fgb aligning is correct fgb[0] = start[0]; @@ -1292,21 +1293,21 @@ Bool_t PRunAsymmetry::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2] start[i] = keep; } // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::PrepareRRFViewData(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start[i] < 0) || (start[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::PrepareRRFViewData(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds - if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::PrepareRRFViewData(): **ERROR** end data bin doesn't make any sense!"; - cerr << endl; + if ((end[i] < 0) || (end[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::PrepareRRFViewData(): **ERROR** end data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::PrepareRRFViewData(): **ERROR** t0 data bin doesn't make any sense!"; - cerr << endl; + if ((t0[i] < 0) || (t0[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::PrepareRRFViewData(): **ERROR** t0 data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -1582,11 +1583,11 @@ Bool_t PRunAsymmetry::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalB fT0s[2*i] = runData->GetT0BinEstimated(forwardHistoNo[i]); fRunInfo->SetT0Bin(fT0s[2*i], 2*i); - cerr << endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName()->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } for (UInt_t i=0; iGetT0BinEstimated(backwardHistoNo[i]); fRunInfo->SetT0Bin(fT0s[2*i+1], 2*i+1); - cerr << endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); - cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName()->Data(); + std::cerr << std::endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } // check if t0 is within proper bounds for (UInt_t i=0; i (Int_t)runData->GetDataBin(forwardHistoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::GetProperT0(): **ERROR** t0 data bin (" << fT0s[2*i] << ") doesn't make any sense!"; - cerr << endl << ">> forwardHistoNo " << forwardHistoNo[i]; - cerr << endl; + if ((fT0s[2*i] < 0) || (fT0s[2*i] > static_cast(runData->GetDataBin(forwardHistoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::GetProperT0(): **ERROR** t0 data bin (" << fT0s[2*i] << ") doesn't make any sense!"; + std::cerr << std::endl << ">> forwardHistoNo " << forwardHistoNo[i]; + std::cerr << std::endl; return false; } - if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > (Int_t)runData->GetDataBin(backwardHistoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!"; - cerr << endl << ">> backwardHistoNo " << backwardHistoNo[i]; - cerr << endl; + if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > static_cast(runData->GetDataBin(backwardHistoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!"; + std::cerr << std::endl << ">> backwardHistoNo " << backwardHistoNo[i]; + std::cerr << std::endl; return false; } } @@ -1626,8 +1627,8 @@ Bool_t PRunAsymmetry::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalB // get run to be added to the main one addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunAsymmetry::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -1666,11 +1667,11 @@ Bool_t PRunAsymmetry::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalB fAddT0s[i-1][2*j] = addRunData->GetT0BinEstimated(forwardHistoNo[j]); fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j], i-1, 2*j); - cerr << endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } for (UInt_t j=0; jGetT0BinEstimated(backwardHistoNo[j]); fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j+1], i-1, 2*j+1); - cerr << endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); - cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + std::cerr << std::endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } } @@ -1727,36 +1728,36 @@ Bool_t PRunAsymmetry::GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2] } Double_t t0[2] = {fT0s[0], fT0s[1]}; - Int_t offset = (Int_t)(10.0e-3/fTimeResolution); // needed in case first good bin is not given, default = 10ns + Int_t offset = static_cast((10.0e-3/fTimeResolution)); // needed in case first good bin is not given, default = 10ns // check if data range has been provided, and if not try to estimate them if (start[0] < 0) { - start[0] = (Int_t)t0[0]+offset; + start[0] = static_cast(t0[0])+offset; fRunInfo->SetDataRange(start[0], 0); - cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (start[1] < 0) { - start[1] = (Int_t)t0[1]+offset; + start[1] = static_cast(t0[1])+offset; fRunInfo->SetDataRange(start[1], 2); - cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (end[0] < 0) { end[0] = runData->GetDataBin(histoNo[0])->size(); fRunInfo->SetDataRange(end[0], 1); - cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (end[1] < 0) { end[1] = runData->GetDataBin(histoNo[1])->size(); fRunInfo->SetDataRange(end[1], 3); - cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } // check if start, end, and t0 make any sense @@ -1768,27 +1769,27 @@ Bool_t PRunAsymmetry::GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2] start[i] = keep; } // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start[i] < 0) || (start[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds if (end[i] < 0) { - cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **ERROR** end data bin (" << end[i] << ") doesn't make any sense!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange(): **ERROR** end data bin (" << end[i] << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } - if (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size()) { - cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** end data bin (" << end[i] << ") > histo length (" << (Int_t)runData->GetDataBin(histoNo[i])->size() << ")."; - cerr << endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << endl; - cerr << endl; - end[i] = (Int_t)runData->GetDataBin(histoNo[i])->size()-1; + if (end[i] > static_cast(runData->GetDataBin(histoNo[i])->size())) { + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange(): **WARNING** end data bin (" << end[i] << ") > histo length (" << static_cast(runData->GetDataBin(histoNo[i])->size()) << ")."; + std::cerr << std::endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << std::endl; + std::cerr << std::endl; + end[i] = static_cast(runData->GetDataBin(histoNo[i])->size())-1; } // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetry::GetProperDataRange(): **ERROR** t0 data bin doesn't make any sense!"; - cerr << endl; + if ((t0[i] < 0) || (t0[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange(): **ERROR** t0 data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -1797,18 +1798,18 @@ Bool_t PRunAsymmetry::GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2] if (fabs(static_cast(start[0])-t0[0]) > fabs(static_cast(start[1])-t0[1])){ start[1] = static_cast(t0[1] + static_cast(start[0]) - t0[0]); end[1] = static_cast(t0[1] + static_cast(end[0]) - t0[0]); - cerr << endl << ">> PRunAsymmetry::GetProperDataRange **WARNING** needed to shift backward data range."; - cerr << endl << ">> given: " << fRunInfo->GetDataRange(2) << ", " << fRunInfo->GetDataRange(3); - cerr << endl << ">> used : " << start[1] << ", " << end[1]; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange **WARNING** needed to shift backward data range."; + std::cerr << std::endl << ">> given: " << fRunInfo->GetDataRange(2) << ", " << fRunInfo->GetDataRange(3); + std::cerr << std::endl << ">> used : " << start[1] << ", " << end[1]; + std::cerr << std::endl; } if (fabs(static_cast(start[0])-t0[0]) < fabs(static_cast(start[1])-t0[1])){ start[0] = static_cast(t0[0] + static_cast(start[1]) - t0[1]); end[0] = static_cast(t0[0] + static_cast(end[1]) - t0[1]); - cerr << endl << ">> PRunAsymmetry::GetProperDataRange **WARNING** needed to shift forward data range."; - cerr << endl << ">> given: " << fRunInfo->GetDataRange(0) << ", " << fRunInfo->GetDataRange(1); - cerr << endl << ">> used : " << start[0] << ", " << end[0]; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetry::GetProperDataRange **WARNING** needed to shift forward data range."; + std::cerr << std::endl << ">> given: " << fRunInfo->GetDataRange(0) << ", " << fRunInfo->GetDataRange(1); + std::cerr << std::endl << ">> used : " << start[0] << ", " << end[0]; + std::cerr << std::endl; } // keep good bins for potential latter use @@ -1863,7 +1864,7 @@ void PRunAsymmetry::GetProperFitRange(PMsrGlobalBlock *globalBlock) if ((fFitStartTime == PMUSR_UNDEFINED) || (fFitEndTime == PMUSR_UNDEFINED)) { fFitStartTime = (fGoodBins[0] - fT0s[0]) * fTimeResolution; // (fgb-t0)*dt fFitEndTime = (fGoodBins[1] - fT0s[0]) * fTimeResolution; // (lgb-t0)*dt - cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << endl; - cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; + std::cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << std::endl; + std::cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << std::endl; } } diff --git a/src/classes/PRunAsymmetryRRF.cpp b/src/classes/PRunAsymmetryRRF.cpp index 38811c93..64d2fdc2 100644 --- a/src/classes/PRunAsymmetryRRF.cpp +++ b/src/classes/PRunAsymmetryRRF.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2007-2016 by Andreas Suter * + * Copyright (C) 2007-2019 by Andreas Suter * * andreas.suter@psi.ch * * * * This program is free software; you can redistribute it and/or modify * @@ -39,7 +39,6 @@ #include #include -using namespace std; #include #include @@ -85,9 +84,9 @@ PRunAsymmetryRRF::PRunAsymmetryRRF(PMsrHandler *msrInfo, PRunDataHandler *rawDat fRRFPacking = fMsrInfo->GetMsrGlobal()->GetRRFPacking(); if (fRRFPacking == -1) { // this should NOT happen, somethin is severely wrong - cerr << endl << ">> PRunAsymmetryRRF::PRunAsymmetryRRF(): **SEVERE ERROR**: Couldn't find any RRF packing information!"; - cerr << endl << ">> This is very bad :-(, will quit ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::PRunAsymmetryRRF(): **SEVERE ERROR**: Couldn't find any RRF packing information!"; + std::cerr << std::endl << ">> This is very bad :-(, will quit ..."; + std::cerr << std::endl; fValid = false; return; } @@ -98,16 +97,16 @@ PRunAsymmetryRRF::PRunAsymmetryRRF(PMsrHandler *msrInfo, PRunDataHandler *rawDat // check if alpha is given if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given - cerr << endl << ">> PRunAsymmetryRRF::PRunAsymmetryRRF(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::PRunAsymmetryRRF(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; + std::cerr << std::endl; fValid = false; return; } // check if alpha parameter is within proper bounds - if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { - cerr << endl << ">> PRunAsymmetryRRF::PRunAsymmetryRRF(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); - cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; - cerr << endl; + if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > static_cast(param->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryRRF::PRunAsymmetryRRF(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); + std::cerr << std::endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + std::cerr << std::endl; fValid = false; return; } @@ -121,10 +120,10 @@ PRunAsymmetryRRF::PRunAsymmetryRRF(PMsrHandler *msrInfo, PRunDataHandler *rawDat Bool_t betaFixedToOne = false; if (fRunInfo->GetBetaParamNo() == -1) { // no beta given hence assuming beta == 1 betaFixedToOne = true; - } else if ((fRunInfo->GetBetaParamNo() < 0) || (fRunInfo->GetBetaParamNo() > (Int_t)param->size())) { // check if beta parameter is within proper bounds - cerr << endl << ">> PRunAsymmetryRRF::PRunAsymmetryRRF(): **ERROR** beta parameter no = " << fRunInfo->GetBetaParamNo(); - cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; - cerr << endl; + } else if ((fRunInfo->GetBetaParamNo() < 0) || (fRunInfo->GetBetaParamNo() > static_cast(param->size()))) { // check if beta parameter is within proper bounds + std::cerr << std::endl << ">> PRunAsymmetryRRF::PRunAsymmetryRRF(): **ERROR** beta parameter no = " << fRunInfo->GetBetaParamNo(); + std::cerr << std::endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + std::cerr << std::endl; fValid = false; return; } else { // check if beta is fixed @@ -202,7 +201,7 @@ Double_t PRunAsymmetryRRF::CalcChiSquare(const std::vector& par) #pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,a,b,f) schedule(dynamic,chunk) reduction(+:chisq) #endif for (i=fStartTimeBin; i(i)*fData.GetDataTimeStep(); switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 asymFcnValue = fTheory->Func(time, par, fFuncValues); @@ -260,7 +259,7 @@ Double_t PRunAsymmetryRRF::CalcChiSquareExpected(const std::vector& pa */ Double_t PRunAsymmetryRRF::CalcMaxLikelihood(const std::vector& par) { - cout << endl << "PRunAsymmetryRRF::CalcMaxLikelihood(): not implemented yet ..." << endl; + std::cout << std::endl << "PRunAsymmetryRRF::CalcMaxLikelihood(): not implemented yet ..." << std::endl; return 1.0; } @@ -296,8 +295,8 @@ UInt_t PRunAsymmetryRRF::GetNoOfFitBins() */ void PRunAsymmetryRRF::SetFitRangeBin(const TString fitRange) { - TObjArray *tok = 0; - TObjString *ostr = 0; + TObjArray *tok = nullptr; + TObjString *ostr = nullptr; TString str; Ssiz_t idx = -1; Int_t offset = 0; @@ -306,7 +305,7 @@ void PRunAsymmetryRRF::SetFitRangeBin(const TString fitRange) if (tok->GetEntries() == 3) { // structure FIT_RANGE fgb+n0 lgb-n1 // handle fgb+n0 entry - ostr = (TObjString*) tok->At(1); + ostr = static_cast(tok->At(1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -318,7 +317,7 @@ void PRunAsymmetryRRF::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(2); + ostr = static_cast(tok->At(2)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -332,11 +331,11 @@ void PRunAsymmetryRRF::SetFitRangeBin(const TString fitRange) Int_t pos = 2*(fRunNo+1)-1; if (pos + 1 >= tok->GetEntries()) { - cerr << endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } else { // handle fgb+n0 entry - ostr = (TObjString*) tok->At(pos); + ostr = static_cast(tok->At(pos)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -348,7 +347,7 @@ void PRunAsymmetryRRF::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(pos+1); + ostr = static_cast(tok->At(pos+1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -360,8 +359,8 @@ void PRunAsymmetryRRF::SetFitRangeBin(const TString fitRange) fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; } } else { // error - cerr << endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } // clean up @@ -416,7 +415,7 @@ void PRunAsymmetryRRF::CalcTheory() Double_t a, b, f; Double_t time; for (UInt_t i=0; isize(); i++) { - time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + time = fData.GetDataTimeStart() + static_cast(i)*fData.GetDataTimeStep(); switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 asymFcnValue = fTheory->Func(time, par, fFuncValues); @@ -479,8 +478,8 @@ Bool_t PRunAsymmetryRRF::PrepareData() // get the correct run PRawRunData *runData = fRawData->GetRunData(*(fRunInfo->GetRunName())); if (!runData) { // run not found - cerr << endl << ">> PRunAsymmetryRRF::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; + std::cerr << std::endl; return false; } @@ -491,10 +490,10 @@ Bool_t PRunAsymmetryRRF::PrepareData() forwardHistoNo.push_back(fRunInfo->GetForwardHistoNo(i)); if (!runData->IsPresent(forwardHistoNo[i])) { - cerr << endl << ">> PRunAsymmetryRRF::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> forwardHistoNo found = " << forwardHistoNo[i] << ", which is NOT present in the data file!?!?"; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> forwardHistoNo found = " << forwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; // clean up forwardHistoNo.clear(); backwardHistoNo.clear(); @@ -505,10 +504,10 @@ Bool_t PRunAsymmetryRRF::PrepareData() backwardHistoNo.push_back(fRunInfo->GetBackwardHistoNo(i)); if (!runData->IsPresent(backwardHistoNo[i])) { - cerr << endl << ">> PRunAsymmetryRRF::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> backwardHistoNo found = " << backwardHistoNo[i] << ", which is NOT present in the data file!?!?"; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> backwardHistoNo found = " << backwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; // clean up forwardHistoNo.clear(); backwardHistoNo.clear(); @@ -516,10 +515,10 @@ Bool_t PRunAsymmetryRRF::PrepareData() } } if (forwardHistoNo.size() != backwardHistoNo.size()) { - cerr << endl << ">> PRunAsymmetryRRF::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> # of forward histograms different from # of backward histograms."; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> # of forward histograms different from # of backward histograms."; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; // clean up forwardHistoNo.clear(); backwardHistoNo.clear(); @@ -528,8 +527,8 @@ Bool_t PRunAsymmetryRRF::PrepareData() // keep the time resolution in (us) fTimeResolution = runData->GetTimeResolution()/1.0e3; - cout.precision(10); - cout << endl << ">> PRunAsymmetryRRF::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; + std::cout.precision(10); + std::cout << std::endl << ">> PRunAsymmetryRRF::PrepareData(): time resolution=" << std::fixed << runData->GetTimeResolution() << "(ns)" << std::endl; // get all the proper t0's and addt0's for the current RUN block if (!GetProperT0(runData, globalBlock, forwardHistoNo, backwardHistoNo)) { @@ -537,7 +536,7 @@ Bool_t PRunAsymmetryRRF::PrepareData() } // keep the histo of each group at this point (addruns handled below) - vector forward, backward; + std::vector forward, backward; forward.resize(forwardHistoNo.size()); // resize to number of groups backward.resize(backwardHistoNo.size()); // resize to numer of groups for (UInt_t i=0; iGetRunNameSize(); i++) { // get run to be added to the main one addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunAsymmetryRRF::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -623,12 +622,12 @@ Bool_t PRunAsymmetryRRF::PrepareData() fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.1), 2); fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.6), 3); - cerr << endl << ">> PRunAsymmetryRRF::PrepareData(): **WARNING** Neither fix background nor background bins are given!"; - cerr << endl << ">> Will try the following:"; - cerr << endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); - cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareData(): **WARNING** Neither fix background nor background bins are given!"; + std::cerr << std::endl << ">> Will try the following:"; + std::cerr << std::endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); + std::cerr << std::endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + std::cerr << std::endl; if (!SubtractEstimatedBkg()) return false; } @@ -746,11 +745,11 @@ Bool_t PRunAsymmetryRRF::SubtractEstimatedBkg() beamPeriod = 0.0; // check if start and end are in proper order - UInt_t start[2] = {(UInt_t)fRunInfo->GetBkgRange(0), (UInt_t)fRunInfo->GetBkgRange(2)}; - UInt_t end[2] = {(UInt_t)fRunInfo->GetBkgRange(1), (UInt_t)fRunInfo->GetBkgRange(3)}; + UInt_t start[2] = {static_cast(fRunInfo->GetBkgRange(0)), static_cast(fRunInfo->GetBkgRange(2))}; + UInt_t end[2] = {static_cast(fRunInfo->GetBkgRange(1)), static_cast(fRunInfo->GetBkgRange(3))}; for (UInt_t i=0; i<2; i++) { if (end[i] < start[i]) { - cout << endl << "PRunAsymmetryRRF::SubtractEstimatedBkg(): end = " << end[i] << " > start = " << start[i] << "! Will swap them!"; + std::cout << std::endl << "PRunAsymmetryRRF::SubtractEstimatedBkg(): end = " << end[i] << " > start = " << start[i] << "! Will swap them!"; UInt_t keep = end[i]; end[i] = start[i]; start[i] = keep; @@ -760,11 +759,11 @@ Bool_t PRunAsymmetryRRF::SubtractEstimatedBkg() // calculate proper background range for (UInt_t i=0; i<2; i++) { if (beamPeriod != 0.0) { - Double_t timeBkg = (Double_t)(end[i]-start[i])*fTimeResolution; // length of the background intervall in time - UInt_t fullCycles = (UInt_t)(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall + Double_t timeBkg = static_cast(end[i]-start[i])*fTimeResolution; // length of the background intervall in time + UInt_t fullCycles = static_cast(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall // correct the end of the background intervall such that the background is as close as possible to a multiple of the proton cylce - end[i] = start[i] + (UInt_t) ((fullCycles*beamPeriod)/fTimeResolution); - cout << "PRunAsymmetryRRF::SubtractEstimatedBkg(): Background " << start[i] << ", " << end[i] << endl; + end[i] = start[i] + static_cast((fullCycles*beamPeriod)/fTimeResolution); + std::cout << "PRunAsymmetryRRF::SubtractEstimatedBkg(): Background " << start[i] << ", " << end[i] << std::endl; if (end[i] == start[i]) end[i] = fRunInfo->GetBkgRange(2*i+1); } @@ -772,17 +771,17 @@ Bool_t PRunAsymmetryRRF::SubtractEstimatedBkg() // check if start is within histogram bounds if ((start[0] >= fForward.size()) || (start[1] >= fBackward.size())) { - cerr << endl << ">> PRunAsymmetryRRF::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; - cerr << endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; + std::cerr << std::endl << ">> PRunAsymmetryRRF::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + std::cerr << std::endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; return false; } // check if end is within histogram bounds if ((end[0] >= fForward.size()) || (end[1] >= fBackward.size())) { - cerr << endl << ">> PRunAsymmetryRRF::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; - cerr << endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; + std::cerr << std::endl << ">> PRunAsymmetryRRF::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + std::cerr << std::endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; return false; } @@ -795,14 +794,14 @@ Bool_t PRunAsymmetryRRF::SubtractEstimatedBkg() bkg[0] += fForward[i]; errBkg[0] = TMath::Sqrt(bkg[0])/(end[0] - start[0] + 1); bkg[0] /= static_cast(end[0] - start[0] + 1); - cout << endl << ">> estimated forward histo background: " << bkg[0]; + std::cout << std::endl << ">> estimated forward histo background: " << bkg[0]; // backward for (UInt_t i=start[1]; i<=end[1]; i++) bkg[1] += fBackward[i]; errBkg[1] = TMath::Sqrt(bkg[1])/(end[1] - start[1] + 1); bkg[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated backward histo background: " << bkg[1] << endl; + std::cout << std::endl << ">> estimated backward histo background: " << bkg[1] << std::endl; // correct error for forward, backward Double_t errVal = 0.0; @@ -845,17 +844,17 @@ Bool_t PRunAsymmetryRRF::PrepareFitData() // 1st: form the asymmetry of the original data // forward and backward detectors might have different fgb-t0 offset. Take the maximum of both. - Int_t fgbOffset = fGoodBins[0]-(Int_t)fT0s[0]; - if (fgbOffset < fGoodBins[2]-(Int_t)fT0s[1]) - fgbOffset = fGoodBins[2]-(Int_t)fT0s[1]; + Int_t fgbOffset = fGoodBins[0]-static_cast(fT0s[0]); + if (fgbOffset < fGoodBins[2]-static_cast(fT0s[1])) + fgbOffset = fGoodBins[2]-static_cast(fT0s[1]); // last good bin (lgb) is the minimum of forward/backward lgb - Int_t lgb_offset = fGoodBins[1]-(Int_t)fT0s[0]+fgbOffset; - if (lgb_offset < fGoodBins[3]-(Int_t)fT0s[1]+fgbOffset) - lgb_offset = fGoodBins[3]-(Int_t)fT0s[1]+fgbOffset; + Int_t lgb_offset = fGoodBins[1]-static_cast(fT0s[0])+fgbOffset; + if (lgb_offset < fGoodBins[3]-static_cast(fT0s[1])+fgbOffset) + lgb_offset = fGoodBins[3]-static_cast(fT0s[1])+fgbOffset; - Int_t fgb = (Int_t)fT0s[0]+fgbOffset; + Int_t fgb = static_cast(fT0s[0])+fgbOffset; Int_t lgb = fgb + lgb_offset; - Int_t dt0 = (Int_t)fT0s[0]-(Int_t)fT0s[1]; + Int_t dt0 = static_cast(fT0s[0])-static_cast(fT0s[1]); PDoubleVector asym; PDoubleVector asymErr; @@ -883,7 +882,7 @@ Bool_t PRunAsymmetryRRF::PrepareFitData() Double_t wRRF = globalBlock->GetRRFFreq("Mc"); Double_t phaseRRF = globalBlock->GetRRFPhase()*TMath::TwoPi()/180.0; - Double_t startTime = fTimeResolution * (Double_t)fgbOffset; + Double_t startTime = fTimeResolution * static_cast(fgbOffset); Double_t time=0.0; for (UInt_t i=0; i(fRRFPacking-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*static_cast(fRRFPacking)); for (UInt_t i=0; i(fT0s[0]), static_cast(fT0s[1])}; // check if the data ranges and t0's between forward/backward are compatible Int_t fgb[2]; @@ -973,13 +972,13 @@ Bool_t PRunAsymmetryRRF::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2] if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { fgb[0] = start[0]; fgb[1] = t0[1] + start[0]-t0[0]; - cerr << endl << ">> PRunAsymmetryRRF::PrepareViewData(): **WARNING** needed to shift backward fgb from "; - cerr << start[1] << " to " << fgb[1] << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareViewData(): **WARNING** needed to shift backward fgb from "; + std::cerr << start[1] << " to " << fgb[1] << std::endl; } else { fgb[0] = t0[0] + start[1]-t0[1]; fgb[1] = start[1]; - cerr << endl << ">> PRunAsymmetryRRF::PrepareViewData(): **WARNING** needed to shift forward fgb from "; - cerr << start[0] << " to " << fgb[0] << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareViewData(): **WARNING** needed to shift forward fgb from "; + std::cerr << start[0] << " to " << fgb[0] << std::endl; } } else { // fgb aligning is correct fgb[0] = start[0]; @@ -999,21 +998,21 @@ Bool_t PRunAsymmetryRRF::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2] // check if start, end, and t0 make any sense for (UInt_t i=0; i<2; i++) { // 1st check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryRRF::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start[i] < 0) || (start[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 2nd check if end is within proper bounds - if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryRRF::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; - cerr << endl; + if ((end[i] < 0) || (end[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryRRF::PrepareViewData(): **ERROR** t0 data bin doesn't make any sense!"; - cerr << endl; + if ((t0[i] < 0) || (t0[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareViewData(): **ERROR** t0 data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -1077,7 +1076,7 @@ Bool_t PRunAsymmetryRRF::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2] PMsrGlobalBlock *globalBlock = fMsrInfo->GetMsrGlobal(); Double_t wRRF = globalBlock->GetRRFFreq("Mc"); Double_t phaseRRF = globalBlock->GetRRFPhase()*TMath::TwoPi()/180.0; - Double_t startTime=fTimeResolution*((Double_t)start[0]-t0[0]); + Double_t startTime=fTimeResolution*(static_cast(start[0])-t0[0]); Double_t time = 0.0; for (UInt_t i=0; i(fRRFPacking-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*static_cast(fRRFPacking)); for (UInt_t i=0; isize() * 10 > runData->GetDataBin(histoNo[0])->size()) { size = fData.GetValue()->size() * 10; - factor = (Double_t)runData->GetDataBin(histoNo[0])->size() / (Double_t)size; + factor = static_cast(runData->GetDataBin(histoNo[0])->size()) / static_cast(size); } fData.SetTheoryTimeStart(fData.GetDataTimeStart()); fData.SetTheoryTimeStep(fTimeResolution*factor); for (UInt_t i=0; i(i)*fTimeResolution*factor; dval = fTheory->Func(time, par, fFuncValues); if (fabs(dval) > 10.0) { // dirty hack needs to be fixed!! dval = 0.0; @@ -1193,7 +1192,7 @@ Bool_t PRunAsymmetryRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glob // fill in the missing T0's from the GLOBAL block section (if present) for (UInt_t i=0; iGetT0BinSize(); i++) { - if (fT0s[i] == -1) { // i.e. not given in the RUN block section + if (fT0s[i] == -1.0) { // i.e. not given in the RUN block section fT0s[i] = globalBlock->GetT0Bin(i); } } @@ -1220,11 +1219,11 @@ Bool_t PRunAsymmetryRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glob fT0s[2*i] = runData->GetT0BinEstimated(forwardHistoNo[i]); fRunInfo->SetT0Bin(fT0s[2*i], 2*i); - cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName()->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } for (UInt_t i=0; iGetT0BinEstimated(backwardHistoNo[i]); fRunInfo->SetT0Bin(fT0s[2*i+1], 2*i+1); - cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); - cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName()->Data(); + std::cerr << std::endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } // check if t0 is within proper bounds for (UInt_t i=0; i (Int_t)runData->GetDataBin(forwardHistoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **ERROR** t0 data bin (" << fT0s[2*i] << ") doesn't make any sense!"; - cerr << endl << ">> forwardHistoNo " << forwardHistoNo[i]; - cerr << endl; + if ((fT0s[2*i] < 0) || (fT0s[2*i] > static_cast(runData->GetDataBin(forwardHistoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperT0(): **ERROR** t0 data bin (" << fT0s[2*i] << ") doesn't make any sense!"; + std::cerr << std::endl << ">> forwardHistoNo " << forwardHistoNo[i]; + std::cerr << std::endl; return false; } - if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > (Int_t)runData->GetDataBin(backwardHistoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryRRF::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!"; - cerr << endl << ">> backwardHistoNo " << backwardHistoNo[i]; - cerr << endl; + if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > static_cast(runData->GetDataBin(backwardHistoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryRRF::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!"; + std::cerr << std::endl << ">> backwardHistoNo " << backwardHistoNo[i]; + std::cerr << std::endl; return false; } } @@ -1263,9 +1262,9 @@ Bool_t PRunAsymmetryRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glob for (UInt_t i=1; iGetRunNameSize(); i++) { // get run to be added to the main one addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -1304,11 +1303,11 @@ Bool_t PRunAsymmetryRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glob fAddT0s[i-1][2*j] = addRunData->GetT0BinEstimated(forwardHistoNo[j]); fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j], i-1, 2*j); - cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } for (UInt_t j=0; jGetT0BinEstimated(backwardHistoNo[j]); fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j+1], i-1, 2*j+1); - cerr << endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); - cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + std::cerr << std::endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } } @@ -1365,36 +1364,36 @@ Bool_t PRunAsymmetryRRF::GetProperDataRange(PRawRunData* runData, UInt_t histoNo } Double_t t0[2] = {fT0s[0], fT0s[1]}; - Int_t offset = (Int_t)(10.0e-3/fTimeResolution); // needed in case first good bin is not given, default = 10ns + Int_t offset = static_cast(10.0e-3/fTimeResolution); // needed in case first good bin is not given, default = 10ns // check if data range has been provided, and if not try to estimate them if (start[0] < 0) { - start[0] = (Int_t)t0[0]+offset; + start[0] = static_cast(t0[0])+offset; fRunInfo->SetDataRange(start[0], 0); - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (start[1] < 0) { - start[1] = (Int_t)t0[1]+offset; + start[1] = static_cast(t0[1])+offset; fRunInfo->SetDataRange(start[1], 2); - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (end[0] < 0) { end[0] = runData->GetDataBin(histoNo[0])->size(); fRunInfo->SetDataRange(end[0], 1); - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (end[1] < 0) { end[1] = runData->GetDataBin(histoNo[1])->size(); fRunInfo->SetDataRange(end[1], 3); - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } // check if start, end, and t0 make any sense @@ -1406,27 +1405,27 @@ Bool_t PRunAsymmetryRRF::GetProperDataRange(PRawRunData* runData, UInt_t histoNo start[i] = keep; } // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start[i] < 0) || (start[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds if (end[i] < 0) { - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **ERROR** end data bin (" << end[i] << ") doesn't make any sense!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **ERROR** end data bin (" << end[i] << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } - if (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size()) { - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** end data bin (" << end[i] << ") > histo length (" << (Int_t)runData->GetDataBin(histoNo[i])->size() << ")."; - cerr << endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << endl; - cerr << endl; - end[i] = (Int_t)runData->GetDataBin(histoNo[i])->size()-1; + if (end[i] > static_cast(runData->GetDataBin(histoNo[i])->size())) { + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **WARNING** end data bin (" << end[i] << ") > histo length (" << (Int_t)runData->GetDataBin(histoNo[i])->size() << ")."; + std::cerr << std::endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << std::endl; + std::cerr << std::endl; + end[i] = static_cast(runData->GetDataBin(histoNo[i])->size())-1; } // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **ERROR** t0 data bin doesn't make any sense!"; - cerr << endl; + if ((t0[i] < 0) || (t0[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange(): **ERROR** t0 data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -1435,18 +1434,18 @@ Bool_t PRunAsymmetryRRF::GetProperDataRange(PRawRunData* runData, UInt_t histoNo if (fabs(static_cast(start[0])-t0[0]) > fabs(static_cast(start[1])-t0[1])){ start[1] = static_cast(t0[1] + static_cast(start[0]) - t0[0]); end[1] = static_cast(t0[1] + static_cast(end[0]) - t0[0]); - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange **WARNING** needed to shift backward data range."; - cerr << endl << ">> given: " << fRunInfo->GetDataRange(2) << ", " << fRunInfo->GetDataRange(3); - cerr << endl << ">> used : " << start[1] << ", " << end[1]; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange **WARNING** needed to shift backward data range."; + std::cerr << std::endl << ">> given: " << fRunInfo->GetDataRange(2) << ", " << fRunInfo->GetDataRange(3); + std::cerr << std::endl << ">> used : " << start[1] << ", " << end[1]; + std::cerr << std::endl; } if (fabs(static_cast(start[0])-t0[0]) < fabs(static_cast(start[1])-t0[1])){ start[0] = static_cast(t0[0] + static_cast(start[1]) - t0[1]); end[0] = static_cast(t0[0] + static_cast(end[1]) - t0[1]); - cerr << endl << ">> PRunAsymmetryRRF::GetProperDataRange **WARNING** needed to shift forward data range."; - cerr << endl << ">> given: " << fRunInfo->GetDataRange(0) << ", " << fRunInfo->GetDataRange(1); - cerr << endl << ">> used : " << start[0] << ", " << end[0]; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryRRF::GetProperDataRange **WARNING** needed to shift forward data range."; + std::cerr << std::endl << ">> given: " << fRunInfo->GetDataRange(0) << ", " << fRunInfo->GetDataRange(1); + std::cerr << std::endl << ">> used : " << start[0] << ", " << end[0]; + std::cerr << std::endl; } // keep good bins for potential latter use @@ -1501,7 +1500,7 @@ void PRunAsymmetryRRF::GetProperFitRange(PMsrGlobalBlock *globalBlock) if ((fFitStartTime == PMUSR_UNDEFINED) || (fFitEndTime == PMUSR_UNDEFINED)) { fFitStartTime = (fGoodBins[0] - fT0s[0]) * fTimeResolution; // (fgb-t0)*dt fFitEndTime = (fGoodBins[1] - fT0s[0]) * fTimeResolution; // (lgb-t0)*dt - cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << endl; - cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; + std::cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << std::endl; + std::cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << std::endl; } } diff --git a/src/classes/PRunDataHandler.cpp b/src/classes/PRunDataHandler.cpp index d18ef587..b6be2530 100644 --- a/src/classes/PRunDataHandler.cpp +++ b/src/classes/PRunDataHandler.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2007-2016 by Andreas Suter * + * Copyright (C) 2007-2019 by Andreas Suter * * andreas.suter@psi.ch * * * * This program is free software; you can redistribute it and/or modify * @@ -41,7 +41,6 @@ #include #include #include -using namespace std; #include #include @@ -236,7 +235,7 @@ PRawRunData* PRunDataHandler::GetRunData(const TString &runName) } if (i == fData.size()) - return 0; + return nullptr; else return &fData[i]; } @@ -256,7 +255,7 @@ PRawRunData* PRunDataHandler::GetRunData(const TString &runName) PRawRunData* PRunDataHandler::GetRunData(const UInt_t idx) { if (idx >= fData.size()) - return 0; + return nullptr; else return &fData[idx]; } @@ -288,11 +287,11 @@ void PRunDataHandler::ReadData() } else if ((fFileFormat == "Wkm") || (fFileFormat == "wkm")) { fAllDataAvailable = ReadWkmFile(); } else { - cerr << endl << ">> PRunDataHandler::ReadData(): **ERROR** unkown file format \"" << fFileFormat << "\" found." << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadData(): **ERROR** unkown file format \"" << fFileFormat << "\" found." << std::endl; fAllDataAvailable = false; } } else { - cerr << endl << ">> PRunDataHandler::ReadData(): **ERROR** Couldn't read files." << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadData(): **ERROR** Couldn't read files." << std::endl; fAllDataAvailable = false; } } @@ -331,9 +330,9 @@ void PRunDataHandler::WriteData() void PRunDataHandler::Init(const Int_t tag) { if ((tag==PHR_INIT_ALL) || (tag==PHR_INIT_ANY2MANY)) - fMsrInfo = 0; + fMsrInfo = nullptr; if ((tag==PHR_INIT_ALL) || (tag==PHR_INIT_MSR)) - fAny2ManyInfo = 0; + fAny2ManyInfo = nullptr; fAllDataAvailable = false; if (tag!=PHR_INIT_ALL) fFileFormat = TString(""); @@ -357,15 +356,15 @@ Bool_t PRunDataHandler::ReadFilesMsr() Bool_t success = true; // loop over the full RUN list to see what needs to be read - PMsrRunList *runList = 0; + PMsrRunList *runList = nullptr; runList = fMsrInfo->GetMsrRunList(); - if (runList == 0) { - cerr << endl << ">> PRunDataHandler::ReadFilesMsr(): **ERROR** Couldn't obtain run list from PMsrHandler: something VERY fishy"; - cerr << endl; + if (runList == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::ReadFilesMsr(): **ERROR** Couldn't obtain run list from PMsrHandler: something VERY fishy"; + std::cerr << std::endl; return false; } - char str[1024], *p_str=0; + char str[1024], *p_str=nullptr; UInt_t year=0; TString musrRoot("musr-root"); @@ -379,7 +378,7 @@ Bool_t PRunDataHandler::ReadFilesMsr() // get year from string if LEM data file strcpy(str, fRunName.Data()); p_str = strstr(str, "lem"); - if (p_str != 0) + if (p_str != nullptr) sscanf(p_str, "lem%d_his", &year); // check special case for ROOT-NPP/ROOT-PPC (LEM) @@ -462,8 +461,8 @@ Bool_t PRunDataHandler::ReadFilesMsr() Bool_t PRunDataHandler::ReadWriteFilesList() { if ((fAny2ManyInfo->inFileName.size() == 0) && (fAny2ManyInfo->runList.size() == 0)) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't obtain run list from fAny2ManyInfo: something VERY fishy"; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't obtain run list from fAny2ManyInfo: something VERY fishy"; + std::cerr << std::endl; return false; } @@ -487,7 +486,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() inTag = A2M_UNDEFINED; if (inTag == A2M_UNDEFINED) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** no valid input data file format found: '" << fAny2ManyInfo->inFormat.Data() << "'" << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** no valid input data file format found: '" << fAny2ManyInfo->inFormat.Data() << "'" << std::endl; return false; } @@ -511,7 +510,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() outTag = A2M_UNDEFINED; if (outTag == A2M_UNDEFINED) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** no valid output data file format found: '" << fAny2ManyInfo->outFormat.Data() << "'" << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** no valid output data file format found: '" << fAny2ManyInfo->outFormat.Data() << "'" << std::endl; return false; } @@ -520,7 +519,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() // loop over all runs of the run list for (UInt_t i=0; iinFileName.size(); i++) { if (!FileExistsCheck(true, i)) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't find file " << fAny2ManyInfo->inFileName[i].Data() << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't find file " << fAny2ManyInfo->inFileName[i].Data() << std::endl; return false; } @@ -549,7 +548,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() } if (!success) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't read file " << fAny2ManyInfo->inFileName[i].Data() << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't read file " << fAny2ManyInfo->inFileName[i].Data() << std::endl; return false; } @@ -568,7 +567,6 @@ Bool_t PRunDataHandler::ReadWriteFilesList() else success = WriteMusrRootFile(fAny2ManyInfo->outFileName); break; - break; case A2M_PSIBIN: if (fAny2ManyInfo->outFileName.Length() == 0) success = WritePsiBinFile(); @@ -610,7 +608,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() } if (success == false) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't write converted output file." << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't write converted output file." << std::endl; return false; } @@ -624,7 +622,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() // loop over all runs of the run list for (UInt_t i=0; irunList.size(); i++) { if (!FileExistsCheck(false, i)) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't find run " << fAny2ManyInfo->runList[i] << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't find run " << fAny2ManyInfo->runList[i] << std::endl; return false; } @@ -653,7 +651,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() } if (!success) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't read file " << fRunPathName.Data() << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't read file " << fRunPathName.Data() << std::endl; return false; } @@ -665,7 +663,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() Bool_t ok; TString fln = FileNameFromTemplate(fAny2ManyInfo->outTemplate, fAny2ManyInfo->runList[i], year, ok); if (!ok) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't create necessary output file name." << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't create necessary output file name." << std::endl; return false; } @@ -701,7 +699,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() } if (success == false) { - cerr << endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't write converted output file." << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't write converted output file." << std::endl; return false; } @@ -750,24 +748,24 @@ Bool_t PRunDataHandler::ReadWriteFilesList() // check if the compressed file shall be streamed to the stdout if (fAny2ManyInfo->useStandardOutput) { // stream file to stdout - ifstream is; + std::ifstream is; int length=1024; char *buffer; - is.open(fln.Data(), ios::binary); + is.open(fln.Data(), std::ios::binary); if (!is.is_open()) { - cerr << endl << "PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't open the file for streaming." << endl; + std::cerr << std::endl << "PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't open the file for streaming." << std::endl; remove(fln.Data()); return false; } // get length of file - is.seekg(0, ios::end); + is.seekg(0, std::ios::end); length = is.tellg(); - is.seekg(0, ios::beg); + is.seekg(0, std::ios::beg); if (length == -1) { - cerr << endl << "PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't determine the file size." << endl; + std::cerr << std::endl << "PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't determine the file size." << std::endl; remove(fln.Data()); return false; } @@ -778,7 +776,7 @@ Bool_t PRunDataHandler::ReadWriteFilesList() // read data as a block while (!is.eof()) { is.read(buffer, length); - cout.write(buffer, length); + std::cout.write(buffer, length); } is.close(); @@ -942,28 +940,28 @@ Bool_t PRunDataHandler::FileExistsCheck(PMsrRunBlock &runInfo, const UInt_t idx) Bool_t success = true; // local init - TROOT root("PRunBase", "PRunBase", 0); + TROOT root("PRunBase", "PRunBase", nullptr); TString pathName = "???"; TString str, *pstr; TString ext; pstr = runInfo.GetBeamline(idx); - if (pstr == 0) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain beamline data." << endl; + if (pstr == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain beamline data." << std::endl; assert(0); } pstr->ToLower(); runInfo.SetBeamline(*pstr, idx); pstr = runInfo.GetInstitute(idx); - if (pstr == 0) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain institute data." << endl; + if (pstr == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain institute data." << std::endl; assert(0); } pstr->ToLower(); runInfo.SetInstitute(*pstr, idx); pstr = runInfo.GetFileFormat(idx); - if (pstr == 0) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain file format data." << endl; + if (pstr == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain file format data." << std::endl; assert(0); } pstr->ToLower(); @@ -1002,25 +1000,25 @@ Bool_t PRunDataHandler::FileExistsCheck(PMsrRunBlock &runInfo, const UInt_t idx) // unkown file format found if (!success) { pstr = runInfo.GetFileFormat(idx); - if (pstr == 0) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain file format data." << endl; + if (pstr == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain file format data." << std::endl; assert(0); } pstr->ToUpper(); - cerr << endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** File Format '" << pstr->Data() << "' unsupported."; - cerr << endl << ">> support file formats are:"; - cerr << endl << ">> ROOT-NPP -> root not post pileup corrected for lem"; - cerr << endl << ">> ROOT-PPC -> root post pileup corrected for lem"; - cerr << endl << ">> MUSR-ROOT -> MusrRoot file format"; - cerr << endl << ">> NEXUS -> nexus file format, HDF4, HDF5, or XML"; - cerr << endl << ">> PSI-BIN -> psi bin file format"; - cerr << endl << ">> PSI-MDU -> psi mdu file format (see also MDU-ASCII)"; - cerr << endl << ">> MUD -> triumf mud file format"; - cerr << endl << ">> WKM -> wkm ascii file format"; - cerr << endl << ">> MDU-ASCII -> psi mdu ascii file format"; - cerr << endl << ">> ASCII -> column like file format"; - cerr << endl << ">> DB -> triumf db file \"format\""; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** File Format '" << pstr->Data() << "' unsupported."; + std::cerr << std::endl << ">> support file formats are:"; + std::cerr << std::endl << ">> ROOT-NPP -> root not post pileup corrected for lem"; + std::cerr << std::endl << ">> ROOT-PPC -> root post pileup corrected for lem"; + std::cerr << std::endl << ">> MUSR-ROOT -> MusrRoot file format"; + std::cerr << std::endl << ">> NEXUS -> nexus file format, HDF4, HDF5, or XML"; + std::cerr << std::endl << ">> PSI-BIN -> psi bin file format"; + std::cerr << std::endl << ">> PSI-MDU -> psi mdu file format (see also MDU-ASCII)"; + std::cerr << std::endl << ">> MUD -> triumf mud file format"; + std::cerr << std::endl << ">> WKM -> wkm ascii file format"; + std::cerr << std::endl << ">> MDU-ASCII -> psi mdu ascii file format"; + std::cerr << std::endl << ">> ASCII -> column like file format"; + std::cerr << std::endl << ">> DB -> triumf db file \"format\""; + std::cerr << std::endl; return success; } @@ -1071,7 +1069,7 @@ Bool_t PRunDataHandler::FileExistsCheck(PMsrRunBlock &runInfo, const UInt_t idx) // cleanup if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } @@ -1082,15 +1080,15 @@ Bool_t PRunDataHandler::FileExistsCheck(PMsrRunBlock &runInfo, const UInt_t idx) TObjArray *tokens = str.Tokenize(":"); TObjString *ostr; pstr = runInfo.GetInstitute(idx); - if (pstr == 0) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain institute data." << endl; + if (pstr == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain institute data." << std::endl; assert(0); } pstr->ToUpper(); runInfo.SetInstitute(*pstr, idx); pstr = runInfo.GetBeamline(idx); - if (pstr == 0) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain beamline data." << endl; + if (pstr == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain beamline data." << std::endl; assert(0); } pstr->ToUpper(); @@ -1110,18 +1108,18 @@ Bool_t PRunDataHandler::FileExistsCheck(PMsrRunBlock &runInfo, const UInt_t idx) // clean up if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } // no proper path name found if (pathName.CompareTo("???") == 0) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** Couldn't find '" << runInfo.GetRunName(idx)->Data() << "' in any standard path."; - cerr << endl << ">> standard search pathes are:"; - cerr << endl << ">> 1. the local directory"; - cerr << endl << ">> 2. the data directory given in the startup XML file"; - cerr << endl << ">> 3. the directories listed in MUSRFULLDATAPATH"; - cerr << endl << ">> 4. default path construct which is described in the manual"; + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** Couldn't find '" << runInfo.GetRunName(idx)->Data() << "' in any standard path."; + std::cerr << std::endl << ">> standard search pathes are:"; + std::cerr << std::endl << ">> 1. the local directory"; + std::cerr << std::endl << ">> 2. the data directory given in the startup XML file"; + std::cerr << std::endl << ">> 3. the directories listed in MUSRFULLDATAPATH"; + std::cerr << std::endl << ">> 4. default path construct which is described in the manual"; return false; } @@ -1150,19 +1148,19 @@ Bool_t PRunDataHandler::FileExistsCheck(const Bool_t fileName, const Int_t idx) TString fln(""); if (fileName) { // single input file name - if (idx >= (Int_t)fAny2ManyInfo->inFileName.size()) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** idx=" << idx << " out of range. (inFileName.size()==" << fAny2ManyInfo->inFileName.size() << ")" << endl; + if (idx >= static_cast(fAny2ManyInfo->inFileName.size())) { + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** idx=" << idx << " out of range. (inFileName.size()==" << fAny2ManyInfo->inFileName.size() << ")" << std::endl; return false; } fln = fAny2ManyInfo->inFileName[idx]; } else { // run file list entry shall be handled - if (idx >= (Int_t)fAny2ManyInfo->runList.size()) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** idx=" << idx << " out of range. (inFileName.size()==" << fAny2ManyInfo->runList.size() << ")" << endl; + if (idx >= static_cast(fAny2ManyInfo->runList.size())) { + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** idx=" << idx << " out of range. (inFileName.size()==" << fAny2ManyInfo->runList.size() << ")" << std::endl; return false; } // check for input/output templates if ((fAny2ManyInfo->inTemplate.Length() == 0) || (fAny2ManyInfo->outTemplate.Length() == 0)) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** when using run lists, input/output templates are needed as well." << endl; + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** when using run lists, input/output templates are needed as well." << std::endl; return false; } // make the input file name according to the input template @@ -1209,16 +1207,16 @@ Bool_t PRunDataHandler::FileExistsCheck(const Bool_t fileName, const Int_t idx) // cleanup if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } // no proper path name found if (pathName.CompareTo("???") == 0) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** Couldn't find '" << fln.Data() << "' in any standard path."; - cerr << endl << ">> standard search pathes are:"; - cerr << endl << ">> 1. the local directory"; - cerr << endl << ">> 2. the data directory given in the startup XML file"; - cerr << endl << ">> 3. the directories listed in MUSRFULLDATAPATH"; + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** Couldn't find '" << fln.Data() << "' in any standard path."; + std::cerr << std::endl << ">> standard search pathes are:"; + std::cerr << std::endl << ">> 1. the local directory"; + std::cerr << std::endl << ">> 2. the data directory given in the startup XML file"; + std::cerr << std::endl << ">> 3. the directories listed in MUSRFULLDATAPATH"; return false; } @@ -1276,16 +1274,16 @@ Bool_t PRunDataHandler::FileExistsCheck(const TString fileName) // cleanup if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } // no proper path name found if (pathName.CompareTo("???") == 0) { - cerr << endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** Couldn't find '" << fileName.Data() << "' in any standard path."; - cerr << endl << ">> standard search pathes are:"; - cerr << endl << ">> 1. the local directory"; - cerr << endl << ">> 2. the data directory given in the startup XML file"; - cerr << endl << ">> 3. the directories listed in MUSRFULLDATAPATH"; + std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck(): **ERROR** Couldn't find '" << fileName.Data() << "' in any standard path."; + std::cerr << std::endl << ">> standard search pathes are:"; + std::cerr << std::endl << ">> 1. the local directory"; + std::cerr << std::endl << ">> 2. the data directory given in the startup XML file"; + std::cerr << std::endl << ">> 3. the directories listed in MUSRFULLDATAPATH"; return false; } @@ -1323,8 +1321,8 @@ Bool_t PRunDataHandler::ReadRootFile() if (!folder) { // either something is wrong, or it is a MusrRoot file f.GetObject("RunHeader", folder); if (!folder) { // something is wrong!! - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't neither obtain RunInfo (LEM),"; - cerr << endl << " nor RunHeader (MusrRoot) from " << fRunPathName.Data() << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't neither obtain RunInfo (LEM),"; + std::cerr << std::endl << " nor RunHeader (MusrRoot) from " << fRunPathName.Data() << std::endl; f.Close(); return false; } else { @@ -1340,7 +1338,7 @@ Bool_t PRunDataHandler::ReadRootFile() // check if run header is valid if (!runHeader) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't obtain run header info from ROOT file " << fRunPathName.Data() << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't obtain run header info from ROOT file " << fRunPathName.Data() << std::endl; f.Close(); return false; } @@ -1357,7 +1355,7 @@ Bool_t PRunDataHandler::ReadRootFile() runData.SetRunTitle(ostr.GetString()); // get run number - runData.SetRunNumber((Int_t)runHeader->GetRunNumber()); + runData.SetRunNumber(static_cast(runHeader->GetRunNumber())); // get temperature runData.ClearTemperature(); @@ -1377,7 +1375,7 @@ Bool_t PRunDataHandler::ReadRootFile() // get start time/date // start date - time_t idt = (time_t)runHeader->GetStartTime(); + time_t idt = static_cast(runHeader->GetStartTime()); runData.SetStartDateTime(idt); struct tm *dt = localtime(&idt); char str[128]; @@ -1392,7 +1390,7 @@ Bool_t PRunDataHandler::ReadRootFile() // get stop time/date // stop date - idt = (time_t)runHeader->GetStopTime(); + idt = static_cast(runHeader->GetStopTime()); runData.SetStopDateTime(idt); dt = localtime(&idt); memset(str, 0, sizeof(str)); @@ -1419,26 +1417,26 @@ Bool_t PRunDataHandler::ReadRootFile() // check if run summary is valid if (!runSummary) { - cout << endl << "**INFO** Couldn't obtain run summary info from ROOT file " << fRunPathName.Data() << endl; + std::cout << std::endl << "**INFO** Couldn't obtain run summary info from ROOT file " << fRunPathName.Data() << std::endl; // this is not fatal... only RA-HV values are not available } else { // it follows a (at least) little bit strange extraction of the RA values from Thomas' TObjArray... //streaming of a ASCII-file would be more easy TString s; TObjArrayIter summIter(runSummary); TObjString *os(dynamic_cast(summIter.Next())); - TObjArray *oa(0); - TObjString *objTok(0); - while (os != 0) { + TObjArray *oa(nullptr); + TObjString *objTok(nullptr); + while (os != nullptr) { s = os->GetString(); // will put four parallel if's since it may be that more than one RA-values are on one line if (s.Contains("RA-L")) { oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); - while (objTok != 0) { + while (objTok != nullptr) { if (!objTok->GetString().CompareTo("RA-L")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if (objTok != 0 && !objTok->GetString().CompareTo("=")) { + if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value runData.SetRingAnode(0, objTok->GetString().Atof()); // fill RA-R value into the runData structure break; @@ -1449,7 +1447,7 @@ Bool_t PRunDataHandler::ReadRootFile() // clean up if (oa) { delete oa; - oa = 0; + oa = nullptr; } } @@ -1457,10 +1455,10 @@ Bool_t PRunDataHandler::ReadRootFile() oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); - while (objTok != 0){ + while (objTok != nullptr){ if (!objTok->GetString().CompareTo("RA-R")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if (objTok != 0 && !objTok->GetString().CompareTo("=")) { + if (objTok != nullptr && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value runData.SetRingAnode(1, objTok->GetString().Atof()); // fill RA-R value into the runData structure break; @@ -1471,7 +1469,7 @@ Bool_t PRunDataHandler::ReadRootFile() // clean up if (oa) { delete oa; - oa = 0; + oa = nullptr; } } @@ -1479,10 +1477,10 @@ Bool_t PRunDataHandler::ReadRootFile() oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); - while (objTok != 0){ + while (objTok != nullptr){ if (!objTok->GetString().CompareTo("RA-T")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if (objTok != 0 && !objTok->GetString().CompareTo("=")) { + if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value runData.SetRingAnode(2, objTok->GetString().Atof()); // fill RA-T value into the runData structure break; @@ -1493,7 +1491,7 @@ Bool_t PRunDataHandler::ReadRootFile() // clean up if (oa) { delete oa; - oa = 0; + oa = nullptr; } } @@ -1501,10 +1499,10 @@ Bool_t PRunDataHandler::ReadRootFile() oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); - while (objTok != 0){ + while (objTok != nullptr){ if (!objTok->GetString().CompareTo("RA-B")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if (objTok != 0 && !objTok->GetString().CompareTo("=")) { + if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value runData.SetRingAnode(3, objTok->GetString().Atof()); // fill RA-B value into the runData structure break; @@ -1515,7 +1513,7 @@ Bool_t PRunDataHandler::ReadRootFile() // clean up if (oa) { delete oa; - oa = 0; + oa = nullptr; } } @@ -1528,7 +1526,7 @@ Bool_t PRunDataHandler::ReadRootFile() // check if histos folder is found f.GetObject("histos", folder); if (!folder) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't obtain histos from " << fRunPathName.Data() << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't obtain histos from " << fRunPathName.Data() << std::endl; f.Close(); return false; } @@ -1539,8 +1537,8 @@ Bool_t PRunDataHandler::ReadRootFile() sprintf(histoName, "hDecay%02d", i); TH1F *histo = dynamic_cast(folder->FindObjectAny(histoName)); if (!histo) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << histoName; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << histoName; + std::cerr << std::endl; f.Close(); return false; } @@ -1556,7 +1554,7 @@ Bool_t PRunDataHandler::ReadRootFile() dataSet.SetHistoNo(i+1); dataSet.SetTimeZeroBin(t0[i]); dataSet.SetTimeZeroBinEstimated(histo->GetMaximumBin()); - dataSet.SetFirstGoodBin((Int_t)t0[i]); + dataSet.SetFirstGoodBin(static_cast(t0[i])); dataSet.SetLastGoodBin(histo->GetNbinsX()-1); dataSet.SetData(histoData); runData.SetDataSet(dataSet); @@ -1567,16 +1565,16 @@ Bool_t PRunDataHandler::ReadRootFile() // check if any post pileup histos are present at all (this is not the case for LEM data 2006 and earlier) sprintf(histoName, "hDecay%02d", POST_PILEUP_HISTO_OFFSET); if (!folder->FindObjectAny(histoName)) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **WARNING** Couldn't get histo " << histoName; - cerr << endl << ">> most probably this is an old (2006 or earlier) LEM file without post pileup histos."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **WARNING** Couldn't get histo " << histoName; + std::cerr << std::endl << ">> most probably this is an old (2006 or earlier) LEM file without post pileup histos."; + std::cerr << std::endl; } else { for (Int_t i=0; i(folder->FindObjectAny(histoName)); if (!histo) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << histoName; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << histoName; + std::cerr << std::endl; f.Close(); return false; } @@ -1591,7 +1589,7 @@ Bool_t PRunDataHandler::ReadRootFile() dataSet.SetHistoNo(i+1+POST_PILEUP_HISTO_OFFSET); dataSet.SetTimeZeroBin(t0[i]); dataSet.SetTimeZeroBinEstimated(histo->GetMaximumBin()); - dataSet.SetFirstGoodBin((Int_t)t0[i]); + dataSet.SetFirstGoodBin(static_cast(t0[i])); dataSet.SetLastGoodBin(histo->GetNbinsX()-1); dataSet.SetData(histoData); runData.SetDataSet(dataSet); @@ -1603,17 +1601,17 @@ Bool_t PRunDataHandler::ReadRootFile() } else { // MusrRoot file // invoke the MusrRoot header object TMusrRunHeader *header = new TMusrRunHeader(true); // read quite - if (header == 0) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader in file:" << fRunPathName; - cerr << endl; + if (header == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader in file:" << fRunPathName; + std::cerr << std::endl; f.Close(); return false; } // try to populate the MusrRoot header object if (!header->ExtractAll(folder)) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader in file:" << fRunPathName; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader in file:" << fRunPathName; + std::cerr << std::endl; f.Close(); return false; } @@ -1744,7 +1742,7 @@ Bool_t PRunDataHandler::ReadRootFile() else if (!prop.GetUnit().CompareTo("us") || !prop.GetUnit().CompareTo("microsec")) dval = prop.GetValue()*1.0e3; else - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Found unrecognized Time Resolution unit: " << prop.GetUnit() << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Found unrecognized Time Resolution unit: " << prop.GetUnit() << std::endl; runData.SetTimeResolution(dval); } @@ -1764,8 +1762,8 @@ Bool_t PRunDataHandler::ReadRootFile() found = true; } if (!found) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** requested histo group " << fAny2ManyInfo->groupHistoList[i]; - cerr << endl << ">> which is NOT present in the data file." << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** requested histo group " << fAny2ManyInfo->groupHistoList[i]; + std::cerr << std::endl << ">> which is NOT present in the data file." << std::endl; return false; } } @@ -1812,26 +1810,26 @@ Bool_t PRunDataHandler::ReadRootFile() // check if run summary is valid if (!runSummary) { - cout << endl << "**INFO** Couldn't obtain run summary info from ROOT file " << fRunPathName.Data() << endl; + std::cout << std::endl << "**INFO** Couldn't obtain run summary info from ROOT file " << fRunPathName.Data() << std::endl; // this is not fatal... only RA-HV values are not available } else { // it follows a (at least) little bit strange extraction of the RA values from Thomas' TObjArray... //streaming of a ASCII-file would be more easy TString s; TObjArrayIter summIter(runSummary); TObjString *os(dynamic_cast(summIter.Next())); - TObjArray *oa(0); - TObjString *objTok(0); - while (os != 0) { + TObjArray *oa(nullptr); + TObjString *objTok(nullptr); + while (os != nullptr) { s = os->GetString(); // will put four parallel if's since it may be that more than one RA-values are on one line if (s.Contains("RA-L")) { oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); - while (objTok != 0) { + while (objTok != nullptr) { if (!objTok->GetString().CompareTo("RA-L")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if (objTok != 0 && !objTok->GetString().CompareTo("=")) { + if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value runData.SetRingAnode(0, objTok->GetString().Atof()); // fill RA-R value into the runData structure break; @@ -1842,7 +1840,7 @@ Bool_t PRunDataHandler::ReadRootFile() // clean up if (oa) { delete oa; - oa = 0; + oa = nullptr; } } @@ -1850,10 +1848,10 @@ Bool_t PRunDataHandler::ReadRootFile() oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); - while (objTok != 0){ + while (objTok != nullptr){ if (!objTok->GetString().CompareTo("RA-R")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if (objTok != 0 && !objTok->GetString().CompareTo("=")) { + if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value runData.SetRingAnode(1, objTok->GetString().Atof()); // fill RA-R value into the runData structure break; @@ -1864,7 +1862,7 @@ Bool_t PRunDataHandler::ReadRootFile() // clean up if (oa) { delete oa; - oa = 0; + oa = nullptr; } } @@ -1872,10 +1870,10 @@ Bool_t PRunDataHandler::ReadRootFile() oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); - while (objTok != 0){ + while (objTok != nullptr){ if (!objTok->GetString().CompareTo("RA-T")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if (objTok != 0 && !objTok->GetString().CompareTo("=")) { + if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value runData.SetRingAnode(2, objTok->GetString().Atof()); // fill RA-T value into the runData structure break; @@ -1886,7 +1884,7 @@ Bool_t PRunDataHandler::ReadRootFile() // clean up if (oa) { delete oa; - oa = 0; + oa = nullptr; } } @@ -1894,10 +1892,10 @@ Bool_t PRunDataHandler::ReadRootFile() oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); - while (objTok != 0){ + while (objTok != nullptr){ if (!objTok->GetString().CompareTo("RA-B")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if (objTok != 0 && !objTok->GetString().CompareTo("=")) { + if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value runData.SetRingAnode(3, objTok->GetString().Atof()); // fill RA-B value into the runData structure break; @@ -1908,7 +1906,7 @@ Bool_t PRunDataHandler::ReadRootFile() // clean up if (oa) { delete oa; - oa = 0; + oa = nullptr; } } @@ -1921,7 +1919,7 @@ Bool_t PRunDataHandler::ReadRootFile() // check if histos folder is found f.GetObject("histos", folder); if (!folder) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't obtain histos from " << fRunPathName.Data() << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't obtain histos from " << fRunPathName.Data() << std::endl; f.Close(); return false; } @@ -1932,8 +1930,8 @@ Bool_t PRunDataHandler::ReadRootFile() str.Form("hDecay%03d", redGreenOffsets[i]+j+1); TH1F *histo = dynamic_cast(folder->FindObjectAny(str.Data())); if (!histo) { - cerr << endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << str; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't get histo " << str; + std::cerr << std::endl; f.Close(); return false; } @@ -1973,7 +1971,7 @@ Bool_t PRunDataHandler::ReadRootFile() // clean up if (header) { delete header; - header=0; + header=nullptr; } } @@ -2001,26 +1999,26 @@ Bool_t PRunDataHandler::ReadRootFile() Bool_t PRunDataHandler::ReadNexusFile() { #ifdef PNEXUS_ENABLED - cout << endl << ">> PRunDataHandler::ReadNexusFile(): Will read nexus file " << fRunPathName.Data() << " ..."; + std::cout << std::endl << ">> PRunDataHandler::ReadNexusFile(): Will read nexus file " << fRunPathName.Data() << " ..."; PDoubleVector histoData; PRawRunData runData; PRawRunDataSet dataSet; TString str; - string sstr; + std::string sstr; Double_t dval; bool ok; PNeXus *nxs_file = new PNeXus(fRunPathName.Data()); if (!nxs_file->IsValid()) { - cerr << endl << ">> PRunDataHandler::ReadNexusFile(): Not a valid NeXus file."; - cerr << endl << ">> Error Message: " << nxs_file->GetErrorMsg().data() << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadNexusFile(): Not a valid NeXus file."; + std::cerr << std::endl << ">> Error Message: " << nxs_file->GetErrorMsg().data() << std::endl; return false; } if (nxs_file->GetIdfVersion() == 1) { if (!nxs_file->IsValid()) { - cout << endl << "**ERROR** invalid NeXus IDF 2 version file found." << endl; + std::cout << std::endl << "**ERROR** invalid NeXus IDF 2 version file found." << std::endl; return false; } @@ -2105,12 +2103,12 @@ Bool_t PRunDataHandler::ReadNexusFile() } // get/set t0, firstGoodBin, lastGoodBin - vector *t0 = nxs_file->GetEntryIdf1()->GetData()->GetT0s(); - vector *fgb = nxs_file->GetEntryIdf1()->GetData()->GetFirstGoodBins(); - vector *lgb = nxs_file->GetEntryIdf1()->GetData()->GetLastGoodBins(); + std::vector *t0 = nxs_file->GetEntryIdf1()->GetData()->GetT0s(); + std::vector *fgb = nxs_file->GetEntryIdf1()->GetData()->GetFirstGoodBins(); + std::vector *lgb = nxs_file->GetEntryIdf1()->GetData()->GetLastGoodBins(); // get/set data - vector *pdata; + std::vector *pdata; unsigned int max=0, binMax=0; PDoubleVector data; for (UInt_t i=0; iGetEntryIdf1()->GetData()->GetNoOfHistos(); i++) { @@ -2156,7 +2154,7 @@ Bool_t PRunDataHandler::ReadNexusFile() fData.push_back(runData); } else if (nxs_file->GetIdfVersion() == 2) { if (!nxs_file->IsValid()) { - cout << endl << "**ERROR** invalid NeXus IDF 2 version file found." << endl; + std::cout << std::endl << "**ERROR** invalid NeXus IDF 2 version file found." << std::endl; return false; } // get header information @@ -2218,7 +2216,7 @@ Bool_t PRunDataHandler::ReadNexusFile() runData.SetRingAnode(i, PMUSR_UNDEFINED); // get/set setup take NXsample/temperature_1_env and NXsample/magnetic_field_1_env - sstr = nxs_file->GetEntryIdf2()->GetSample()->GetEnvironmentTemp() + string("/"); + sstr = nxs_file->GetEntryIdf2()->GetSample()->GetEnvironmentTemp() + std::string("/"); sstr += nxs_file->GetEntryIdf2()->GetSample()->GetEnvironmentField(); str = sstr; runData.SetSetup(str); @@ -2341,16 +2339,16 @@ Bool_t PRunDataHandler::ReadNexusFile() // keep the information fData.push_back(runData); } else { - cout << endl << ">> PRunDataHandler::ReadNexusFile(): IDF version " << nxs_file->GetIdfVersion() << ", not implemented." << endl; + std::cout << std::endl << ">> PRunDataHandler::ReadNexusFile(): IDF version " << nxs_file->GetIdfVersion() << ", not implemented." << std::endl; } // clean up if (nxs_file) { delete nxs_file; - nxs_file = 0; + nxs_file = nullptr; } #else - cout << endl << ">> PRunDataHandler::ReadNexusFile(): Sorry, not enabled at configuration level, i.e. --enable-NeXus when executing configure" << endl << endl; + std::cout << std::endl << ">> PRunDataHandler::ReadNexusFile(): Sorry, not enabled at configuration level, i.e. --enable-NeXus when executing configure" << std::endl << std::endl; #endif return true; } @@ -2372,13 +2370,13 @@ Bool_t PRunDataHandler::ReadWkmFile() PRawRunData runData; // open file - ifstream f; + std::ifstream f; // open wkm-file - f.open(fRunPathName.Data(), ifstream::in); + f.open(fRunPathName.Data(), std::ifstream::in); if (!f.is_open()) { - cerr << endl << ">> PRunDataHandler::ReadWkmFile: **ERROR** Couldn't open run data (" << fRunPathName.Data() << ") file for reading, sorry ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile: **ERROR** Couldn't open run data (" << fRunPathName.Data() << ") file for reading, sorry ..."; + std::cerr << std::endl; return false; } @@ -2408,19 +2406,19 @@ Bool_t PRunDataHandler::ReadWkmFile() } else { // real stuff, hence filter data if (line.Contains("Title") || line.Contains("Titel")) { idx = line.Index(":"); - line.Replace(0, idx+1, 0, 0); // remove 'Title:' + line.Replace(0, idx+1, nullptr, 0); // remove 'Title:' StripWhitespace(line); runData.SetRunTitle(line); } else if (line.Contains("Run:")) { idx = line.Index(":"); - line.Replace(0, idx+1, 0, 0); // remove 'Run:' + line.Replace(0, idx+1, nullptr, 0); // remove 'Run:' StripWhitespace(line); ival = ToInt(line, ok); if (ok) runData.SetRunNumber(ival); } else if (line.Contains("Field")) { idx = line.Index(":"); - line.Replace(0, idx+1, 0, 0); // remove 'Field:' + line.Replace(0, idx+1, nullptr, 0); // remove 'Field:' StripWhitespace(line); idx = line.Index("G"); // check if unit is given if (idx > 0) // unit is indeed given @@ -2430,13 +2428,13 @@ Bool_t PRunDataHandler::ReadWkmFile() runData.SetField(dval); } else if (line.Contains("Setup")) { idx = line.Index(":"); - line.Replace(0, idx+1, 0, 0); // remove 'Setup:' + line.Replace(0, idx+1, nullptr, 0); // remove 'Setup:' StripWhitespace(line); runData.SetSetup(line); } else if (line.Contains("Temp:") || line.Contains("Temp(meas1):")) { linecp = line; idx = line.Index(":"); - line.Replace(0, idx+1, 0, 0); // remove 'Temp:' + line.Replace(0, idx+1, nullptr, 0); // remove 'Temp:' StripWhitespace(line); idx = line.Index("+/-"); // remove "+/- ..." part if (idx > 0) @@ -2449,7 +2447,7 @@ Bool_t PRunDataHandler::ReadWkmFile() runData.SetTemperature(0, dval, 0.0); } idx = linecp.Index("+/-"); // get the error - linecp.Replace(0, idx+3, 0, 0); + linecp.Replace(0, idx+3, nullptr, 0); StripWhitespace(linecp); dval = ToDouble(linecp, ok); if (ok) { @@ -2458,7 +2456,7 @@ Bool_t PRunDataHandler::ReadWkmFile() } else if (line.Contains("Temp(meas2):")) { linecp = line; idx = line.Index(":"); - line.Replace(0, idx+1, 0, 0); // remove 'Temp(meas2):' + line.Replace(0, idx+1, nullptr, 0); // remove 'Temp(meas2):' StripWhitespace(line); idx = line.Index("+/-"); // remove "+/- ..." part if (idx > 0) @@ -2471,7 +2469,7 @@ Bool_t PRunDataHandler::ReadWkmFile() runData.SetTemperature(1, dval, 0.0); } idx = linecp.Index("+/-"); // get the error - linecp.Replace(0, idx+3, 0, 0); + linecp.Replace(0, idx+3, nullptr, 0); StripWhitespace(linecp); dval = ToDouble(linecp, ok); if (ok) { @@ -2479,21 +2477,21 @@ Bool_t PRunDataHandler::ReadWkmFile() } } else if (line.Contains("Groups")) { idx = line.Index(":"); - line.Replace(0, idx+1, 0, 0); // remove 'Groups:' + line.Replace(0, idx+1, nullptr, 0); // remove 'Groups:' StripWhitespace(line); ival = ToInt(line, ok); if (ok) groups = ival; } else if (line.Contains("Channels")) { idx = line.Index(":"); - line.Replace(0, idx+1, 0, 0); // remove 'Channels:' + line.Replace(0, idx+1, nullptr, 0); // remove 'Channels:' StripWhitespace(line); ival = ToInt(line, ok); if (ok) channels = ival; } else if (line.Contains("Resolution")) { idx = line.Index(":"); - line.Replace(0, idx+1, 0, 0); // remove 'Resolution:' + line.Replace(0, idx+1, nullptr, 0); // remove 'Resolution:' StripWhitespace(line); dval = ToDouble(line, ok); if (ok) @@ -2506,11 +2504,11 @@ Bool_t PRunDataHandler::ReadWkmFile() } while (headerInfo && !f.eof()); if ((groups == 0) || (channels == 0) || runData.GetTimeResolution() == 0.0) { - cerr << endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** essential header informations are missing!"; - cerr << endl << ">> groups = " << groups; - cerr << endl << ">> channels = " << channels; - cerr << endl << ">> time resolution = " << runData.GetTimeResolution(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** essential header informations are missing!"; + std::cerr << std::endl << ">> groups = " << groups; + std::cerr << std::endl << ">> channels = " << channels; + std::cerr << std::endl << ">> time resolution = " << runData.GetTimeResolution(); + std::cerr << std::endl; f.close(); return false; } @@ -2556,7 +2554,7 @@ Bool_t PRunDataHandler::ReadWkmFile() tokens = line.Tokenize(" "); if (!tokens) { // no tokens found - cerr << endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: coulnd't tokenize run data."; + std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: coulnd't tokenize run data."; return false; } for (Int_t i=0; iGetEntries(); i++) { @@ -2566,7 +2564,7 @@ Bool_t PRunDataHandler::ReadWkmFile() if (ok) { histoData.push_back(val); } else { - cerr << endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: data line contains non-integer values."; + std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: data line contains non-integer values."; // clean up delete tokens; return false; @@ -2575,7 +2573,7 @@ Bool_t PRunDataHandler::ReadWkmFile() // clean up if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } @@ -2589,7 +2587,7 @@ Bool_t PRunDataHandler::ReadWkmFile() line = TString(instr); tokens = line.Tokenize(" "); if (!tokens) { // no tokens found - cerr << endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: coulnd't tokenize run data."; + std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: coulnd't tokenize run data."; return false; } for (Int_t i=0; iGetEntries(); i++) { @@ -2599,7 +2597,7 @@ Bool_t PRunDataHandler::ReadWkmFile() if (ok) { histoData.push_back(val); } else { - cerr << endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: data line contains non-integer values."; + std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: data line contains non-integer values."; // clean up delete tokens; return false; @@ -2608,7 +2606,7 @@ Bool_t PRunDataHandler::ReadWkmFile() // clean up if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } @@ -2637,17 +2635,17 @@ Bool_t PRunDataHandler::ReadWkmFile() f.close(); // check if all groups are found - if ((Int_t) runData.GetNoOfHistos() != groups) { - cerr << endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR**"; - cerr << endl << ">> expected " << groups << " histos, but found " << runData.GetNoOfHistos(); + if (static_cast(runData.GetNoOfHistos()) != groups) { + std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR**"; + std::cerr << std::endl << ">> expected " << groups << " histos, but found " << runData.GetNoOfHistos(); return false; } // check if all groups have enough channels for (UInt_t i=0; isize() != channels) { - cerr << endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR**"; - cerr << endl << ">> expected " << channels << " bins in histo " << i+1 << ", but found " << runData.GetDataBin(i)->size(); + if (static_cast(runData.GetDataBin(i+1)->size()) != channels) { + std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR**"; + std::cerr << std::endl << ">> expected " << channels << " bins in histo " << i+1 << ", but found " << runData.GetDataBin(i)->size(); return false; } } @@ -2685,23 +2683,23 @@ Bool_t PRunDataHandler::ReadPsiBinFile() success = true; break; case 1: // couldn't open file, or failed while reading the header - cerr << endl << ">> **ERROR** couldn't open psi-bin file, or failed while reading the header"; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** couldn't open psi-bin file, or failed while reading the header"; + std::cerr << std::endl; success = false; break; case 2: // unsupported version of the data - cerr << endl << ">> **ERROR** psi-bin file: unsupported version of the data"; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** psi-bin file: unsupported version of the data"; + std::cerr << std::endl; success = false; break; case 3: // error when allocating data buffer - cerr << endl << ">> **ERROR** psi-bin file: error when allocating data buffer"; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** psi-bin file: error when allocating data buffer"; + std::cerr << std::endl; success = false; break; case 4: // number of histograms/record not equals 1 - cerr << endl << ">> **ERROR** psi-bin file: number of histograms/record not equals 1"; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** psi-bin file: number of histograms/record not equals 1"; + std::cerr << std::endl; success = false; break; default: // you never should have reached this point @@ -2784,9 +2782,9 @@ Bool_t PRunDataHandler::ReadPsiBinFile() runData.SetTransport(PMUSR_UNDEFINED); // get field Double_t scale = 0.0; - if (psiBin.get_field().rfind("G") != string::npos) + if (psiBin.get_field().rfind("G") != std::string::npos) scale = 1.0; - if (psiBin.get_field().rfind("T") != string::npos) + if (psiBin.get_field().rfind("T") != std::string::npos) scale = 1.0e4; status = sscanf(psiBin.get_field().c_str(), "%lf", &dval); if (status == 1) @@ -2812,15 +2810,15 @@ Bool_t PRunDataHandler::ReadPsiBinFile() runData.SetTimeResolution(psiBin.get_binWidth_ns()); // get start/stop time - vector sDateTime = psiBin.get_timeStart_vector(); + std::vector sDateTime = psiBin.get_timeStart_vector(); if (sDateTime.size() < 2) { - cerr << endl << ">> **WARNING** psi-bin file: couldn't obtain run start date/time" << endl; + std::cerr << std::endl << ">> **WARNING** psi-bin file: couldn't obtain run start date/time" << std::endl; } - string date(""); + std::string date(""); if (DateToISO8601(sDateTime[0], date)) { runData.SetStartDate(date); } else { - cerr << endl << ">> **WARNING** failed to convert start date: " << sDateTime[0] << " into ISO 8601 date." << endl; + std::cerr << std::endl << ">> **WARNING** failed to convert start date: " << sDateTime[0] << " into ISO 8601 date." << std::endl; runData.SetStartDate(sDateTime[0]); } runData.SetStartTime(sDateTime[1]); @@ -2828,13 +2826,13 @@ Bool_t PRunDataHandler::ReadPsiBinFile() sDateTime = psiBin.get_timeStop_vector(); if (sDateTime.size() < 2) { - cerr << endl << ">> **WARNING** psi-bin file: couldn't obtain run stop date/time" << endl; + std::cerr << std::endl << ">> **WARNING** psi-bin file: couldn't obtain run stop date/time" << std::endl; } - date = string(""); + date = std::string(""); if (DateToISO8601(sDateTime[0], date)) { runData.SetStopDate(date); } else { - cerr << endl << ">> **WARNING** failed to convert stop date: " << sDateTime[0] << " into ISO 8601 date." << endl; + std::cerr << std::endl << ">> **WARNING** failed to convert stop date: " << sDateTime[0] << " into ISO 8601 date." << std::endl; runData.SetStopDate(sDateTime[0]); } runData.SetStopTime(sDateTime[1]); @@ -2844,24 +2842,24 @@ Bool_t PRunDataHandler::ReadPsiBinFile() PIntVector t0 = psiBin.get_t0_vector(); if (t0.empty()) { - cerr << endl << ">> **ERROR** psi-bin file: couldn't obtain any t0's"; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** psi-bin file: couldn't obtain any t0's"; + std::cerr << std::endl; return false; } // get first good bin PIntVector fgb = psiBin.get_firstGood_vector(); if (fgb.empty()) { - cerr << endl << ">> **ERROR** psi-bin file: couldn't obtain any fgb's"; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** psi-bin file: couldn't obtain any fgb's"; + std::cerr << std::endl; return false; } // get last good bin PIntVector lgb = psiBin.get_lastGood_vector(); if (lgb.empty()) { - cerr << endl << ">> **ERROR** psi-bin file: couldn't obtain any lgb's"; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** psi-bin file: couldn't obtain any lgb's"; + std::cerr << std::endl; return false; } @@ -2889,12 +2887,12 @@ Bool_t PRunDataHandler::ReadPsiBinFile() dataSet.Clear(); dataSet.SetName(psiBin.get_nameHisto(i).c_str()); dataSet.SetHistoNo(i+1); // i.e. hist numbering starts at 1 - if (i < (Int_t)t0.size()) + if (i < static_cast(t0.size())) dataSet.SetTimeZeroBin(t0[i]); dataSet.SetTimeZeroBinEstimated(maxBin); - if (i < (Int_t)fgb.size()) + if (i < static_cast(fgb.size())) dataSet.SetFirstGoodBin(fgb[i]); - if (i < (Int_t)lgb.size()) + if (i < static_cast(lgb.size())) dataSet.SetLastGoodBin(lgb[i]); dataSet.SetData(histoData); @@ -2929,10 +2927,10 @@ Bool_t PRunDataHandler::ReadMudFile() PRawRunData runData; - fh = MUD_openRead((Char_t *)fRunPathName.Data(), &type); + fh = MUD_openRead((char*)fRunPathName.Data(), &type); if (fh == -1) { - cerr << endl << ">> **ERROR** Couldn't open mud-file " << fRunPathName.Data() << ", sorry."; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** Couldn't open mud-file " << fRunPathName.Data() << ", sorry."; + std::cerr << std::endl; return false; } @@ -2944,8 +2942,8 @@ Bool_t PRunDataHandler::ReadMudFile() // get/set the lab success = MUD_getLab( fh, str, sizeof(str) ); if ( !success ) { - cerr << endl << ">> **WARNING** Couldn't obtain the laboratory name of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **WARNING** Couldn't obtain the laboratory name of run " << fRunName.Data(); + std::cerr << std::endl; strcpy(str, "n/a"); } runData.SetLaboratory(TString(str)); @@ -2953,8 +2951,8 @@ Bool_t PRunDataHandler::ReadMudFile() // get/set the beamline success = MUD_getArea( fh, str, sizeof(str) ); if ( !success ) { - cerr << endl << ">> **WARNING** Couldn't obtain the beamline of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **WARNING** Couldn't obtain the beamline of run " << fRunName.Data(); + std::cerr << std::endl; strcpy(str, "n/a"); } runData.SetBeamline(TString(str)); @@ -2962,8 +2960,8 @@ Bool_t PRunDataHandler::ReadMudFile() // get/set the instrument success = MUD_getApparatus( fh, str, sizeof(str) ); if ( !success ) { - cerr << endl << ">> **WARNING** Couldn't obtain the instrument name of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **WARNING** Couldn't obtain the instrument name of run " << fRunName.Data(); + std::cerr << std::endl; strcpy(str, "n/a"); } runData.SetInstrument(TString(str)); @@ -2971,15 +2969,15 @@ Bool_t PRunDataHandler::ReadMudFile() // get run title success = MUD_getTitle( fh, str, sizeof(str) ); if ( !success ) { - cerr << endl << ">> **WARNING** Couldn't obtain the run title of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **WARNING** Couldn't obtain the run title of run " << fRunName.Data(); + std::cerr << std::endl; } runData.SetRunTitle(TString(str)); // get run number success = MUD_getRunNumber( fh, &val ); if (success) { - runData.SetRunNumber((Int_t)val); + runData.SetRunNumber(static_cast(val)); } // get start/stop time of the run @@ -2988,7 +2986,7 @@ Bool_t PRunDataHandler::ReadMudFile() TString stime(""); success = MUD_getTimeBegin( fh, (UINT32*)&tval ); if (success) { - runData.SetStartDateTime((const time_t)tval); + runData.SetStartDateTime(static_cast(tval)); dt = localtime((const time_t*)&tval); if (dt) { @@ -3002,7 +3000,7 @@ Bool_t PRunDataHandler::ReadMudFile() stime = str; runData.SetStartTime(stime); } else { - cerr << "PRunDataHandler::ReadMudFile: **WARNING** run start time readback wrong, will set it to 1900-01-01, 00:00:00" << endl; + std::cerr << "PRunDataHandler::ReadMudFile: **WARNING** run start time readback wrong, will set it to 1900-01-01, 00:00:00" << std::endl; stime = "1900-01-01"; runData.SetStartDate(stime); stime = "00:00:00"; @@ -3027,7 +3025,7 @@ Bool_t PRunDataHandler::ReadMudFile() stime = str; runData.SetStopTime(stime); } else { - cerr << "PRunDataHandler::ReadMudFile: **WARNING** run stop time readback wrong, will set it to 1900-01-01, 00:00:00" << endl; + std::cerr << "PRunDataHandler::ReadMudFile: **WARNING** run stop time readback wrong, will set it to 1900-01-01, 00:00:00" << std::endl; stime = "1900-01-01"; runData.SetStopDate(stime); stime = "00:00:00"; @@ -3046,11 +3044,9 @@ Bool_t PRunDataHandler::ReadMudFile() if (success) { setup += TString(str) + TString("/"); if (TString(str) == "BNQR" || TString(str) == "BNMR") { - cerr << "PRunDataHandler::ReadMudFile: **INFORMATION** this run was performed on " << str << endl; - // identified BNMR/BNQR, do not change multiplier. - // Change x label in PMusrCanvas instead. - // I am keeping this here for now for possible future use. - // timeResMultiplier = 1.0e9; + std::cerr << "PRunDataHandler::ReadMudFile: **INFORMATION** this run was performed on " << str << std::endl; + // identified BNMR/BNQR, correct time resolution. + timeResMultiplier = 1.0e15; } } success = MUD_getApparatus( fh, str, sizeof(str) ); @@ -3097,12 +3093,12 @@ Bool_t PRunDataHandler::ReadMudFile() // get number of histogramms success = MUD_getHists(fh, &type, &val); if ( !success ) { - cerr << endl << ">> **ERROR** Couldn't obtain the number of histograms of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **ERROR** Couldn't obtain the number of histograms of run " << fRunName.Data(); + std::cerr << std::endl; MUD_closeRead(fh); return false; } - Int_t noOfHistos = (Int_t)val; + Int_t noOfHistos = static_cast(val); // get time resolution (ns) // check that time resolution is identical for all histograms @@ -3113,9 +3109,9 @@ Bool_t PRunDataHandler::ReadMudFile() for (Int_t i=1; i<=noOfHistos; i++) { success = MUD_getHistSecondsPerBin( fh, i, &lrval ); if (!success) { - cerr << endl << ">> **ERROR** Couldn't obtain the time resolution of run " << fRunName.Data(); - cerr << endl << ">> which is fatal, sorry."; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** Couldn't obtain the time resolution of run " << fRunName.Data(); + std::cerr << std::endl << ">> which is fatal, sorry."; + std::cerr << std::endl; MUD_closeRead(fh); return false; } @@ -3123,16 +3119,16 @@ Bool_t PRunDataHandler::ReadMudFile() timeResolution = lrval; } else { if (lrval != timeResolution) { - cerr << endl << ">> **ERROR** various time resolutions found in run " << fRunName.Data(); - cerr << endl << ">> this is currently not supported, sorry."; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** various time resolutions found in run " << fRunName.Data(); + std::cerr << std::endl << ">> this is currently not supported, sorry."; + std::cerr << std::endl; MUD_closeRead(fh); return false; } } } - runData.SetTimeResolution((Double_t)timeResolution * timeResMultiplier); // s -> ns + runData.SetTimeResolution(static_cast(timeResolution) * timeResMultiplier); // s -> ns // An additional factor of 1e6 needed for bNMR // Check if it is a bNMR run and fix it or check if "timeres" line // was introduced in the msr file @@ -3140,7 +3136,7 @@ Bool_t PRunDataHandler::ReadMudFile() // read histograms UINT32 *pData; // histo memory - pData = NULL; + pData = nullptr; PDoubleVector histoData; PRawRunDataSet dataSet; UInt_t noOfBins; @@ -3153,61 +3149,61 @@ Bool_t PRunDataHandler::ReadMudFile() // get t0's success = MUD_getHistT0_Bin( fh, i, &val ); if ( !success ) { - cerr << endl << ">> **WARNING** Couldn't get t0 of histo " << i << " of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **WARNING** Couldn't get t0 of histo " << i << " of run " << fRunName.Data(); + std::cerr << std::endl; } - dataSet.SetTimeZeroBin((Double_t)val); + dataSet.SetTimeZeroBin(static_cast(val)); // get bkg bins success = MUD_getHistBkgd1( fh, i, &val ); if ( !success ) { - cerr << endl << ">> **WARNING** Couldn't get bkg bin 1 of histo " << i << " of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **WARNING** Couldn't get bkg bin 1 of histo " << i << " of run " << fRunName.Data(); + std::cerr << std::endl; val = 0; } - dataSet.SetFirstBkgBin((Int_t)val); + dataSet.SetFirstBkgBin(static_cast(val)); success = MUD_getHistBkgd2( fh, i, &val ); if ( !success ) { - cerr << endl << ">> **WARNING** Couldn't get bkg bin 2 of histo " << i << " of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **WARNING** Couldn't get bkg bin 2 of histo " << i << " of run " << fRunName.Data(); + std::cerr << std::endl; val = 0; } - dataSet.SetLastBkgBin((Int_t)val); + dataSet.SetLastBkgBin(static_cast(val)); // get good data bins success = MUD_getHistGoodBin1( fh, i, &val ); if ( !success ) { - cerr << endl << ">> **WARNING** Couldn't get good bin 1 of histo " << i << " of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **WARNING** Couldn't get good bin 1 of histo " << i << " of run " << fRunName.Data(); + std::cerr << std::endl; val = 0; } - dataSet.SetFirstGoodBin((Int_t)val); + dataSet.SetFirstGoodBin(static_cast(val)); success = MUD_getHistGoodBin2( fh, i, &val ); if ( !success ) { - cerr << endl << ">> **WARNING** Couldn't get good bin 2 of histo " << i << " of run " << fRunName.Data(); - cerr << endl; + std::cerr << std::endl << ">> **WARNING** Couldn't get good bin 2 of histo " << i << " of run " << fRunName.Data(); + std::cerr << std::endl; val = 0; } - dataSet.SetLastGoodBin((Int_t)val); + dataSet.SetLastGoodBin(static_cast(val)); // get number of bins success = MUD_getHistNumBins( fh, i, &val ); if ( !success ) { - cerr << endl << ">> **ERROR** Couldn't get the number of bins of histo " << i << "."; - cerr << endl << ">> This is fatal, sorry."; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** Couldn't get the number of bins of histo " << i << "."; + std::cerr << std::endl << ">> This is fatal, sorry."; + std::cerr << std::endl; MUD_closeRead( fh ); return false; } - noOfBins = (UInt_t)val; + noOfBins = static_cast(val); pData = (UINT32*)malloc(noOfBins*sizeof(pData)); - if (pData == NULL) { - cerr << endl << ">> **ERROR** Couldn't allocate memory for data."; - cerr << endl << ">> This is fatal, sorry."; - cerr << endl; + if (pData == nullptr) { + std::cerr << std::endl << ">> **ERROR** Couldn't allocate memory for data."; + std::cerr << std::endl << ">> This is fatal, sorry."; + std::cerr << std::endl; MUD_closeRead( fh ); return false; } @@ -3215,9 +3211,9 @@ Bool_t PRunDataHandler::ReadMudFile() // get histogram success = MUD_getHistData( fh, i, pData ); if ( !success ) { - cerr << endl << ">> **ERROR** Couldn't get histo no " << i << "."; - cerr << endl << ">> This is fatal, sorry."; - cerr << endl; + std::cerr << std::endl << ">> **ERROR** Couldn't get histo no " << i << "."; + std::cerr << std::endl << ">> This is fatal, sorry."; + std::cerr << std::endl; MUD_closeRead( fh ); return false; } @@ -3287,13 +3283,13 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() Bool_t success = true; // open file - ifstream f; + std::ifstream f; // open data-file - f.open(fRunPathName.Data(), ifstream::in); + f.open(fRunPathName.Data(), std::ifstream::in); if (!f.is_open()) { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** Couldn't open data file (" << fRunPathName.Data() << ") for reading, sorry ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** Couldn't open data file (" << fRunPathName.Data() << ") for reading, sorry ..."; + std::cerr << std::endl; return false; } @@ -3309,12 +3305,12 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() Bool_t dataTag = false; Int_t dataLineCounter = 0; TObjString *ostr; - TObjArray *tokens = 0; + TObjArray *tokens = nullptr; TString str; Int_t groups = 0; Int_t channels = 0; Double_t dval = 0.0, unitScaling = 0.0; - vector data; + std::vector data; while (!f.eof()) { f.getline(instr, sizeof(instr)); @@ -3356,9 +3352,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() tokens = workStr.Tokenize(":("); // field: val (units) // check if expected number of tokens present if (tokens->GetEntries() != 3) { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", invalid field entry in header."; - cerr << endl << ">> " << line.Data(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", invalid field entry in header."; + std::cerr << std::endl << ">> " << line.Data(); + std::cerr << std::endl; success = false; break; } @@ -3367,9 +3363,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() if (ostr->GetString().IsFloat()) { dval = ostr->GetString().Atof(); } else { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", field value is not float/doulbe."; - cerr << endl << ">> " << line.Data(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", field value is not float/doulbe."; + std::cerr << std::endl << ">> " << line.Data(); + std::cerr << std::endl; success = false; break; } @@ -3380,9 +3376,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() else if (ostr->GetString().Contains("T")) unitScaling = 1.0e4; else { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", unkown field units."; - cerr << endl << ">> " << line.Data(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", unkown field units."; + std::cerr << std::endl << ">> " << line.Data(); + std::cerr << std::endl; success = false; break; } @@ -3391,15 +3387,15 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() // clean up tokens if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } else if (workStr.BeginsWith("temp:", TString::kIgnoreCase)) { tokens = workStr.Tokenize(":("); // temp: val (units) // check if expected number of tokens present if (tokens->GetEntries() != 3) { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", invalid temperatue entry in header."; - cerr << endl << ">> " << line.Data(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", invalid temperatue entry in header."; + std::cerr << std::endl << ">> " << line.Data(); + std::cerr << std::endl; success = false; break; } @@ -3408,9 +3404,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() if (ostr->GetString().IsFloat()) { dval = ostr->GetString().Atof(); } else { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", temperature value is not float/doulbe."; - cerr << endl << ">> " << line.Data(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", temperature value is not float/doulbe."; + std::cerr << std::endl << ">> " << line.Data(); + std::cerr << std::endl; success = false; break; } @@ -3419,7 +3415,7 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() // clean up tokens if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } else if (workStr.BeginsWith("setup:", TString::kIgnoreCase)) { runData.SetSetup(TString(workStr.Data()+workStr.First(":")+2)); @@ -3427,8 +3423,8 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() workStr = TString(workStr.Data()+workStr.First(":")+2); groups = workStr.Atoi(); if (groups == 0) { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", groups is not a number or 0."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", groups is not a number or 0."; + std::cerr << std::endl; success = false; break; } @@ -3437,8 +3433,8 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() workStr = TString(workStr.Data()+workStr.First(":")+2); channels = workStr.Atoi(); if (channels == 0) { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", channels is not a number or 0."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", channels is not a number or 0."; + std::cerr << std::endl; success = false; break; } @@ -3446,9 +3442,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() tokens = workStr.Tokenize(":("); // resolution: val (units) // check if expected number of tokens present if (tokens->GetEntries() != 3) { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", invalid time resolution entry in header."; - cerr << endl << line.Data(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", invalid time resolution entry in header."; + std::cerr << std::endl << line.Data(); + std::cerr << std::endl; success = false; break; } @@ -3457,9 +3453,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() if (ostr->GetString().IsFloat()) { dval = ostr->GetString().Atof(); } else { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", time resolution value is not float/doulbe."; - cerr << endl << ">> " << line.Data(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", time resolution value is not float/doulbe."; + std::cerr << std::endl << ">> " << line.Data(); + std::cerr << std::endl; success = false; break; } @@ -3474,9 +3470,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() else if (ostr->GetString().Contains("us")) unitScaling = 1.0e3; else { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", unkown time resolution units."; - cerr << endl << ">> " << line.Data(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", unkown time resolution units."; + std::cerr << std::endl << ">> " << line.Data(); + std::cerr << std::endl; success = false; break; } @@ -3485,11 +3481,11 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() // clean up tokens if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } else { // error - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", illegal header line."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", illegal header line."; + std::cerr << std::endl; success = false; break; } @@ -3498,10 +3494,10 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() tokens = line.Tokenize(" ,\t"); // check if the number of data line entries is correct if (tokens->GetEntries() != groups+1) { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** found data line with a wrong data format, cannot be handled (line no " << lineNo << ")"; - cerr << endl << ">> line:"; - cerr << endl << ">> " << line.Data(); - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** found data line with a wrong data format, cannot be handled (line no " << lineNo << ")"; + std::cerr << std::endl << ">> line:"; + std::cerr << std::endl << ">> " << line.Data(); + std::cerr << std::endl; success = false; break; } @@ -3514,7 +3510,7 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() // clean up tokens if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } } } @@ -3547,8 +3543,8 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() data.clear(); if (dataLineCounter != channels) { - cerr << endl << ">> PRunDataHandler::ReadMduAsciiFile **WARNING** found " << dataLineCounter << " data bins,"; - cerr << endl << ">> expected " << channels << " according to the header." << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **WARNING** found " << dataLineCounter << " data bins,"; + std::cerr << std::endl << ">> expected " << channels << " according to the header." << std::endl; } fData.push_back(runData); @@ -3600,13 +3596,13 @@ Bool_t PRunDataHandler::ReadAsciiFile() Bool_t success = true; // open file - ifstream f; + std::ifstream f; // open data-file - f.open(fRunPathName.Data(), ifstream::in); + f.open(fRunPathName.Data(), std::ifstream::in); if (!f.is_open()) { - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** Couldn't open data file (" << fRunPathName.Data() << ") for reading, sorry ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** Couldn't open data file (" << fRunPathName.Data() << ") for reading, sorry ..."; + std::cerr << std::endl; return false; } @@ -3666,8 +3662,8 @@ Bool_t PRunDataHandler::ReadAsciiFile() } else if (workStr.BeginsWith("field:", TString::kIgnoreCase)) { workStr = TString(workStr.Data()+workStr.First(":")+2); if (!workStr.IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ", field is not a number."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ", field is not a number."; + std::cerr << std::endl; success = false; break; } @@ -3679,8 +3675,8 @@ Bool_t PRunDataHandler::ReadAsciiFile() } else if (workStr.BeginsWith("temp:", TString::kIgnoreCase)) { workStr = TString(workStr.Data()+workStr.First(":")+2); if (!workStr.IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ", temperature is not a number."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ", temperature is not a number."; + std::cerr << std::endl; success = false; break; } @@ -3688,16 +3684,16 @@ Bool_t PRunDataHandler::ReadAsciiFile() } else if (workStr.BeginsWith("energy:", TString::kIgnoreCase)) { workStr = TString(workStr.Data()+workStr.First(":")+2); if (!workStr.IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ", energy is not a number."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ", energy is not a number."; + std::cerr << std::endl; success = false; break; } runData.SetEnergy(workStr.Atof()); runData.SetTransport(PMUSR_UNDEFINED); // just to initialize the variables to some "meaningful" value } else { // error - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ", illegal header line."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ", illegal header line."; + std::cerr << std::endl; success = false; break; } @@ -3714,8 +3710,8 @@ Bool_t PRunDataHandler::ReadAsciiFile() tokens = line.Tokenize(" ,\t"); // check if the number of data line entries is 2 or 3 if ((tokens->GetEntries() != 2) && (tokens->GetEntries() != 3)) { - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** found data line with a structure different than \"x, y [, error y]\", cannot be handled (line no " << lineNo << ")"; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** found data line with a structure different than \"x, y [, error y]\", cannot be handled (line no " << lineNo << ")"; + std::cerr << std::endl; success = false; break; } @@ -3723,8 +3719,8 @@ Bool_t PRunDataHandler::ReadAsciiFile() // get x ostr = dynamic_cast(tokens->At(0)); if (!ostr->GetString().IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": x = " << ostr->GetString().Data() << " is not a number, sorry."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": x = " << ostr->GetString().Data() << " is not a number, sorry."; + std::cerr << std::endl; success = false; break; } @@ -3733,8 +3729,8 @@ Bool_t PRunDataHandler::ReadAsciiFile() // get y ostr = dynamic_cast(tokens->At(1)); if (!ostr->GetString().IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": y = " << ostr->GetString().Data() << " is not a number, sorry."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": y = " << ostr->GetString().Data() << " is not a number, sorry."; + std::cerr << std::endl; success = false; break; } @@ -3744,8 +3740,8 @@ Bool_t PRunDataHandler::ReadAsciiFile() if (tokens->GetEntries() == 3) { ostr = dynamic_cast(tokens->At(2)); if (!ostr->GetString().IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": error y = " << ostr->GetString().Data() << " is not a number, sorry."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": error y = " << ostr->GetString().Data() << " is not a number, sorry."; + std::cerr << std::endl; success = false; break; } @@ -3757,7 +3753,7 @@ Bool_t PRunDataHandler::ReadAsciiFile() // clean up tokens if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } // keep values @@ -3767,8 +3763,8 @@ Bool_t PRunDataHandler::ReadAsciiFile() eyVec.push_back(ey); } else { - cerr << endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << " neither header nor data line. No idea how to handle it!"; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << " neither header nor data line. No idea how to handle it!"; + std::cerr << std::endl; success = false; break; } @@ -3911,13 +3907,13 @@ Bool_t PRunDataHandler::ReadDBFile() Bool_t success = true; // open file - ifstream f; + std::ifstream f; // open db-file - f.open(fRunPathName.Data(), ifstream::in); + f.open(fRunPathName.Data(), std::ifstream::in); if (!f.is_open()) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** Couldn't open data file (" << fRunPathName.Data() << ") for reading, sorry ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** Couldn't open data file (" << fRunPathName.Data() << ") for reading, sorry ..."; + std::cerr << std::endl; return false; } @@ -3938,7 +3934,7 @@ Bool_t PRunDataHandler::ReadDBFile() // variables needed to tokenize strings TString tstr; TObjString *ostr; - TObjArray *tokens = 0; + TObjArray *tokens = nullptr; while (!f.eof()) { // get next line from file @@ -3983,7 +3979,7 @@ Bool_t PRunDataHandler::ReadDBFile() // clean up tokens if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } continue; } @@ -4023,7 +4019,7 @@ Bool_t PRunDataHandler::ReadDBFile() // clean up tokens if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } // prepare data vector for use @@ -4043,9 +4039,9 @@ Bool_t PRunDataHandler::ReadDBFile() TString run("run"); idx = GetDataTagIndex(run, runData.fDataNonMusr.GetDataTags()); if (idx == -1) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> found potential run data line without run data tag."; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> found potential run data line without run data tag."; return false; } // split string in tokens @@ -4053,10 +4049,10 @@ Bool_t PRunDataHandler::ReadDBFile() ostr = dynamic_cast(tokens->At(0)); tstr = ostr->GetString(); if (!tstr.IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> Expected db-data line with structure: runNo,,, runTitle"; - cerr << endl << ">> runNo = " << tstr.Data() << ", seems to be not a number."; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> Expected db-data line with structure: runNo,,, runTitle"; + std::cerr << std::endl << ">> runNo = " << tstr.Data() << ", seems to be not a number."; delete tokens; return false; } @@ -4069,9 +4065,9 @@ Bool_t PRunDataHandler::ReadDBFile() // split string in tokens tokens = workStr.Tokenize("=,"); // line has structure: tag = val,err1,err2, if (tokens->GetEntries() < 3) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; delete tokens; return false; } @@ -4079,9 +4075,9 @@ Bool_t PRunDataHandler::ReadDBFile() tstr = ostr->GetString(); idx = GetDataTagIndex(tstr, runData.fDataNonMusr.GetDataTags()); if (idx == -1) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> data tag error: " << tstr.Data() << " seems not present in the data tag list"; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> data tag error: " << tstr.Data() << " seems not present in the data tag list"; delete tokens; return false; } @@ -4091,10 +4087,10 @@ Bool_t PRunDataHandler::ReadDBFile() ostr = dynamic_cast(tokens->At(1)); tstr = ostr->GetString(); if (!tstr.IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; - cerr << endl << ">> val = " << tstr.Data() << ", seems to be not a number."; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; + std::cerr << std::endl << ">> val = " << tstr.Data() << ", seems to be not a number."; delete tokens; return false; } @@ -4108,10 +4104,10 @@ Bool_t PRunDataHandler::ReadDBFile() ostr = dynamic_cast(tokens->At(1)); tstr = ostr->GetString(); if (!tstr.IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; - cerr << endl << ">> val = " << tstr.Data() << ", seems to be not a number."; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; + std::cerr << std::endl << ">> val = " << tstr.Data() << ", seems to be not a number."; delete tokens; return false; } @@ -4121,10 +4117,10 @@ Bool_t PRunDataHandler::ReadDBFile() ostr = dynamic_cast(tokens->At(2)); tstr = ostr->GetString(); if (!tstr.IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; - cerr << endl << ">> err1 = " << tstr.Data() << ", seems to be not a number."; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; + std::cerr << std::endl << ">> err1 = " << tstr.Data() << ", seems to be not a number."; delete tokens; return false; } @@ -4132,24 +4128,23 @@ Bool_t PRunDataHandler::ReadDBFile() runData.fDataNonMusr.AppendSubErrData(idx, val); break; default: - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; delete tokens; return false; - break; } } } else { // handle row formated data // split string in tokens tokens = workStr.Tokenize(","); // line has structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle - if (tokens->GetEntries() != (Int_t)(3*runData.fDataNonMusr.GetDataTags()->size()+1)) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; - cerr << endl << ">> found = " << tokens->GetEntries() << " tokens, however expected " << 3*runData.fDataNonMusr.GetDataTags()->size()+1; - cerr << endl << ">> Perhaps there are commas without space inbetween, like 12.3,, 3.2,..."; + if (tokens->GetEntries() != static_cast(3*runData.fDataNonMusr.GetDataTags()->size()+1)) { + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; + std::cerr << std::endl << ">> found = " << tokens->GetEntries() << " tokens, however expected " << 3*runData.fDataNonMusr.GetDataTags()->size()+1; + std::cerr << std::endl << ">> Perhaps there are commas without space inbetween, like 12.3,, 3.2,..."; delete tokens; return false; } @@ -4160,10 +4155,10 @@ Bool_t PRunDataHandler::ReadDBFile() ostr = dynamic_cast(tokens->At(i)); tstr = ostr->GetString(); if (!tstr.IsFloat()) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; - cerr << endl << ">> value=" << tstr.Data() << " seems not to be a number"; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; + std::cerr << std::endl << ">> value=" << tstr.Data() << " seems not to be a number"; delete tokens; return false; } @@ -4177,10 +4172,10 @@ Bool_t PRunDataHandler::ReadDBFile() } else if (tstr.IsFloat()) { runData.fDataNonMusr.AppendSubErrData(j, tstr.Atof()); } else { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; - cerr << endl << ">> " << workStr.Data(); - cerr << endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; - cerr << endl << ">> error1=" << tstr.Data() << " seems not to be a number"; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; + std::cerr << std::endl << ">> " << workStr.Data(); + std::cerr << std::endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; + std::cerr << std::endl << ">> error1=" << tstr.Data() << " seems not to be a number"; delete tokens; return false; } @@ -4197,13 +4192,13 @@ Bool_t PRunDataHandler::ReadDBFile() // check that the number of labels == the number of data tags if (runData.fDataNonMusr.GetLabels()->size() != runData.fDataNonMusr.GetDataTags()->size()) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR**"; - cerr << endl << ">> number of LABELS found = " << runData.fDataNonMusr.GetLabels()->size(); - cerr << endl << ">> number of Data tags found = " << runData.fDataNonMusr.GetDataTags()->size(); - cerr << endl << ">> They have to be equal!!"; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR**"; + std::cerr << std::endl << ">> number of LABELS found = " << runData.fDataNonMusr.GetLabels()->size(); + std::cerr << std::endl << ">> number of Data tags found = " << runData.fDataNonMusr.GetDataTags()->size(); + std::cerr << std::endl << ">> They have to be equal!!"; if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } return false; } @@ -4211,18 +4206,18 @@ Bool_t PRunDataHandler::ReadDBFile() // check if all vectors have the same size for (UInt_t i=1; isize(); i++) { if (runData.fDataNonMusr.GetData()->at(i).size() != runData.fDataNonMusr.GetData()->at(i-1).size()) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo; - cerr << endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i-1).Data() << ", number data elements = " << runData.fDataNonMusr.GetData()->at(i-1).size(); - cerr << endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i).Data() << ", number data elements = " << runData.fDataNonMusr.GetData()->at(i).size(); - cerr << endl << ">> They have to be equal!!"; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo; + std::cerr << std::endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i-1).Data() << ", number data elements = " << runData.fDataNonMusr.GetData()->at(i-1).size(); + std::cerr << std::endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i).Data() << ", number data elements = " << runData.fDataNonMusr.GetData()->at(i).size(); + std::cerr << std::endl << ">> They have to be equal!!"; success = false; break; } if (runData.fDataNonMusr.GetErrData()->at(i).size() != runData.fDataNonMusr.GetErrData()->at(i-1).size()) { - cerr << endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo; - cerr << endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i-1).Data() << ", number data elements = " << runData.fDataNonMusr.GetData()->at(i-1).size(); - cerr << endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i).Data() << ", number error data elements = " << runData.fDataNonMusr.GetErrData()->at(i).size(); - cerr << endl << ">> They have to be equal!!"; + std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo; + std::cerr << std::endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i-1).Data() << ", number data elements = " << runData.fDataNonMusr.GetData()->at(i-1).size(); + std::cerr << std::endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i).Data() << ", number error data elements = " << runData.fDataNonMusr.GetErrData()->at(i).size(); + std::cerr << std::endl << ">> They have to be equal!!"; success = false; break; } @@ -4231,7 +4226,7 @@ Bool_t PRunDataHandler::ReadDBFile() // clean up tokens if (tokens) { delete tokens; - tokens = 0; + tokens = nullptr; } // keep run name @@ -4262,7 +4257,7 @@ Bool_t PRunDataHandler::WriteMusrRootFile(TString fln) return false; if (!fAny2ManyInfo->useStandardOutput) - cout << endl << ">> PRunDataHandler::WriteMusrRootFile(): writing a root data file (" << fln.Data() << ") ... " << endl; + std::cout << std::endl << ">> PRunDataHandler::WriteMusrRootFile(): writing a root data file (" << fln.Data() << ") ... " << std::endl; // generate data file TFolder *histosFolder; @@ -4327,7 +4322,7 @@ Bool_t PRunDataHandler::WriteMusrRootFile(TString fln) dval[0] = fData[0].GetField(); prop.Set("Sample Magnetic Field", dval[0], "G"); header->Set("RunInfo/Sample Magnetic Field", prop); - header->Set("RunInfo/No of Histos", (Int_t)fData[0].GetNoOfHistos()); + header->Set("RunInfo/No of Histos", static_cast(fData[0].GetNoOfHistos())); dval[0] = fData[0].GetTimeResolution(); prop.Set("Time Resolution", dval[0], "ns"); header->Set("RunInfo/Time Resolution", prop); @@ -4339,9 +4334,9 @@ Bool_t PRunDataHandler::WriteMusrRootFile(TString fln) UInt_t size = fData[0].GetNoOfHistos(); for (UInt_t i=0; i> PRunDataHandler::WriteMusrRootFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteMusrRootFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } histoNo = dataSet->GetHistoNo(); @@ -4353,15 +4348,15 @@ Bool_t PRunDataHandler::WriteMusrRootFile(TString fln) pathName.Form("DetectorInfo/Detector%03d/Histo Number", histoNo); header->Set(pathName, histoNo); pathName.Form("DetectorInfo/Detector%03d/Histo Length", histoNo); - header->Set(pathName, (Int_t)(dataSet->GetData()->size()/fAny2ManyInfo->rebin)); + header->Set(pathName, static_cast(dataSet->GetData()->size()/fAny2ManyInfo->rebin)); pathName.Form("DetectorInfo/Detector%03d/Time Zero Bin", histoNo); header->Set(pathName, dataSet->GetTimeZeroBin()/fAny2ManyInfo->rebin); pathName.Form("DetectorInfo/Detector%03d/First Good Bin", histoNo); ival = dataSet->GetFirstGoodBin(); - header->Set(pathName, (Int_t)(ival/fAny2ManyInfo->rebin)); + header->Set(pathName, static_cast(ival/fAny2ManyInfo->rebin)); pathName.Form("DetectorInfo/Detector%03d/Last Good Bin", histoNo); ival = dataSet->GetLastGoodBin(); - header->Set(pathName, (Int_t)(ival/fAny2ManyInfo->rebin)); + header->Set(pathName, static_cast(ival/fAny2ManyInfo->rebin)); } // feed SampleEnvironmentInfo @@ -4377,20 +4372,20 @@ Bool_t PRunDataHandler::WriteMusrRootFile(TString fln) header->Set("BeamlineInfo/Name", str); // feed histos - vector histos; - TH1F *histo = 0; + std::vector histos; + TH1F *histo = nullptr; UInt_t length = 0; if (fAny2ManyInfo->rebin == 1) { for (UInt_t i=0; i> PRunDataHandler::WriteMusrRootFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteMusrRootFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } str.Form("hDecay%03d", dataSet->GetHistoNo()); length = dataSet->GetData()->size(); - histo = new TH1F(str.Data(), str.Data(), length+1, -0.5, (Double_t)length+0.5); + histo = new TH1F(str.Data(), str.Data(), length+1, -0.5, static_cast(length)+0.5); for (UInt_t j=0; jSetBinContent(j+1, dataSet->GetData()->at(j)); } @@ -4401,14 +4396,14 @@ Bool_t PRunDataHandler::WriteMusrRootFile(TString fln) UInt_t dataCount = 0; for (UInt_t i=0; i> PRunDataHandler::WriteMusrRootFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteMusrRootFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } str.Form("hDecay%03d", dataSet->GetHistoNo()); length = dataSet->GetData()->size(); - histo = new TH1F(str.Data(), str.Data(), (Int_t)(length/fAny2ManyInfo->rebin)+1, -0.5, (Double_t)((Int_t)(length/fAny2ManyInfo->rebin))+0.5); + histo = new TH1F(str.Data(), str.Data(), static_cast(length/fAny2ManyInfo->rebin)+1, -0.5, static_cast(static_cast(length/fAny2ManyInfo->rebin))+0.5); dataCount = 0; for (UInt_t j=0; j 0) && (j % fAny2ManyInfo->rebin == 0)) { @@ -4428,8 +4423,8 @@ Bool_t PRunDataHandler::WriteMusrRootFile(TString fln) // write file TFile *fout = new TFile(fln, "RECREATE", fln); - if (fout == 0) { - cerr << endl << "PRunDataHandler::WriteMusrRootFile(): **ERROR** Couldn't create ROOT file '" << fln << "'" << endl; + if (fout == nullptr) { + std::cerr << std::endl << "PRunDataHandler::WriteMusrRootFile(): **ERROR** Couldn't create ROOT file '" << fln << "'" << std::endl; return false; } @@ -4442,24 +4437,24 @@ Bool_t PRunDataHandler::WriteMusrRootFile(TString fln) // check if root file shall be streamed to stdout if (fAny2ManyInfo->useStandardOutput && (fAny2ManyInfo->compressionTag == 0)) { // stream file to stdout - ifstream is; + std::ifstream is; int length=1024; char *buffer; - is.open(fln.Data(), ios::binary); + is.open(fln.Data(), std::ios::binary); if (!is.is_open()) { - cerr << endl << "PRunDataHandler::WriteMusrRootFile(): **ERROR** Couldn't open the root-file for streaming." << endl; + std::cerr << std::endl << "PRunDataHandler::WriteMusrRootFile(): **ERROR** Couldn't open the root-file for streaming." << std::endl; remove(fln.Data()); return false; } // get length of file - is.seekg(0, ios::end); + is.seekg(0, std::ios::end); length = is.tellg(); - is.seekg(0, ios::beg); + is.seekg(0, std::ios::beg); if (length == -1) { - cerr << endl << "PRunDataHandler::WriteMusrRootFile(): **ERROR** Couldn't determine the root-file size." << endl; + std::cerr << std::endl << "PRunDataHandler::WriteMusrRootFile(): **ERROR** Couldn't determine the root-file size." << std::endl; remove(fln.Data()); return false; } @@ -4470,7 +4465,7 @@ Bool_t PRunDataHandler::WriteMusrRootFile(TString fln) // read data as a block while (!is.eof()) { is.read(buffer, length); - cout.write(buffer, length); + std::cout.write(buffer, length); } is.close(); @@ -4505,7 +4500,7 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) if (!fAny2ManyInfo->useStandardOutput) - cout << endl << ">> PRunDataHandler::WriteRootFile(): writing a root data file (" << fln.Data() << ") ... " << endl; + std::cout << std::endl << ">> PRunDataHandler::WriteRootFile(): writing a root data file (" << fln.Data() << ") ... " << std::endl; // generate data file TFolder *histosFolder; @@ -4546,8 +4541,8 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) // feed t0's if possible UInt_t NoT0s = fData[0].GetNoOfHistos(); if (fData[0].GetNoOfHistos() > NHIST) { - cerr << endl << ">> PRunDataHandler::WriteRootFile: **WARNING** found more T0's (" << NoT0s << ") than can be handled (" << NHIST << ")."; - cerr << endl << ">> Will only write the first " << NHIST << " T0s!!" << endl; + std::cerr << std::endl << ">> PRunDataHandler::WriteRootFile: **WARNING** found more T0's (" << NoT0s << ") than can be handled (" << NHIST << ")."; + std::cerr << std::endl << ">> Will only write the first " << NHIST << " T0s!!" << std::endl; NoT0s = NHIST; } Double_t *tt0 = new Double_t[NoT0s]; @@ -4560,20 +4555,20 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) runInfo->Add(header); // add header to RunInfo folder // feed histos - vector histos; - TH1F *histo = 0; + std::vector histos; + TH1F *histo = nullptr; Char_t str[32]; UInt_t size = 0; if (fAny2ManyInfo->rebin == 1) { for (UInt_t i=0; i> PRunDataHandler::WriteRootFile: **ERROR** Couldn't get data set (idx=0" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteRootFile: **ERROR** Couldn't get data set (idx=0" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } size = dataSet->GetData()->size(); - sprintf(str, "hDecay%02d", (Int_t)i); + sprintf(str, "hDecay%02d", static_cast(i)); histo = new TH1F(str, str, size+1, -0.5, static_cast(size)+0.5); for (UInt_t j=0; jSetBinContent(j+1, dataSet->GetData()->at(j)); @@ -4585,14 +4580,14 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) UInt_t dataCount = 0; for (UInt_t i=0; i> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=0" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=0" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } size = dataSet->GetData()->size(); - sprintf(str, "hDecay%02d", (Int_t)i); - histo = new TH1F(str, str, (UInt_t)(size/fAny2ManyInfo->rebin)+1, -0.5, (Double_t)size/(Double_t)fAny2ManyInfo->rebin+0.5); + sprintf(str, "hDecay%02d", static_cast(i)); + histo = new TH1F(str, str, static_cast(size/fAny2ManyInfo->rebin)+1, -0.5, static_cast(size)/static_cast(fAny2ManyInfo->rebin)+0.5); dataCount = 0; for (UInt_t j=0; j 0) && (j % fAny2ManyInfo->rebin == 0)) { @@ -4612,8 +4607,8 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) // write file TFile *fout = new TFile(fln, "RECREATE", fln); - if (fout == 0) { - cerr << endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't create ROOT file '" << fln << "'" << endl; + if (fout == nullptr) { + std::cerr << std::endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't create ROOT file '" << fln << "'" << std::endl; return false; } @@ -4634,24 +4629,24 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) // check if root file shall be streamed to stdout if (fAny2ManyInfo->useStandardOutput && (fAny2ManyInfo->compressionTag == 0)) { // stream file to stdout - ifstream is; + std::ifstream is; int length=1024; char *buffer; - is.open(fln.Data(), ios::binary); + is.open(fln.Data(), std::ios::binary); if (!is.is_open()) { - cerr << endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't open the root-file for streaming." << endl; + std::cerr << std::endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't open the root-file for streaming." << std::endl; remove(fln.Data()); return false; } // get length of file - is.seekg(0, ios::end); + is.seekg(0, std::ios::end); length = is.tellg(); - is.seekg(0, ios::beg); + is.seekg(0, std::ios::beg); if (length == -1) { - cerr << endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't determine the root-file size." << endl; + std::cerr << std::endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't determine the root-file size." << std::endl; remove(fln.Data()); return false; } @@ -4662,7 +4657,7 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) // read data as a block while (!is.eof()) { is.read(buffer, length); - cout.write(buffer, length); + std::cout.write(buffer, length); } is.close(); @@ -4697,12 +4692,12 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) return false; if (!fAny2ManyInfo->useStandardOutput) - cout << endl << ">> PRunDataHandler::WriteNexusFile(): writing a NeXus data file (" << fln.Data() << ") ... " << endl; + std::cout << std::endl << ">> PRunDataHandler::WriteNexusFile(): writing a NeXus data file (" << fln.Data() << ") ... " << std::endl; // create NeXus object PNeXus *nxs = new PNeXus(); - if (nxs == 0) { - cerr << endl << ">> PRunDataHandler::WriteNexusFile(): **ERROR** couldn't invoke the NeXus object." << endl; + if (nxs == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::WriteNexusFile(): **ERROR** couldn't invoke the NeXus object." << std::endl; return false; } @@ -4718,10 +4713,10 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) struct tm *tm; time(&now); tm = localtime(&now); - string str(""); + std::string str(""); char cstr[128]; strftime(cstr, sizeof(cstr), "%FT%T", tm); - str = string(cstr); + str = std::string(cstr); nxs->SetFileTime(str); nxs->GetEntryIdf1()->SetProgramName("any2many"); @@ -4734,9 +4729,9 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) nxs->GetEntryIdf1()->SetLaboratory(fData[0].GetLaboratory()->Data()); if (*fData[0].GetBeamline() != "n/a") nxs->GetEntryIdf1()->SetBeamline(fData[0].GetBeamline()->Data()); - str = string(fData[0].GetStartDate()->Data()) + string("T") + string(fData[0].GetStartTime()->Data()); + str = std::string(fData[0].GetStartDate()->Data()) + std::string("T") + std::string(fData[0].GetStartTime()->Data()); nxs->GetEntryIdf1()->SetStartTime(str); - str = string(fData[0].GetStopDate()->Data()) + string("T") + string(fData[0].GetStopTime()->Data()); + str = std::string(fData[0].GetStopDate()->Data()) + std::string("T") + std::string(fData[0].GetStopTime()->Data()); nxs->GetEntryIdf1()->SetStopTime(str); nxs->GetEntryIdf1()->SetSwitchingState(1); nxs->GetEntryIdf1()->GetUser()->SetName("n/a"); @@ -4753,12 +4748,12 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) nxs->GetEntryIdf1()->GetInstrument()->GetCollimator()->SetType("n/a"); // calculate the total number of counts double total_counts = 0; - PRawRunDataSet *dataSet = 0; + PRawRunDataSet *dataSet = nullptr; for (unsigned int i=0; i> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=0" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=0" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } for (unsigned int j=0; jGetData()->size(); j++) @@ -4772,9 +4767,9 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) for (unsigned int i=0; iGetEntryIdf1()->GetData()->SetT0((Int_t)(dataSet->GetTimeZeroBin()/fAny2ManyInfo->rebin), i); - nxs->GetEntryIdf1()->GetData()->SetFirstGoodBin((Int_t)(dataSet->GetFirstGoodBin()/fAny2ManyInfo->rebin), i); - nxs->GetEntryIdf1()->GetData()->SetLastGoodBin((Int_t)(dataSet->GetLastGoodBin()/fAny2ManyInfo->rebin), i); + nxs->GetEntryIdf1()->GetData()->SetT0(static_cast(dataSet->GetTimeZeroBin()/fAny2ManyInfo->rebin), i); + nxs->GetEntryIdf1()->GetData()->SetFirstGoodBin(static_cast(dataSet->GetFirstGoodBin()/fAny2ManyInfo->rebin), i); + nxs->GetEntryIdf1()->GetData()->SetLastGoodBin(static_cast(dataSet->GetLastGoodBin()/fAny2ManyInfo->rebin), i); } // feed histos @@ -4783,9 +4778,9 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) if (fAny2ManyInfo->rebin == 1) { for (UInt_t i=0; i> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } size = dataSet->GetData()->size(); @@ -4800,9 +4795,9 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) UInt_t dataCount = 0; for (UInt_t i=0; i> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteNexusFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } size = dataSet->GetData()->size(); @@ -4828,10 +4823,10 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) struct tm *tm; time(&now); tm = localtime(&now); - string str(""); + std::string str(""); char cstr[128]; strftime(cstr, sizeof(cstr), "%FT%T", tm); - str = string(cstr); + str = std::string(cstr); nxs->SetFileTime(str); // NXroot info @@ -4843,9 +4838,9 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) nxs->GetEntryIdf2()->SetProgramVersion("$Id$"); nxs->GetEntryIdf2()->SetRunNumber(fData[0].GetRunNumber()); nxs->GetEntryIdf2()->SetTitle(fData[0].GetRunTitle()->Data()); - str = string(fData[0].GetStartDate()->Data()) + string("T") + string(fData[0].GetStartTime()->Data()); + str = std::string(fData[0].GetStartDate()->Data()) + std::string("T") + std::string(fData[0].GetStartTime()->Data()); nxs->GetEntryIdf2()->SetStartTime(str); - str = string(fData[0].GetStopDate()->Data()) + string("T") + string(fData[0].GetStopTime()->Data()); + str = std::string(fData[0].GetStopDate()->Data()) + std::string("T") + std::string(fData[0].GetStopTime()->Data()); nxs->GetEntryIdf2()->SetStopTime(str); nxs->GetEntryIdf2()->SetExperimentIdentifier("n/a"); @@ -4877,23 +4872,23 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) nxs->GetEntryIdf2()->GetInstrument()->GetDetector()->SetNoOfPeriods(0); // currently red/green is not distinguished nxs->GetEntryIdf2()->GetInstrument()->GetDetector()->SetNoOfSpectra(fData[0].GetNoOfHistos()); PRawRunDataSet *dataSet = fData[0].GetDataSet(0, false); // i.e. the false means, that i is the index and NOT the histo number - if (dataSet == 0) { // something is really wrong - cerr << endl << ">> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't get data set (idx=0)"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't get data set (idx=0)"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } nxs->GetEntryIdf2()->GetInstrument()->GetDetector()->SetNoOfBins((unsigned int)(dataSet->GetData()->size() / fAny2ManyInfo->rebin)); nxs->GetEntryIdf2()->GetInstrument()->GetDetector()->SetTimeResolution(fData[0].GetTimeResolution()*fAny2ManyInfo->rebin, "ns"); - int *histo = 0; + int *histo = nullptr; int idx = 0; if (fAny2ManyInfo->rebin == 1) { histo = new int[fData[0].GetNoOfHistos()*dataSet->GetData()->size()]; idx = 0; for (int i=0; iGetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfSpectra(); i++) { dataSet = fData[0].GetDataSet(i, false); // i.e. the false means, that i is the index and NOT the histo number - if (dataSet == 0) { // something is really wrong - cerr << endl << ">> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } for (unsigned int j=0; jGetData()->size(); j++) { @@ -4904,7 +4899,7 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) // clean up if (histo) { delete [] histo; - histo = 0; + histo = nullptr; } } else { // rebin > 1 histo = new int[fData[0].GetNoOfHistos()*(int)(dataSet->GetData()->size()/fAny2ManyInfo->rebin)]; @@ -4912,9 +4907,9 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) idx = 0; for (int i=0; iGetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfSpectra(); i++) { dataSet = fData[0].GetDataSet(i, false); // i.e. the false means, that i is the index and NOT the histo number - if (dataSet == 0) { // something is really wrong - cerr << endl << ">> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } for (unsigned int j=0; jGetData()->size(); j++) { @@ -4929,7 +4924,7 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) // clean up if (histo) { delete [] histo; - histo = 0; + histo = nullptr; } } @@ -4941,7 +4936,7 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) nxs->GetEntryIdf2()->GetInstrument()->GetDetector()->SetTimeResolution(fData[0].GetTimeResolution()*fAny2ManyInfo->rebin, "ns"); // handle raw time - vector raw_time; + std::vector raw_time; UInt_t size = (unsigned int)(dataSet->GetData()->size() / fAny2ManyInfo->rebin); for (unsigned int i=0; irebin * 1.0e-3); // since time resolution is given in ns, the factor 1.0e-3 is needed to convert to us @@ -4957,14 +4952,14 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) int *fgb = new int[fData[0].GetNoOfHistos()]; int *lgb = new int[fData[0].GetNoOfHistos()]; if ((t0==0) || (fgb==0) || (lgb==0)) { - cerr << endl << ">> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't allocate memory for t0, fgb, lgb" << endl; + std::cerr << std::endl << ">> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't allocate memory for t0, fgb, lgb" << std::endl; return false; } for (unsigned int i=0; i> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't get data set (idx=0)"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteNeXusFile: **ERROR** Couldn't get data set (idx=0)"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } t0[i] = (int)(dataSet->GetTimeZeroBin() / fAny2ManyInfo->rebin); @@ -4983,7 +4978,7 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) // clean up if (nxs != 0) { delete nxs; - nxs = 0; + nxs = nullptr; } return false; } @@ -4998,11 +4993,11 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) else if (!fAny2ManyInfo->outFormat.CompareTo("nexus1-xml", TString::kIgnoreCase) || !fAny2ManyInfo->outFormat.CompareTo("nexus2-xml", TString::kIgnoreCase)) strncpy(fileType, "xml", sizeof(fileType)); else { - cerr << endl << ">> PRunDataHandler::WriteNexusFile(): **ERROR** undefined output NeXus format " << fAny2ManyInfo->outFormat.Data() << " found."; - cerr << endl << ">> Allowed are: hdf4, hdf5, xml" << endl; + std::cerr << std::endl << ">> PRunDataHandler::WriteNexusFile(): **ERROR** undefined output NeXus format " << fAny2ManyInfo->outFormat.Data() << " found."; + std::cerr << std::endl << ">> Allowed are: hdf4, hdf5, xml" << std::endl; if (nxs != 0) { delete nxs; - nxs = 0; + nxs = nullptr; } return false; } @@ -5012,10 +5007,10 @@ Bool_t PRunDataHandler::WriteNexusFile(TString fln) if (nxs != 0) { delete nxs; - nxs = 0; + nxs = nullptr; } #else - cout << endl << ">> PRunDataHandler::WriteNexusFile(): Sorry, not enabled at configuration level, i.e. --enable-NeXus when executing configure" << endl << endl; + std::cout << std::endl << ">> PRunDataHandler::WriteNexusFile(): Sorry, not enabled at configuration level, i.e. --enable-NeXus when executing configure" << std::endl << std::endl; #endif return true; @@ -5052,64 +5047,64 @@ Bool_t PRunDataHandler::WriteWkmFile(TString fln) TString fileName = fln; if (!fAny2ManyInfo->useStandardOutput) - cout << endl << ">> PRunDataHandler::WriteWkmFile(): writing a wkm data file (" << fln.Data() << ") ... " << endl; + std::cout << std::endl << ">> PRunDataHandler::WriteWkmFile(): writing a wkm data file (" << fln.Data() << ") ... " << std::endl; // write ascii file - ofstream fout; - streambuf* strm_buffer = 0; + std::ofstream fout; + std::streambuf* strm_buffer = nullptr; if (!fAny2ManyInfo->useStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { // open data-file - fout.open(fln.Data(), ofstream::out); + fout.open(fln.Data(), std::ofstream::out); if (!fout.is_open()) { - cerr << endl << ">> PRunDataHandler::WriteWkmFile **ERROR** Couldn't open data file (" << fln.Data() << ") for writing, sorry ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::WriteWkmFile **ERROR** Couldn't open data file (" << fln.Data() << ") for writing, sorry ..."; + std::cerr << std::endl; return false; } // save output buffer of the stream - strm_buffer = cout.rdbuf(); + strm_buffer = std::cout.rdbuf(); // redirect output into the file - cout.rdbuf(fout.rdbuf()); + std::cout.rdbuf(fout.rdbuf()); } // write header - cout << "- WKM data file converted with any2many"; + std::cout << "- WKM data file converted with any2many"; if (lem_wkm_style) { - cout << endl << "NEMU_Run: " << fData[0].GetRunNumber(); - cout << endl << "nemu_Run: " << fileName.Data(); + std::cout << std::endl << "NEMU_Run: " << fData[0].GetRunNumber(); + std::cout << std::endl << "nemu_Run: " << fileName.Data(); } else { - cout << endl << "Run: " << fData[0].GetRunNumber(); + std::cout << std::endl << "Run: " << fData[0].GetRunNumber(); } - cout << endl << "Date: " << fData[0].GetStartTime()->Data() << " " << fData[0].GetStartDate()->Data() << " / " << fData[0].GetStopTime()->Data() << " " << fData[0].GetStopDate()->Data(); + std::cout << std::endl << "Date: " << fData[0].GetStartTime()->Data() << " " << fData[0].GetStartDate()->Data() << " / " << fData[0].GetStopTime()->Data() << " " << fData[0].GetStopDate()->Data(); if (fData[0].GetRunTitle()->Length() > 0) - cout << endl << "Title: " << fData[0].GetRunTitle()->Data(); + std::cout << std::endl << "Title: " << fData[0].GetRunTitle()->Data(); if (fData[0].GetField() != PMUSR_UNDEFINED) { - cout << endl << "Field: " << fData[0].GetField(); + std::cout << std::endl << "Field: " << fData[0].GetField(); } else { - cout << endl << "Field: ??"; + std::cout << std::endl << "Field: ??"; } - cout << endl << "Setup: " << fData[0].GetSetup()->Data(); + std::cout << std::endl << "Setup: " << fData[0].GetSetup()->Data(); if (fData[0].GetNoOfTemperatures() == 1) { - cout << endl << "Temp: " << fData[0].GetTemperature(0); + std::cout << std::endl << "Temp: " << fData[0].GetTemperature(0); } else if (fData[0].GetNoOfTemperatures() > 1) { - cout << endl << "Temp(meas1): " << fData[0].GetTemperature(0) << " +- " << fData[0].GetTempError(0); - cout << endl << "Temp(meas2): " << fData[0].GetTemperature(1) << " +- " << fData[0].GetTempError(1); + std::cout << std::endl << "Temp(meas1): " << fData[0].GetTemperature(0) << " +- " << fData[0].GetTempError(0); + std::cout << std::endl << "Temp(meas2): " << fData[0].GetTemperature(1) << " +- " << fData[0].GetTempError(1); } else { - cout << endl << "Temp: ??"; + std::cout << std::endl << "Temp: ??"; } if (lem_wkm_style) - cout << endl << "TOF(M3S1): nocut"; - cout << endl << "Groups: " << fData[0].GetNoOfHistos(); + std::cout << std::endl << "TOF(M3S1): nocut"; + std::cout << std::endl << "Groups: " << fData[0].GetNoOfHistos(); UInt_t histo0 = 1; if (fAny2ManyInfo->groupHistoList.size() != 0) { // red/green list found histo0 = fAny2ManyInfo->groupHistoList[0]+1; // take the first available red/green entry } - cout << endl << "Channels: " << static_cast(fData[0].GetDataBin(histo0)->size()/fAny2ManyInfo->rebin); - cout.precision(10); - cout << endl << "Resolution: " << fData[0].GetTimeResolution()*fAny2ManyInfo->rebin/1.0e3; // ns->us - cout.setf(ios::fixed,ios::floatfield); // floatfield set to fixed + std::cout << std::endl << "Channels: " << static_cast(fData[0].GetDataBin(histo0)->size()/fAny2ManyInfo->rebin); + std::cout.precision(10); + std::cout << std::endl << "Resolution: " << fData[0].GetTimeResolution()*fAny2ManyInfo->rebin/1.0e3; // ns->us + std::cout.setf(std::ios::fixed,std::ios::floatfield); // floatfield set to fixed // write data UInt_t no_of_bins_per_line = 16; @@ -5120,35 +5115,35 @@ Bool_t PRunDataHandler::WriteWkmFile(TString fln) if (fAny2ManyInfo->rebin == 1) { for (UInt_t i=0; iGetData()->size(); j++) { if ((j > 0) && (j % no_of_bins_per_line == 0)) - cout << endl; + std::cout << std::endl; if (lem_wkm_style) - cout << setw(8) << static_cast(dataSet->GetData()->at(j)); + std::cout << std::setw(8) << static_cast(dataSet->GetData()->at(j)); else - cout << static_cast(dataSet->GetData()->at(j)) << " "; + std::cout << static_cast(dataSet->GetData()->at(j)) << " "; } } } else { // rebin > 1 Int_t dataRebin = 0; UInt_t count = 0; for (UInt_t i=0; iGetData()->size(); j++) { if ((j > 0) && (j % fAny2ManyInfo->rebin == 0)) { if (lem_wkm_style) - cout << setw(8) << dataRebin; + std::cout << std::setw(8) << dataRebin; else - cout << dataRebin << " "; + std::cout << dataRebin << " "; count++; dataRebin = 0; if ((count > 0) && (count % no_of_bins_per_line == 0) && (j != dataSet->GetData()->size()-1)) - cout << endl; + std::cout << std::endl; } else { dataRebin += static_cast(dataSet->GetData()->at(j)); } @@ -5158,7 +5153,7 @@ Bool_t PRunDataHandler::WriteWkmFile(TString fln) if (!fAny2ManyInfo->useStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { // restore old output buffer - cout.rdbuf(strm_buffer); + std::cout.rdbuf(strm_buffer); fout.close(); } @@ -5186,7 +5181,7 @@ Bool_t PRunDataHandler::WritePsiBinFile(TString fln) return false; if (!fAny2ManyInfo->useStandardOutput) - cout << endl << ">> PRunDataHandler::WritePsiBinFile(): writing a psi-bin data file (" << fln.Data() << ") ... " << endl; + std::cout << std::endl << ">> PRunDataHandler::WritePsiBinFile(): writing a psi-bin data file (" << fln.Data() << ") ... " << std::endl; MuSR_td_PSI_bin psibin; int status = 0; @@ -5199,9 +5194,9 @@ Bool_t PRunDataHandler::WritePsiBinFile(TString fln) if (fAny2ManyInfo->groupHistoList.size() != 0) { // red/green list found histo0 = fAny2ManyInfo->groupHistoList[0]+1; // take the first available red/green entry } - psibin.put_histoLength_bin((int)(fData[0].GetDataBin(histo0)->size()/fAny2ManyInfo->rebin)); + psibin.put_histoLength_bin(static_cast(fData[0].GetDataBin(histo0)->size()/fAny2ManyInfo->rebin)); // number of histograms - psibin.put_numberHisto_int((int)fData[0].GetNoOfHistos()); + psibin.put_numberHisto_int(static_cast(fData[0].GetNoOfHistos())); // run title = sample (10 char) / temp (10 char) / field (10 char) / orientation (10 char) char cstr[11]; // sample @@ -5243,7 +5238,7 @@ Bool_t PRunDataHandler::WritePsiBinFile(TString fln) // handle PSI-BIN start/stop Time/Date. PSI-BIN requires: Time -> HH:MM:SS, and Date -> DD-MMM-YY // internally given: Time -> HH:MM:SS, and Date -> YYYY-MM-DD // run start date - vector svec; + std::vector svec; TString str, date; TDatime dt; int year, month, day; @@ -5296,7 +5291,7 @@ Bool_t PRunDataHandler::WritePsiBinFile(TString fln) psibin.put_numberTemperature_int(fData[0].GetNoOfTemperatures()); // mean temperatures - vector dvec; + std::vector dvec; for (UInt_t i=0; i> PRunDataHandler::WritePsiBinFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WritePsiBinFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } @@ -5334,32 +5329,32 @@ Bool_t PRunDataHandler::WritePsiBinFile(TString fln) str.Form("Detector%3d", i+1); psibin.put_nameHisto(str.Data(), i); // time zero bin - ival = (Int_t)(dataSet->GetTimeZeroBin()/fAny2ManyInfo->rebin); + ival = static_cast(dataSet->GetTimeZeroBin()/fAny2ManyInfo->rebin); psibin.put_t0_int(i, ival); // first good bin - ival = (Int_t)(dataSet->GetFirstGoodBin()/fAny2ManyInfo->rebin); + ival = static_cast(dataSet->GetFirstGoodBin()/fAny2ManyInfo->rebin); psibin.put_firstGood_int(i, ival); // last good bin - ival = (Int_t)(dataSet->GetLastGoodBin()/fAny2ManyInfo->rebin); + ival = static_cast(dataSet->GetLastGoodBin()/fAny2ManyInfo->rebin); psibin.put_lastGood_int(i, ival); } // feed histos - vector< vector > histos; + std::vector< std::vector > histos; histos.resize(fData[0].GetNoOfHistos()); UInt_t length = 0; if (fAny2ManyInfo->rebin == 1) { for (UInt_t i=0; i> PRunDataHandler::WritePsiBinFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WritePsiBinFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } length = dataSet->GetData()->size(); histos[i].resize(length); for (UInt_t j=0; jGetData()->at(j); + histos[i][j] = static_cast(dataSet->GetData()->at(j)); } } } else { // rebin > 1 @@ -5367,9 +5362,9 @@ Bool_t PRunDataHandler::WritePsiBinFile(TString fln) UInt_t dataCount = 0; for (UInt_t i=0; i> PRunDataHandler::WritePsiBinFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WritePsiBinFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } length = dataSet->GetData()->size(); @@ -5386,12 +5381,12 @@ Bool_t PRunDataHandler::WritePsiBinFile(TString fln) } status = psibin.put_histo_array_int(histos); if (status != 0) { - cerr << endl << ">> PRunDataHandler::WritePsiBinFile(): " << psibin.ConsistencyStatus() << endl; + std::cerr << std::endl << ">> PRunDataHandler::WritePsiBinFile(): " << psibin.ConsistencyStatus() << std::endl; return false; } if (!psibin.CheckDataConsistency()) { - cerr << endl << ">> PRunDataHandler::WritePsiBinFile(): " << psibin.ConsistencyStatus() << endl; + std::cerr << std::endl << ">> PRunDataHandler::WritePsiBinFile(): " << psibin.ConsistencyStatus() << std::endl; return false; } @@ -5399,7 +5394,7 @@ Bool_t PRunDataHandler::WritePsiBinFile(TString fln) status = psibin.write(fln.Data()); if (status != 0) { - cerr << endl << ">> PRunDataHandler::WritePsiBinFile(): " << psibin.WriteStatus() << endl; + std::cerr << std::endl << ">> PRunDataHandler::WritePsiBinFile(): " << psibin.WriteStatus() << std::endl; return false; } @@ -5426,12 +5421,12 @@ Bool_t PRunDataHandler::WriteMudFile(TString fln) return false; if (!fAny2ManyInfo->useStandardOutput) - cout << endl << ">> PRunDataHandler::WriteMudFile(): writing a mud data file (" << fln.Data() << ") ... " << endl; + std::cout << std::endl << ">> PRunDataHandler::WriteMudFile(): writing a mud data file (" << fln.Data() << ") ... " << std::endl; // generate the mud data file int fd = MUD_openWrite((char*)fln.Data(), MUD_FMT_TRI_TD_ID); if (fd == -1) { - cerr << endl << ">> PRunDataHandler::WriteMudFile(): **ERROR** couldn't open mud data file for write ..." << endl; + std::cerr << std::endl << ">> PRunDataHandler::WriteMudFile(): **ERROR** couldn't open mud data file for write ..." << std::endl; return false; } @@ -5465,8 +5460,8 @@ Bool_t PRunDataHandler::WriteMudFile(TString fln) UInt_t *data, dataSize = fData[0].GetDataSet(0, false)->GetData()->size()/fAny2ManyInfo->rebin + 1; data = new UInt_t[dataSize]; - if (data == 0) { - cerr << endl << ">> PRunDataHandler::WriteMudFile(): **ERROR** couldn't allocate memory for the data ..." << endl; + if (data == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::WriteMudFile(): **ERROR** couldn't allocate memory for the data ..." << std::endl; MUD_closeWrite(fd); return false; } @@ -5476,9 +5471,9 @@ Bool_t PRunDataHandler::WriteMudFile(TString fln) PRawRunDataSet *dataSet; for (UInt_t i=0; i> PRunDataHandler::WriteMudFile: **ERROR** Couldn't get data set (idx=" << i << ")"; - cerr << endl << ">> something is really wrong!" << endl; + if (dataSet == nullptr) { // something is really wrong + std::cerr << std::endl << ">> PRunDataHandler::WriteMudFile: **ERROR** Couldn't get data set (idx=" << i << ")"; + std::cerr << std::endl << ">> something is really wrong!" << std::endl; return false; } @@ -5525,24 +5520,24 @@ Bool_t PRunDataHandler::WriteMudFile(TString fln) // check if mud file shall be streamed to stdout if (fAny2ManyInfo->useStandardOutput && (fAny2ManyInfo->compressionTag == 0)) { // stream file to stdout - ifstream is; + std::ifstream is; int length=1024; char *buffer; - is.open(fln.Data(), ios::binary); + is.open(fln.Data(), std::ios::binary); if (!is.is_open()) { - cerr << endl << "PRunDataHandler::WriteMudFile(): **ERROR** Couldn't open the mud-file for streaming." << endl; + std::cerr << std::endl << "PRunDataHandler::WriteMudFile(): **ERROR** Couldn't open the mud-file for streaming." << std::endl; remove(fln.Data()); return false; } // get length of file - is.seekg(0, ios::end); + is.seekg(0, std::ios::end); length = is.tellg(); - is.seekg(0, ios::beg); + is.seekg(0, std::ios::beg); if (length == -1) { - cerr << endl << "PRunDataHandler::WriteMudFile(): **ERROR** Couldn't determine the mud-file size." << endl; + std::cerr << std::endl << "PRunDataHandler::WriteMudFile(): **ERROR** Couldn't determine the mud-file size." << std::endl; remove(fln.Data()); return false; } @@ -5553,7 +5548,7 @@ Bool_t PRunDataHandler::WriteMudFile(TString fln) // read data as a block while (!is.eof()) { is.read(buffer, length); - cout.write(buffer, length); + std::cout.write(buffer, length); } is.close(); @@ -5588,79 +5583,79 @@ Bool_t PRunDataHandler::WriteAsciiFile(TString fln) TString fileName = fln; if (!fAny2ManyInfo->useStandardOutput) - cout << endl << ">> PRunDataHandler::WriteAsciiFile(): writing an ascii data file (" << fln.Data() << ") ... " << endl; + std::cout << std::endl << ">> PRunDataHandler::WriteAsciiFile(): writing an ascii data file (" << fln.Data() << ") ... " << std::endl; // write ascii file - ofstream fout; - streambuf* strm_buffer = 0; + std::ofstream fout; + std::streambuf* strm_buffer = nullptr; if (!fAny2ManyInfo->useStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { // open data-file - fout.open(fln.Data(), ofstream::out); + fout.open(fln.Data(), std::ofstream::out); if (!fout.is_open()) { - cerr << endl << ">> PRunDataHandler::WriteAsciiFile **ERROR** Couldn't open data file (" << fln.Data() << ") for writing, sorry ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunDataHandler::WriteAsciiFile **ERROR** Couldn't open data file (" << fln.Data() << ") for writing, sorry ..."; + std::cerr << std::endl; return false; } // save output buffer of the stream - strm_buffer = cout.rdbuf(); + strm_buffer = std::cout.rdbuf(); // redirect output into the file - cout.rdbuf(fout.rdbuf()); + std::cout.rdbuf(fout.rdbuf()); } // write header - cout << "%*************************************************************************"; - cout << endl << "% file name : " << fileName.Data(); + std::cout << "%*************************************************************************"; + std::cout << std::endl << "% file name : " << fileName.Data(); if (fData[0].GetRunTitle()->Length() > 0) - cout << endl << "% title : " << fData[0].GetRunTitle()->Data(); + std::cout << std::endl << "% title : " << fData[0].GetRunTitle()->Data(); if (fData[0].GetRunNumber() >= 0) - cout << endl << "% run number : " << fData[0].GetRunNumber(); + std::cout << std::endl << "% run number : " << fData[0].GetRunNumber(); if (fData[0].GetSetup()->Length() > 0) - cout << endl << "% setup : " << fData[0].GetSetup()->Data(); - cout << endl << "% field : " << fData[0].GetField() << " (G)"; + std::cout << std::endl << "% setup : " << fData[0].GetSetup()->Data(); + std::cout << std::endl << "% field : " << fData[0].GetField() << " (G)"; if (fData[0].GetStartTime()->Length() > 0) - cout << endl << "% date : " << fData[0].GetStartTime()->Data() << " " << fData[0].GetStartDate()->Data() << " / " << fData[0].GetStopTime()->Data() << " " << fData[0].GetStopDate()->Data(); + std::cout << std::endl << "% date : " << fData[0].GetStartTime()->Data() << " " << fData[0].GetStartDate()->Data() << " / " << fData[0].GetStopTime()->Data() << " " << fData[0].GetStopDate()->Data(); if (fData[0].GetNoOfTemperatures() > 0) { - cout << endl << "% temperature : "; + std::cout << std::endl << "% temperature : "; for (UInt_t i=0; irebin << " (ns)"; - cout.setf(ios::fixed,ios::floatfield); // floatfield set to fixed + std::cout.precision(10); + std::cout << std::endl << "% time resolution : " << fData[0].GetTimeResolution()*fAny2ManyInfo->rebin << " (ns)"; + std::cout.setf(std::ios::fixed,std::ios::floatfield); // floatfield set to fixed } PRawRunDataSet *dataSet; - cout << endl << "% t0 : "; + std::cout << std::endl << "% t0 : "; for (UInt_t i=0; i(dataSet->GetTimeZeroBin()/fAny2ManyInfo->rebin) << ", "; + std::cout << static_cast(dataSet->GetTimeZeroBin()/fAny2ManyInfo->rebin) << ", "; } dataSet = fData[0].GetDataSet(fData[0].GetNoOfHistos()-1, false); // i.e. the false means, that i is the index and NOT the histo number - cout << static_cast(dataSet->GetTimeZeroBin()/fAny2ManyInfo->rebin); + std::cout << static_cast(dataSet->GetTimeZeroBin()/fAny2ManyInfo->rebin); - cout << endl << "% # histos : " << fData[0].GetNoOfHistos(); + std::cout << std::endl << "% # histos : " << fData[0].GetNoOfHistos(); dataSet = fData[0].GetDataSet(0, false); // i.e. the false means, that i is the index and NOT the histo number - cout << endl << "% # of bins : " << static_cast(dataSet->GetData()->size()/fAny2ManyInfo->rebin); - cout << endl << "%*************************************************************************"; + std::cout << std::endl << "% # of bins : " << static_cast(dataSet->GetData()->size()/fAny2ManyInfo->rebin); + std::cout << std::endl << "%*************************************************************************"; // write data UInt_t length = fData[0].GetDataSet(0,false)->GetData()->size(); if (fAny2ManyInfo->rebin == 1) { for (UInt_t i=0; i(dataSet->GetData()->at(i)); + std::cout.width(8); + std::cout << static_cast(dataSet->GetData()->at(i)); } } } else { @@ -5674,10 +5669,10 @@ Bool_t PRunDataHandler::WriteAsciiFile(TString fln) for (UInt_t i=0; i 0) && ((i % fAny2ManyInfo->rebin) == 0)) { - cout << endl; + std::cout << std::endl; for (UInt_t j=0; juseStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { // restore old output buffer - cout.rdbuf(strm_buffer); + std::cout.rdbuf(strm_buffer); fout.close(); } @@ -5721,14 +5716,14 @@ Bool_t PRunDataHandler::WriteAsciiFile(TString fln) */ Bool_t PRunDataHandler::StripWhitespace(TString &str) { - Char_t *s = 0; - Char_t *subs = 0; + Char_t *s = nullptr; + Char_t *subs = nullptr; Int_t i; Int_t start; Int_t end; Int_t size; - size = (Int_t)str.Length(); + size = static_cast(str.Length()); s = new Char_t[size+1]; if (!s) @@ -5768,11 +5763,11 @@ Bool_t PRunDataHandler::StripWhitespace(TString &str) // clean up if (subs) { delete [] subs; - subs = 0; + subs = nullptr; } if (s) { delete [] s; - s = 0; + s = nullptr; } return true; @@ -5828,7 +5823,7 @@ Double_t PRunDataHandler::ToDouble(TString &str, Bool_t &ok) ok = true; - size = (Int_t)str.Length(); + size = static_cast(str.Length()); s = new Char_t[size+1]; if (!s) { @@ -5851,7 +5846,7 @@ Double_t PRunDataHandler::ToDouble(TString &str, Bool_t &ok) // clean up if (s) { delete [] s; - s = 0; + s = nullptr; } return value; @@ -5878,7 +5873,7 @@ Int_t PRunDataHandler::ToInt(TString &str, Bool_t &ok) ok = true; - size = (Int_t)str.Length(); + size = static_cast(str.Length()); s = new Char_t[size+1]; if (!s) { @@ -5901,7 +5896,7 @@ Int_t PRunDataHandler::ToInt(TString &str, Bool_t &ok) // clean up if (s) { delete [] s; - s = 0; + s = nullptr; } return value; @@ -5978,8 +5973,8 @@ TString PRunDataHandler::GenerateOutputFileName(const TString fileName, const TS newFln = fln; newFln.Insert(newFln.Last('.'), TString::Format(".%d", count++)); } while (!gSystem->AccessPathName(newFln)); - cerr << endl << ">> PRunDataHandler::GenerateOutputFileName **WARNING** needed to modify output filename to " << newFln << ","; - cerr << endl << ">> due to potential conflict with already existing files." << endl << endl; + std::cerr << std::endl << ">> PRunDataHandler::GenerateOutputFileName **WARNING** needed to modify output filename to " << newFln << ","; + std::cerr << std::endl << ">> due to potential conflict with already existing files." << std::endl << std::endl; fln = newFln; } @@ -6013,7 +6008,7 @@ TString PRunDataHandler::GetFileName(const TString extension, Bool_t &ok) Int_t start = fRunPathName.Last('/'); Int_t end = fRunPathName.Last('.'); if (end == -1) { - cerr << endl << ">> PRunDataHandler::GetFileName(): **ERROR** couldn't generate the output file name ..." << endl; + std::cerr << std::endl << ">> PRunDataHandler::GetFileName(): **ERROR** couldn't generate the output file name ..." << std::endl; ok = false; return fileName; } @@ -6060,14 +6055,14 @@ TString PRunDataHandler::FileNameFromTemplate(TString &fileNameTemplate, Int_t r { TString result(""); - TObjArray *tok=0; + TObjArray *tok=nullptr; TObjString *ostr; TString str; // check year string if ((year.Length() != 2) && (year.Length() != 4)) { - cerr << endl << ">> PRunDataHandler::FileNameFromTemplate: **ERROR** year needs to be of the format"; - cerr << endl << ">> 'yy' or 'yyyy', found " << year << endl; + std::cerr << std::endl << ">> PRunDataHandler::FileNameFromTemplate: **ERROR** year needs to be of the format"; + std::cerr << std::endl << ">> 'yy' or 'yyyy', found " << year << std::endl; return result; } @@ -6085,17 +6080,17 @@ TString PRunDataHandler::FileNameFromTemplate(TString &fileNameTemplate, Int_t r // tokenize template string tok = fileNameTemplate.Tokenize("[]"); - if (tok == 0) { - cerr << endl << ">> PRunDataHandler::FileNameFromTemplate: **ERROR** couldn't tokenize template!" << endl; + if (tok == nullptr) { + std::cerr << std::endl << ">> PRunDataHandler::FileNameFromTemplate: **ERROR** couldn't tokenize template!" << std::endl; return result; } if (tok->GetEntries()==1) { - cerr << endl << ">> PRunDataHandler::FileNameFromTemplate: **WARNING** template without tags." << endl; + std::cerr << std::endl << ">> PRunDataHandler::FileNameFromTemplate: **WARNING** template without tags." << std::endl; } // go through the tokens and generate the result string for (Int_t i=0; iGetEntries(); i++) { - ostr = (TObjString*)tok->At(i); + ostr = dynamic_cast(tok->At(i)); str = ostr->GetString(); // check tokens @@ -6145,9 +6140,9 @@ TString PRunDataHandler::FileNameFromTemplate(TString &fileNameTemplate, Int_t r * \param inDate input date which should be converted to an ISO 8601 date. * \param iso8601Date on success the converted iso8601Date, otherwise an empty string */ -bool PRunDataHandler::DateToISO8601(string inDate, string &iso8601Date) +bool PRunDataHandler::DateToISO8601(std::string inDate, std::string &iso8601Date) { - iso8601Date = string(""); + iso8601Date = std::string(""); struct tm tm; diff --git a/src/classes/PRunMuMinus.cpp b/src/classes/PRunMuMinus.cpp index 66a7990a..83101a8e 100644 --- a/src/classes/PRunMuMinus.cpp +++ b/src/classes/PRunMuMinus.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2007-2016 by Andreas Suter * + * Copyright (C) 2007-2019 by Andreas Suter * * andreas.suter@psi.ch * * * * This program is free software; you can redistribute it and/or modify * @@ -36,7 +36,6 @@ #endif #include -using namespace std; #include #include @@ -86,9 +85,9 @@ PRunMuMinus::PRunMuMinus(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t fPacking = fMsrInfo->GetMsrGlobal()->GetPacking(); } if (fPacking == -1) { // this should NOT happen, somethin is severely wrong - cerr << endl << ">> PRunMuMinus::PRunMuMinus: **SEVERE ERROR**: Couldn't find any packing information!"; - cerr << endl << ">> This is very bad :-(, will quit ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunMuMinus::PRunMuMinus: **SEVERE ERROR**: Couldn't find any packing information!"; + std::cerr << std::endl << ">> This is very bad :-(, will quit ..."; + std::cerr << std::endl; fValid = false; return; } @@ -102,9 +101,9 @@ PRunMuMinus::PRunMuMinus(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t fEndTimeBin = -1; if (!PrepareData()) { - cerr << endl << ">> PRunMuMinus::PRunMuMinus: **SEVERE ERROR**: Couldn't prepare data for fitting!"; - cerr << endl << ">> This is very bad :-(, will quit ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunMuMinus::PRunMuMinus: **SEVERE ERROR**: Couldn't prepare data for fitting!"; + std::cerr << std::endl << ">> This is very bad :-(, will quit ..."; + std::cerr << std::endl; fValid = false; } } @@ -159,7 +158,7 @@ Double_t PRunMuMinus::CalcChiSquare(const std::vector& par) #pragma omp parallel for default(shared) private(i,time,diff) schedule(dynamic,chunk) reduction(+:chisq) #endif for (i=fStartTimeBin; i < fEndTimeBin; ++i) { - time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + time = fData.GetDataTimeStart() + static_cast(i)*fData.GetDataTimeStep(); diff = fData.GetValue()->at(i) - fTheory->Func(time, par, fFuncValues); chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i)); } @@ -207,7 +206,7 @@ Double_t PRunMuMinus::CalcChiSquareExpected(const std::vector& par) #pragma omp parallel for default(shared) private(i,time,diff) schedule(dynamic,chunk) reduction(+:chisq) #endif for (i=fStartTimeBin; i < fEndTimeBin; ++i) { - time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + time = fData.GetDataTimeStart() + static_cast(i)*fData.GetDataTimeStep(); theo = fTheory->Func(time, par, fFuncValues); diff = fData.GetValue()->at(i) - theo; chisq += diff*diff / theo; @@ -256,14 +255,14 @@ Double_t PRunMuMinus::CalcMaxLikelihood(const std::vector& par) #pragma omp parallel for default(shared) private(i,time,theo,data) schedule(dynamic,chunk) reduction(-:mllh) #endif for (i=fStartTimeBin; i < fEndTimeBin; ++i) { - time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + time = fData.GetDataTimeStart() + static_cast(i)*fData.GetDataTimeStep(); // calculate theory for the given parameter set theo = fTheory->Func(time, par, fFuncValues); data = fData.GetValue()->at(i); if (theo <= 0.0) { - cerr << ">> PRunMuMinus::CalcMaxLikelihood: **WARNING** NEGATIVE theory!!" << endl; + std::cerr << ">> PRunMuMinus::CalcMaxLikelihood: **WARNING** NEGATIVE theory!!" << std::endl; continue; } @@ -308,8 +307,8 @@ UInt_t PRunMuMinus::GetNoOfFitBins() */ void PRunMuMinus::SetFitRangeBin(const TString fitRange) { - TObjArray *tok = 0; - TObjString *ostr = 0; + TObjArray *tok = nullptr; + TObjString *ostr = nullptr; TString str; Ssiz_t idx = -1; Int_t offset = 0; @@ -318,7 +317,7 @@ void PRunMuMinus::SetFitRangeBin(const TString fitRange) if (tok->GetEntries() == 3) { // structure FIT_RANGE fgb+n0 lgb-n1 // handle fgb+n0 entry - ostr = (TObjString*) tok->At(1); + ostr = dynamic_cast(tok->At(1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -330,7 +329,7 @@ void PRunMuMinus::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(2); + ostr = dynamic_cast(tok->At(2)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -344,11 +343,11 @@ void PRunMuMinus::SetFitRangeBin(const TString fitRange) Int_t pos = 2*(fRunNo+1)-1; if (pos + 1 >= tok->GetEntries()) { - cerr << endl << ">> PRunMuMinus::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunMuMinus::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } else { // handle fgb+n0 entry - ostr = (TObjString*) tok->At(pos); + ostr = dynamic_cast(tok->At(pos)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -360,7 +359,7 @@ void PRunMuMinus::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(pos+1); + ostr = dynamic_cast(tok->At(pos+1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -372,8 +371,8 @@ void PRunMuMinus::SetFitRangeBin(const TString fitRange) fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; } } else { // error - cerr << endl << ">> PRunMuMinus::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunMuMinus::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } // clean up @@ -429,7 +428,7 @@ void PRunMuMinus::CalcTheory() Double_t resolution = fData.GetDataTimeStep(); Double_t time; for (UInt_t i=0; i(i)*resolution; fData.AppendTheoryValue(fTheory->Func(time, par, fFuncValues)); } @@ -463,8 +462,8 @@ Bool_t PRunMuMinus::PrepareData() // get the proper run PRawRunData* runData = fRawData->GetRunData(*fRunInfo->GetRunName()); if (!runData) { // couldn't get run - cerr << endl << ">> PRunMuMinus::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; - cerr << endl; + std::cerr << std::endl << ">> PRunMuMinus::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; + std::cerr << std::endl; return false; } @@ -474,10 +473,10 @@ Bool_t PRunMuMinus::PrepareData() histoNo.push_back(fRunInfo->GetForwardHistoNo(i)); if (!runData->IsPresent(histoNo[i])) { - cerr << endl << ">> PRunMuMinus::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> histoNo found = " << histoNo[i] << ", which is NOT present in the data file!?!?"; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunMuMinus::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> histoNo found = " << histoNo[i] << ", which is NOT present in the data file!?!?"; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; histoNo.clear(); return false; } @@ -485,8 +484,8 @@ Bool_t PRunMuMinus::PrepareData() // keep the time resolution in (us) fTimeResolution = runData->GetTimeResolution()/1.0e3; - cout.precision(10); - cout << endl << ">> PRunMuMinus::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; + std::cout.precision(10); + std::cout << std::endl << ">> PRunMuMinus::PrepareData(): time resolution=" << std::fixed << runData->GetTimeResolution() << "(ns)" << std::endl; // get all the proper t0's and addt0's for the current RUN block if (!GetProperT0(runData, globalBlock, histoNo)) { @@ -494,7 +493,7 @@ Bool_t PRunMuMinus::PrepareData() } // keep the histo of each group at this point (addruns handled below) - vector forward; + std::vector forward; forward.resize(histoNo.size()); // resize to number of groups for (UInt_t i=0; iGetDataBin(histoNo[i])->size()); @@ -508,9 +507,9 @@ Bool_t PRunMuMinus::PrepareData() // get run to be added to the main one addRunData = fRawData->GetRunData(*fRunInfo->GetRunName(i)); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunMuMinus::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunMuMinus::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -520,8 +519,9 @@ Bool_t PRunMuMinus::PrepareData() addRunSize = addRunData->GetDataBin(histoNo[k])->size(); for (UInt_t j=0; jGetDataBin(histoNo[k])->size(); j++) { // loop over the bin indices // make sure that the index stays in the proper range - if (((Int_t)j+(Int_t)fAddT0s[i-1][k]-(Int_t)fT0s[k] >= 0) && (j+(Int_t)fAddT0s[i-1][k]-(Int_t)fT0s[k] < addRunSize)) { - forward[k][j] += addRunData->GetDataBin(histoNo[k])->at(j+(Int_t)fAddT0s[i-1][k]-(Int_t)fT0s[k]); + if ((static_cast(j)+static_cast(fAddT0s[i-1][k])-static_cast(fT0s[k]) >= 0) && + (j+static_cast(fAddT0s[i-1][k])-static_cast(fT0s[k]) < addRunSize)) { + forward[k][j] += addRunData->GetDataBin(histoNo[k])->at(j+static_cast(fAddT0s[i-1][k])-static_cast(fT0s[k])); } } } @@ -538,8 +538,8 @@ Bool_t PRunMuMinus::PrepareData() for (UInt_t i=1; iGetDataBin(histoNo[i])->size(); j++) { // loop over the bin indices // make sure that the index stays within proper range - if (((Int_t)j+fT0s[i]-fT0s[0] >= 0) && (j+fT0s[i]-fT0s[0] < runData->GetDataBin(histoNo[i])->size())) { - fForward[j] += forward[i][j+(Int_t)fT0s[i]-(Int_t)fT0s[0]]; + if ((static_cast(j)+fT0s[i]-fT0s[0] >= 0) && (j+fT0s[i]-fT0s[0] < runData->GetDataBin(histoNo[i])->size())) { + fForward[j] += forward[i][j+static_cast(fT0s[i])-static_cast(fT0s[0])]; } } } @@ -589,11 +589,11 @@ Bool_t PRunMuMinus::PrepareFitData(PRawRunData* runData, const UInt_t histoNo) // for the single histo fit, just the rebinned raw data are copied // fill data set - Int_t t0 = (Int_t)fT0s[0]; + Int_t t0 = static_cast(fT0s[0]); Double_t value = 0.0; // data start at data_start-t0 // time shifted so that packing is included correctly, i.e. t0 == t0 after packing - fData.SetDataTimeStart(fTimeResolution*((Double_t)fGoodBins[0]-(Double_t)t0+(Double_t)(fPacking-1)/2.0)); + fData.SetDataTimeStart(fTimeResolution*(static_cast(fGoodBins[0])-static_cast(t0)+static_cast(fPacking-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*fPacking); for (Int_t i=fGoodBins[0]; iGetMsrPlotList()->at(0).fViewPacking > 0) { - theoryNorm = (Double_t)fMsrInfo->GetMsrPlotList()->at(0).fViewPacking/(Double_t)fPacking; + theoryNorm = static_cast(fMsrInfo->GetMsrPlotList()->at(0).fViewPacking)/static_cast(fPacking); } // raw data, since PMusrCanvas is doing ranging etc. @@ -662,12 +662,12 @@ Bool_t PRunMuMinus::PrepareRawViewData(PRawRunData* runData, const UInt_t histoN Int_t end = start + ((fForward.size()-start)/packing)*packing; // check if data range has been provided, and if not try to estimate them if (start < 0) { - Int_t offset = (Int_t)(10.0e-3/fTimeResolution); - start = ((Int_t)fT0s[0]+offset) - (((Int_t)fT0s[0]+offset)/packing)*packing; + Int_t offset = static_cast(10.0e-3/fTimeResolution); + start = (static_cast(fT0s[0])+offset) - ((static_cast(fT0s[0])+offset)/packing)*packing; end = start + ((fForward.size()-start)/packing)*packing; - cerr << endl << ">> PRunMuMinus::PrepareData(): **WARNING** data range was not provided, will try data range start = " << start << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunMuMinus::PrepareData(): **WARNING** data range was not provided, will try data range start = " << start << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } // check if start, end, and t0 make any sense // 1st check if start and end are in proper order @@ -677,15 +677,15 @@ Bool_t PRunMuMinus::PrepareRawViewData(PRawRunData* runData, const UInt_t histoN start = keep; } // 2nd check if start is within proper bounds - if ((start < 0) || (start > (Int_t)fForward.size())) { - cerr << endl << ">> PRunMuMinus::PrepareRawViewData(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start < 0) || (start > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunMuMinus::PrepareRawViewData(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds - if ((end < 0) || (end > (Int_t)fForward.size())) { - cerr << endl << ">> PRunMuMinus::PrepareRawViewData(): **ERROR** end data bin doesn't make any sense!"; - cerr << endl; + if ((end < 0) || (end > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunMuMinus::PrepareRawViewData(): **ERROR** end data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } @@ -696,11 +696,11 @@ Bool_t PRunMuMinus::PrepareRawViewData(PRawRunData* runData, const UInt_t histoN } // everything looks fine, hence fill data set - Int_t t0 = (Int_t)fT0s[0]; + Int_t t0 = static_cast(fT0s[0]); Double_t value = 0.0; // data start at data_start-t0 // time shifted so that packing is included correctly, i.e. t0 == t0 after packing - fData.SetDataTimeStart(fTimeResolution*((Double_t)start-(Double_t)t0+(Double_t)(packing-1)/2.0)); + fData.SetDataTimeStart(fTimeResolution*(static_cast(start)-static_cast(t0)+static_cast(packing-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*packing); for (Int_t i=start; isize() * 10 > fForward.size()) { size = fData.GetValue()->size() * 10; - factor = (Double_t)fForward.size() / (Double_t)size; + factor = static_cast(fForward.size()) / static_cast(size); } Double_t time; Double_t theoryValue; @@ -791,7 +791,7 @@ Bool_t PRunMuMinus::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlo // fill in the T0's from the GLOBAL block section (if present) for (UInt_t i=0; iGetT0BinSize(); i++) { - if (fT0s[i] == -1) { // i.e. not given in the RUN block section + if (fT0s[i] == -1.0) { // i.e. not given in the RUN block section fT0s[i] = globalBlock->GetT0Bin(i); } } @@ -812,19 +812,19 @@ Bool_t PRunMuMinus::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlo fT0s[i] = runData->GetT0BinEstimated(histoNo[i]); fRunInfo->SetT0Bin(fT0s[i], i); // keep value for the msr-file - cerr << endl << ">> PRunMuMinus::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(histoNo[i]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunMuMinus::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName()->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(histoNo[i]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } // check if t0 is within proper bounds for (UInt_t i=0; iGetForwardHistoNoSize(); i++) { - if ((fT0s[i] < 0) || (fT0s[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunMuMinus::GetProperT0(): **ERROR** t0 data bin (" << fT0s[i] << ") doesn't make any sense!"; - cerr << endl; + if ((fT0s[i] < 0) || (fT0s[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunMuMinus::GetProperT0(): **ERROR** t0 data bin (" << fT0s[i] << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -837,9 +837,9 @@ Bool_t PRunMuMinus::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlo // get run to be added to the main one addRunData = fRawData->GetRunData(*fRunInfo->GetRunName(i)); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunMuMinus::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunMuMinus::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -870,19 +870,19 @@ Bool_t PRunMuMinus::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlo fAddT0s[i-1][j] = addRunData->GetT0BinEstimated(histoNo[j]); fRunInfo->SetAddT0Bin(fAddT0s[i-1][j], i-1, j); // keep value for the msr-file - cerr << endl << ">> PRunMuMinus::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(histoNo[j]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunMuMinus::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(histoNo[j]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } // check if t0 is within proper bounds for (UInt_t j=0; jGetForwardHistoNoSize(); j++) { - if ((fAddT0s[i-1][j] < 0) || (fAddT0s[i-1][j] > (Int_t)addRunData->GetDataBin(histoNo[j])->size())) { - cerr << endl << ">> PRunMuMinus::GetProperT0(): **ERROR** addt0 data bin (" << fAddT0s[i-1][j] << ") doesn't make any sense!"; - cerr << endl; + if ((fAddT0s[i-1][j] < 0) || (fAddT0s[i-1][j] > static_cast(addRunData->GetDataBin(histoNo[j])->size()))) { + std::cerr << std::endl << ">> PRunMuMinus::GetProperT0(): **ERROR** addt0 data bin (" << fAddT0s[i-1][j] << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -923,19 +923,19 @@ Bool_t PRunMuMinus::GetProperDataRange() // check if data range has been provided, and if not try to estimate them if (start < 0) { - Int_t offset = (Int_t)(10.0e-3/fTimeResolution); - start = (Int_t)fT0s[0]+offset; + Int_t offset = static_cast(10.0e-3/fTimeResolution); + start = static_cast(fT0s[0])+offset; fRunInfo->SetDataRange(start, 0); - cerr << endl << ">> PRunMuMinus::GetProperDataRange(): **WARNING** data range was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunMuMinus::GetProperDataRange(): **WARNING** data range was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (end < 0) { end = fForward.size(); fRunInfo->SetDataRange(end, 1); - cerr << endl << ">> PRunMuMinus::GetProperDataRange(): **WARNING** data range was not provided, will try data range end = " << end << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunMuMinus::GetProperDataRange(): **WARNING** data range was not provided, will try data range end = " << end << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } // check if start and end make any sense @@ -946,15 +946,15 @@ Bool_t PRunMuMinus::GetProperDataRange() start = keep; } // 2nd check if start is within proper bounds - if ((start < 0) || (start > (Int_t)fForward.size())) { - cerr << endl << ">> PRunMuMinus::GetProperDataRange(): **ERROR** start data bin (" << start << ") doesn't make any sense!"; - cerr << endl; + if ((start < 0) || (start > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunMuMinus::GetProperDataRange(): **ERROR** start data bin (" << start << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds - if ((end < 0) || (end > (Int_t)fForward.size())) { - cerr << endl << ">> PRunMuMinus::GetProperDataRange(): **ERROR** end data bin (" << end << ") doesn't make any sense!"; - cerr << endl; + if ((end < 0) || (end > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunMuMinus::GetProperDataRange(): **ERROR** end data bin (" << end << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } @@ -1008,7 +1008,7 @@ void PRunMuMinus::GetProperFitRange(PMsrGlobalBlock *globalBlock) if ((fFitStartTime == PMUSR_UNDEFINED) || (fFitEndTime == PMUSR_UNDEFINED)) { fFitStartTime = (fGoodBins[0] - fT0s[0]) * fTimeResolution; // (fgb-t0)*dt fFitEndTime = (fGoodBins[1] - fT0s[0]) * fTimeResolution; // (lgb-t0)*dt - cerr << ">> PRunMuMinus::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << endl; - cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; + std::cerr << ">> PRunMuMinus::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << std::endl; + std::cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << std::endl; } } diff --git a/src/classes/PRunSingleHisto.cpp b/src/classes/PRunSingleHisto.cpp index c3aa50b8..4931703f 100644 --- a/src/classes/PRunSingleHisto.cpp +++ b/src/classes/PRunSingleHisto.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2007-2016 by Andreas Suter * + * Copyright (C) 2007-2019 by Andreas Suter * * andreas.suter@psi.ch * * * * This program is free software; you can redistribute it and/or modify * @@ -38,7 +38,6 @@ #include #include #include -using namespace std; #include #include @@ -91,9 +90,9 @@ PRunSingleHisto::PRunSingleHisto(PMsrHandler *msrInfo, PRunDataHandler *rawData, fPacking = fMsrInfo->GetMsrGlobal()->GetPacking(); } if (fPacking == -1) { // this should NOT happen, somethin is severely wrong - cerr << endl << ">> PRunSingleHisto::PRunSingleHisto: **SEVERE ERROR**: Couldn't find any packing information!"; - cerr << endl << ">> This is very bad :-(, will quit ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::PRunSingleHisto: **SEVERE ERROR**: Couldn't find any packing information!"; + std::cerr << std::endl << ">> This is very bad :-(, will quit ..."; + std::cerr << std::endl; fValid = false; return; } @@ -107,9 +106,9 @@ PRunSingleHisto::PRunSingleHisto(PMsrHandler *msrInfo, PRunDataHandler *rawData, fEndTimeBin = -1; if (!PrepareData()) { - cerr << endl << ">> PRunSingleHisto::PRunSingleHisto: **SEVERE ERROR**: Couldn't prepare data for fitting!"; - cerr << endl << ">> This is very bad :-(, will quit ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::PRunSingleHisto: **SEVERE ERROR**: Couldn't prepare data for fitting!"; + std::cerr << std::endl << ">> This is very bad :-(, will quit ..."; + std::cerr << std::endl; fValid = false; } } @@ -174,7 +173,7 @@ Double_t PRunSingleHisto::CalcChiSquare(const std::vector& par) // calculate functions for (Int_t i=0; iGetNoOfFuncs(); i++) { - Int_t funcNo = fMsrInfo->GetFuncNo(i); + UInt_t funcNo = fMsrInfo->GetFuncNo(i); fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par); } @@ -195,7 +194,7 @@ Double_t PRunSingleHisto::CalcChiSquare(const std::vector& par) #pragma omp parallel for default(shared) private(i,time,diff) schedule(dynamic,chunk) reduction(+:chisq) #endif for (i=fStartTimeBin; i(i)*fData.GetDataTimeStep(); diff = fData.GetValue()->at(i) - (N0*TMath::Exp(-time/tau)*(1.0+fTheory->Func(time, par, fFuncValues))+bkg); chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i)); @@ -280,7 +279,7 @@ Double_t PRunSingleHisto::CalcChiSquareExpected(const std::vector& par #pragma omp parallel for default(shared) private(i,time,diff) schedule(dynamic,chunk) reduction(+:chisq) #endif for (i=fStartTimeBin; i < fEndTimeBin; ++i) { - time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + time = fData.GetDataTimeStart() + static_cast(i)*fData.GetDataTimeStep(); theo = N0*TMath::Exp(-time/tau)*(1.0+fTheory->Func(time, par, fFuncValues))+bkg; diff = fData.GetValue()->at(i) - theo; chisq += diff*diff / theo; @@ -316,7 +315,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihood(const std::vector& par) N0 = par[fRunInfo->GetNormParamNo()-1]; } else { // norm is a function // get function number - UInt_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET; + Int_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET; // evaluate function N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par); } @@ -342,7 +341,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihood(const std::vector& par) // calculate functions for (Int_t i=0; iGetNoOfFuncs(); i++) { - Int_t funcNo = fMsrInfo->GetFuncNo(i); + UInt_t funcNo = fMsrInfo->GetFuncNo(i); fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par); } @@ -371,7 +370,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihood(const std::vector& par) #pragma omp parallel for default(shared) private(i,time,theo,data) schedule(dynamic,chunk) reduction(-:mllh) #endif for (i=fStartTimeBin; i(i)*fData.GetDataTimeStep(); // calculate theory for the given parameter set theo = N0*TMath::Exp(-time/tau)*(1.0+fTheory->Func(time, par, fFuncValues))+bkg; theo *= normalizer; @@ -379,7 +378,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihood(const std::vector& par) data = normalizer*fData.GetValue()->at(i); if (theo <= 0.0) { - cerr << ">> PRunSingleHisto::CalcMaxLikelihood: **WARNING** NEGATIVE theory!!" << endl; + std::cerr << ">> PRunSingleHisto::CalcMaxLikelihood: **WARNING** NEGATIVE theory!!" << std::endl; continue; } @@ -415,7 +414,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihoodExpected(const std::vector& N0 = par[fRunInfo->GetNormParamNo()-1]; } else { // norm is a function // get function number - UInt_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET; + Int_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET; // evaluate function N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par); } @@ -441,7 +440,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihoodExpected(const std::vector& // calculate functions for (Int_t i=0; iGetNoOfFuncs(); i++) { - Int_t funcNo = fMsrInfo->GetFuncNo(i); + UInt_t funcNo = fMsrInfo->GetFuncNo(i); fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par); } @@ -470,7 +469,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihoodExpected(const std::vector& #pragma omp parallel for default(shared) private(i,time,theo,data) schedule(dynamic,chunk) reduction(-:mllh) #endif for (i=fStartTimeBin; i(i)*fData.GetDataTimeStep(); // calculate theory for the given parameter set theo = N0*TMath::Exp(-time/tau)*(1.0+fTheory->Func(time, par, fFuncValues))+bkg; theo *= normalizer; @@ -478,7 +477,7 @@ Double_t PRunSingleHisto::CalcMaxLikelihoodExpected(const std::vector& data = normalizer*fData.GetValue()->at(i); if (theo <= 0.0) { - cerr << ">> PRunSingleHisto::CalcMaxLikelihood: **WARNING** NEGATIVE theory!!" << endl; + std::cerr << ">> PRunSingleHisto::CalcMaxLikelihood: **WARNING** NEGATIVE theory!!" << std::endl; continue; } @@ -511,7 +510,7 @@ void PRunSingleHisto::CalcTheory() N0 = par[fRunInfo->GetNormParamNo()-1]; } else { // norm is a function // get function number - UInt_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET; + Int_t funNo = fRunInfo->GetNormParamNo()-MSR_PARAM_FUN_OFFSET; // evaluate function N0 = fMsrInfo->EvalFunc(funNo, *fRunInfo->GetMap(), par); } @@ -546,7 +545,7 @@ void PRunSingleHisto::CalcTheory() Double_t resolution = fData.GetDataTimeStep(); Double_t time; for (UInt_t i=0; i(i)*resolution; fData.AppendTheoryValue(N0*TMath::Exp(-time/tau)*(1.0+fTheory->Func(time, par, fFuncValues))+bkg); } @@ -585,8 +584,8 @@ UInt_t PRunSingleHisto::GetNoOfFitBins() */ void PRunSingleHisto::SetFitRangeBin(const TString fitRange) { - TObjArray *tok = 0; - TObjString *ostr = 0; + TObjArray *tok = nullptr; + TObjString *ostr = nullptr; TString str; Ssiz_t idx = -1; Int_t offset = 0; @@ -595,7 +594,7 @@ void PRunSingleHisto::SetFitRangeBin(const TString fitRange) if (tok->GetEntries() == 3) { // structure FIT_RANGE fgb+n0 lgb-n1 // handle fgb+n0 entry - ostr = (TObjString*) tok->At(1); + ostr = dynamic_cast(tok->At(1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -607,7 +606,7 @@ void PRunSingleHisto::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(2); + ostr = dynamic_cast(tok->At(2)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -621,11 +620,11 @@ void PRunSingleHisto::SetFitRangeBin(const TString fitRange) Int_t pos = 2*(fRunNo+1)-1; if (pos + 1 >= tok->GetEntries()) { - cerr << endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } else { // handle fgb+n0 entry - ostr = (TObjString*) tok->At(pos); + ostr = dynamic_cast(tok->At(pos)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -637,7 +636,7 @@ void PRunSingleHisto::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(pos+1); + ostr = dynamic_cast(tok->At(pos+1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -649,8 +648,8 @@ void PRunSingleHisto::SetFitRangeBin(const TString fitRange) fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; } } else { // error - cerr << endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } // clean up @@ -707,8 +706,8 @@ Bool_t PRunSingleHisto::PrepareData() // get the proper run PRawRunData* runData = fRawData->GetRunData(*fRunInfo->GetRunName()); if (!runData) { // couldn't get run - cerr << endl << ">> PRunSingleHisto::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; + std::cerr << std::endl; return false; } @@ -718,10 +717,10 @@ Bool_t PRunSingleHisto::PrepareData() histoNo.push_back(fRunInfo->GetForwardHistoNo(i)); if (!runData->IsPresent(histoNo[i])) { - cerr << endl << ">> PRunSingleHisto::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> histoNo found = " << histoNo[i] << ", which is NOT present in the data file!?!?"; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> histoNo found = " << histoNo[i] << ", which is NOT present in the data file!?!?"; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; histoNo.clear(); return false; } @@ -729,8 +728,8 @@ Bool_t PRunSingleHisto::PrepareData() // keep the time resolution in (us) fTimeResolution = runData->GetTimeResolution()/1.0e3; - cout.precision(10); - cout << endl << ">> PRunSingleHisto::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; + std::cout.precision(10); + std::cout << std::endl << ">> PRunSingleHisto::PrepareData(): time resolution=" << std::fixed << runData->GetTimeResolution() << "(ns)" << std::endl; // get all the proper t0's and addt0's for the current RUN block if (!GetProperT0(runData, globalBlock, histoNo)) { @@ -738,7 +737,7 @@ Bool_t PRunSingleHisto::PrepareData() } // keep the histo of each group at this point (addruns handled below) - vector forward; + std::vector forward; forward.resize(histoNo.size()); // resize to number of groups for (UInt_t i=0; iGetDataBin(histoNo[i])->size()); @@ -752,9 +751,9 @@ Bool_t PRunSingleHisto::PrepareData() // get run to be added to the main one addRunData = fRawData->GetRunData(*fRunInfo->GetRunName(i)); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunSingleHisto::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunSingleHisto::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -764,8 +763,9 @@ Bool_t PRunSingleHisto::PrepareData() addRunSize = addRunData->GetDataBin(histoNo[k])->size(); for (UInt_t j=0; jGetDataBin(histoNo[k])->size(); j++) { // loop over the bin indices // make sure that the index stays in the proper range - if (((Int_t)j+(Int_t)fAddT0s[i-1][k]-(Int_t)fT0s[k] >= 0) && (j+(Int_t)fAddT0s[i-1][k]-(Int_t)fT0s[k] < addRunSize)) { - forward[k][j] += addRunData->GetDataBin(histoNo[k])->at(j+(Int_t)fAddT0s[i-1][k]-(Int_t)fT0s[k]); + if ((static_cast(j)+static_cast(fAddT0s[i-1][k])-static_cast(fT0s[k]) >= 0) && + (j+static_cast(fAddT0s[i-1][k])-static_cast(fT0s[k]) < addRunSize)) { + forward[k][j] += addRunData->GetDataBin(histoNo[k])->at(j+static_cast(fAddT0s[i-1][k])-static_cast(fT0s[k])); } } } @@ -782,8 +782,8 @@ Bool_t PRunSingleHisto::PrepareData() for (UInt_t i=1; iGetDataBin(histoNo[i])->size(); j++) { // loop over the bin indices // make sure that the index stays within proper range - if (((Int_t)j+fT0s[i]-fT0s[0] >= 0) && (j+fT0s[i]-fT0s[0] < runData->GetDataBin(histoNo[i])->size())) { - fForward[j] += forward[i][j+(Int_t)fT0s[i]-(Int_t)fT0s[0]]; + if ((static_cast(j)+fT0s[i]-fT0s[0] >= 0) && (j+fT0s[i]-fT0s[0] < runData->GetDataBin(histoNo[i])->size())) { + fForward[j] += forward[i][j+static_cast(fT0s[i])-static_cast(fT0s[0])]; } } } @@ -854,10 +854,10 @@ Bool_t PRunSingleHisto::PrepareFitData(PRawRunData* runData, const UInt_t histoN } else { // no background given to do the job, try estimate fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.1), 0); fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); - cerr << endl << ">> PRunSingleHisto::PrepareFitData(): **WARNING** Neither fix background nor background bins are given!"; - cerr << endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::PrepareFitData(): **WARNING** Neither fix background nor background bins are given!"; + std::cerr << std::endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + std::cerr << std::endl; if (!EstimateBkg(histoNo)) return false; } @@ -869,7 +869,7 @@ Bool_t PRunSingleHisto::PrepareFitData(PRawRunData* runData, const UInt_t histoN } // everything looks fine, hence fill data set - Int_t t0 = (Int_t)fT0s[0]; + Int_t t0 = static_cast(fT0s[0]); Double_t value = 0.0; Double_t normalizer = 1.0; // in order that after rebinning the fit does not need to be redone (important for plots) @@ -878,7 +878,7 @@ Bool_t PRunSingleHisto::PrepareFitData(PRawRunData* runData, const UInt_t histoN normalizer = fPacking * (fTimeResolution * 1.0e3); // fTimeResolution us->ns // data start at data_start-t0 // time shifted so that packing is included correctly, i.e. t0 == t0 after packing - fData.SetDataTimeStart(fTimeResolution*((Double_t)fGoodBins[0]-(Double_t)t0+(Double_t)(fPacking-1)/2.0)); + fData.SetDataTimeStart(fTimeResolution*(static_cast(fGoodBins[0])-static_cast(t0)+static_cast(fPacking-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*fPacking); for (Int_t i=fGoodBins[0]; ins } else if (!fScaleN0AndBkg && (fMsrInfo->GetMsrPlotList()->at(0).fViewPacking > 0)) { - theoryNorm = (Double_t)fMsrInfo->GetMsrPlotList()->at(0).fViewPacking/(Double_t)fPacking; + theoryNorm = static_cast(fMsrInfo->GetMsrPlotList()->at(0).fViewPacking)/static_cast(fPacking); } // raw data, since PMusrCanvas is doing ranging etc. // start = the first bin which is a multiple of packing backward from first good data bin Int_t start = fGoodBins[0] - (fGoodBins[0]/packing)*packing; - // end = last bin starting from start which is a multipl of packing and still within the data + // end = last bin starting from start which is a multiple of packing and still within the data Int_t end = start + ((fForward.size()-start)/packing)*packing; // check if data range has been provided, and if not try to estimate them if (start < 0) { - Int_t offset = (Int_t)(10.0e-3/fTimeResolution); - start = ((Int_t)fT0s[0]+offset) - (((Int_t)fT0s[0]+offset)/packing)*packing; + Int_t offset = static_cast(10.0e-3/fTimeResolution); + start = (static_cast(fT0s[0])+offset) - ((static_cast(fT0s[0])+offset)/packing)*packing; end = start + ((fForward.size()-start)/packing)*packing; - cerr << endl << ">> PRunSingleHisto::PrepareRawViewData(): **WARNING** data range was not provided, will try data range start = " << start << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::PrepareRawViewData(): **WARNING** data range was not provided, will try data range start = " << start << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } // check if start, end, and t0 make any sense // 1st check if start and end are in proper order @@ -966,24 +966,24 @@ Bool_t PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const UInt_t hi start = keep; } // 2nd check if start is within proper bounds - if ((start < 0) || (start > (Int_t)fForward.size())) { - cerr << endl << ">> PRunSingleHisto::PrepareRawViewData(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start < 0) || (start > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunSingleHisto::PrepareRawViewData(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds - if ((end < 0) || (end > (Int_t)fForward.size())) { - cerr << endl << ">> PRunSingleHisto::PrepareRawViewData(): **ERROR** end data bin doesn't make any sense!"; - cerr << endl; + if ((end < 0) || (end > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunSingleHisto::PrepareRawViewData(): **ERROR** end data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // everything looks fine, hence fill data set - Int_t t0 = (Int_t)fT0s[0]; + Int_t t0 = static_cast(fT0s[0]); Double_t value = 0.0; // data start at data_start-t0 // time shifted so that packing is included correctly, i.e. t0 == t0 after packing - fData.SetDataTimeStart(fTimeResolution*((Double_t)start-(Double_t)t0+(Double_t)(packing-1)/2.0)); + fData.SetDataTimeStart(fTimeResolution*(static_cast(start)-static_cast(t0)+static_cast(packing-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*packing); for (Int_t i=start; iSetBkgRange(static_cast(fT0s[0]*0.1), 0); fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); - cerr << endl << ">> PRunSingleHisto::PrepareRawViewData(): **WARNING** Neither fix background nor background bins are given!"; - cerr << endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::PrepareRawViewData(): **WARNING** Neither fix background nor background bins are given!"; + std::cerr << std::endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + std::cerr << std::endl; if (!EstimateBkg(histoNo)) return false; } @@ -1065,7 +1065,7 @@ Bool_t PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const UInt_t hi Double_t factor = 1.0; if (fData.GetValue()->size() * 10 > fForward.size()) { size = fData.GetValue()->size() * 10; - factor = (Double_t)fForward.size() / (Double_t)size; + factor = static_cast(fForward.size()) / static_cast(size); } Double_t time; Double_t theoryValue; @@ -1132,13 +1132,13 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo if (fScaleN0AndBkg) { dataNorm = 1.0/ (packing * (fTimeResolution * 1.0e3)); // fTimeResolution us->ns } else if (!fScaleN0AndBkg && (fMsrInfo->GetMsrPlotList()->at(0).fViewPacking > 0)) { - theoryNorm = (Double_t)fMsrInfo->GetMsrPlotList()->at(0).fViewPacking/(Double_t)fPacking; + theoryNorm = static_cast(fMsrInfo->GetMsrPlotList()->at(0).fViewPacking)/static_cast(fPacking); } // transform raw histo data. This is done the following way (for details see the manual): // for the single histo fit, just the rebinned raw data are copied // first get start data, end data, and t0 - Int_t t0 = (Int_t)fT0s[0]; + Int_t t0 = static_cast(fT0s[0]); // start = the first bin which is a multiple of packing backward from first good data bin Int_t start = fGoodBins[0] - (fGoodBins[0]/packing)*packing; @@ -1147,12 +1147,12 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo // check if data range has been provided, and if not try to estimate them if (start < 0) { - Int_t offset = (Int_t)(10.0e-3/fTimeResolution); - start = ((Int_t)fT0s[0]+offset) - (((Int_t)fT0s[0]+offset)/packing)*packing; + Int_t offset = static_cast(10.0e-3/fTimeResolution); + start = (static_cast(fT0s[0])+offset) - ((static_cast(fT0s[0])+offset)/packing)*packing; end = start + ((fForward.size()-start)/packing)*packing; - cerr << endl << ">> PRunSingleHisto::PrepareViewData(): **WARNING** data range was not provided, will try data range start = " << start << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::PrepareViewData(): **WARNING** data range was not provided, will try data range start = " << start << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } // check if start, end, and t0 make any sense @@ -1163,15 +1163,15 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo start = keep; } // 2nd check if start is within proper bounds - if ((start < 0) || (start > (Int_t)fForward.size())) { - cerr << endl << ">> PRunSingleHisto::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start < 0) || (start > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunSingleHisto::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds - if ((end < 0) || (end > (Int_t)fForward.size())) { - cerr << endl << ">> PRunSingleHisto::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; - cerr << endl; + if ((end < 0) || (end > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunSingleHisto::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } @@ -1213,10 +1213,10 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo } else { // no background given to do the job, try estimate fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.1), 0); fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); - cerr << endl << ">> PRunSingleHisto::PrepareViewData(): **WARNING** Neither fix background nor background bins are given!"; - cerr << endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::PrepareViewData(): **WARNING** Neither fix background nor background bins are given!"; + std::cerr << std::endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + std::cerr << std::endl; if (!EstimateBkg(histoNo)) return false; } @@ -1235,7 +1235,7 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo Double_t time = 0.0; // data start at data_start-t0 shifted by (pack-1)/2 - fData.SetDataTimeStart(fTimeResolution*((Double_t)start-(Double_t)t0+(Double_t)(packing-1)/2.0)); + fData.SetDataTimeStart(fTimeResolution*(static_cast(start)-static_cast(t0)+static_cast(packing-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*packing); // data is always normalized to (per nsec!!) @@ -1244,7 +1244,7 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo for (Int_t i=start; i(i)-static_cast(packing-1)/2.0)-t0)*fTimeResolution; expval = TMath::Exp(+time/tau)/N0; fData.AppendValue(-1.0+expval*(value-bkg)); fData.AppendErrorValue(expval*TMath::Sqrt(value*dataNorm)); @@ -1285,7 +1285,7 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo value = 0.0; error = 0.0; } - time = ((Double_t)i-t0)*fTimeResolution; + time = (static_cast(i)-t0)*fTimeResolution; expval = TMath::Exp(+time/tau)/N0; rrf_val = (-1.0+expval*(fForward[i]/(fTimeResolution*1.0e3)-bkg))*TMath::Cos(wRRF * time + phaseRRF); value += rrf_val; @@ -1310,7 +1310,7 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo // check if a finer binning for the theory is needed if (fData.GetValue()->size() * 10 > fForward.size()) { size = fData.GetValue()->size() * 10; - factor = (Double_t)fForward.size() / (Double_t)size; + factor = static_cast(fForward.size()) / static_cast(size); } fData.SetTheoryTimeStart(fData.GetDataTimeStart()); fData.SetTheoryTimeStep(fTimeResolution*factor); @@ -1321,7 +1321,7 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo } for (UInt_t i=0; i(i)*fData.GetTheoryTimeStep(); theoryValue = fTheory->Func(time, par, fFuncValues); if (wRRF != 0.0) { theoryValue *= 2.0*TMath::Cos(wRRF * time + phaseRRF); @@ -1399,7 +1399,7 @@ Bool_t PRunSingleHisto::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globa // fill in the T0's from the GLOBAL block section (if present) for (UInt_t i=0; iGetT0BinSize(); i++) { - if (fT0s[i] == -1) { // i.e. not given in the RUN block section + if (fT0s[i] == -1.0) { // i.e. not given in the RUN block section fT0s[i] = globalBlock->GetT0Bin(i); } } @@ -1420,19 +1420,19 @@ Bool_t PRunSingleHisto::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globa fT0s[i] = runData->GetT0BinEstimated(histoNo[i]); fRunInfo->SetT0Bin(fT0s[i], i); // keep value for the msr-file - cerr << endl << ">> PRunSingleHisto::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(histoNo[i]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName()->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(histoNo[i]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } // check if t0 is within proper bounds for (UInt_t i=0; iGetForwardHistoNoSize(); i++) { - if ((fT0s[i] < 0) || (fT0s[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunSingleHisto::GetProperT0(): **ERROR** t0 data bin (" << fT0s[i] << ") doesn't make any sense!"; - cerr << endl; + if ((fT0s[i] < 0.0) || (fT0s[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunSingleHisto::GetProperT0(): **ERROR** t0 data bin (" << fT0s[i] << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -1445,9 +1445,9 @@ Bool_t PRunSingleHisto::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globa // get run to be added to the main one addRunData = fRawData->GetRunData(*fRunInfo->GetRunName(i)); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunSingleHisto::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunSingleHisto::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -1478,19 +1478,19 @@ Bool_t PRunSingleHisto::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globa fAddT0s[i-1][j] = addRunData->GetT0BinEstimated(histoNo[j]); fRunInfo->SetAddT0Bin(fAddT0s[i-1][j], i-1, j); // keep value for the msr-file - cerr << endl << ">> PRunSingleHisto::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(histoNo[j]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(histoNo[j]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } // check if t0 is within proper bounds for (UInt_t j=0; jGetForwardHistoNoSize(); j++) { - if ((fAddT0s[i-1][j] < 0) || (fAddT0s[i-1][j] > (Int_t)addRunData->GetDataBin(histoNo[j])->size())) { - cerr << endl << ">> PRunSingleHisto::GetProperT0(): **ERROR** addt0 data bin (" << fAddT0s[i-1][j] << ") doesn't make any sense!"; - cerr << endl; + if ((fAddT0s[i-1][j] < 0.0) || (fAddT0s[i-1][j] > static_cast(addRunData->GetDataBin(histoNo[j])->size()))) { + std::cerr << std::endl << ">> PRunSingleHisto::GetProperT0(): **ERROR** addt0 data bin (" << fAddT0s[i-1][j] << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -1531,19 +1531,19 @@ Bool_t PRunSingleHisto::GetProperDataRange() // check if data range has been provided, and if not try to estimate them if (start < 0) { - Int_t offset = (Int_t)(10.0e-3/fTimeResolution); - start = (Int_t)fT0s[0]+offset; + Int_t offset = static_cast(10.0e-3/fTimeResolution); + start = static_cast(fT0s[0])+offset; fRunInfo->SetDataRange(start, 0); - cerr << endl << ">> PRunSingleHisto::GetProperDataRange(): **WARNING** data range was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::GetProperDataRange(): **WARNING** data range was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (end < 0) { end = fForward.size(); fRunInfo->SetDataRange(end, 1); - cerr << endl << ">> PRunSingleHisto::GetProperDataRange(): **WARNING** data range was not provided, will try data range end = " << end << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::GetProperDataRange(): **WARNING** data range was not provided, will try data range end = " << end << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } // check if start and end make any sense @@ -1554,22 +1554,22 @@ Bool_t PRunSingleHisto::GetProperDataRange() start = keep; } // 2nd check if start is within proper bounds - if ((start < 0) || (start > (Int_t)fForward.size())) { - cerr << endl << ">> PRunSingleHisto::GetProperDataRange(): **ERROR** start data bin (" << start << ") doesn't make any sense!"; - cerr << endl; + if ((start < 0) || (start > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunSingleHisto::GetProperDataRange(): **ERROR** start data bin (" << start << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds if (end < 0) { - cerr << endl << ">> PRunSingleHisto::GetProperDataRange(): **ERROR** end data bin (" << end << ") doesn't make any sense!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::GetProperDataRange(): **ERROR** end data bin (" << end << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } - if (end > (Int_t)fForward.size()) { - cerr << endl << ">> PRunSingleHisto::GetProperDataRange(): **WARNING** end data bin (" << end << ") > histo length (" << (Int_t)fForward.size() << ")."; - cerr << endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << endl; - cerr << endl; - end = (Int_t)fForward.size()-1; + if (end > static_cast(fForward.size())) { + std::cerr << std::endl << ">> PRunSingleHisto::GetProperDataRange(): **WARNING** end data bin (" << end << ") > histo length (" << fForward.size() << ")."; + std::cerr << std::endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << std::endl; + std::cerr << std::endl; + end = static_cast(fForward.size())-1; } // keep good bins for potential later use @@ -1622,8 +1622,8 @@ void PRunSingleHisto::GetProperFitRange(PMsrGlobalBlock *globalBlock) if ((fFitStartTime == PMUSR_UNDEFINED) || (fFitEndTime == PMUSR_UNDEFINED)) { fFitStartTime = (fGoodBins[0] - fT0s[0]) * fTimeResolution; // (fgb-t0)*dt fFitEndTime = (fGoodBins[1] - fT0s[0]) * fTimeResolution; // (lgb-t0)*dt - cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << endl; - cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; + std::cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << std::endl; + std::cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << std::endl; } } @@ -1646,7 +1646,7 @@ void PRunSingleHisto::EstimateN0() assert(param); if (paramNo > param->size()) { - cerr << endl << ">> PRunSingleHisto::EstimateN0: **ERROR** found parameter number " << paramNo << ", which is larger than the number of parameters = " << param->size() << endl; + std::cerr << std::endl << ">> PRunSingleHisto::EstimateN0: **ERROR** found parameter number " << paramNo << ", which is larger than the number of parameters = " << param->size() << std::endl; return; } @@ -1663,7 +1663,7 @@ void PRunSingleHisto::EstimateN0() if ((paramNoBkg > 10000) || (paramNoBkg == -1)) { // i.e. fun or map scaleBkg = false; } else { - if (paramNoBkg-1 < (Int_t)param->size()) { + if (paramNoBkg-1 < static_cast(param->size())) { bkg = param->at(paramNoBkg-1).fValue; errBkg = param->at(paramNoBkg-1).fStep; } @@ -1673,7 +1673,7 @@ void PRunSingleHisto::EstimateN0() Double_t dt = fTimeResolution; Double_t tau = PMUON_LIFETIME; - UInt_t t0 = (UInt_t)round(fT0s[0]); + UInt_t t0 = static_cast(round(fT0s[0])); Double_t dval = 0.0; Double_t nom = 0.0; Double_t denom = 0.0; @@ -1681,13 +1681,13 @@ void PRunSingleHisto::EstimateN0() // calc nominator for (UInt_t i=t0; i(i-t0)/tau); nom += xx; } // calc denominator for (UInt_t i=t0; i(i-t0)/tau); dval = fForward[i]; if (dval > 0) denom += xx*xx/dval; @@ -1707,9 +1707,9 @@ void PRunSingleHisto::EstimateN0() errBkg *= rescale; } - cout << ">> PRunSingleHisto::EstimateN0: found N0=" << param->at(paramNo-1).fValue << ", will set it to N0=" << N0 << endl; + std::cout << ">> PRunSingleHisto::EstimateN0: found N0=" << param->at(paramNo-1).fValue << ", will set it to N0=" << N0 << std::endl; if (scaleBkg) - cout << ">> PRunSingleHisto::EstimateN0: found Bkg=" << param->at(paramNoBkg-1).fValue << ", will set it to Bkg=" << bkg << endl; + std::cout << ">> PRunSingleHisto::EstimateN0: found Bkg=" << param->at(paramNoBkg-1).fValue << ", will set it to Bkg=" << bkg << std::endl; fMsrInfo->SetMsrParamValue(paramNo-1, N0); fMsrInfo->SetMsrParamStep(paramNo-1, sqrt(fabs(N0))); if (scaleBkg) { @@ -1745,41 +1745,41 @@ Bool_t PRunSingleHisto::EstimateBkg(UInt_t histoNo) beamPeriod = 0.0; // check if start and end are in proper order - UInt_t start = fRunInfo->GetBkgRange(0); - UInt_t end = fRunInfo->GetBkgRange(1); + Int_t start = fRunInfo->GetBkgRange(0); + Int_t end = fRunInfo->GetBkgRange(1); if (end < start) { - cout << endl << "PRunSingleHisto::EstimatBkg(): end = " << end << " > start = " << start << "! Will swap them!"; - UInt_t keep = end; + std::cout << std::endl << "PRunSingleHisto::EstimatBkg(): end = " << end << " > start = " << start << "! Will swap them!"; + Int_t keep = end; end = start; start = keep; } // calculate proper background range if (beamPeriod != 0.0) { - Double_t timeBkg = (Double_t)(end-start)*(fTimeResolution*fPacking); // length of the background intervall in time - UInt_t fullCycles = (UInt_t)(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall + Double_t timeBkg = static_cast(end-start)*(fTimeResolution*fPacking); // length of the background intervall in time + UInt_t fullCycles = static_cast(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall // correct the end of the background intervall such that the background is as close as possible to a multiple of the proton cylce - end = start + (UInt_t) ((fullCycles*beamPeriod)/(fTimeResolution*fPacking)); - cout << endl << "PRunSingleHisto::EstimatBkg(): Background " << start << ", " << end; + end = start + static_cast((fullCycles*beamPeriod)/(fTimeResolution*fPacking)); + std::cout << std::endl << "PRunSingleHisto::EstimatBkg(): Background " << start << ", " << end; if (end == start) end = fRunInfo->GetBkgRange(1); } // check if start is within histogram bounds if (start >= fForward.size()) { - cerr << endl << ">> PRunSingleHisto::EstimatBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths = " << fForward.size(); - cerr << endl << ">> background start = " << start; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::EstimatBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths = " << fForward.size(); + std::cerr << std::endl << ">> background start = " << start; + std::cerr << std::endl; return false; } // check if end is within histogram bounds if (end >= fForward.size()) { - cerr << endl << ">> PRunSingleHisto::EstimatBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths = " << fForward.size(); - cerr << endl << ">> background end = " << end; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHisto::EstimatBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths = " << fForward.size(); + std::cerr << std::endl << ">> background end = " << end; + std::cerr << std::endl; return false; } @@ -1821,13 +1821,13 @@ Bool_t PRunSingleHisto::IsScaleN0AndBkg() PMsrLines *cmd = fMsrInfo->GetMsrCommands(); for (UInt_t i=0; isize(); i++) { if (cmd->at(i).fLine.Contains("SCALE_N0_BKG", TString::kIgnoreCase)) { - TObjArray *tokens = 0; - TObjString *ostr = 0; + TObjArray *tokens = nullptr; + TObjString *ostr = nullptr; TString str; tokens = cmd->at(i).fLine.Tokenize(" \t"); if (tokens->GetEntries() != 2) { - cerr << endl << ">> PRunSingleHisto::IsScaleN0AndBkg(): **WARNING** Found uncorrect 'SCALE_N0_BKG' command, will ignore it."; - cerr << endl << ">> Allowed commands: SCALE_N0_BKG TRUE | FALSE" << endl; + std::cerr << std::endl << ">> PRunSingleHisto::IsScaleN0AndBkg(): **WARNING** Found uncorrect 'SCALE_N0_BKG' command, will ignore it."; + std::cerr << std::endl << ">> Allowed commands: SCALE_N0_BKG TRUE | FALSE" << std::endl; return willScale; } ostr = dynamic_cast(tokens->At(1)); diff --git a/src/classes/PRunSingleHistoRRF.cpp b/src/classes/PRunSingleHistoRRF.cpp index a42575bd..ec9ab895 100644 --- a/src/classes/PRunSingleHistoRRF.cpp +++ b/src/classes/PRunSingleHistoRRF.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2007-2016 by Andreas Suter * + * Copyright (C) 2007-2019 by Andreas Suter * * andreas.suter@psi.ch * * * * This program is free software; you can redistribute it and/or modify * @@ -38,7 +38,6 @@ #include #include #include -using namespace std; #include #include @@ -88,24 +87,24 @@ PRunSingleHistoRRF::PRunSingleHistoRRF(PMsrHandler *msrInfo, PRunDataHandler *ra PMsrGlobalBlock *global = msrInfo->GetMsrGlobal(); if (!global->IsPresent()) { - cerr << endl << ">> PRunSingleHistoRRF::PRunSingleHistoRRF(): **SEVERE ERROR**: no GLOBAL-block present!"; - cerr << endl << ">> For Single Histo RRF the GLOBAL-block is mandatory! Please fix this first."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::PRunSingleHistoRRF(): **SEVERE ERROR**: no GLOBAL-block present!"; + std::cerr << std::endl << ">> For Single Histo RRF the GLOBAL-block is mandatory! Please fix this first."; + std::cerr << std::endl; fValid = false; return; } if (!global->GetRRFUnit().CompareTo("??")) { - cerr << endl << ">> PRunSingleHistoRRF::PRunSingleHistoRRF(): **SEVERE ERROR**: no RRF-Frequency found!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::PRunSingleHistoRRF(): **SEVERE ERROR**: no RRF-Frequency found!"; + std::cerr << std::endl; fValid = false; return; } fRRFPacking = global->GetRRFPacking(); if (fRRFPacking == -1) { - cerr << endl << ">> PRunSingleHistoRRF::PRunSingleHistoRRF(): **SEVERE ERROR**: no RRF-Packing found!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::PRunSingleHistoRRF(): **SEVERE ERROR**: no RRF-Packing found!"; + std::cerr << std::endl; fValid = false; return; } @@ -118,9 +117,9 @@ PRunSingleHistoRRF::PRunSingleHistoRRF(PMsrHandler *msrInfo, PRunDataHandler *ra fN0EstimateEndTime = 1.0; // end time in (us) over which N0 is estimated. if (!PrepareData()) { - cerr << endl << ">> PRunSingleHistoRRF::PRunSingleHistoRRF(): **SEVERE ERROR**: Couldn't prepare data for fitting!"; - cerr << endl << ">> This is very bad :-(, will quit ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::PRunSingleHistoRRF(): **SEVERE ERROR**: Couldn't prepare data for fitting!"; + std::cerr << std::endl << ">> This is very bad :-(, will quit ..."; + std::cerr << std::endl; fValid = false; } } @@ -154,7 +153,7 @@ Double_t PRunSingleHistoRRF::CalcChiSquare(const std::vector& par) // calculate functions for (Int_t i=0; iGetNoOfFuncs(); i++) { - Int_t funcNo = fMsrInfo->GetFuncNo(i); + UInt_t funcNo = fMsrInfo->GetFuncNo(i); fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par); } @@ -175,7 +174,7 @@ Double_t PRunSingleHistoRRF::CalcChiSquare(const std::vector& par) #pragma omp parallel for default(shared) private(i,time,diff) schedule(dynamic,chunk) reduction(+:chisq) #endif for (i=fStartTimeBin; i(i)*fData.GetDataTimeStep(); diff = fData.GetValue()->at(i) - fTheory->Func(time, par, fFuncValues); chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i)); } @@ -202,7 +201,7 @@ Double_t PRunSingleHistoRRF::CalcChiSquareExpected(const std::vector& // calculate functions for (Int_t i=0; iGetNoOfFuncs(); i++) { - Int_t funcNo = fMsrInfo->GetFuncNo(i); + UInt_t funcNo = fMsrInfo->GetFuncNo(i); fFuncValues[i] = fMsrInfo->EvalFunc(funcNo, *fRunInfo->GetMap(), par); } @@ -223,7 +222,7 @@ Double_t PRunSingleHistoRRF::CalcChiSquareExpected(const std::vector& #pragma omp parallel for default(shared) private(i,time,diff) schedule(dynamic,chunk) reduction(+:chisq) #endif for (i=fStartTimeBin; i < fEndTimeBin; ++i) { - time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + time = fData.GetDataTimeStart() + static_cast(i)*fData.GetDataTimeStep(); theo = fTheory->Func(time, par, fFuncValues); diff = fData.GetValue()->at(i) - theo; chisq += diff*diff / theo; @@ -275,7 +274,7 @@ void PRunSingleHistoRRF::CalcTheory() Double_t resolution = fData.GetDataTimeStep(); Double_t time; for (UInt_t i=0; i(i)*resolution; fData.AppendTheoryValue(fTheory->Func(time, par, fFuncValues)); } @@ -314,8 +313,8 @@ UInt_t PRunSingleHistoRRF::GetNoOfFitBins() */ void PRunSingleHistoRRF::SetFitRangeBin(const TString fitRange) { - TObjArray *tok = 0; - TObjString *ostr = 0; + TObjArray *tok = nullptr; + TObjString *ostr = nullptr; TString str; Ssiz_t idx = -1; Int_t offset = 0; @@ -324,7 +323,7 @@ void PRunSingleHistoRRF::SetFitRangeBin(const TString fitRange) if (tok->GetEntries() == 3) { // structure FIT_RANGE fgb+n0 lgb-n1 // handle fgb+n0 entry - ostr = (TObjString*) tok->At(1); + ostr = dynamic_cast(tok->At(1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -336,7 +335,7 @@ void PRunSingleHistoRRF::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(2); + ostr = dynamic_cast(tok->At(2)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -350,11 +349,11 @@ void PRunSingleHistoRRF::SetFitRangeBin(const TString fitRange) Int_t pos = 2*(fRunNo+1)-1; if (pos + 1 >= tok->GetEntries()) { - cerr << endl << ">> PRunSingleHistoRRF::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } else { // handle fgb+n0 entry - ostr = (TObjString*) tok->At(pos); + ostr = dynamic_cast(tok->At(pos)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -366,7 +365,7 @@ void PRunSingleHistoRRF::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(pos+1); + ostr = dynamic_cast(tok->At(pos+1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -378,8 +377,8 @@ void PRunSingleHistoRRF::SetFitRangeBin(const TString fitRange) fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; } } else { // error - cerr << endl << ">> PRunSingleHistoRRF::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } // clean up @@ -436,8 +435,8 @@ Bool_t PRunSingleHistoRRF::PrepareData() // get the proper run PRawRunData* runData = fRawData->GetRunData(*fRunInfo->GetRunName()); if (!runData) { // couldn't get run - cerr << endl << ">> PRunSingleHistoRRF::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; + std::cerr << std::endl; return false; } @@ -447,10 +446,10 @@ Bool_t PRunSingleHistoRRF::PrepareData() histoNo.push_back(fRunInfo->GetForwardHistoNo(i)); if (!runData->IsPresent(histoNo[i])) { - cerr << endl << ">> PRunSingleHistoRRF::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> histoNo found = " << histoNo[i] << ", which is NOT present in the data file!?!?"; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> histoNo found = " << histoNo[i] << ", which is NOT present in the data file!?!?"; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; histoNo.clear(); return false; } @@ -458,8 +457,8 @@ Bool_t PRunSingleHistoRRF::PrepareData() // keep the time resolution in (us) fTimeResolution = runData->GetTimeResolution()/1.0e3; - cout.precision(10); - cout << endl << ">> PRunSingleHisto::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; + std::cout.precision(10); + std::cout << std::endl << ">> PRunSingleHisto::PrepareData(): time resolution=" << std::fixed << runData->GetTimeResolution() << "(ns)" << std::endl; // get all the proper t0's and addt0's for the current RUN block if (!GetProperT0(runData, globalBlock, histoNo)) { @@ -467,7 +466,7 @@ Bool_t PRunSingleHistoRRF::PrepareData() } // keep the histo of each group at this point (addruns handled below) - vector forward; + std::vector forward; forward.resize(histoNo.size()); // resize to number of groups for (UInt_t i=0; iGetDataBin(histoNo[i])->size()); @@ -481,9 +480,9 @@ Bool_t PRunSingleHistoRRF::PrepareData() // get run to be added to the main one addRunData = fRawData->GetRunData(*fRunInfo->GetRunName(i)); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunSingleHistoRRF::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunSingleHistoRRF::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -493,8 +492,9 @@ Bool_t PRunSingleHistoRRF::PrepareData() addRunSize = addRunData->GetDataBin(histoNo[k])->size(); for (UInt_t j=0; jGetDataBin(histoNo[k])->size(); j++) { // loop over the bin indices // make sure that the index stays in the proper range - if (((Int_t)j+(Int_t)fAddT0s[i-1][k]-(Int_t)fT0s[k] >= 0) && (j+(Int_t)fAddT0s[i-1][k]-(Int_t)fT0s[k] < addRunSize)) { - forward[k][j] += addRunData->GetDataBin(histoNo[k])->at(j+(Int_t)fAddT0s[i-1][k]-(Int_t)fT0s[k]); + if ((static_cast(j)+static_cast(fAddT0s[i-1][k])-static_cast(fT0s[k]) >= 0) && + (j+static_cast(fAddT0s[i-1][k])-static_cast(fT0s[k]) < addRunSize)) { + forward[k][j] += addRunData->GetDataBin(histoNo[k])->at(j+static_cast(fAddT0s[i-1][k])-static_cast(fT0s[k])); } } } @@ -511,8 +511,9 @@ Bool_t PRunSingleHistoRRF::PrepareData() for (UInt_t i=1; iGetDataBin(histoNo[i])->size(); j++) { // loop over the bin indices // make sure that the index stays within proper range - if (((Int_t)j+fT0s[i]-fT0s[0] >= 0) && (j+fT0s[i]-fT0s[0] < runData->GetDataBin(histoNo[i])->size())) { - fForward[j] += forward[i][j+(Int_t)fT0s[i]-(Int_t)fT0s[0]]; + if ((static_cast(j)+static_cast(fT0s[i])-static_cast(fT0s[0]) >= 0) && + (j+static_cast(fT0s[i])-static_cast(fT0s[0]) < runData->GetDataBin(histoNo[i])->size())) { + fForward[j] += forward[i][j+static_cast(fT0s[i])-static_cast(fT0s[0])]; } } } @@ -567,13 +568,13 @@ Bool_t PRunSingleHistoRRF::PrepareFitData(PRawRunData* runData, const UInt_t his rawNt.push_back(fForward[i]); // N(t) without any corrections } Double_t freqMax = GetMainFrequency(rawNt); - cout << "info> freqMax=" << freqMax << " (MHz)" << endl; + std::cout << "info> freqMax=" << freqMax << " (MHz)" << std::endl; // "optimal packing" Double_t optNoPoints = 8; if (freqMax < 271.0) // < 271 MHz, i.e ~ 2T optNoPoints = 5; - cout << "info> optimal packing: " << (Int_t)(1.0 / (fTimeResolution*(freqMax - fMsrInfo->GetMsrGlobal()->GetRRFFreq("MHz"))) / optNoPoints); + std::cout << "info> optimal packing: " << static_cast(1.0 / (fTimeResolution*(freqMax - fMsrInfo->GetMsrGlobal()->GetRRFFreq("MHz"))) / optNoPoints); // initially fForward is the "raw data set" (i.e. grouped histo and raw runs already added) to be fitted. This means fForward = N(t) at this point. @@ -586,10 +587,10 @@ Bool_t PRunSingleHistoRRF::PrepareFitData(PRawRunData* runData, const UInt_t his } else { // no background given to do the job, try estimate fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.1), 0); fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); - cerr << endl << ">> PRunSingleHistoRRF::PrepareFitData(): **WARNING** Neither fix background nor background bins are given!"; - cerr << endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::PrepareFitData(): **WARNING** Neither fix background nor background bins are given!"; + std::cerr << std::endl << ">> Will try the following: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS MAKES ANY SENSE! Better check ..."; + std::cerr << std::endl; if (!EstimateBkg(histoNo)) return false; } @@ -604,10 +605,10 @@ Bool_t PRunSingleHistoRRF::PrepareFitData(PRawRunData* runData, const UInt_t his } // here fForward = N(t) - Nbkg - Int_t t0 = (Int_t)fT0s[0]; + Int_t t0 = static_cast(fT0s[0]); // 2) N(t) - Nbkg -> exp(+t/tau) [N(t)-Nbkg] - Double_t startTime = fTimeResolution * ((Double_t)fGoodBins[0] - (Double_t)t0); + Double_t startTime = fTimeResolution * (static_cast(fGoodBins[0]) - static_cast(t0)); Double_t time_tau=0.0; Double_t exp_t_tau=0.0; @@ -650,7 +651,7 @@ Bool_t PRunSingleHistoRRF::PrepareFitData(PRawRunData* runData, const UInt_t his Double_t phaseRRF = globalBlock->GetRRFPhase()*TMath::TwoPi()/180.0; Double_t time = 0.0; for (Int_t i=fGoodBins[0]; i<=fGoodBins[1]; i++) { - time = startTime + fTimeResolution * ((Double_t)i - (Double_t)fGoodBins[0]); + time = startTime + fTimeResolution * (static_cast(i) - static_cast(fGoodBins[0])); fForward[i] *= 2.0*cos(wRRF * time + phaseRRF); } @@ -683,7 +684,7 @@ Bool_t PRunSingleHistoRRF::PrepareFitData(PRawRunData* runData, const UInt_t his } // set start time and time step - fData.SetDataTimeStart(fTimeResolution*((Double_t)fGoodBins[0]-(Double_t)t0+(Double_t)(fRRFPacking-1)/2.0)); + fData.SetDataTimeStart(fTimeResolution*(static_cast(fGoodBins[0])-static_cast(t0)+static_cast(fRRFPacking-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*fRRFPacking); CalcNoOfFitBins(); @@ -723,8 +724,8 @@ Bool_t PRunSingleHistoRRF::PrepareViewData(PRawRunData* runData, const UInt_t hi Int_t viewPacking = fMsrInfo->GetMsrPlotList()->at(0).fViewPacking; if (viewPacking > 0) { if (viewPacking < fRRFPacking) { - cerr << ">> PRunSingleHistoRRF::PrepareViewData(): **WARNING** Found View Packing (" << viewPacking << ") < RRF Packing (" << fRRFPacking << ")."; - cerr << ">> Will ignore View Packing." << endl; + std::cerr << ">> PRunSingleHistoRRF::PrepareViewData(): **WARNING** Found View Packing (" << viewPacking << ") < RRF Packing (" << fRRFPacking << ")."; + std::cerr << ">> Will ignore View Packing." << std::endl; } else { // STILL MISSING } @@ -753,14 +754,14 @@ Bool_t PRunSingleHistoRRF::PrepareViewData(PRawRunData* runData, const UInt_t hi if (fData.GetValue()->size() * 10 > fForward.size()) { size = fData.GetValue()->size() * 10; - factor = (Double_t)fForward.size() / (Double_t)size; + factor = static_cast(fForward.size()) / static_cast(size); } fData.SetTheoryTimeStart(fData.GetDataTimeStart()); fData.SetTheoryTimeStep(fTimeResolution*factor); // calculate theory for (UInt_t i=0; i(i)*fData.GetTheoryTimeStep(); theoryValue = fTheory->Func(time, par, fFuncValues); if (fabs(theoryValue) > 10.0) { // dirty hack needs to be fixed!! theoryValue = 0.0; @@ -808,7 +809,7 @@ Bool_t PRunSingleHistoRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *gl // fill in the T0's from the GLOBAL block section (if present) for (UInt_t i=0; iGetT0BinSize(); i++) { - if (fT0s[i] == -1) { // i.e. not given in the RUN block section + if (fT0s[i] == -1.0) { // i.e. not given in the RUN block section fT0s[i] = globalBlock->GetT0Bin(i); } } @@ -829,19 +830,19 @@ Bool_t PRunSingleHistoRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *gl fT0s[i] = runData->GetT0BinEstimated(histoNo[i]); fRunInfo->SetT0Bin(fT0s[i], i); // keep value for the msr-file - cerr << endl << ">> PRunSingleHistoRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(histoNo[i]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName()->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(histoNo[i]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } // check if t0 is within proper bounds for (UInt_t i=0; iGetForwardHistoNoSize(); i++) { - if ((fT0s[i] < 0) || (fT0s[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunSingleHistoRRF::GetProperT0(): **ERROR** t0 data bin (" << fT0s[i] << ") doesn't make any sense!"; - cerr << endl; + if ((fT0s[i] < 0.0) || (fT0s[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperT0(): **ERROR** t0 data bin (" << fT0s[i] << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -854,9 +855,9 @@ Bool_t PRunSingleHistoRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *gl // get run to be added to the main one addRunData = fRawData->GetRunData(*fRunInfo->GetRunName(i)); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunSingleHistoRRF::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -887,19 +888,19 @@ Bool_t PRunSingleHistoRRF::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *gl fAddT0s[i-1][j] = addRunData->GetT0BinEstimated(histoNo[j]); fRunInfo->SetAddT0Bin(fAddT0s[i-1][j], i-1, j); // keep value for the msr-file - cerr << endl << ">> PRunSingleHistoRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(histoNo[j]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(histoNo[j]); + std::cerr << std::endl << ">> NO WARRANTY THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } // check if t0 is within proper bounds for (UInt_t j=0; jGetForwardHistoNoSize(); j++) { - if ((fAddT0s[i-1][j] < 0) || (fAddT0s[i-1][j] > (Int_t)addRunData->GetDataBin(histoNo[j])->size())) { - cerr << endl << ">> PRunSingleHistoRRF::GetProperT0(): **ERROR** addt0 data bin (" << fAddT0s[i-1][j] << ") doesn't make any sense!"; - cerr << endl; + if ((fAddT0s[i-1][j] < 0) || (fAddT0s[i-1][j] > static_cast(addRunData->GetDataBin(histoNo[j])->size()))) { + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperT0(): **ERROR** addt0 data bin (" << fAddT0s[i-1][j] << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -940,19 +941,19 @@ Bool_t PRunSingleHistoRRF::GetProperDataRange() // check if data range has been provided, and if not try to estimate them if (start < 0) { - Int_t offset = (Int_t)(10.0e-3/fTimeResolution); - start = (Int_t)fT0s[0]+offset; + Int_t offset = static_cast(10.0e-3/fTimeResolution); + start = static_cast(fT0s[0])+offset; fRunInfo->SetDataRange(start, 0); - cerr << endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **WARNING** data range was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **WARNING** data range was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (end < 0) { end = fForward.size(); fRunInfo->SetDataRange(end, 1); - cerr << endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **WARNING** data range was not provided, will try data range end = " << end << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **WARNING** data range was not provided, will try data range end = " << end << "."; + std::cerr << std::endl << ">> NO WARRANTY THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } // check if start and end make any sense @@ -963,22 +964,22 @@ Bool_t PRunSingleHistoRRF::GetProperDataRange() start = keep; } // 2nd check if start is within proper bounds - if ((start < 0) || (start > (Int_t)fForward.size())) { - cerr << endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **ERROR** start data bin (" << start << ") doesn't make any sense!"; - cerr << endl; + if ((start < 0) || (start > static_cast(fForward.size()))) { + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **ERROR** start data bin (" << start << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds if (end < 0) { - cerr << endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **ERROR** end data bin (" << end << ") doesn't make any sense!"; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **ERROR** end data bin (" << end << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } - if (end > (Int_t)fForward.size()) { - cerr << endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **WARNING** end data bin (" << end << ") > histo length (" << (Int_t)fForward.size() << ")."; - cerr << endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << endl; - cerr << endl; - end = (Int_t)fForward.size()-1; + if (end > static_cast(fForward.size())) { + std::cerr << std::endl << ">> PRunSingleHistoRRF::GetProperDataRange(): **WARNING** end data bin (" << end << ") > histo length (" << fForward.size() << ")."; + std::cerr << std::endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << std::endl; + std::cerr << std::endl; + end = static_cast(fForward.size()-1); } // keep good bins for potential later use @@ -1031,8 +1032,8 @@ void PRunSingleHistoRRF::GetProperFitRange(PMsrGlobalBlock *globalBlock) if ((fFitStartTime == PMUSR_UNDEFINED) || (fFitEndTime == PMUSR_UNDEFINED)) { fFitStartTime = (fGoodBins[0] - fT0s[0]) * fTimeResolution; // (fgb-t0)*dt fFitEndTime = (fGoodBins[1] - fT0s[0]) * fTimeResolution; // (lgb-t0)*dt - cerr << ">> PRunSingleHistoRRF::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << endl; - cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; + std::cerr << ">> PRunSingleHistoRRF::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << std::endl; + std::cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << std::endl; } } @@ -1102,7 +1103,7 @@ Double_t PRunSingleHistoRRF::EstimateN0(Double_t &errN0, Double_t freqMax) { // endBin is estimated such that the number of full cycles (according to the maximum frequency of the data) // is approximately the time fN0EstimateEndTime. - Int_t endBin = (Int_t)round(ceil(fN0EstimateEndTime*freqMax/TMath::TwoPi()) * (TMath::TwoPi()/freqMax) / fTimeResolution); + Int_t endBin = static_cast(round(ceil(fN0EstimateEndTime*freqMax/TMath::TwoPi()) * (TMath::TwoPi()/freqMax) / fTimeResolution)); Double_t n0 = 0.0; Double_t wN = 0.0; @@ -1120,7 +1121,7 @@ Double_t PRunSingleHistoRRF::EstimateN0(Double_t &errN0, Double_t freqMax) } errN0 = sqrt(errN0)/wN; - cout << "info> PRunSingleHistoRRF::EstimateN0(): N0=" << n0 << "(" << errN0 << ")" << endl; + std::cout << "info> PRunSingleHistoRRF::EstimateN0(): N0=" << n0 << "(" << errN0 << ")" << std::endl; return n0; } @@ -1155,7 +1156,7 @@ Bool_t PRunSingleHistoRRF::EstimateBkg(UInt_t histoNo) UInt_t start = fRunInfo->GetBkgRange(0); UInt_t end = fRunInfo->GetBkgRange(1); if (end < start) { - cout << endl << "PRunSingleHistoRRF::EstimatBkg(): end = " << end << " > start = " << start << "! Will swap them!"; + std::cout << std::endl << "PRunSingleHistoRRF::EstimatBkg(): end = " << end << " > start = " << start << "! Will swap them!"; UInt_t keep = end; end = start; start = keep; @@ -1163,30 +1164,30 @@ Bool_t PRunSingleHistoRRF::EstimateBkg(UInt_t histoNo) // calculate proper background range if (beamPeriod != 0.0) { - Double_t timeBkg = (Double_t)(end-start)*fTimeResolution; // length of the background intervall in time - UInt_t fullCycles = (UInt_t)(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall + Double_t timeBkg = static_cast(end-start)*fTimeResolution; // length of the background intervall in time + UInt_t fullCycles = static_cast(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall // correct the end of the background intervall such that the background is as close as possible to a multiple of the proton cylce - end = start + (UInt_t) ((fullCycles*beamPeriod)/fTimeResolution); - cout << endl << "PRunSingleHistoRRF::EstimatBkg(): Background " << start << ", " << end; + end = start + static_cast((fullCycles*beamPeriod)/fTimeResolution); + std::cout << std::endl << "PRunSingleHistoRRF::EstimatBkg(): Background " << start << ", " << end; if (end == start) end = fRunInfo->GetBkgRange(1); } // check if start is within histogram bounds if (start >= fForward.size()) { - cerr << endl << ">> PRunSingleHistoRRF::EstimatBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths = " << fForward.size(); - cerr << endl << ">> background start = " << start; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::EstimatBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths = " << fForward.size(); + std::cerr << std::endl << ">> background start = " << start; + std::cerr << std::endl; return false; } // check if end is within histogram bounds if (end >= fForward.size()) { - cerr << endl << ">> PRunSingleHistoRRF::EstimatBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths = " << fForward.size(); - cerr << endl << ">> background end = " << end; - cerr << endl; + std::cerr << std::endl << ">> PRunSingleHistoRRF::EstimatBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths = " << fForward.size(); + std::cerr << std::endl << ">> background end = " << end; + std::cerr << std::endl; return false; } @@ -1205,7 +1206,7 @@ Bool_t PRunSingleHistoRRF::EstimateBkg(UInt_t histoNo) bkg += pow(fForward[i]-fBackground, 2.0); fBkgErr = sqrt(bkg/(static_cast(end - start))); - cout << endl << "info> fBackground=" << fBackground << "(" << fBkgErr << ")" << endl; + std::cout << std::endl << "info> fBackground=" << fBackground << "(" << fBkgErr << ")" << std::endl; fRunInfo->SetBkgEstimated(fBackground, 0); From 4ad524216f8af0e67723db9af39e0ba9794f78dd Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 15 Aug 2018 20:35:06 +0200 Subject: [PATCH 60/87] Start branch to develop full featured beta-NMR support --- src/classes/PMsrHandler.cpp | 16 ++- src/classes/PMusrCanvas.cpp | 15 ++- src/classes/PRunListCollection.cpp | 156 +++++++++++++++++++++++++++++ src/include/PMusr.h | 3 + src/include/PRunListCollection.h | 18 ++-- 5 files changed, 200 insertions(+), 8 deletions(-) diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index a45d5832..c57cf12b 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -640,6 +640,9 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) case MSR_FITTYPE_MU_MINUS: fout << std::left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << std::endl ; break; + case MSR_FITTYPE_BNMR: + fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + break; case MSR_FITTYPE_NON_MUSR: fout << std::left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << std::endl ; break; @@ -804,6 +807,9 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) case MSR_FITTYPE_MU_MINUS: fout << std::left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << std::endl ; break; + case MSR_FITTYPE_BNMR: + fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + break; case MSR_FITTYPE_NON_MUSR: fout << std::left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << std::endl ; break; @@ -1716,6 +1722,9 @@ Int_t PMsrHandler::WriteMsrFile(const Char_t *filename, std::map> PMsrHandler::CheckHistoGrouping: **ERROR** # of forward histos != # of backward histos."; std::cerr << std::endl << ">> Run #" << i+1; diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index f683d229..a4b42f19 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -734,6 +734,18 @@ void PMusrCanvas::UpdateDataTheoryPad() // handle data HandleDataSet(i, runNo, data); break; + case MSR_FITTYPE_BNMR: + data = fRunList->GetAsymmetryBNMR(runNo, PRunListCollection::kRunNo); + if (!data) { // something wrong + fValid = false; + // error message + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a beta-NMR asymmetry plot"; + cerr << endl; + return; + } + // handle data + HandleDataSet(i, runNo, data); + break; case MSR_FITTYPE_NON_MUSR: data = fRunList->GetNonMusr(runNo, PRunListCollection::kRunNo); if (!data) { // something wrong @@ -902,7 +914,8 @@ void PMusrCanvas::UpdateInfoPad() tstr += grouping; tstr += TString(","); } else if ((runs[runNo].GetFitType() == MSR_FITTYPE_ASYM) || - (runs[runNo].GetFitType() == MSR_FITTYPE_ASYM_RRF)) { + (runs[runNo].GetFitType() == MSR_FITTYPE_ASYM_RRF) || + (runs[runNo].GetFitType() == MSR_FITTYPE_BNMR)) { tstr += TString("h:"); TString grouping; fMsrHandler->GetGroupingString(runNo, "forward", grouping); diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index 2a546ba3..7013ee94 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -76,6 +76,12 @@ PRunListCollection::~PRunListCollection() } fRunAsymmetryRRFList.clear(); + for (UInt_t i=0; iCleanUp(); + fRunAsymmetryBNMRList[i]->~PRunAsymmetryBNMR(); + } + fRunAsymmetryBNMRList.clear(); + for (UInt_t i=0; iCleanUp(); fRunMuMinusList[i]->~PRunMuMinus(); @@ -133,6 +139,11 @@ Bool_t PRunListCollection::Add(Int_t runNo, EPMusrHandleTag tag) if (!fRunAsymmetryRRFList[fRunAsymmetryRRFList.size()-1]->IsValid()) success = false; break; + case PRUN_ASYMMETRY_BNMR: + fRunAsymmetryBNMRList.push_back(new PRunAsymmetryBNMR(fMsrInfo, fData, runNo, tag)); + if (!fRunAsymmetryBNMRList[fRunAsymmetryBNMRList.size()-1]->IsValid()) + success = false; + break; case PRUN_MU_MINUS: fRunMuMinusList.push_back(new PRunMuMinus(fMsrInfo, fData, runNo, tag)); if (!fRunMuMinusList[fRunMuMinusList.size()-1]->IsValid()) @@ -175,6 +186,8 @@ void PRunListCollection::SetFitRange(const TString fitRange) fRunAsymmetryList[i]->SetFitRangeBin(fitRange); for (UInt_t i=0; iSetFitRangeBin(fitRange); + for (UInt_t i=0; iSetFitRangeBin(fitRange); for (UInt_t i=0; iSetFitRangeBin(fitRange); for (UInt_t i=0; iSetFitRange(fitRange); for (UInt_t i=0; iSetFitRange(fitRange); + for (UInt_t i=0; iSetFitRange(fitRange); for (UInt_t i=0; iSetFitRange(fitRange); for (UInt_t i=0; i& p return chisq; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMRChisq (public) +//-------------------------------------------------------------------------- +/** + *

Calculates chi-square of all asymmetry BNMR runs of a msr-file. + * + * return: + * - chi-square of all asymmetry BNMR runs of the msr-file + * + * \param par fit parameter vector + */ +Double_t PRunListCollection::GetAsymmetryBNMRChisq(const std::vector& par) const +{ + Double_t chisq = 0.0; + + for (UInt_t i=0; iCalcChiSquare(par); + + return chisq; +} + //-------------------------------------------------------------------------- // GetMuMinusChisq (public) //-------------------------------------------------------------------------- @@ -380,6 +416,9 @@ Double_t PRunListCollection::GetSingleHistoChisqExpected(const std::vectorCalcChiSquareExpected(par); break; + case PRUN_ASYMMETRY_BNMR: + expectedChisq = fRunAsymmetryBNMRList[subIdx]->CalcChiSquareExpected(par); + break; case PRUN_MU_MINUS: expectedChisq = fRunMuMinusList[subIdx]->CalcChiSquareExpected(par); break; @@ -441,6 +480,9 @@ Double_t PRunListCollection::GetSingleRunChisq(const std::vector& par, case PRUN_ASYMMETRY_RRF: chisq = fRunAsymmetryRRFList[subIdx]->CalcChiSquare(par); break; + case PRUN_ASYMMETRY_BNMR: + chisq = fRunAsymmetryBNMRList[subIdx]->CalcChiSquare(par); + break; case PRUN_MU_MINUS: chisq = fRunMuMinusList[subIdx]->CalcChiSquare(par); break; @@ -540,6 +582,28 @@ Double_t PRunListCollection::GetAsymmetryRRFMaximumLikelihood(const std::vector< return mlh; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMRMaximumLikelihood (public) +//-------------------------------------------------------------------------- +/** + *

Since it is not clear yet how to handle asymmetry fits with max likelihood + * the chi square will be used! + * + * return: + * - chi-square of all asymmetry BNMR runs of the msr-file + * + * \param par fit parameter vector + */ +Double_t PRunListCollection::GetAsymmetryBNMRMaximumLikelihood(const std::vector& par) const +{ + Double_t mlh = 0.0; + + for (UInt_t i=0; iCalcChiSquare(par); + + return mlh; +} + //-------------------------------------------------------------------------- // GetMuMinusMaximumLikelihood (public) //-------------------------------------------------------------------------- @@ -721,6 +785,9 @@ UInt_t PRunListCollection::GetNoOfBinsFitted(const UInt_t idx) const case PRUN_ASYMMETRY_RRF: result = fRunAsymmetryRRFList[subIdx]->GetNoOfFitBins(); break; + case PRUN_ASYMMETRY_BNMR: + result = fRunAsymmetryBNMRList[subIdx]->GetNoOfFitBins(); + break; case PRUN_MU_MINUS: result = fRunMuMinusList[subIdx]->GetNoOfFitBins(); break; @@ -760,6 +827,9 @@ UInt_t PRunListCollection::GetTotalNoOfBinsFitted() const for (UInt_t i=0; iGetNoOfFitBins(); + for (UInt_t i=0; iGetNoOfFitBins(); + for (UInt_t i=0; iGetNoOfFitBins(); @@ -898,6 +968,49 @@ PRunData* PRunListCollection::GetAsymmetry(UInt_t index, EDataSwitch tag) return data; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMR (public) +//-------------------------------------------------------------------------- +/** + *

Get a processed asymmetry data set. + * + * return: + * - pointer to the run data set (processed data) if data set is found + * - null pointer otherwise + * + * \param index msr-file run index + * \param tag kIndex -> data at index, kRunNo -> data of given run no + */ +PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) +{ + PRunData *data = 0; + + switch (tag) { + case kIndex: // called from musrfit when dumping the data + if (index > fRunAsymmetryList.size()) { + cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; + cerr << endl; + return 0; + } + + fRunAsymmetryList[index]->CalcTheory(); + data = fRunAsymmetryList[index]->GetData(); + break; + case kRunNo: // called from PMusrCanvas + for (UInt_t i=0; iGetRunNo() == index) { + data = fRunAsymmetryList[i]->GetData(); + break; + } + } + break; + default: // error + break; + } + + return data; +} + //-------------------------------------------------------------------------- // GetAsymmetryRRF (public) //-------------------------------------------------------------------------- @@ -941,6 +1054,49 @@ PRunData* PRunListCollection::GetAsymmetryRRF(UInt_t index, EDataSwitch tag) return data; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMR (public) +//-------------------------------------------------------------------------- +/** + *

Get a processed asymmetry BNMR data set. + * + * return: + * - pointer to the run data set (processed data) if data set is found + * - null pointer otherwise + * + * \param index msr-file run index + * \param tag kIndex -> data at index, kRunNo -> data of given run no + */ +PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) +{ + PRunData *data = 0; + + switch (tag) { + case kIndex: // called from musrfit when dumping the data + if (index > fRunAsymmetryBNMRList.size()) { + cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; + cerr << endl; + return 0; + } + + fRunAsymmetryBNMRList[index]->CalcTheory(); + data = fRunAsymmetryBNMRList[index]->GetData(); + break; + case kRunNo: // called from PMusrCanvas + for (UInt_t i=0; iGetRunNo() == index) { + data = fRunAsymmetryBNMRList[i]->GetData(); + break; + } + } + break; + default: // error + break; + } + + return data; +} + //-------------------------------------------------------------------------- // GetMuMinus (public) //-------------------------------------------------------------------------- diff --git a/src/include/PMusr.h b/src/include/PMusr.h index 44321518..0d9414ef 100644 --- a/src/include/PMusr.h +++ b/src/include/PMusr.h @@ -58,6 +58,7 @@ #define PRUN_ASYMMETRY 2 #define PRUN_ASYMMETRY_RRF 3 #define PRUN_MU_MINUS 4 +#define PRUN_ASYMMETRY_BNMR 5 #define PRUN_NON_MUSR 8 // muon life time in (us), see PRL99, 032001 (2007) @@ -100,6 +101,7 @@ #define MSR_FITTYPE_ASYM 2 #define MSR_FITTYPE_ASYM_RRF 3 #define MSR_FITTYPE_MU_MINUS 4 +#define MSR_FITTYPE_BNMR 5 #define MSR_FITTYPE_NON_MUSR 8 //------------------------------------------------------------- @@ -109,6 +111,7 @@ #define MSR_PLOT_ASYM 2 #define MSR_PLOT_ASYM_RRF 3 #define MSR_PLOT_MU_MINUS 4 +#define MSR_PLOT_BNMR 5 #define MSR_PLOT_NON_MUSR 8 //------------------------------------------------------------- diff --git a/src/include/PRunListCollection.h b/src/include/PRunListCollection.h index c6c8e89c..7d969e37 100644 --- a/src/include/PRunListCollection.h +++ b/src/include/PRunListCollection.h @@ -39,6 +39,7 @@ #include "PRunSingleHistoRRF.h" #include "PRunAsymmetry.h" #include "PRunAsymmetryRRF.h" +#include "PRunAsymmetryBNMR.h" #include "PRunMuMinus.h" #include "PRunNonMusr.h" @@ -62,6 +63,7 @@ class PRunListCollection virtual Double_t GetSingleHistoRRFChisq(const std::vector& par) const; virtual Double_t GetAsymmetryChisq(const std::vector& par) const; virtual Double_t GetAsymmetryRRFChisq(const std::vector& par) const; + virtual Double_t GetAsymmetryBNMRChisq(const std::vector& par) const; virtual Double_t GetMuMinusChisq(const std::vector& par) const; virtual Double_t GetNonMusrChisq(const std::vector& par) const; @@ -72,6 +74,7 @@ class PRunListCollection virtual Double_t GetSingleHistoRRFMaximumLikelihood(const std::vector& par) const; virtual Double_t GetAsymmetryMaximumLikelihood(const std::vector& par) const; virtual Double_t GetAsymmetryRRFMaximumLikelihood(const std::vector& par) const; + virtual Double_t GetAsymmetryBNMRMaximumLikelihood(const std::vector& par) const; virtual Double_t GetMuMinusMaximumLikelihood(const std::vector& par) const; virtual Double_t GetNonMusrMaximumLikelihood(const std::vector& par) const; @@ -85,6 +88,7 @@ class PRunListCollection virtual UInt_t GetNoOfSingleHistoRRF() const { return fRunSingleHistoRRFList.size(); } ///< returns the number of single histogram RRF data sets present in the msr-file virtual UInt_t GetNoOfAsymmetry() const { return fRunAsymmetryList.size(); } ///< returns the number of asymmetry data sets present in the msr-file virtual UInt_t GetNoOfAsymmetryRRF() const { return fRunAsymmetryRRFList.size(); } ///< returns the number of asymmetry RRF data sets present in the msr-file + virtual UInt_t GetNoOfAsymmetryBNMR() const { return fRunAsymmetryBNMRList.size(); } ///< returns the number of asymmetry BNMR data sets present in the msr-file virtual UInt_t GetNoOfMuMinus() const { return fRunMuMinusList.size(); } ///< returns the number of mu minus data sets present in the msr-file virtual UInt_t GetNoOfNonMusr() const { return fRunNonMusrList.size(); } ///< returns the number of non-muSR data sets present in the msr-file @@ -92,6 +96,7 @@ class PRunListCollection virtual PRunData* GetSingleHistoRRF(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetAsymmetry(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetAsymmetryRRF(UInt_t index, EDataSwitch tag=kIndex); + virtual PRunData* GetAsymmetryBNMR(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetMuMinus(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetNonMusr(UInt_t index, EDataSwitch tag=kIndex); @@ -106,12 +111,13 @@ class PRunListCollection PMsrHandler *fMsrInfo; ///< pointer to the msr-file handler PRunDataHandler *fData; ///< pointer to the run-data handler - std::vector fRunSingleHistoList; ///< stores all processed single histogram data - std::vector fRunSingleHistoRRFList; ///< stores all processed single histogram RRF data - std::vector fRunAsymmetryList; ///< stores all processed asymmetry data - std::vector fRunAsymmetryRRFList; ///< stores all processed asymmetry RRF data - std::vector fRunMuMinusList; ///< stores all processed mu-minus data - std::vector fRunNonMusrList; ///< stores all processed non-muSR data + vector fRunSingleHistoList; ///< stores all processed single histogram data + vector fRunSingleHistoRRFList; ///< stores all processed single histogram RRF data + vector fRunAsymmetryList; ///< stores all processed asymmetry data + vector fRunAsymmetryRRFList; ///< stores all processed asymmetry RRF data + vector fRunAsymmetryBNMRList; ///< stores all processed asymmetry BNMR data + vector fRunMuMinusList; ///< stores all processed mu-minus data + vector fRunNonMusrList; ///< stores all processed non-muSR data }; #endif // _PRUNLISTCOLLECTION_H_ From 8346e8debb075fcce46f1d46206f031931565e1d Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 15 Aug 2018 21:35:56 +0200 Subject: [PATCH 61/87] First successful compilation of AsymmetryBNMR --- src/classes/CMakeLists.txt | 1 + src/classes/Makefile.am | 122 ++ src/classes/PRunAsymmetryBNMR.cpp | 1869 ++++++++++++++++++++++++++++ src/classes/PRunListCollection.cpp | 43 - src/include/PRunAsymmetryBNMR.h | 89 ++ 5 files changed, 2081 insertions(+), 43 deletions(-) create mode 100644 src/classes/Makefile.am create mode 100644 src/classes/PRunAsymmetryBNMR.cpp create mode 100644 src/include/PRunAsymmetryBNMR.h diff --git a/src/classes/CMakeLists.txt b/src/classes/CMakeLists.txt index 358f9c9a..25e99c8a 100644 --- a/src/classes/CMakeLists.txt +++ b/src/classes/CMakeLists.txt @@ -71,6 +71,7 @@ add_library(PMusr SHARED PMusrT0Dict.cxx PPrepFourier.cpp PRunAsymmetry.cpp + PRunAsymmetryBNMR.cpp PRunAsymmetryRRF.cpp PRunBase.cpp PRunDataHandler.cpp diff --git a/src/classes/Makefile.am b/src/classes/Makefile.am new file mode 100644 index 00000000..fa3a0fba --- /dev/null +++ b/src/classes/Makefile.am @@ -0,0 +1,122 @@ +## Process this file with automake to create Makefile.in + +h_sources = \ + ../include/PFitterFcn.h \ + ../include/PFitter.h \ + ../include/PFourier.h \ + ../include/PFourierCanvas.h \ + ../include/PFunctionGrammar.h \ + ../include/PFunction.h \ + ../include/PFunctionHandler.h \ + ../include/PMsr2Data.h \ + ../include/PMsrHandler.h \ + ../include/PMusrCanvas.h \ + ../include/PMusr.h \ + ../include/PMusrT0.h \ + ../include/PPrepFourier.h \ + ../include/PRunAsymmetry.h \ + ../include/PRunAsymmetryBNMR.h \ + ../include/PRunAsymmetryRRF.h \ + ../include/PRunBase.h \ + ../include/PRunDataHandler.h \ + ../include/PRunListCollection.h \ + ../include/PRunNonMusr.h \ + ../include/PRunMuMinus.h \ + ../include/PRunSingleHisto.h \ + ../include/PRunSingleHistoRRF.h \ + ../include/PStartupHandler.h \ + ../include/PTheory.h + +h_sources_userFcn = \ + ../include/PUserFcnBase.h + +h_linkdef = \ + ../include/PFourierCanvasLinkDef.h \ + ../include/PMusrCanvasLinkDef.h \ + ../include/PMusrT0LinkDef.h \ + ../include/PStartupHandlerLinkDef.h + +h_linkdef_userFcn = \ + ../include/PUserFcnBaseLinkDef.h + +dict_h_sources = \ + PFourierCanvasDict.h \ + PMusrCanvasDict.h \ + PMusrT0Dict.h \ + PStartupHandlerDict.h + +dict_h_sources_userFcn = \ + PUserFcnBaseDict.h + +cpp_sources = \ + PFitter.cpp \ + PFitterFcn.cpp \ + PFourier.cpp \ + PFourierCanvas.cpp \ + PFunction.cpp \ + PFunctionHandler.cpp \ + PMsr2Data.cpp \ + PMsrHandler.cpp \ + PMusrCanvas.cpp \ + PMusr.cpp \ + PMusrT0.cpp \ + PPrepFourier.cpp \ + PRunAsymmetry.cpp \ + PRunAsymmetryBNMR.cpp \ + PRunAsymmetryRRF.cpp \ + PRunBase.cpp \ + PRunDataHandler.cpp \ + PRunListCollection.cpp \ + PRunNonMusr.cpp \ + PRunMuMinus.cpp \ + PRunSingleHisto.cpp \ + PRunSingleHistoRRF.cpp \ + PStartupHandler.cpp \ + PTheory.cpp + +cpp_sources_userFcn = \ + PUserFcnBase.cpp + +dict_cpp_sources = \ + PFourierCanvasDict.cpp \ + PMusrCanvasDict.cpp \ + PMusrT0Dict.cpp \ + PStartupHandlerDict.cpp + +dict_cpp_sources_userFcn = \ + PUserFcnBaseDict.cpp + +pcmdir = $(libdir) +pcm_DATA = \ + PFourierCanvasDict_rdict.pcm \ + PMusrCanvasDict_rdict.pcm \ + PMusrT0Dict_rdict.pcm \ + PStartupHandlerDict_rdict.pcm \ + PUserFcnBaseDict_rdict.pcm + +include_HEADERS = $(h_sources) $(h_sources_userFcn) +noinst_HEADERS = $(h_linkdef) $(dict_h_sources) $(h_linkdef_userFcn) $(dict_h_sources_userFcn) + +AM_CPPFLAGS = -I$(top_srcdir)/src/include $(MUSR_ROOT_CFLAGS) $(PSIBIN_CFLAGS) $(MUD_CFLAGS) $(LEM_CFLAGS) $(FFTW3_CFLAGS) $(GSL_CFLAGS) $(BOOST_CFLAGS) -I$(ROOTINCDIR) $(PNEXUS_CXXFLAGS) $(NEXUS_CFLAGS) +AM_CXXFLAGS = $(LOCAL_LIB_CXXFLAGS) + +BUILT_SOURCES = $(dict_cpp_sources) $(dict_h_sources) $(dict_cpp_sources_userFcn) $(dict_h_sources_userFcn) +AM_LDFLAGS = $(LOCAL_LIB_LDFLAGS) -L@ROOTLIBDIR@ +CLEANFILES = *Dict.cpp *Dict.h *Dict* *~ core + +%Dict.cpp %Dict.h: ../include/%.h ../include/%LinkDef.h + @ROOTCLING@ -v -f $*Dict.cpp -c -p $(AM_CPPFLAGS) $^ + +lib_LTLIBRARIES = libPUserFcnBase.la libPMusr.la + +libPUserFcnBase_la_SOURCES = $(h_sources_userFcn) $(cpp_sources_userFcn) $(dict_h_sources_userFcn) $(dict_cpp_sources_userFcn) +libPUserFcnBase_la_LIBADD = $(ROOT_LIBS) +libPUserFcnBase_la_LDFLAGS = -version-info $(MUSR_LIBRARY_VERSION) -release $(MUSR_RELEASE) $(AM_LDFLAGS) + +libPMusr_la_SOURCES = $(h_sources) $(cpp_sources) $(dict_h_sources) $(dict_cpp_sources) +libPMusr_la_LIBADD = libPUserFcnBase.la $(MUSR_ROOT_LIBS) $(LEM_LIBS) $(PSIBIN_LIBS) $(MUD_LIBS) $(PNEXUS_LIBS) $(FFTW3_LIBS) $(GSL_LIBS) $(ROOT_LIBS) +libPMusr_la_LDFLAGS = -version-info $(MUSR_LIBRARY_VERSION) -release $(MUSR_RELEASE) $(AM_LDFLAGS) + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = PUserFcnBase.pc PMusr.pc + diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp new file mode 100644 index 00000000..b55052a0 --- /dev/null +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -0,0 +1,1869 @@ +/*************************************************************************** + + PRunAsymmetryBNMR.cpp + + Author: Andreas Suter + e-mail: andreas.suter@psi.ch + +***************************************************************************/ + +/*************************************************************************** + * Copyright (C) 2007-2016 by Andreas Suter * + * andreas.suter@psi.ch * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_GOMP +#include +#endif + +#include + +#include +using namespace std; + +#include +#include +#include + +#include "PMusr.h" +#include "PRunAsymmetryBNMR.h" + +//-------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------- +/** + *

Constructor + */ +PRunAsymmetryBNMR::PRunAsymmetryBNMR() : PRunBase() +{ + fNoOfFitBins = 0; + fPacking = -1; + + // the 2 following variables are need in case fit range is given in bins, and since + // the fit range can be changed in the command block, these variables need to be accessible + fGoodBins[0] = -1; + fGoodBins[1] = -1; + + fStartTimeBin = -1; + fEndTimeBin = -1; +} + +//-------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------- +/** + *

Constructor + * + * \param msrInfo pointer to the msr-file handler + * \param rawData raw run data + * \param runNo number of the run within the msr-file + * \param tag tag showing what shall be done: kFit == fitting, kView == viewing + */ +PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag) : PRunBase(msrInfo, rawData, runNo, tag) +{ + // the 2 following variables are need in case fit range is given in bins, and since + // the fit range can be changed in the command block, these variables need to be accessible + fGoodBins[0] = -1; + fGoodBins[1] = -1; + + fStartTimeBin = -1; + fEndTimeBin = -1; + + fPacking = fRunInfo->GetPacking(); + if (fPacking == -1) { // i.e. packing is NOT given in the RUN-block, it must be given in the GLOBAL-block + fPacking = fMsrInfo->GetMsrGlobal()->GetPacking(); + } + if (fPacking == -1) { // this should NOT happen, somethin is severely wrong + cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **SEVERE ERROR**: Couldn't find any packing information!"; + cerr << endl << ">> This is very bad :-(, will quit ..."; + cerr << endl; + fValid = false; + return; + } + + // check if alpha and/or beta is fixed -------------------- + + PMsrParamList *param = msrInfo->GetMsrParamList(); + + // check if alpha is given + if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given + cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; + cerr << endl; + fValid = false; + return; + } + // check if alpha parameter is within proper bounds + if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); + cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + cerr << endl; + fValid = false; + return; + } + // check if alpha is fixed + Bool_t alphaFixedToOne = false; + if (((*param)[fRunInfo->GetAlphaParamNo()-1].fStep == 0.0) && + ((*param)[fRunInfo->GetAlphaParamNo()-1].fValue == 1.0)) + alphaFixedToOne = true; + + // check if beta is given + Bool_t betaFixedToOne = false; + if (fRunInfo->GetBetaParamNo() == -1) { // no beta given hence assuming beta == 1 + betaFixedToOne = true; + } else if ((fRunInfo->GetBetaParamNo() < 0) || (fRunInfo->GetBetaParamNo() > (Int_t)param->size())) { // check if beta parameter is within proper bounds + cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** beta parameter no = " << fRunInfo->GetBetaParamNo(); + cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + cerr << endl; + fValid = false; + return; + } else { // check if beta is fixed + if (((*param)[fRunInfo->GetBetaParamNo()-1].fStep == 0.0) && + ((*param)[fRunInfo->GetBetaParamNo()-1].fValue == 1.0)) + betaFixedToOne = true; + } + + // set fAlphaBetaTag + if (alphaFixedToOne && betaFixedToOne) // alpha == 1, beta == 1 + fAlphaBetaTag = 1; + else if (!alphaFixedToOne && betaFixedToOne) // alpha != 1, beta == 1 + fAlphaBetaTag = 2; + else if (alphaFixedToOne && !betaFixedToOne) // alpha == 1, beta != 1 + fAlphaBetaTag = 3; + else + fAlphaBetaTag = 4; + + // calculate fData + if (!PrepareData()) + fValid = false; +} + +//-------------------------------------------------------------------------- +// Destructor +//-------------------------------------------------------------------------- +/** + *

Destructor. + */ +PRunAsymmetryBNMR::~PRunAsymmetryBNMR() +{ + fForward.clear(); + fForwardErr.clear(); + fBackward.clear(); + fBackwardErr.clear(); +} + +//-------------------------------------------------------------------------- +// CalcChiSquare (public) +//-------------------------------------------------------------------------- +/** + *

Calculate chi-square. + * + * return: + * - chisq value + * + * \param par parameter vector iterated by minuit2 + */ +Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) +{ + Double_t chisq = 0.0; + Double_t diff = 0.0; + Double_t asymFcnValue = 0.0; + Double_t a, b, f; + + // calculate functions + for (Int_t i=0; iGetNoOfFuncs(); i++) { + fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); + } + + // calculate chi square + Double_t time(1.0); + Int_t i; + + // Calculate the theory function once to ensure one function evaluation for the current set of parameters. + // This is needed for the LF and user functions where some non-thread-save calculations only need to be calculated once + // for a given set of parameters---which should be done outside of the parallelized loop. + // For all other functions it means a tiny and acceptable overhead. + asymFcnValue = fTheory->Func(time, par, fFuncValues); + + #ifdef HAVE_GOMP + Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs(); + if (chunk < 10) + chunk = 10; + #pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,a,b,f) schedule(dynamic,chunk) reduction(+:chisq) + #endif + for (i=fStartTimeBin; iFunc(time, par, fFuncValues); + break; + case 2: // alpha != 1, beta == 1 + a = par[fRunInfo->GetAlphaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)); + break; + case 3: // alpha == 1, beta != 1 + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0)); + break; + case 4: // alpha != 1, beta != 1 + a = par[fRunInfo->GetAlphaParamNo()-1]; + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0)); + break; + default: + asymFcnValue = 0.0; + break; + } + diff = fData.GetValue()->at(i) - asymFcnValue; + chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i)); + } + + return chisq; +} + +//-------------------------------------------------------------------------- +// CalcChiSquareExpected (public) +//-------------------------------------------------------------------------- +/** + *

Calculate expected chi-square. Currently not implemented since not clear what to be done. + * + * return: + * - chisq value == 0.0 + * + * \param par parameter vector iterated by minuit2 + */ +Double_t PRunAsymmetryBNMR::CalcChiSquareExpected(const std::vector& par) +{ + return 0.0; +} + +//-------------------------------------------------------------------------- +// CalcMaxLikelihood (public) +//-------------------------------------------------------------------------- +/** + *

NOT IMPLEMENTED!! + * + * \param par parameter vector iterated by minuit2 + */ +Double_t PRunAsymmetryBNMR::CalcMaxLikelihood(const std::vector& par) +{ + cout << endl << "PRunAsymmetryBNMR::CalcMaxLikelihood(): not implemented yet ..." << endl; + + return 1.0; +} + +//-------------------------------------------------------------------------- +// GetNoOfFitBins (public) +//-------------------------------------------------------------------------- +/** + *

Calculate the number of fitted bins for the current fit range. + * + * return: number of fitted bins. + */ +UInt_t PRunAsymmetryBNMR::GetNoOfFitBins() +{ + CalcNoOfFitBins(); + + return fNoOfFitBins; +} + +//-------------------------------------------------------------------------- +// SetFitRangeBin (public) +//-------------------------------------------------------------------------- +/** + *

Allows to change the fit range on the fly. Used in the COMMAND block. + * The syntax of the string is: FIT_RANGE fgb[+n00] lgb[-n01] [fgb[+n10] lgb[-n11] ... fgb[+nN0] lgb[-nN1]]. + * If only one pair of fgb/lgb is given, it is used for all runs in the RUN block section. + * If multiple fgb/lgb's are given, the number N has to be the number of RUN blocks in + * the msr-file. + * + *

nXY are offsets which can be used to shift, limit the fit range. + * + * \param fitRange string containing the necessary information. + */ +void PRunAsymmetryBNMR::SetFitRangeBin(const TString fitRange) +{ + TObjArray *tok = 0; + TObjString *ostr = 0; + TString str; + Ssiz_t idx = -1; + Int_t offset = 0; + + tok = fitRange.Tokenize(" \t"); + + if (tok->GetEntries() == 3) { // structure FIT_RANGE fgb+n0 lgb-n1 + // handle fgb+n0 entry + ostr = (TObjString*) tok->At(1); + str = ostr->GetString(); + // check if there is an offset present + idx = str.First("+"); + if (idx != -1) { // offset present + str.Remove(0, idx+1); + if (str.IsFloat()) // if str is a valid number, convert is to an integer + offset = str.Atoi(); + } + fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; + + // handle lgb-n1 entry + ostr = (TObjString*) tok->At(2); + str = ostr->GetString(); + // check if there is an offset present + idx = str.First("-"); + if (idx != -1) { // offset present + str.Remove(0, idx+1); + if (str.IsFloat()) // if str is a valid number, convert is to an integer + offset = str.Atoi(); + } + fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; + } else if ((tok->GetEntries() > 3) && (tok->GetEntries() % 2 == 1)) { // structure FIT_RANGE fgb[+n00] lgb[-n01] [fgb[+n10] lgb[-n11] ... fgb[+nN0] lgb[-nN1]] + Int_t pos = 2*(fRunNo+1)-1; + + if (pos + 1 >= tok->GetEntries()) { + cerr << endl << ">> PRunAsymmetryBNMR::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + cerr << endl << ">> will ignore it. Sorry ..." << endl; + } else { + // handle fgb+n0 entry + ostr = (TObjString*) tok->At(pos); + str = ostr->GetString(); + // check if there is an offset present + idx = str.First("+"); + if (idx != -1) { // offset present + str.Remove(0, idx+1); + if (str.IsFloat()) // if str is a valid number, convert is to an integer + offset = str.Atoi(); + } + fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; + + // handle lgb-n1 entry + ostr = (TObjString*) tok->At(pos+1); + str = ostr->GetString(); + // check if there is an offset present + idx = str.First("-"); + if (idx != -1) { // offset present + str.Remove(0, idx+1); + if (str.IsFloat()) // if str is a valid number, convert is to an integer + offset = str.Atoi(); + } + fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; + } + } else { // error + cerr << endl << ">> PRunAsymmetryBNMR::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + cerr << endl << ">> will ignore it. Sorry ..." << endl; + } + + // clean up + if (tok) { + delete tok; + } +} + +//-------------------------------------------------------------------------- +// CalcNoOfFitBins (protected) +//-------------------------------------------------------------------------- +/** + *

Calculate the number of fitted bins for the current fit range. + */ +void PRunAsymmetryBNMR::CalcNoOfFitBins() +{ + // In order not having to loop over all bins and to stay consistent with the chisq method, calculate the start and end bins explicitly + fStartTimeBin = static_cast(ceil((fFitStartTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())); + if (fStartTimeBin < 0) + fStartTimeBin = 0; + fEndTimeBin = static_cast(floor((fFitEndTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())) + 1; + if (fEndTimeBin > static_cast(fData.GetValue()->size())) + fEndTimeBin = fData.GetValue()->size(); + + if (fEndTimeBin > fStartTimeBin) + fNoOfFitBins = fEndTimeBin - fStartTimeBin; + else + fNoOfFitBins = 0; +} + +//-------------------------------------------------------------------------- +// CalcTheory (protected) +//-------------------------------------------------------------------------- +/** + *

Calculate theory for a given set of fit-parameters. + */ +void PRunAsymmetryBNMR::CalcTheory() +{ + // feed the parameter vector + std::vector par; + PMsrParamList *paramList = fMsrInfo->GetMsrParamList(); + for (UInt_t i=0; isize(); i++) + par.push_back((*paramList)[i].fValue); + + // calculate functions + for (Int_t i=0; iGetNoOfFuncs(); i++) { + fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); + } + + // calculate asymmetry + Double_t asymFcnValue = 0.0; + Double_t a, b, f; + Double_t time; + for (UInt_t i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + switch (fAlphaBetaTag) { + case 1: // alpha == 1, beta == 1 + asymFcnValue = fTheory->Func(time, par, fFuncValues); + break; + case 2: // alpha != 1, beta == 1 + a = par[fRunInfo->GetAlphaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)); + break; + case 3: // alpha == 1, beta != 1 + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0)); + break; + case 4: // alpha != 1, beta != 1 + a = par[fRunInfo->GetAlphaParamNo()-1]; + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0)); + break; + default: + asymFcnValue = 0.0; + break; + } + fData.AppendTheoryValue(asymFcnValue); + } + + // clean up + par.clear(); +} + +//-------------------------------------------------------------------------- +// PrepareData (protected) +//-------------------------------------------------------------------------- +/** + *

Prepare data for fitting or viewing. What is already processed at this stage: + * - get all needed forward/backward histograms + * - get time resolution + * - get start/stop fit time + * - get t0's and perform necessary cross checks (e.g. if t0 of msr-file (if present) are consistent with t0 of the data files, etc.) + * - add runs (if addruns are present) + * - group histograms (if grouping is present) + * - subtract background + * + * Error propagation for \f$ A_i = (f_i^{\rm c}-b_i^{\rm c})/(f_i^{\rm c}+b_i^{\rm c})\f$: + * \f[ \Delta A_i = \pm\frac{2}{(f_i^{\rm c}+b_i^{\rm c})^2}\left[ + * (b_i^{\rm c})^2 (\Delta f_i^{\rm c})^2 + + * (\Delta b_i^{\rm c})^2 (f_i^{\rm c})^2\right]^{1/2}\f] + * + * return: + * - true if everthing went smooth + * - false, otherwise. + */ +Bool_t PRunAsymmetryBNMR::PrepareData() +{ + // keep the Global block info + PMsrGlobalBlock *globalBlock = fMsrInfo->GetMsrGlobal(); + + // get forward/backward histo from PRunDataHandler object ------------------------ + // get the correct run + PRawRunData *runData = fRawData->GetRunData(*(fRunInfo->GetRunName())); + if (!runData) { // run not found + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; + cerr << endl; + return false; + } + + // collect histogram numbers + PUIntVector forwardHistoNo; + PUIntVector backwardHistoNo; + for (UInt_t i=0; iGetForwardHistoNoSize(); i++) { + forwardHistoNo.push_back(fRunInfo->GetForwardHistoNo(i)); + + if (!runData->IsPresent(forwardHistoNo[i])) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; + cerr << endl << ">> forwardHistoNo found = " << forwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + cerr << endl << ">> Will quit :-("; + cerr << endl; + // clean up + forwardHistoNo.clear(); + backwardHistoNo.clear(); + return false; + } + } + for (UInt_t i=0; iGetBackwardHistoNoSize(); i++) { + backwardHistoNo.push_back(fRunInfo->GetBackwardHistoNo(i)); + + if (!runData->IsPresent(backwardHistoNo[i])) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; + cerr << endl << ">> backwardHistoNo found = " << backwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + cerr << endl << ">> Will quit :-("; + cerr << endl; + // clean up + forwardHistoNo.clear(); + backwardHistoNo.clear(); + return false; + } + } + if (forwardHistoNo.size() != backwardHistoNo.size()) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; + cerr << endl << ">> # of forward histograms different from # of backward histograms."; + cerr << endl << ">> Will quit :-("; + cerr << endl; + // clean up + forwardHistoNo.clear(); + backwardHistoNo.clear(); + return false; + } + + // keep the time resolution in (us) + fTimeResolution = runData->GetTimeResolution()/1.0e3; + cout.precision(10); + cout << endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; + + // get all the proper t0's and addt0's for the current RUN block + if (!GetProperT0(runData, globalBlock, forwardHistoNo, backwardHistoNo)) { + return false; + } + + // keep the histo of each group at this point (addruns handled below) + vector forward, backward; + forward.resize(forwardHistoNo.size()); // resize to number of groups + backward.resize(backwardHistoNo.size()); // resize to numer of groups + for (UInt_t i=0; iGetDataBin(forwardHistoNo[i])->size()); + backward[i].resize(runData->GetDataBin(backwardHistoNo[i])->size()); + forward[i] = *runData->GetDataBin(forwardHistoNo[i]); + backward[i] = *runData->GetDataBin(backwardHistoNo[i]); + } + + // check if addrun's are present, and if yes add data + // check if there are runs to be added to the current one + if (fRunInfo->GetRunNameSize() > 1) { // runs to be added present + PRawRunData *addRunData; + for (UInt_t i=1; iGetRunNameSize(); i++) { + // get run to be added to the main one + addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); + if (addRunData == 0) { // couldn't get run + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + cerr << endl; + return false; + } + + // add forward run + UInt_t addRunSize; + for (UInt_t k=0; kGetDataBin(forwardHistoNo[k])->size(); + for (UInt_t j=0; jGetDataBin(forwardHistoNo[k])->size(); j++) { // loop over the bin indices + // make sure that the index stays in the proper range + if (((Int_t)j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k] >= 0) && (j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k] < addRunSize)) { + forward[k][j] += addRunData->GetDataBin(forwardHistoNo[k])->at(j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k]); + } + } + } + + // add backward run + for (UInt_t k=0; kGetDataBin(backwardHistoNo[k])->size(); + for (UInt_t j=0; jGetDataBin(backwardHistoNo[k])->size(); j++) { // loop over the bin indices + // make sure that the index stays in the proper range + if (((Int_t)j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1] >= 0) && (j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1] < addRunSize)) { + backward[k][j] += addRunData->GetDataBin(backwardHistoNo[k])->at(j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1]); + } + } + } + } + } + + // set forward/backward histo data of the first group + fForward.resize(forward[0].size()); + fBackward.resize(backward[0].size()); + for (UInt_t i=0; iGetDataBin(forwardHistoNo[i])->size(); j++) { // loop over the bin indices + // make sure that the index stays within proper range + if ((j+fT0s[2*i]-fT0s[0] >= 0) && (j+fT0s[2*i]-fT0s[0] < runData->GetDataBin(forwardHistoNo[i])->size())) { + fForward[j] += forward[i][j+(Int_t)fT0s[2*i]-(Int_t)fT0s[0]]; + } + } + } + + // group histograms, add all the remaining backward histograms of the group + for (UInt_t i=1; iGetDataBin(backwardHistoNo[i])->size(); j++) { // loop over the bin indices + // make sure that the index stays within proper range + if ((j+fT0s[2*i+1]-fT0s[1] >= 0) && (j+fT0s[2*i+1]-fT0s[1] < runData->GetDataBin(backwardHistoNo[i])->size())) { + fBackward[j] += backward[i][j+(Int_t)fT0s[2*i+1]-(Int_t)fT0s[1]]; + } + } + } + + // subtract background from histogramms ------------------------------------------ + if (fRunInfo->GetBkgFix(0) == PMUSR_UNDEFINED) { // no fixed background given + if (fRunInfo->GetBkgRange(0) >= 0) { // background range given + if (!SubtractEstimatedBkg()) + return false; + } else { // no background given to do the job, try to estimate it + fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.1), 0); + fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); + fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.1), 2); + fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.6), 3); + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **WARNING** Neither fix background nor background bins are given!"; + cerr << endl << ">> Will try the following:"; + cerr << endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); + cerr << endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); + cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; + cerr << endl; + if (!SubtractEstimatedBkg()) + return false; + } + } else { // fixed background given + if (!SubtractFixBkg()) + return false; + } + + UInt_t histoNo[2] = {forwardHistoNo[0], backwardHistoNo[0]}; + + // get the data range (fgb/lgb) for the current RUN block + if (!GetProperDataRange(runData, histoNo)) { + return false; + } + + // get the fit range for the current RUN block + GetProperFitRange(globalBlock); + + // everything looks fine, hence fill data set + Bool_t status; + switch(fHandleTag) { + case kFit: + status = PrepareFitData(); + break; + case kView: + if (fMsrInfo->GetMsrPlotList()->at(0).fRRFPacking == 0) + status = PrepareViewData(runData, histoNo); + else + status = PrepareRRFViewData(runData, histoNo); + break; + default: + status = false; + break; + } + + // clean up + forwardHistoNo.clear(); + backwardHistoNo.clear(); + + return status; +} + +//-------------------------------------------------------------------------- +// SubtractFixBkg (private) +//-------------------------------------------------------------------------- +/** + *

Subtracts a fixed background from the raw data. The background is given + * in units of (1/bin); for the Asymmetry representation (1/ns) doesn't make too much sense. + * The error propagation is done the following way: it is assumed that the error of the background + * is Poisson like, i.e. \f$\Delta\mathrm{bkg} = \sqrt{\mathrm{bkg}}\f$. + * + * Error propagation: + * \f[ \Delta f_i^{\rm c} = \pm\left[ (\Delta f_i)^2 + (\Delta \mathrm{bkg})^2 \right]^{1/2} = + * \pm\left[ f_i + \mathrm{bkg} \right]^{1/2}, \f] + * where \f$ f_i^{\rm c} \f$ is the background corrected histogram, \f$ f_i \f$ the raw histogram + * and \f$ \mathrm{bkg} \f$ the fix given background. + * + * return: + * - true + * + */ +Bool_t PRunAsymmetryBNMR::SubtractFixBkg() +{ + Double_t dval; + for (UInt_t i=0; iGetBkgFix(0); + + // keep the error, and make sure that the bin is NOT empty + if (fBackward[i] != 0.0) + dval = TMath::Sqrt(fBackward[i]); + else + dval = 1.0; + fBackwardErr.push_back(dval); + fBackward[i] -= fRunInfo->GetBkgFix(1); + } + + return true; +} + +//-------------------------------------------------------------------------- +// SubtractEstimatedBkg (private) +//-------------------------------------------------------------------------- +/** + *

Subtracts the background which is estimated from a given interval (typically before t0). + * + * The background corrected histogramms are: + * \f$ f_i^{\rm c} = f_i - \mathrm{bkg} \f$, where \f$ f_i \f$ is the raw data histogram, + * \f$ \mathrm{bkg} \f$ the background estimate, and \f$ f_i^{\rm c} \f$ background corrected + * histogram. The error on \f$ f_i^{\rm c} \f$ is + * \f[ \Delta f_i^{\rm c} = \pm \sqrt{ (\Delta f_i)^2 + (\Delta \mathrm{bkg})^2 } = + * \pm \sqrt{f_i + (\Delta \mathrm{bkg})^2} \f] + * The background error \f$ \Delta \mathrm{bkg} \f$ is + * \f[ \Delta \mathrm{bkg} = \pm\frac{1}{N}\left[\sum_{i=0}^N (\Delta f_i)^2\right]^{1/2} = + * \pm\frac{1}{N}\left[\sum_{i=0}^N f_i \right]^{1/2},\f] + * where \f$N\f$ is the number of bins over which the background is formed. + * + * return: + * - true + */ +Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() +{ + Double_t beamPeriod = 0.0; + + // check if data are from PSI, RAL, or TRIUMF + if (fRunInfo->GetInstitute()->Contains("psi")) + beamPeriod = ACCEL_PERIOD_PSI; + else if (fRunInfo->GetInstitute()->Contains("ral")) + beamPeriod = ACCEL_PERIOD_RAL; + else if (fRunInfo->GetInstitute()->Contains("triumf")) + beamPeriod = ACCEL_PERIOD_TRIUMF; + else + beamPeriod = 0.0; + + // check if start and end are in proper order + Int_t start[2] = {fRunInfo->GetBkgRange(0), fRunInfo->GetBkgRange(2)}; + Int_t end[2] = {fRunInfo->GetBkgRange(1), fRunInfo->GetBkgRange(3)}; + for (UInt_t i=0; i<2; i++) { + if (end[i] < start[i]) { + cout << endl << "PRunAsymmetryBNMR::SubtractEstimatedBkg(): end = " << end[i] << " > start = " << start[i] << "! Will swap them!"; + UInt_t keep = end[i]; + end[i] = start[i]; + start[i] = keep; + } + } + + // calculate proper background range + for (UInt_t i=0; i<2; i++) { + if (beamPeriod != 0.0) { + Double_t timeBkg = (Double_t)(end[i]-start[i])*(fTimeResolution*fPacking); // length of the background intervall in time + UInt_t fullCycles = (UInt_t)(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall + // correct the end of the background intervall such that the background is as close as possible to a multiple of the proton cylce + end[i] = start[i] + (UInt_t) ((fullCycles*beamPeriod)/(fTimeResolution*fPacking)); + cout << "PRunAsymmetryBNMR::SubtractEstimatedBkg(): Background " << start[i] << ", " << end[i] << endl; + if (end[i] == start[i]) + end[i] = fRunInfo->GetBkgRange(2*i+1); + } + } + + // check if start is within histogram bounds + if ((start[0] < 0) || (start[0] >= fForward.size()) || + (start[1] < 0) || (start[1] >= fBackward.size())) { + cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + cerr << endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; + return false; + } + + // check if end is within histogram bounds + if ((end[0] < 0) || (end[0] >= fForward.size()) || + (end[1] < 0) || (end[1] >= fBackward.size())) { + cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + cerr << endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; + return false; + } + + // calculate background + Double_t bkg[2] = {0.0, 0.0}; + Double_t errBkg[2] = {0.0, 0.0}; + + // forward + for (UInt_t i=start[0]; i<=end[0]; i++) + bkg[0] += fForward[i]; + errBkg[0] = TMath::Sqrt(bkg[0])/(end[0] - start[0] + 1); + bkg[0] /= static_cast(end[0] - start[0] + 1); + cout << endl << ">> estimated forward histo background: " << bkg[0]; + + // backward + for (UInt_t i=start[1]; i<=end[1]; i++) + bkg[1] += fBackward[i]; + errBkg[1] = TMath::Sqrt(bkg[1])/(end[1] - start[1] + 1); + bkg[1] /= static_cast(end[1] - start[1] + 1); + cout << endl << ">> estimated backward histo background: " << bkg[1] << endl; + + // correct error for forward, backward + Double_t errVal = 0.0; + for (UInt_t i=0; i 0.0) + errVal = TMath::Sqrt(fForward[i]+errBkg[0]*errBkg[0]); + else + errVal = 1.0; + fForwardErr.push_back(errVal); + if (fBackward[i] > 0.0) + errVal = TMath::Sqrt(fBackward[i]+errBkg[1]*errBkg[1]); + else + errVal = 1.0; + fBackwardErr.push_back(errVal); + } + + // subtract background from data + for (UInt_t i=0; iSetBkgEstimated(bkg[0], 0); + fRunInfo->SetBkgEstimated(bkg[1], 1); + + return true; +} + +//-------------------------------------------------------------------------- +// PrepareFitData (protected) +//-------------------------------------------------------------------------- +/** + *

Take the pre-processed data (i.e. grouping and addrun are preformed) and form the asymmetry for fitting. + * Before forming the asymmetry, the following checks will be performed: + * -# check if data range is given, if not try to estimate one. + * -# check that if a data range is present, that it makes any sense. + * -# check that 'first good bin'-'t0' is the same for forward and backward histogram. If not adjust it. + * -# pack data (rebin). + * -# if packed forward size != backward size, truncate the longer one such that an asymmetry can be formed. + * -# calculate the asymmetry: \f$ A_i = (f_i^c-b_i^c)/(f_i^c+b_i^c) \f$ + * -# calculate the asymmetry errors: \f$ \delta A_i = 2 \sqrt{(b_i^c)^2 (\delta f_i^c)^2 + (\delta b_i^c)^2 (f_i^c)^2}/(f_i^c+b_i^c)^2\f$ + */ +Bool_t PRunAsymmetryBNMR::PrepareFitData() +{ + // transform raw histo data. This is done the following way (for details see the manual): + // first rebin the data, than calculate the asymmetry + + // everything looks fine, hence fill packed forward and backward histo + PRunData forwardPacked; + PRunData backwardPacked; + Double_t value = 0.0; + Double_t error = 0.0; + // forward + for (Int_t i=fGoodBins[0]; i 1 + if (((i-fGoodBins[0]) % fPacking == 0) && (i != fGoodBins[0])) { // fill data + // in order that after rebinning the fit does not need to be redone (important for plots) + // the value is normalize to per bin + value /= fPacking; + forwardPacked.AppendValue(value); + if (value == 0.0) + forwardPacked.AppendErrorValue(1.0); + else + forwardPacked.AppendErrorValue(TMath::Sqrt(error)/fPacking); + value = 0.0; + error = 0.0; + } + value += fForward[i]; + error += fForwardErr[i]*fForwardErr[i]; + } + } + // backward + for (Int_t i=fGoodBins[2]; i 1 + if (((i-fGoodBins[2]) % fPacking == 0) && (i != fGoodBins[2])) { // fill data + // in order that after rebinning the fit does not need to be redone (important for plots) + // the value is normalize to per bin + value /= fPacking; + backwardPacked.AppendValue(value); + if (value == 0.0) + backwardPacked.AppendErrorValue(1.0); + else + backwardPacked.AppendErrorValue(TMath::Sqrt(error)/fPacking); + value = 0.0; + error = 0.0; + } + value += fBackward[i]; + error += fBackwardErr[i]*fBackwardErr[i]; + } + } + + // check if packed forward and backward hist have the same size, otherwise take the minimum size + UInt_t noOfBins = forwardPacked.GetValue()->size(); + if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { + if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) + noOfBins = backwardPacked.GetValue()->size(); + } + + // form asymmetry including error propagation + Double_t asym; + Double_t f, b, ef, eb; + // fill data time start, and step + // data start at data_start-t0 shifted by (pack-1)/2 + fData.SetDataTimeStart(fTimeResolution*((Double_t)fGoodBins[0]-fT0s[0]+(Double_t)(fPacking-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*(Double_t)fPacking); + for (UInt_t i=0; iat(i); + b = backwardPacked.GetValue()->at(i); + ef = forwardPacked.GetError()->at(i); + eb = backwardPacked.GetError()->at(i); + // check that there are indeed bins + if (f+b != 0.0) + asym = (f-b) / (f+b); + else + asym = 0.0; + fData.AppendValue(asym); + // calculate the error + if (f+b != 0.0) + error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); + else + error = 1.0; + fData.AppendErrorValue(error); + } + + CalcNoOfFitBins(); + + // clean up + fForward.clear(); + fForwardErr.clear(); + fBackward.clear(); + fBackwardErr.clear(); + + return true; +} + +//-------------------------------------------------------------------------- +// PrepareViewData (protected) +//-------------------------------------------------------------------------- +/** + *

Take the pre-processed data (i.e. grouping and addrun are preformed) and form the asymmetry for view representation. + * Before forming the asymmetry, the following checks will be performed: + * -# check if view packing is whished. + * -# check if data range is given, if not try to estimate one. + * -# check that data range is present, that it makes any sense. + * -# check that 'first good bin'-'t0' is the same for forward and backward histogram. If not adjust it. + * -# pack data (rebin). + * -# if packed forward size != backward size, truncate the longer one such that an asymmetry can be formed. + * -# calculate the asymmetry: \f$ A_i = (\alpha f_i^c-b_i^c)/(\alpha \beta f_i^c+b_i^c) \f$ + * -# calculate the asymmetry errors: \f$ \delta A_i = 2 \sqrt{(b_i^c)^2 (\delta f_i^c)^2 + (\delta b_i^c)^2 (f_i^c)^2}/(f_i^c+b_i^c)^2\f$ + * -# calculate the theory vector. + * + * \param runData raw run data needed to perform some crosschecks + * \param histoNo histogram number (within a run). histoNo[0]: forward histogram number, histNo[1]: backward histogram number + */ +Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]) +{ + // check if view_packing is wished + Int_t packing = fPacking; + if (fMsrInfo->GetMsrPlotList()->at(0).fViewPacking > 0) { + packing = fMsrInfo->GetMsrPlotList()->at(0).fViewPacking; + } + + // feed the parameter vector + std::vector par; + PMsrParamList *paramList = fMsrInfo->GetMsrParamList(); + for (UInt_t i=0; isize(); i++) + par.push_back((*paramList)[i].fValue); + + // transform raw histo data. This is done the following way (for details see the manual): + // first rebin the data, than calculate the asymmetry + + // first get start data, end data, and t0 + Int_t start[2] = {fGoodBins[0], fGoodBins[2]}; + Int_t end[2] = {fGoodBins[1], fGoodBins[3]}; + Int_t t0[2] = {(Int_t)fT0s[0], (Int_t)fT0s[1]}; + + // check if the data ranges and t0's between forward/backward are compatible + Int_t fgb[2]; + if (start[0]-t0[0] != start[1]-t0[1]) { // wrong fgb aligning + if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { + fgb[0] = start[0]; + fgb[1] = t0[1] + start[0]-t0[0]; + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **WARNING** needed to shift backward fgb from "; + cerr << start[1] << " to " << fgb[1] << endl; + } else { + fgb[0] = t0[0] + start[1]-t0[1]; + fgb[1] = start[1]; + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **WARNING** needed to shift forward fgb from "; + cerr << start[0] << " to " << fgb[0] << endl; + } + } else { // fgb aligning is correct + fgb[0] = start[0]; + fgb[1] = start[1]; + } + + Int_t val = fgb[0]-packing*(fgb[0]/packing); + do { + if (fgb[1] - fgb[0] < 0) + val += packing; + } while (val + fgb[1] - fgb[0] < 0); + + start[0] = val; + start[1] = val + fgb[1] - fgb[0]; + + // make sure that there are equal number of rebinned bins in forward and backward + UInt_t noOfBins0 = (runData->GetDataBin(histoNo[0])->size()-start[0])/packing; + UInt_t noOfBins1 = (runData->GetDataBin(histoNo[1])->size()-start[1])/packing; + if (noOfBins0 > noOfBins1) + noOfBins0 = noOfBins1; + end[0] = start[0] + noOfBins0 * packing; + end[1] = start[1] + noOfBins0 * packing; + + // check if start, end, and t0 make any sense + // 1st check if start and end are in proper order + for (UInt_t i=0; i<2; i++) { + if (end[i] < start[i]) { // need to swap them + Int_t keep = end[i]; + end[i] = start[i]; + start[i] = keep; + } + // 2nd check if start is within proper bounds + if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 3rd check if end is within proper bounds + if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 4th check if t0 is within proper bounds + if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** t0 data bin doesn't make any sense!"; + cerr << endl; + return false; + } + } + + // everything looks fine, hence fill packed forward and backward histo + PRunData forwardPacked; + PRunData backwardPacked; + Double_t value = 0.0; + Double_t error = 0.0; + + // forward + for (Int_t i=start[0]; i 1 + if (((i-start[0]) % packing == 0) && (i != start[0])) { // fill data + // in order that after rebinning the fit does not need to be redone (important for plots) + // the value is normalize to per bin + value /= packing; + forwardPacked.AppendValue(value); + if (value == 0.0) + forwardPacked.AppendErrorValue(1.0); + else + forwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); + value = 0.0; + error = 0.0; + } + value += fForward[i]; + error += fForwardErr[i]*fForwardErr[i]; + } + } + + // backward + for (Int_t i=start[1]; i 1 + if (((i-start[1]) % packing == 0) && (i != start[1])) { // fill data + // in order that after rebinning the fit does not need to be redone (important for plots) + // the value is normalize to per bin + value /= packing; + backwardPacked.AppendValue(value); + if (value == 0.0) + backwardPacked.AppendErrorValue(1.0); + else + backwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); + value = 0.0; + error = 0.0; + } + value += fBackward[i]; + error += fBackwardErr[i]*fBackwardErr[i]; + } + } + + // check if packed forward and backward hist have the same size, otherwise take the minimum size + UInt_t noOfBins = forwardPacked.GetValue()->size(); + if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { + if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) + noOfBins = backwardPacked.GetValue()->size(); + } + + // form asymmetry including error propagation + Double_t asym; + Double_t f, b, ef, eb, alpha = 1.0, beta = 1.0; + // set data time start, and step + // data start at data_start-t0 + fData.SetDataTimeStart(fTimeResolution*((Double_t)start[0]-t0[0]+(Double_t)(packing-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*(Double_t)packing); + + // get the proper alpha and beta + switch (fAlphaBetaTag) { + case 1: // alpha == 1, beta == 1 + alpha = 1.0; + beta = 1.0; + break; + case 2: // alpha != 1, beta == 1 + alpha = par[fRunInfo->GetAlphaParamNo()-1]; + beta = 1.0; + break; + case 3: // alpha == 1, beta != 1 + alpha = 1.0; + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; + case 4: // alpha != 1, beta != 1 + alpha = par[fRunInfo->GetAlphaParamNo()-1]; + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; + default: + break; + } + + for (UInt_t i=0; isize(); i++) { + // to make the formulae more readable + f = forwardPacked.GetValue()->at(i); + b = backwardPacked.GetValue()->at(i); + ef = forwardPacked.GetError()->at(i); + eb = backwardPacked.GetError()->at(i); + // check that there are indeed bins + if (f+b != 0.0) + asym = (alpha*f-b) / (alpha*beta*f+b); + else + asym = 0.0; + fData.AppendValue(asym); + // calculate the error + if (f+b != 0.0) + error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); + else + error = 1.0; + fData.AppendErrorValue(error); + } + + CalcNoOfFitBins(); + + // clean up + fForward.clear(); + fForwardErr.clear(); + fBackward.clear(); + fBackwardErr.clear(); + + // fill theory vector for kView + // calculate functions + for (Int_t i=0; iGetNoOfFuncs(); i++) { + fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); + } + + // calculate theory + Double_t time; + UInt_t size = runData->GetDataBin(histoNo[0])->size(); + Double_t factor = 1.0; + if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo[0])->size()) { + size = fData.GetValue()->size() * 10; + factor = (Double_t)runData->GetDataBin(histoNo[0])->size() / (Double_t)size; + } + fData.SetTheoryTimeStart(fData.GetDataTimeStart()); + fData.SetTheoryTimeStep(fTimeResolution*factor); + for (UInt_t i=0; iFunc(time, par, fFuncValues); + if (fabs(value) > 10.0) { // dirty hack needs to be fixed!! + value = 0.0; + } + fData.AppendTheoryValue(value); + } + + // clean up + par.clear(); + + return true; +} + +//-------------------------------------------------------------------------- +// PrepareRRFViewData (protected) +//-------------------------------------------------------------------------- +/** + *

Prepares the RRF data set for visual representation. This is done the following way: + * -# make all necessary checks + * -# build the asymmetry, \f$ A(t) \f$, WITHOUT packing. + * -# \f$ A_R(t) = A(t) \cdot 2 \cos(\omega_R t + \phi_R) \f$ + * -# do the packing of \f$ A_R(t) \f$ + * -# calculate theory, \f$ T(t) \f$, as close as possible to the time resolution [compatible with the RRF frequency] + * -# \f$ T_R(t) = T(t) \cdot 2 \cos(\omega_R t + \phi_R) \f$ + * -# do the packing of \f$ T_R(t) \f$ + * -# calculate the Kaiser FIR filter coefficients + * -# filter \f$ T_R(t) \f$. + * + * \param runData raw run data needed to perform some crosschecks + * \param histoNo array of the histo numbers form which to build the asymmetry + */ +Bool_t PRunAsymmetryBNMR::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]) +{ + // feed the parameter vector + std::vector par; + PMsrParamList *paramList = fMsrInfo->GetMsrParamList(); + for (UInt_t i=0; isize(); i++) + par.push_back((*paramList)[i].fValue); + + // ------------------------------------------------------------ + // 1. make all necessary checks + // ------------------------------------------------------------ + + // first get start data, end data, and t0 + Int_t start[2] = {fGoodBins[0], fGoodBins[2]}; + Int_t end[2] = {fGoodBins[1], fGoodBins[3]}; + Int_t t0[2] = {(Int_t)fT0s[0], (Int_t)fT0s[1]}; + UInt_t packing = fMsrInfo->GetMsrPlotList()->at(0).fRRFPacking; + + // check if the data ranges and t0's between forward/backward are compatible + Int_t fgb[2]; + if (start[0]-t0[0] != start[1]-t0[1]) { // wrong fgb aligning + if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { + fgb[0] = start[0]; + fgb[1] = t0[1] + start[0]-t0[0]; + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **WARNING** needed to shift backward fgb from "; + cerr << start[1] << " to " << fgb[1] << endl; + } else { + fgb[0] = t0[0] + start[1]-t0[1]; + fgb[1] = start[1]; + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **WARNING** needed to shift forward fgb from "; + cerr << start[1] << " to " << fgb[0] << endl; + } + } else { // fgb aligning is correct + fgb[0] = start[0]; + fgb[1] = start[1]; + } + + Int_t val = fgb[0]-packing*(fgb[0]/packing); + do { + if (fgb[1] - fgb[0] < 0) + val += packing; + } while (val + fgb[1] - fgb[0] < 0); + + start[0] = val; + start[1] = val + fgb[1] - fgb[0]; + + // make sure that there are equal number of rebinned bins in forward and backward + UInt_t noOfBins0 = runData->GetDataBin(histoNo[0])->size()-start[0]; + UInt_t noOfBins1 = runData->GetDataBin(histoNo[1])->size()-start[1]; + if (noOfBins0 > noOfBins1) + noOfBins0 = noOfBins1; + end[0] = start[0] + noOfBins0; + end[1] = start[1] + noOfBins0; + + // check if start, end, and t0 make any sense + // 1st check if start and end are in proper order + for (UInt_t i=0; i<2; i++) { + if (end[i] < start[i]) { // need to swap them + Int_t keep = end[i]; + end[i] = start[i]; + start[i] = keep; + } + // 2nd check if start is within proper bounds + if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** start data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 3rd check if end is within proper bounds + if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** end data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 4th check if t0 is within proper bounds + if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** t0 data bin doesn't make any sense!"; + cerr << endl; + return false; + } + } + + // ------------------------------------------------------------ + // 2. build the asymmetry [A(t)] WITHOUT packing. + // ------------------------------------------------------------ + + PDoubleVector forward, forwardErr; + PDoubleVector backward, backwardErr; + Double_t error = 0.0; + // forward + for (Int_t i=start[0]; i backward.size()) + noOfBins = backward.size(); + } + + // form asymmetry including error propagation + PDoubleVector asymmetry, asymmetryErr; + Double_t asym; + Double_t f, b, ef, eb, alpha = 1.0, beta = 1.0; + + // get the proper alpha and beta + switch (fAlphaBetaTag) { + case 1: // alpha == 1, beta == 1 + alpha = 1.0; + beta = 1.0; + break; + case 2: // alpha != 1, beta == 1 + alpha = par[fRunInfo->GetAlphaParamNo()-1]; + beta = 1.0; + break; + case 3: // alpha == 1, beta != 1 + alpha = 1.0; + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; + case 4: // alpha != 1, beta != 1 + alpha = par[fRunInfo->GetAlphaParamNo()-1]; + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; + default: + break; + } + + for (UInt_t i=0; iGetMsrPlotList()->at(0).fRRFUnit) { + case RRF_UNIT_kHz: + gammaRRF = TMath::TwoPi()*1.0e-3; + break; + case RRF_UNIT_MHz: + gammaRRF = TMath::TwoPi(); + break; + case RRF_UNIT_Mcs: + gammaRRF = 1.0; + break; + case RRF_UNIT_G: + gammaRRF = GAMMA_BAR_MUON*TMath::TwoPi(); + break; + case RRF_UNIT_T: + gammaRRF = GAMMA_BAR_MUON*TMath::TwoPi()*1.0e4; + break; + default: + gammaRRF = TMath::TwoPi(); + break; + } + wRRF = gammaRRF * fMsrInfo->GetMsrPlotList()->at(0).fRRFFreq; + phaseRRF = fMsrInfo->GetMsrPlotList()->at(0).fRRFPhase / 180.0 * TMath::Pi(); + + for (UInt_t i=0; i(start[0])-t0[0]+static_cast(i)); + asymmetry[i] *= 2.0*TMath::Cos(wRRF*time+phaseRRF); + } + + // ------------------------------------------------------------ + // 4. do the packing of A_R(t) + // ------------------------------------------------------------ + Double_t value = 0.0; + error = 0.0; + for (UInt_t i=0; i(packing-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*static_cast(packing)); + + // ------------------------------------------------------------ + // 5. calculate theory [T(t)] as close as possible to the time resolution [compatible with the RRF frequency] + // 6. T_R(t) = T(t) * 2 cos(w_R t + phi_R) + // ------------------------------------------------------------ + UInt_t rebinRRF = static_cast((TMath::Pi()/2.0/wRRF)/fTimeResolution); // RRF time resolution / data time resolution + fData.SetTheoryTimeStart(fData.GetDataTimeStart()); + fData.SetTheoryTimeStep(TMath::Pi()/2.0/wRRF/rebinRRF); // = theory time resolution as close as possible to the data time resolution compatible with wRRF + + // calculate functions + for (Int_t i=0; iGetNoOfFuncs(); i++) { + fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); + } + + Double_t theoryValue; + for (UInt_t i=0; i(i)*fData.GetTheoryTimeStep(); + theoryValue = fTheory->Func(time, par, fFuncValues); + theoryValue *= 2.0*TMath::Cos(wRRF * time + phaseRRF); + + if (fabs(theoryValue) > 10.0) { // dirty hack needs to be fixed!! + theoryValue = 0.0; + } + + fData.AppendTheoryValue(theoryValue); + } + + // ------------------------------------------------------------ + // 7. do the packing of T_R(t) + // ------------------------------------------------------------ + + PDoubleVector theo; + Double_t dval = 0.0; + for (UInt_t i=0; isize(); i++) { + if ((i % rebinRRF == 0) && (i != 0)) { + theo.push_back(dval/rebinRRF); + dval = 0.0; + } + dval += fData.GetTheory()->at(i); + } + fData.ReplaceTheory(theo); + theo.clear(); + + // set the theory time start and step size + fData.SetTheoryTimeStart(fData.GetTheoryTimeStart()+static_cast(rebinRRF-1)*fData.GetTheoryTimeStep()/2.0); + fData.SetTheoryTimeStep(rebinRRF*fData.GetTheoryTimeStep()); + + // ------------------------------------------------------------ + // 8. calculate the Kaiser FIR filter coefficients + // ------------------------------------------------------------ + CalculateKaiserFilterCoeff(wRRF, 60.0, 0.2); // w_c = wRRF, A = -20 log_10(delta), Delta w / w_c = (w_s - w_p) / (2 w_c) + + // ------------------------------------------------------------ + // 9. filter T_R(t) + // ------------------------------------------------------------ + FilterTheo(); + + // clean up + par.clear(); + forward.clear(); + forwardErr.clear(); + backward.clear(); + backwardErr.clear(); + asymmetry.clear(); + asymmetryErr.clear(); + + return true; +} + +//-------------------------------------------------------------------------- +// GetProperT0 (private) +//-------------------------------------------------------------------------- +/** + *

Get the proper t0 for the single histogram run. + * -# the t0 vector size = number of detectors (grouping) for forward. + * -# initialize t0's with -1 + * -# fill t0's from RUN block + * -# if t0's are missing (i.e. t0 == -1), try to fill from the GLOBAL block. + * -# if t0's are missing, try t0's from the data file + * -# if t0's are missing, try to estimate them + * + * \param runData pointer to the current RUN block entry from the msr-file + * \param globalBlock pointer to the GLOBLA block entry from the msr-file + * \param forwardHistoNo histogram number vector of forward; forwardHistoNo = msr-file forward + redGreen_offset - 1 + * \param backwardHistoNo histogram number vector of backwardward; backwardHistoNo = msr-file backward + redGreen_offset - 1 + * + * return: + * - true if everthing went smooth + * - false, otherwise. + */ +Bool_t PRunAsymmetryBNMR::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlock, PUIntVector &forwardHistoNo, PUIntVector &backwardHistoNo) +{ + // feed all T0's + // first init T0's, T0's are stored as (forward T0, backward T0, etc.) + fT0s.clear(); + fT0s.resize(2*forwardHistoNo.size()); + for (UInt_t i=0; iGetT0BinSize(); i++) { + fT0s[i] = fRunInfo->GetT0Bin(i); + } + + // fill in the missing T0's from the GLOBAL block section (if present) + for (UInt_t i=0; iGetT0BinSize(); i++) { + if (fT0s[i] == -1) { // i.e. not given in the RUN block section + fT0s[i] = globalBlock->GetT0Bin(i); + } + } + + // fill in the missing T0's from the data file, if not already present in the msr-file + for (UInt_t i=0; iGetT0Bin(forwardHistoNo[i]) > 0.0) { + fT0s[2*i] = runData->GetT0Bin(forwardHistoNo[i]); + fRunInfo->SetT0Bin(fT0s[2*i], 2*i); + } + } + for (UInt_t i=0; iGetT0Bin(backwardHistoNo[i]) > 0.0) { + fT0s[2*i+1] = runData->GetT0Bin(backwardHistoNo[i]); + fRunInfo->SetT0Bin(fT0s[2*i+1], 2*i+1); + } + } + + // fill in the T0's gaps, i.e. in case the T0's are NEITHER in the msr-file and NOR in the data file + for (UInt_t i=0; iGetT0BinEstimated(forwardHistoNo[i]); + fRunInfo->SetT0Bin(fT0s[2*i], 2*i); + + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); + cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl; + } + } + for (UInt_t i=0; iGetT0BinEstimated(backwardHistoNo[i]); + fRunInfo->SetT0Bin(fT0s[2*i+1], 2*i+1); + + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); + cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl; + } + } + + // check if t0 is within proper bounds + for (UInt_t i=0; i (Int_t)runData->GetDataBin(forwardHistoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **ERROR** t0 data bin (" << fT0s[2*i] << ") doesn't make any sense!"; + cerr << endl << ">> forwardHistoNo " << forwardHistoNo[i]; + cerr << endl; + return false; + } + if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > (Int_t)runData->GetDataBin(backwardHistoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!"; + cerr << endl << ">> backwardHistoNo " << backwardHistoNo[i]; + cerr << endl; + return false; + } + } + + // check if addrun's are present, and if yes add the necessary t0's + if (fRunInfo->GetRunNameSize() > 1) { // runs to be added present + PRawRunData *addRunData; + fAddT0s.resize(fRunInfo->GetRunNameSize()-1); // resize to the number of addruns + for (UInt_t i=1; iGetRunNameSize(); i++) { + // get run to be added to the main one + addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); + if (addRunData == 0) { // couldn't get run + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + cerr << endl; + return false; + } + + // feed all T0's + // first init T0's, T0's are stored as (forward T0, backward T0, etc.) + fAddT0s[i-1].clear(); + fAddT0s[i-1].resize(2*forwardHistoNo.size()); + for (UInt_t j=0; jGetAddT0BinSize(i); j++) { + fAddT0s[i-1][j] = fRunInfo->GetAddT0Bin(i, j); + } + + // fill in the T0's from the data file, if not already present in the msr-file + for (UInt_t j=0; jGetT0Bin(forwardHistoNo[j]) > 0.0) { + fAddT0s[i-1][2*j] = addRunData->GetT0Bin(forwardHistoNo[j]); + fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j], i-1, 2*j); + } + } + for (UInt_t j=0; jGetT0Bin(backwardHistoNo[j]) > 0.0) { + fAddT0s[i-1][2*j+1] = addRunData->GetT0Bin(backwardHistoNo[j]); + fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j+1], i-1, 2*j+1); + } + } + + // fill in the T0's gaps, i.e. in case the T0's are NOT in the msr-file and NOT in the data file + for (UInt_t j=0; jGetT0BinEstimated(forwardHistoNo[j]); + fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j], i-1, 2*j); + + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl; + } + } + for (UInt_t j=0; jGetT0BinEstimated(backwardHistoNo[j]); + fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j+1], i-1, 2*j+1); + + cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); + cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + cerr << endl; + } + } + } + } + + return true; +} + +//-------------------------------------------------------------------------- +// GetProperDataRange (private) +//-------------------------------------------------------------------------- +/** + *

Get the proper data range, i.e. first/last good bin (fgb/lgb). + * -# get fgb/lgb from the RUN block + * -# if fgb/lgb still undefined, try to get it from the GLOBAL block + * -# if fgb/lgb still undefined, try to estimate them. + * + * \param runData raw run data needed to perform some crosschecks + * \param histoNo histogram number (within a run). histoNo[0]: forward histogram number, histNo[1]: backward histogram number + * + * return: + * - true if everthing went smooth + * - false, otherwise. + */ +Bool_t PRunAsymmetryBNMR::GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2]) +{ + // first get start/end data + Int_t start[2] = {fRunInfo->GetDataRange(0), fRunInfo->GetDataRange(2)}; + Int_t end[2] = {fRunInfo->GetDataRange(1), fRunInfo->GetDataRange(3)}; + // check if data range has been provided in the RUN block. If not, try the GLOBAL block + if (start[0] == -1) { + start[0] = fMsrInfo->GetMsrGlobal()->GetDataRange(0); + } + if (start[1] == -1) { + start[1] = fMsrInfo->GetMsrGlobal()->GetDataRange(2); + } + if (end[0] == -1) { + end[0] = fMsrInfo->GetMsrGlobal()->GetDataRange(1); + } + if (end[1] == -1) { + end[1] = fMsrInfo->GetMsrGlobal()->GetDataRange(3); + } + + Double_t t0[2] = {fT0s[0], fT0s[1]}; + Int_t offset = (Int_t)(10.0e-3/fTimeResolution); // needed in case first good bin is not given, default = 10ns + + // check if data range has been provided, and if not try to estimate them + if (start[0] < 0) { + start[0] = (Int_t)t0[0]+offset; + fRunInfo->SetDataRange(start[0], 0); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + cerr << endl; + } + if (start[1] < 0) { + start[1] = (Int_t)t0[1]+offset; + fRunInfo->SetDataRange(start[1], 2); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + cerr << endl; + } + if (end[0] < 0) { + end[0] = runData->GetDataBin(histoNo[0])->size(); + fRunInfo->SetDataRange(end[0], 1); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + cerr << endl; + } + if (end[1] < 0) { + end[1] = runData->GetDataBin(histoNo[1])->size(); + fRunInfo->SetDataRange(end[1], 3); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; + cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + cerr << endl; + } + + // check if start, end, and t0 make any sense + // 1st check if start and end are in proper order + for (UInt_t i=0; i<2; i++) { + if (end[i] < start[i]) { // need to swap them + Int_t keep = end[i]; + end[i] = start[i]; + start[i] = keep; + } + // 2nd check if start is within proper bounds + if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** start data bin doesn't make any sense!"; + cerr << endl; + return false; + } + // 3rd check if end is within proper bounds + if (end[i] < 0) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** end data bin (" << end[i] << ") doesn't make any sense!"; + cerr << endl; + return false; + } + if (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size()) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** end data bin (" << end[i] << ") > histo length (" << (Int_t)runData->GetDataBin(histoNo[i])->size() << ")."; + cerr << endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << endl; + cerr << endl; + end[i] = (Int_t)runData->GetDataBin(histoNo[i])->size()-1; + } + // 4th check if t0 is within proper bounds + if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** t0 data bin doesn't make any sense!"; + cerr << endl; + return false; + } + } + + // check that start-t0 is the same for forward as for backward, otherwise take max(start[i]-t0[i]) + if (fabs(static_cast(start[0])-t0[0]) > fabs(static_cast(start[1])-t0[1])){ + start[1] = static_cast(t0[1] + static_cast(start[0]) - t0[0]); + end[1] = static_cast(t0[1] + static_cast(end[0]) - t0[0]); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange **WARNING** needed to shift backward data range."; + cerr << endl << ">> given: " << fRunInfo->GetDataRange(2) << ", " << fRunInfo->GetDataRange(3); + cerr << endl << ">> used : " << start[1] << ", " << end[1]; + cerr << endl; + } + if (fabs(static_cast(start[0])-t0[0]) < fabs(static_cast(start[1])-t0[1])){ + start[0] = static_cast(t0[0] + static_cast(start[1]) - t0[1]); + end[0] = static_cast(t0[0] + static_cast(end[1]) - t0[1]); + cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange **WARNING** needed to shift forward data range."; + cerr << endl << ">> given: " << fRunInfo->GetDataRange(0) << ", " << fRunInfo->GetDataRange(1); + cerr << endl << ">> used : " << start[0] << ", " << end[0]; + cerr << endl; + } + + // keep good bins for potential latter use + fGoodBins[0] = start[0]; + fGoodBins[1] = end[0]; + fGoodBins[2] = start[1]; + fGoodBins[3] = end[1]; + + return true; +} + +//-------------------------------------------------------------------------- +// GetProperFitRange (private) +//-------------------------------------------------------------------------- +/** + *

Get the proper fit range. There are two possible fit range commands: + * fit given in (usec), or + * fit fgb+offset_0 lgb-offset_1 given in (bins), therefore it works the following way: + * -# get fit range assuming given in time from RUN block + * -# if fit range in RUN block is given in bins, replace start/end + * -# if fit range is NOT given yet, try fit range assuming given in time from GLOBAL block + * -# if fit range in GLOBAL block is given in bins, replace start/end + * -# if still no fit range is given, use fgb/lgb. + * + * \param globalBlock pointer to the GLOBAL block information form the msr-file. + */ +void PRunAsymmetryBNMR::GetProperFitRange(PMsrGlobalBlock *globalBlock) +{ + // set fit start/end time; first check RUN Block + fFitStartTime = fRunInfo->GetFitRange(0); + fFitEndTime = fRunInfo->GetFitRange(1); + // if fit range is given in bins (and not time), the fit start/end time can be calculated at this point now + if (fRunInfo->IsFitRangeInBin()) { + fFitStartTime = (fGoodBins[0] + fRunInfo->GetFitRangeOffset(0) - fT0s[0]) * fTimeResolution; // (fgb+n0-t0)*dt + fFitEndTime = (fGoodBins[1] - fRunInfo->GetFitRangeOffset(1) - fT0s[0]) * fTimeResolution; // (lgb-n1-t0)*dt + // write these times back into the data structure. This way it is available when writting the log-file + fRunInfo->SetFitRange(fFitStartTime, 0); + fRunInfo->SetFitRange(fFitEndTime, 1); + } + if (fFitStartTime == PMUSR_UNDEFINED) { // fit start/end NOT found in the RUN block, check GLOBAL block + fFitStartTime = globalBlock->GetFitRange(0); + fFitEndTime = globalBlock->GetFitRange(1); + // if fit range is given in bins (and not time), the fit start/end time can be calculated at this point now + if (globalBlock->IsFitRangeInBin()) { + fFitStartTime = (fGoodBins[0] + globalBlock->GetFitRangeOffset(0) - fT0s[0]) * fTimeResolution; // (fgb+n0-t0)*dt + fFitEndTime = (fGoodBins[1] - globalBlock->GetFitRangeOffset(1) - fT0s[0]) * fTimeResolution; // (lgb-n1-t0)*dt + // write these times back into the data structure. This way it is available when writting the log-file + globalBlock->SetFitRange(fFitStartTime, 0); + globalBlock->SetFitRange(fFitEndTime, 1); + } + } + if ((fFitStartTime == PMUSR_UNDEFINED) || (fFitEndTime == PMUSR_UNDEFINED)) { + fFitStartTime = (fGoodBins[0] - fT0s[0]) * fTimeResolution; // (fgb-t0)*dt + fFitEndTime = (fGoodBins[1] - fT0s[0]) * fTimeResolution; // (lgb-t0)*dt + cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << endl; + cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; + } +} diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index 7013ee94..dd0ecca1 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -1054,49 +1054,6 @@ PRunData* PRunListCollection::GetAsymmetryRRF(UInt_t index, EDataSwitch tag) return data; } -//-------------------------------------------------------------------------- -// GetAsymmetryBNMR (public) -//-------------------------------------------------------------------------- -/** - *

Get a processed asymmetry BNMR data set. - * - * return: - * - pointer to the run data set (processed data) if data set is found - * - null pointer otherwise - * - * \param index msr-file run index - * \param tag kIndex -> data at index, kRunNo -> data of given run no - */ -PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) -{ - PRunData *data = 0; - - switch (tag) { - case kIndex: // called from musrfit when dumping the data - if (index > fRunAsymmetryBNMRList.size()) { - cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; - cerr << endl; - return 0; - } - - fRunAsymmetryBNMRList[index]->CalcTheory(); - data = fRunAsymmetryBNMRList[index]->GetData(); - break; - case kRunNo: // called from PMusrCanvas - for (UInt_t i=0; iGetRunNo() == index) { - data = fRunAsymmetryBNMRList[i]->GetData(); - break; - } - } - break; - default: // error - break; - } - - return data; -} - //-------------------------------------------------------------------------- // GetMuMinus (public) //-------------------------------------------------------------------------- diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h new file mode 100644 index 00000000..ec2f80a7 --- /dev/null +++ b/src/include/PRunAsymmetryBNMR.h @@ -0,0 +1,89 @@ +/*************************************************************************** + + PRunAsymmetry.h + + Author: Andreas Suter + e-mail: andreas.suter@psi.ch + +***************************************************************************/ + +/*************************************************************************** + * Copyright (C) 2007-2016 by Andreas Suter * + * andreas.suter@psi.ch * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _PRUNASYMMETRYBNMR_H_ +#define _PRUNASYMMETRYBNMR_H_ + +#include "PRunBase.h" + +//--------------------------------------------------------------------------- +/** + *

Class handling the asymmetry fit. + */ +class PRunAsymmetryBNMR : public PRunBase +{ + public: + PRunAsymmetryBNMR(); + PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawData, UInt_t runNo, EPMusrHandleTag tag); + virtual ~PRunAsymmetryBNMR(); + + virtual Double_t CalcChiSquare(const std::vector& par); + virtual Double_t CalcChiSquareExpected(const std::vector& par); + virtual Double_t CalcMaxLikelihood(const std::vector& par); + virtual void CalcTheory(); + + virtual UInt_t GetNoOfFitBins(); + + virtual void SetFitRangeBin(const TString fitRange); + + virtual Int_t GetStartTimeBin() { return fStartTimeBin; } + virtual Int_t GetEndTimeBin() { return fEndTimeBin; } + virtual Int_t GetPacking() { return fPacking; } + + protected: + virtual void CalcNoOfFitBins(); + virtual Bool_t PrepareData(); + virtual Bool_t PrepareFitData(); + virtual Bool_t PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]); + virtual Bool_t PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]); + + private: + UInt_t fAlphaBetaTag; ///< \f$ 1 \to \alpha = \beta = 1\f$; \f$ 2 \to \alpha \neq 1, \beta = 1\f$; \f$ 3 \to \alpha = 1, \beta \neq 1\f$; \f$ 4 \to \alpha \neq 1, \beta \neq 1\f$. + UInt_t fNoOfFitBins; ///< number of bins to be be fitted + Int_t fPacking; ///< packing for this particular run. Either given in the RUN- or GLOBAL-block. + + PDoubleVector fForward; ///< forward histo data + PDoubleVector fForwardErr; ///< forward histo errors + PDoubleVector fBackward; ///< backward histo data + PDoubleVector fBackwardErr; ///< backward histo errors + + Int_t fGoodBins[4]; ///< keep first/last good bins. 0=fgb, 1=lgb (forward); 2=fgb, 3=lgb (backward) + + Int_t fStartTimeBin; ///< bin at which the fit starts + Int_t fEndTimeBin; ///< bin at which the fit ends + + Bool_t SubtractFixBkg(); + Bool_t SubtractEstimatedBkg(); + + virtual Bool_t GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlock, PUIntVector &forwardHisto, PUIntVector &backwardHistoNo); + virtual Bool_t GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2]); + virtual void GetProperFitRange(PMsrGlobalBlock *globalBlock); +}; + +#endif // _PRUNASYMMETRYBNMR_H_ From bcd1c98ad276b99bc6d93ec1500dc16d7dbe7d24 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Thu, 16 Aug 2018 23:17:39 +0200 Subject: [PATCH 62/87] More work towards implementation of beta-NMR asymmetry calculation --- src/classes/PMsrHandler.cpp | 60 +++++++++++++++++++++++++++++ src/classes/PMusrCanvas.cpp | 11 ++++++ src/classes/PRunAsymmetryBNMR.cpp | 1 + src/external/libBNMR/ExpRlx-MUD.msr | 6 +-- src/include/PMusrCanvas.h | 2 +- 5 files changed, 76 insertions(+), 4 deletions(-) diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index c57cf12b..9c56192f 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -1173,6 +1173,9 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) case MSR_PLOT_MU_MINUS: fout << "PLOT " << fPlots[plotNo].fPlotType << " (mu minus plot)" << std::endl; break; + case MSR_PLOT_BNMR: + fout << "PLOT " << fPlots[plotNo].fPlotType << " (beta-NMR asymmetry plot)" << endl; + break; case MSR_PLOT_NON_MUSR: fout << "PLOT " << fPlots[plotNo].fPlotType << " (non muSR plot)" << std::endl; break; @@ -2275,6 +2278,9 @@ Int_t PMsrHandler::WriteMsrFile(const Char_t *filename, std::map> 2=forward-backward asym,"; std::cerr << std::endl << ">> 3=forward-backward RRF asym,"; std::cerr << std::endl << ">> 4=mu minus single histo,"; + std::cerr << std::endl << ">> 5=forward-backward beta-NMR asym,"; std::cerr << std::endl << ">> 8=non muSR."; std::cerr << std::endl << ">> is the list of runs, e.g. runs 1 3"; std::cerr << std::endl << ">> range is optional"; @@ -5871,6 +5879,58 @@ Bool_t PMsrHandler::CheckRunBlockIntegrity() fRuns[i].SetPacking(1); } break; + case PRUN_ASYMMETRY_BNMR: + // check alpha + if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> alpha parameter number missing which is needed for an asymmetry fit."; + cerr << endl << ">> Consider to check the manual ;-)" << endl; + return false; + } + // check that there is a forward parameter number + if (fRuns[i].GetForwardHistoNo() == -1) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> forward histogram number not defined. Necessary for asymmetry fits." << endl; + return false; + } + // check that there is a backward parameter number + if (fRuns[i].GetBackwardHistoNo() == -1) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> backward histogram number not defined. Necessary for asymmetry fits." << endl; + return false; + } + // check fit range + if (!fRuns[i].IsFitRangeInBin()) { // fit range given as times in usec + if ((fRuns[i].GetFitRange(0) == PMUSR_UNDEFINED) || (fRuns[i].GetFitRange(1) == PMUSR_UNDEFINED)) { + if ((fGlobal.GetFitRange(0) == PMUSR_UNDEFINED) || (fGlobal.GetFitRange(1) == PMUSR_UNDEFINED)) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> Fit range is not defined, also NOT present in the GLOBAL block. Necessary for asymmetry fits." << endl; + return false; + } + } + } + // check number of T0's provided + if ((fRuns[i].GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize()) && + (fGlobal.GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize())) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << " in forward. Needs to be fixed." << endl; + cerr << endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << ". Needs to be fixed." << endl; + return false; + } + if ((fRuns[i].GetT0BinSize() > 2*fRuns[i].GetBackwardHistoNoSize()) && + (fGlobal.GetT0BinSize() > 2*fRuns[i].GetBackwardHistoNoSize())) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + cerr << endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << " in backward. Needs to be fixed." << endl; + cerr << endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << ". Needs to be fixed." << endl; + return false; + } + // check packing + if ((fRuns[i].GetPacking() == -1) && (fGlobal.GetPacking() == -1)) { + cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **WARNING** in RUN block number " << i+1; + cerr << endl << ">> Packing is neither defined here, nor in the GLOBAL block, will set it to 1." << endl; + fRuns[i].SetPacking(1); + } + break; case PRUN_ASYMMETRY_RRF: // check alpha if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index a4b42f19..fa93311e 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -1610,6 +1610,7 @@ void PMusrCanvas::ExportData(const Char_t *fileName) case MSR_PLOT_SINGLE_HISTO: case MSR_PLOT_SINGLE_HISTO_RRF: case MSR_PLOT_ASYM: + case MSR_PLOT_BNMR: case MSR_PLOT_ASYM_RRF: case MSR_PLOT_MU_MINUS: if (fDifferenceView) { // difference view plot @@ -2771,6 +2772,8 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) // make sure that for asymmetry the y-range is initialized reasonably if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) dataSet.dataRange->SetYRange(-0.4, 0.4); + if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR) + dataSet.dataRange->SetYRange(-0.4, 0.4); // extract necessary range information if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() == 0) && !fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fUseFitRanges) { // no range information at all @@ -2785,6 +2788,7 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) fXmax = end; } if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) || + (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR) || (fMsrHandler->GetMsrRunList()->at(runNo).IsLifetimeCorrected())) { fYRangePresent = true; fYmin = -0.4; @@ -2833,6 +2837,7 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) // make sure that for asymmetry the y-range is initialized reasonably if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) || + (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR) || (fMsrHandler->GetMsrRunList()->at(runNo).IsLifetimeCorrected())) { dataSet.dataRange->SetYRange(-0.4, 0.4); } @@ -4721,6 +4726,9 @@ void PMusrCanvas::PlotData(Bool_t unzoom) case MSR_PLOT_ASYM: yAxisTitle = "Asymmetry"; break; + case MSR_PLOT_BNMR: + yAxisTitle = "Asymmetry"; + break; case MSR_PLOT_MU_MINUS: yAxisTitle = "N(t) per bin"; break; @@ -6146,6 +6154,9 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) case MSR_PLOT_ASYM: yAxisTitle = ""; break; + case MSR_PLOT_BNMR: + yAxisTitle = ""; + break; case MSR_PLOT_MU_MINUS: yAxisTitle = " per bin"; break; diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index b55052a0..a3ff5a29 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -535,6 +535,7 @@ Bool_t PRunAsymmetryBNMR::PrepareData() } // keep the time resolution in (us) + // possibility to rescale for betaNMR fTimeResolution = runData->GetTimeResolution()/1.0e3; cout.precision(10); cout << endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; diff --git a/src/external/libBNMR/ExpRlx-MUD.msr b/src/external/libBNMR/ExpRlx-MUD.msr index ef423491..404a46ef 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx-MUD.msr @@ -24,7 +24,7 @@ fun1 = 0.5 * map1 * map2 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) -fittype 2 (asymmetry fit) +fittype 5 (asymmetry fit) alpha 1 forward 3 backward 4 @@ -37,7 +37,7 @@ fit 0.5 8 packing 5 RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) -fittype 2 (asymmetry fit) +fittype 5 (asymmetry fit) alpha 1 forward 5 backward 6 @@ -57,7 +57,7 @@ HESSE SAVE ############################################################### -PLOT 2 (asymmetry plot) +PLOT 5 (asymmetry plot) runs 1 2 use_fit_ranges view_packing 10 diff --git a/src/include/PMusrCanvas.h b/src/include/PMusrCanvas.h index 89daca5a..2747db4e 100644 --- a/src/include/PMusrCanvas.h +++ b/src/include/PMusrCanvas.h @@ -246,7 +246,7 @@ class PMusrCanvas : public TObject, public TQObject Bool_t fDifferenceView; ///< tag showing that the shown data, fourier, are the difference between data and theory Int_t fCurrentPlotView; ///< tag showing what the current plot view is: data, fourier, ... Int_t fPreviousPlotView; ///< tag showing the previous plot view - Int_t fPlotType; ///< plot type tag: -1 == undefined, MSR_PLOT_SINGLE_HISTO == single histogram, MSR_PLOT_ASYM == asymmetry, MSR_PLOT_MU_MINUS == mu minus (not yet implemented), MSR_PLOT_NON_MUSR == non-muSR + Int_t fPlotType; ///< plot type tag: -1 == undefined, MSR_PLOT_SINGLE_HISTO == single histogram, MSR_PLOT_ASYM == asymmetry, MSR_PLOT_BNMR == beta-NMR asymmetry, MSR_PLOT_MU_MINUS == mu minus (not yet implemented), MSR_PLOT_NON_MUSR == non-muSR Int_t fPlotNumber; ///< plot number Bool_t fXRangePresent, fYRangePresent; ///< flag indicating if x-/y-range is present From a2d47a09f82f6e26981485986031a1539d13008f Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 17 Aug 2018 16:08:04 +0200 Subject: [PATCH 63/87] First working duplicate asymmetry class for beta-NMR. --- src/classes/PMusrCanvas.cpp | 4 +- src/classes/PRunListCollection.cpp | 12 +-- src/musrt0.cpp | 164 +++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+), 9 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index fa93311e..8cc30344 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -2770,9 +2770,7 @@ void PMusrCanvas::HandleDataSet(UInt_t plotNo, UInt_t runNo, PRunData *data) size = data->GetValue()->size(); dataSet.dataRange->SetXRange(start, end); // full possible range // make sure that for asymmetry the y-range is initialized reasonably - if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) - dataSet.dataRange->SetYRange(-0.4, 0.4); - if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR) + if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_ASYM) || (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fPlotType == MSR_PLOT_BNMR)) dataSet.dataRange->SetYRange(-0.4, 0.4); // extract necessary range information if ((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() == 0) && diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index dd0ecca1..0edab270 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -987,19 +987,19 @@ PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) switch (tag) { case kIndex: // called from musrfit when dumping the data - if (index > fRunAsymmetryList.size()) { + if (index > fRunAsymmetryBNMRList.size()) { cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; cerr << endl; return 0; } - fRunAsymmetryList[index]->CalcTheory(); - data = fRunAsymmetryList[index]->GetData(); + fRunAsymmetryBNMRList[index]->CalcTheory(); + data = fRunAsymmetryBNMRList[index]->GetData(); break; case kRunNo: // called from PMusrCanvas - for (UInt_t i=0; iGetRunNo() == index) { - data = fRunAsymmetryList[i]->GetData(); + for (UInt_t i=0; iGetRunNo() == index) { + data = fRunAsymmetryBNMRList[i]->GetData(); break; } } diff --git a/src/musrt0.cpp b/src/musrt0.cpp index 81f13738..b6e9c770 100644 --- a/src/musrt0.cpp +++ b/src/musrt0.cpp @@ -645,6 +645,169 @@ Int_t main(Int_t argc, Char_t *argv[]) } } } + break; + case MSR_FITTYPE_BNMR: + if ((runList->at(i).GetRunNameSize() == 1) && (runList->at(i).GetForwardHistoNoSize() == 1)) { // no addruns / no grouping + // handle forward histo + // get histo number + histoNo = runList->at(i).GetForwardHistoNo(); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 0); + // set data range as well if firstGoodBinOffset is given + if (firstGoodBinOffsetPresent) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 0); + runList->at(i).SetDataRange(end, 1); + } + // handle backward histo + // get histo number + histoNo = runList->at(i).GetBackwardHistoNo(); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 1); + // set data range as well if firstGoodBinOffset is given + if (firstGoodBinOffsetPresent) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 2); + runList->at(i).SetDataRange(end, 3); + } + } else if ((runList->at(i).GetRunNameSize() > 1) && (runList->at(i).GetForwardHistoNoSize() == 1)) { // addruns / no grouping + // handle forward histo + // get histo number + histoNo = runList->at(i).GetForwardHistoNo(); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 0); + // set data range as well if firstGoodBinOffset is given + if (firstGoodBinOffsetPresent) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 0); + runList->at(i).SetDataRange(end, 1); + } + // handle addruns + for (UInt_t j=1; jat(i).GetRunNameSize(); j++) { + runName = runList->at(i).GetRunName(j); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetAddT0Bin(t0Bin, j-1, 0); + } + // handle backward histo + // get histo number + histoNo = runList->at(i).GetBackwardHistoNo(); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 1); + // set data range as well if firstGoodBinOffset is given + if (firstGoodBinOffsetPresent) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 2); + runList->at(i).SetDataRange(end, 3); + } + // handle addruns + for (UInt_t j=1; jat(i).GetRunNameSize(); j++) { + runName = runList->at(i).GetRunName(j); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetAddT0Bin(t0Bin, j-1, 1); + } + } else if ((runList->at(i).GetRunNameSize() == 1) && (runList->at(i).GetForwardHistoNoSize() > 1)) { // no addruns / grouping + // handle forward histo + for (UInt_t j=0; jat(i).GetForwardHistoNoSize(); j++) { + // get histo number + histoNo = runList->at(i).GetForwardHistoNo(j); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 2*j); + if (firstGoodBinOffsetPresent && (j==0)) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 0); + runList->at(i).SetDataRange(end, 1); + } + } + // handle backward histo + for (UInt_t j=0; jat(i).GetBackwardHistoNoSize(); j++) { + // get histo number + histoNo = runList->at(i).GetBackwardHistoNo(j); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 2*j+1); + if (firstGoodBinOffsetPresent && (j==0)) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 2); + runList->at(i).SetDataRange(end, 3); + } + } + } else { // addruns / grouping + // handle forward histo + for (UInt_t j=0; jat(i).GetForwardHistoNoSize(); j++) { + // get histo number + histoNo = runList->at(i).GetForwardHistoNo(j); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 2*j); + if (firstGoodBinOffsetPresent && (j==0)) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 0); + runList->at(i).SetDataRange(end, 1); + } + // handle addruns + for (UInt_t k=1; kat(i).GetRunNameSize(); k++) { + runName = runList->at(i).GetRunName(k); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetAddT0Bin(t0Bin, k-1, 2*j); + } + } + // handle backward histo + for (UInt_t j=0; jat(i).GetBackwardHistoNoSize(); j++) { + // get histo number + histoNo = runList->at(i).GetBackwardHistoNo(j); + runName = runList->at(i).GetRunName(); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetT0Bin(t0Bin, 2*j+1); + if (firstGoodBinOffsetPresent && (j==0)) { + start = t0Bin + firstGoodBinOffset; + end = dataHandler->GetRunData(*runName)->GetDataBin(histoNo)->size(); + runList->at(i).SetDataRange(start, 2); + runList->at(i).SetDataRange(end, 3); + } + // handle addruns + for (UInt_t k=1; kat(i).GetRunNameSize(); k++) { + runName = runList->at(i).GetRunName(k); + // get bin position of maximal data + t0Bin = musrt0_getMaxBin(dataHandler->GetRunData(*runName)->GetDataBin(histoNo)); + // set t0 to maximum data position + runList->at(i).SetAddT0Bin(t0Bin, k-1, 2*j+1); + } + } + } break; default: break; @@ -806,6 +969,7 @@ Int_t main(Int_t argc, Char_t *argv[]) } break; case MSR_FITTYPE_ASYM: + case MSR_FITTYPE_BNMR: case MSR_FITTYPE_ASYM_RRF: if ((runList->at(i).GetRunNameSize() == 1) && (runList->at(i).GetForwardHistoNoSize() == 1)) { // no addruns / no grouping // feed necessary data forward From 2b00c92139d0a2c177b2c5a2b596aa92b338e1e9 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sat, 18 Aug 2018 23:45:28 +0200 Subject: [PATCH 64/87] Fixed chisqr calculation bug in BNMR --- src/classes/PFitterFcn.cpp | 2 ++ src/external/libBNMR/ExpRlx-MUD.msr | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/classes/PFitterFcn.cpp b/src/classes/PFitterFcn.cpp index d04ac1ee..8e82986b 100644 --- a/src/classes/PFitterFcn.cpp +++ b/src/classes/PFitterFcn.cpp @@ -77,6 +77,7 @@ Double_t PFitterFcn::operator()(const std::vector& par) const value += fRunListCollection->GetSingleHistoRRFChisq(par); value += fRunListCollection->GetAsymmetryChisq(par); value += fRunListCollection->GetAsymmetryRRFChisq(par); + value += fRunListCollection->GetAsymmetryBNMRChisq(par); value += fRunListCollection->GetMuMinusChisq(par); value += fRunListCollection->GetNonMusrChisq(par); } else { // max likelihood @@ -84,6 +85,7 @@ Double_t PFitterFcn::operator()(const std::vector& par) const value += fRunListCollection->GetSingleHistoRRFMaximumLikelihood(par); value += fRunListCollection->GetAsymmetryMaximumLikelihood(par); value += fRunListCollection->GetAsymmetryRRFMaximumLikelihood(par); + value += fRunListCollection->GetAsymmetryBNMRMaximumLikelihood(par); value += fRunListCollection->GetMuMinusMaximumLikelihood(par); value += fRunListCollection->GetNonMusrMaximumLikelihood(par); } diff --git a/src/external/libBNMR/ExpRlx-MUD.msr b/src/external/libBNMR/ExpRlx-MUD.msr index 404a46ef..da4e9a70 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx-MUD.msr @@ -24,7 +24,7 @@ fun1 = 0.5 * map1 * map2 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) -fittype 5 (asymmetry fit) +fittype 5 (beta-NMR fit) alpha 1 forward 3 backward 4 @@ -37,7 +37,7 @@ fit 0.5 8 packing 5 RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) -fittype 5 (asymmetry fit) +fittype 5 (beta-NMR fit) alpha 1 forward 5 backward 6 @@ -57,7 +57,7 @@ HESSE SAVE ############################################################### -PLOT 5 (asymmetry plot) +PLOT 5 (beta-NMR asymmetry plot) runs 1 2 use_fit_ranges view_packing 10 @@ -68,9 +68,9 @@ FOURIER units MHz # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s' fourier_power 12 apodization STRONG # NONE, WEAK, MEDIUM, STRONG -plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE +plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2015-04-14 11:00:19 +STATISTIC --- 2018-08-18 23:43:35 chisq = 399.5, NDF = 290, chisq/NDF = 1.377736 From 9d76afdef96f3543f115a82d9e8bcfd82db76f38 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sun, 19 Aug 2018 23:37:48 +0200 Subject: [PATCH 65/87] Start substract asymmetry implementation. --- src/classes/PRunAsymmetryBNMR.cpp | 738 +++++++++++------------------- src/include/PRunAsymmetryBNMR.h | 12 +- 2 files changed, 286 insertions(+), 464 deletions(-) diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index a3ff5a29..07bb2c3c 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -164,10 +164,15 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD */ PRunAsymmetryBNMR::~PRunAsymmetryBNMR() { - fForward.clear(); - fForwardErr.clear(); - fBackward.clear(); - fBackwardErr.clear(); + fForwardp.clear(); + fForwardpErr.clear(); + fBackwardp.clear(); + fBackwardpErr.clear(); + + fForwardm.clear(); + fForwardmErr.clear(); + fBackwardm.clear(); + fBackwardmErr.clear(); } //-------------------------------------------------------------------------- @@ -595,32 +600,34 @@ Bool_t PRunAsymmetryBNMR::PrepareData() } // set forward/backward histo data of the first group - fForward.resize(forward[0].size()); - fBackward.resize(backward[0].size()); - for (UInt_t i=0; iGetDataBin(forwardHistoNo[i])->size(); j++) { // loop over the bin indices - // make sure that the index stays within proper range - if ((j+fT0s[2*i]-fT0s[0] >= 0) && (j+fT0s[2*i]-fT0s[0] < runData->GetDataBin(forwardHistoNo[i])->size())) { - fForward[j] += forward[i][j+(Int_t)fT0s[2*i]-(Int_t)fT0s[0]]; - } - } - } + // // group histograms, add all the remaining forward histograms of the group + // for (UInt_t i=1; iGetDataBin(forwardHistoNo[i])->size(); j++) { // loop over the bin indices + // // make sure that the index stays within proper range + // if ((j+fT0s[2*i]-fT0s[0] >= 0) && (j+fT0s[2*i]-fT0s[0] < runData->GetDataBin(forwardHistoNo[i])->size())) { + // fForward[j] += forward[i][j+(Int_t)fT0s[2*i]-(Int_t)fT0s[0]]; + // } + // } + // } - // group histograms, add all the remaining backward histograms of the group - for (UInt_t i=1; iGetDataBin(backwardHistoNo[i])->size(); j++) { // loop over the bin indices - // make sure that the index stays within proper range - if ((j+fT0s[2*i+1]-fT0s[1] >= 0) && (j+fT0s[2*i+1]-fT0s[1] < runData->GetDataBin(backwardHistoNo[i])->size())) { - fBackward[j] += backward[i][j+(Int_t)fT0s[2*i+1]-(Int_t)fT0s[1]]; - } - } - } + // // group histograms, add all the remaining backward histograms of the group + // for (UInt_t i=1; iGetDataBin(backwardHistoNo[i])->size(); j++) { // loop over the bin indices + // // make sure that the index stays within proper range + // if ((j+fT0s[2*i+1]-fT0s[1] >= 0) && (j+fT0s[2*i+1]-fT0s[1] < runData->GetDataBin(backwardHistoNo[i])->size())) { + // fBackward[j] += backward[i][j+(Int_t)fT0s[2*i+1]-(Int_t)fT0s[1]]; + // } + // } + // } // subtract background from histogramms ------------------------------------------ if (fRunInfo->GetBkgFix(0) == PMUSR_UNDEFINED) { // no fixed background given @@ -663,10 +670,7 @@ Bool_t PRunAsymmetryBNMR::PrepareData() status = PrepareFitData(); break; case kView: - if (fMsrInfo->GetMsrPlotList()->at(0).fRRFPacking == 0) - status = PrepareViewData(runData, histoNo); - else - status = PrepareRRFViewData(runData, histoNo); + status = PrepareViewData(runData, histoNo); break; default: status = false; @@ -783,64 +787,90 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() } // check if start is within histogram bounds - if ((start[0] < 0) || (start[0] >= fForward.size()) || - (start[1] < 0) || (start[1] >= fBackward.size())) { + if ((start[0] < 0) || (start[0] >= fForwardp.size()) || + (start[1] < 0) || (start[1] >= fBackwardp.size())) { cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + cerr << endl << ">> histo lengths (f/b) = (" << fForwardp.size() << "/" << fBackwardp.size() << ")."; cerr << endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; return false; } // check if end is within histogram bounds - if ((end[0] < 0) || (end[0] >= fForward.size()) || - (end[1] < 0) || (end[1] >= fBackward.size())) { + if ((end[0] < 0) || (end[0] >= fForwardp.size()) || + (end[1] < 0) || (end[1] >= fBackwardp.size())) { cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForward.size() << "/" << fBackward.size() << ")."; + cerr << endl << ">> histo lengths (f/b) = (" << fForwardp.size() << "/" << fBackwardp.size() << ")."; cerr << endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; return false; } // calculate background - Double_t bkg[2] = {0.0, 0.0}; - Double_t errBkg[2] = {0.0, 0.0}; + Double_t bkgp[2] = {0.0, 0.0}; + Double_t errBkgp[2] = {0.0, 0.0}; + Double_t bkgn[2] = {0.0, 0.0}; + Double_t errBkgn[2] = {0.0, 0.0}; // forward - for (UInt_t i=start[0]; i<=end[0]; i++) - bkg[0] += fForward[i]; - errBkg[0] = TMath::Sqrt(bkg[0])/(end[0] - start[0] + 1); - bkg[0] /= static_cast(end[0] - start[0] + 1); - cout << endl << ">> estimated forward histo background: " << bkg[0]; + for (UInt_t i=start[0]; i<=end[0]; i++) { + bkgp[0] += fForwardp[i]; + bkgm[0] += fForwardm[i]; + } + errBkgp[0] = TMath::Sqrt(bkgp[0])/(end[0] - start[0] + 1); + bkgp[0] /= static_cast(end[0] - start[0] + 1); + cout << endl << ">> estimated pos hel forward histo background: " << bkgp[0]; + errBkgm[0] = TMath::Sqrt(bkgp[0])/(end[0] - start[0] + 1); + bkgm[0] /= static_cast(end[0] - start[0] + 1); + cout << endl << ">> estimated neg hel forward histo background: " << bkgm[0]; // backward - for (UInt_t i=start[1]; i<=end[1]; i++) - bkg[1] += fBackward[i]; - errBkg[1] = TMath::Sqrt(bkg[1])/(end[1] - start[1] + 1); - bkg[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated backward histo background: " << bkg[1] << endl; + for (UInt_t i=start[1]; i<=end[1]; i++) { + bkgp[1] += fBackwardp[i]; + bkgm[1] += fBackwardm[i]; + } + errBkgp[1] = TMath::Sqrt(bkgp[1])/(end[1] - start[1] + 1); + bkgp[1] /= static_cast(end[1] - start[1] + 1); + cout << endl << ">> estimated pos hel backward histo background: " << bkgp[1] << endl; + errBkgm[1] = TMath::Sqrt(bkgm[1])/(end[1] - start[1] + 1); + bkgm[1] /= static_cast(end[1] - start[1] + 1); + cout << endl << ">> estimated neg hel backward histo background: " << bkgm[1] << endl; // correct error for forward, backward Double_t errVal = 0.0; - for (UInt_t i=0; i 0.0) - errVal = TMath::Sqrt(fForward[i]+errBkg[0]*errBkg[0]); + for (UInt_t i=0; i 0.0) + errVal = TMath::Sqrt(fForwardp[i]+errBkgp[0]*errBkgp[0]); else errVal = 1.0; - fForwardErr.push_back(errVal); - if (fBackward[i] > 0.0) - errVal = TMath::Sqrt(fBackward[i]+errBkg[1]*errBkg[1]); + fForwardpErr.push_back(errVal); + if (fBackwardp[i] > 0.0) + errVal = TMath::Sqrt(fBackwardp[i]+errBkgp[1]*errBkgp[1]); else errVal = 1.0; - fBackwardErr.push_back(errVal); + fBackwardpErr.push_back(errVal); + if (fForwardm[i] > 0.0) + errVal = TMath::Sqrt(fForwardm[i]+errBkgm[0]*errBkgm[0]); + else + errVal = 1.0; + fForwardmErr.push_back(errVal); + if (fBackwardm[i] > 0.0) + errVal = TMath::Sqrt(fBackwardm[i]+errBkgm[1]*errBkgm[1]); + else + errVal = 1.0; + fBackwardmErr.push_back(errVal); } // subtract background from data - for (UInt_t i=0; iSetBkgEstimated(bkg[0], 0); - fRunInfo->SetBkgEstimated(bkg[1], 1); + fRunInfo->SetBkgEstimated(bkgp[0], 0); + fRunInfo->SetBkgEstimated(bkgp[1], 1); + fRunInfo->SetBkgEstimated(bkgm[0], 3); + fRunInfo->SetBkgEstimated(bkgm[1], 4); return true; } @@ -865,96 +895,143 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() // first rebin the data, than calculate the asymmetry // everything looks fine, hence fill packed forward and backward histo - PRunData forwardPacked; - PRunData backwardPacked; - Double_t value = 0.0; - Double_t error = 0.0; + PRunData forwardpPacked; + PRunData backwardpPacked; + PRunData forwardmPacked; + PRunData backwarmpPacked; + Double_t valuep = 0.0; + Double_t errorp = 0.0; + Double_t valuem = 0.0; + Double_t errorm = 0.0; // forward for (Int_t i=fGoodBins[0]; i 1 if (((i-fGoodBins[0]) % fPacking == 0) && (i != fGoodBins[0])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin - value /= fPacking; - forwardPacked.AppendValue(value); - if (value == 0.0) - forwardPacked.AppendErrorValue(1.0); - else - forwardPacked.AppendErrorValue(TMath::Sqrt(error)/fPacking); - value = 0.0; - error = 0.0; + valuep /= fPacking; + valuem /= fPacking; + forwardpPacked.AppendValue(valuep); + forwardmPacked.AppendValue(valuem); + if (valuep == 0.0) { + forwardpPacked.AppendErrorValue(1.0); + } else { + forwardpPacked.AppendErrorValue(TMath::Sqrt(errorp)/fPacking); + } + if (valuem == 0.0) { + forwardmPacked.AppendErrorValue(1.0); + } else { + forwardmPacked.AppendErrorValue(TMath::Sqrt(errorm)/fPacking); + } + valuep = 0.0; + errorp = 0.0; + valuem = 0.0; + errorm = 0.0; } - value += fForward[i]; - error += fForwardErr[i]*fForwardErr[i]; + valuep += fForwardp[i]; + errorp += fForwardpErr[i]*fForwardpErr[i]; + valuem += fForwardm[i]; + errorm += fForwardmErr[i]*fForwardmErr[i]; } } // backward for (Int_t i=fGoodBins[2]; i 1 if (((i-fGoodBins[2]) % fPacking == 0) && (i != fGoodBins[2])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin - value /= fPacking; - backwardPacked.AppendValue(value); - if (value == 0.0) - backwardPacked.AppendErrorValue(1.0); - else - backwardPacked.AppendErrorValue(TMath::Sqrt(error)/fPacking); - value = 0.0; - error = 0.0; + valuep /= fPacking; + valuem /= fPacking; + backwardpPacked.AppendValue(valuep); + backwardmPacked.AppendValue(valuem); + if (valuep == 0.0) { + backwardpPacked.AppendErrorValue(1.0); + } else { + backwardpPacked.AppendErrorValue(TMath::Sqrt(errorp)/fPacking); + } + if (valuem == 0.0) { + backwardmPacked.AppendErrorValue(1.0); + } else { + backwardmPacked.AppendErrorValue(TMath::Sqrt(errorm)/fPacking); + } + valuep = 0.0; + errorp = 0.0; + valuem = 0.0; + errorm = 0.0; } - value += fBackward[i]; - error += fBackwardErr[i]*fBackwardErr[i]; + valuep += fBackwardp[i]; + errorp += fBackwardpErr[i]*fBackwardpErr[i]; + valuem += fBackwardm[i]; + errorm += fBackwardmErr[i]*fBackwardmErr[i]; } } // check if packed forward and backward hist have the same size, otherwise take the minimum size - UInt_t noOfBins = forwardPacked.GetValue()->size(); - if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { - if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) - noOfBins = backwardPacked.GetValue()->size(); + UInt_t noOfBins = forwardpPacked.GetValue()->size(); + if (forwardpPacked.GetValue()->size() != backwardpPacked.GetValue()->size()) { + if (forwardpPacked.GetValue()->size() > backwardpPacked.GetValue()->size()) + noOfBins = backwardpPacked.GetValue()->size(); } // form asymmetry including error propagation - Double_t asym; - Double_t f, b, ef, eb; + Double_t asym,error; + Double_t fp, bp, efp, ebp; + Double_t fm, bm, efm, ebm; // fill data time start, and step // data start at data_start-t0 shifted by (pack-1)/2 fData.SetDataTimeStart(fTimeResolution*((Double_t)fGoodBins[0]-fT0s[0]+(Double_t)(fPacking-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*(Double_t)fPacking); for (UInt_t i=0; iat(i); - b = backwardPacked.GetValue()->at(i); - ef = forwardPacked.GetError()->at(i); - eb = backwardPacked.GetError()->at(i); + fp = forwardpPacked.GetValue()->at(i); + bp = backwardpPacked.GetValue()->at(i); + efp = forwardpPacked.GetError()->at(i); + ebp = backwardpPacked.GetError()->at(i); + fm = forwardmPacked.GetValue()->at(i); + bm = backwardmPacked.GetValue()->at(i); + efm = forwardmPacked.GetError()->at(i); + ebm = backwardmPacked.GetError()->at(i); // check that there are indeed bins - if (f+b != 0.0) - asym = (f-b) / (f+b); + if (fp+bp != 0.0) + asym = (fp-bp) / (fp+bp) - (fm-bm) / (fm+bm); else asym = 0.0; fData.AppendValue(asym); // calculate the error - if (f+b != 0.0) - error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); + if (fp+bp != 0.0) + errorp = 2.0/((fp+bp)*(fp+bp))*TMath::Sqrt(bp*bp*efp*efp+ebp*ebp*fp*fp); else - error = 1.0; + errorp = 1.0; + if (fm+bm != 0.0) + errorm = 2.0/((fm+bm)*(fm+bm))*TMath::Sqrt(bm*bm*efm*efm+ebm*ebm*fm*fm); + else + errorp = 1.0; + + error = TMath::Sqrt(errorp*errorp+errorm*errorm); fData.AppendErrorValue(error); } CalcNoOfFitBins(); // clean up - fForward.clear(); - fForwardErr.clear(); - fBackward.clear(); - fBackwardErr.clear(); + fForwardp.clear(); + fForwardpErr.clear(); + fBackwardp.clear(); + fBackwardpErr.clear(); + fForwardm.clear(); + fForwardmErr.clear(); + fBackwardm.clear(); + fBackwardmErr.clear(); return true; } @@ -1065,67 +1142,100 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 } // everything looks fine, hence fill packed forward and backward histo - PRunData forwardPacked; - PRunData backwardPacked; - Double_t value = 0.0; - Double_t error = 0.0; + PRunData forwardpPacked; + PRunData backwardpPacked; + PRunData forwardmPacked; + PRunData backwardmPacked; + Double_t valuep = 0.0; + Double_t errorp = 0.0; + Double_t valuem = 0.0; + Double_t errorm = 0.0; // forward for (Int_t i=start[0]; i 1 if (((i-start[0]) % packing == 0) && (i != start[0])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin - value /= packing; - forwardPacked.AppendValue(value); - if (value == 0.0) - forwardPacked.AppendErrorValue(1.0); - else - forwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); - value = 0.0; - error = 0.0; + valuep /= packing; + forwardpPacked.AppendValue(valuep); + valuem /= packing; + forwardmPacked.AppendValue(valuem); + if (valuep == 0.0) { + forwardpPacked.AppendErrorValue(1.0); + } else { + forwardpPacked.AppendErrorValue(TMath::Sqrt(errorp)/packing); + } + if (valuem == 0.0) { + forwardmPacked.AppendErrorValue(1.0); + } else { + forwardmPacked.AppendErrorValue(TMath::Sqrt(errorm)/packing); + } + valuep = 0.0; + errorp = 0.0; + valuem = 0.0; + errorm = 0.0; } - value += fForward[i]; - error += fForwardErr[i]*fForwardErr[i]; + valuep += fForwardp[i]; + errorp += fForwardpErr[i]*fForwardpErr[i]; + valuem += fForwardm[i]; + errorm += fForwardmErr[i]*fForwardmErr[i]; } } // backward for (Int_t i=start[1]; i 1 if (((i-start[1]) % packing == 0) && (i != start[1])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin - value /= packing; - backwardPacked.AppendValue(value); - if (value == 0.0) - backwardPacked.AppendErrorValue(1.0); - else - backwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); - value = 0.0; - error = 0.0; + valuep /= packing; + valuem /= packing; + backwardpPacked.AppendValue(valuep); + backwardmPacked.AppendValue(valuem); + if (valuep == 0.0) { + backwardpPacked.AppendErrorValue(1.0); + } else { + backwardpPacked.AppendErrorValue(TMath::Sqrt(errorp)/packing); + } + if (valuem == 0.0) { + backwardmPacked.AppendErrorValue(1.0); + } else { + backwardmPacked.AppendErrorValue(TMath::Sqrt(errorm)/packing); + } + valuep = 0.0; + errorp = 0.0; + valuem = 0.0; + errorm = 0.0; } - value += fBackward[i]; - error += fBackwardErr[i]*fBackwardErr[i]; + valuep += fBackwardp[i]; + errorp += fBackwardpErr[i]*fBackwardpErr[i]; + valuem += fBackwardm[i]; + errorm += fBackwardmErr[i]*fBackwardmErr[i]; } } // check if packed forward and backward hist have the same size, otherwise take the minimum size - UInt_t noOfBins = forwardPacked.GetValue()->size(); - if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { - if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) - noOfBins = backwardPacked.GetValue()->size(); + UInt_t noOfBins = forwardpPacked.GetValue()->size(); + if (forwardpPacked.GetValue()->size() != backwardpPacked.GetValue()->size()) { + if (forwardpPacked.GetValue()->size() > backwardpPacked.GetValue()->size()) + noOfBins = backwardpPacked.GetValue()->size(); } // form asymmetry including error propagation Double_t asym; - Double_t f, b, ef, eb, alpha = 1.0, beta = 1.0; + Double_t fp, bp, efp, ebp, alpha = 1.0, beta = 1.0; + Double_t fm, bm, efm, ebm; // set data time start, and step // data start at data_start-t0 fData.SetDataTimeStart(fTimeResolution*((Double_t)start[0]-t0[0]+(Double_t)(packing-1)/2.0)); @@ -1153,33 +1263,46 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 break; } - for (UInt_t i=0; isize(); i++) { + for (UInt_t i=0; isize(); i++) { // to make the formulae more readable - f = forwardPacked.GetValue()->at(i); - b = backwardPacked.GetValue()->at(i); - ef = forwardPacked.GetError()->at(i); - eb = backwardPacked.GetError()->at(i); + fp = forwardpPacked.GetValue()->at(i); + bp = backwardpPacked.GetValue()->at(i); + efp = forwardpPacked.GetError()->at(i); + ebp = backwardpPacked.GetError()->at(i); + fm = forwardmPacked.GetValue()->at(i); + bm = backwardmPacked.GetValue()->at(i); + efm = forwardmPacked.GetError()->at(i); + ebm = backwardmPacked.GetError()->at(i); // check that there are indeed bins - if (f+b != 0.0) - asym = (alpha*f-b) / (alpha*beta*f+b); + if (fp+bp != 0.0) + asym = (alpha*fp-bp) / (alpha*beta*fp+bp) - (alpha*fm-bm) / (alpha*beta*fm+bm); else asym = 0.0; fData.AppendValue(asym); // calculate the error - if (f+b != 0.0) - error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); + if (fp+bp != 0.0) + errorp = 2.0/((fp+bp)*(fp+bp))*TMath::Sqrt(bp*bp*efp*efp+ebp*ebp*fp*fp); else - error = 1.0; + errorp = 1.0; + if (fm+bm != 0.0) + errorm = 2.0/((fm+bm)*(fm+bm))*TMath::Sqrt(bm*bm*efm*efm+ebm*ebm*fm*fm); + else + errorm = 1.0; + error = TMath::Sqrt(errorp*errorp+errorm*errorm); fData.AppendErrorValue(error); } CalcNoOfFitBins(); // clean up - fForward.clear(); - fForwardErr.clear(); - fBackward.clear(); - fBackwardErr.clear(); + fForwardp.clear(); + fForwardpErr.clear(); + fBackwardp.clear(); + fBackwardpErr.clear(); + fForwardm.clear(); + fForwardmErr.clear(); + fBackwardm.clear(); + fBackwardmErr.clear(); // fill theory vector for kView // calculate functions @@ -1212,311 +1335,6 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 return true; } -//-------------------------------------------------------------------------- -// PrepareRRFViewData (protected) -//-------------------------------------------------------------------------- -/** - *

Prepares the RRF data set for visual representation. This is done the following way: - * -# make all necessary checks - * -# build the asymmetry, \f$ A(t) \f$, WITHOUT packing. - * -# \f$ A_R(t) = A(t) \cdot 2 \cos(\omega_R t + \phi_R) \f$ - * -# do the packing of \f$ A_R(t) \f$ - * -# calculate theory, \f$ T(t) \f$, as close as possible to the time resolution [compatible with the RRF frequency] - * -# \f$ T_R(t) = T(t) \cdot 2 \cos(\omega_R t + \phi_R) \f$ - * -# do the packing of \f$ T_R(t) \f$ - * -# calculate the Kaiser FIR filter coefficients - * -# filter \f$ T_R(t) \f$. - * - * \param runData raw run data needed to perform some crosschecks - * \param histoNo array of the histo numbers form which to build the asymmetry - */ -Bool_t PRunAsymmetryBNMR::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]) -{ - // feed the parameter vector - std::vector par; - PMsrParamList *paramList = fMsrInfo->GetMsrParamList(); - for (UInt_t i=0; isize(); i++) - par.push_back((*paramList)[i].fValue); - - // ------------------------------------------------------------ - // 1. make all necessary checks - // ------------------------------------------------------------ - - // first get start data, end data, and t0 - Int_t start[2] = {fGoodBins[0], fGoodBins[2]}; - Int_t end[2] = {fGoodBins[1], fGoodBins[3]}; - Int_t t0[2] = {(Int_t)fT0s[0], (Int_t)fT0s[1]}; - UInt_t packing = fMsrInfo->GetMsrPlotList()->at(0).fRRFPacking; - - // check if the data ranges and t0's between forward/backward are compatible - Int_t fgb[2]; - if (start[0]-t0[0] != start[1]-t0[1]) { // wrong fgb aligning - if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { - fgb[0] = start[0]; - fgb[1] = t0[1] + start[0]-t0[0]; - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **WARNING** needed to shift backward fgb from "; - cerr << start[1] << " to " << fgb[1] << endl; - } else { - fgb[0] = t0[0] + start[1]-t0[1]; - fgb[1] = start[1]; - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **WARNING** needed to shift forward fgb from "; - cerr << start[1] << " to " << fgb[0] << endl; - } - } else { // fgb aligning is correct - fgb[0] = start[0]; - fgb[1] = start[1]; - } - - Int_t val = fgb[0]-packing*(fgb[0]/packing); - do { - if (fgb[1] - fgb[0] < 0) - val += packing; - } while (val + fgb[1] - fgb[0] < 0); - - start[0] = val; - start[1] = val + fgb[1] - fgb[0]; - - // make sure that there are equal number of rebinned bins in forward and backward - UInt_t noOfBins0 = runData->GetDataBin(histoNo[0])->size()-start[0]; - UInt_t noOfBins1 = runData->GetDataBin(histoNo[1])->size()-start[1]; - if (noOfBins0 > noOfBins1) - noOfBins0 = noOfBins1; - end[0] = start[0] + noOfBins0; - end[1] = start[1] + noOfBins0; - - // check if start, end, and t0 make any sense - // 1st check if start and end are in proper order - for (UInt_t i=0; i<2; i++) { - if (end[i] < start[i]) { // need to swap them - Int_t keep = end[i]; - end[i] = start[i]; - start[i] = keep; - } - // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; - return false; - } - // 3rd check if end is within proper bounds - if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** end data bin doesn't make any sense!"; - cerr << endl; - return false; - } - // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareRRFViewData(): **ERROR** t0 data bin doesn't make any sense!"; - cerr << endl; - return false; - } - } - - // ------------------------------------------------------------ - // 2. build the asymmetry [A(t)] WITHOUT packing. - // ------------------------------------------------------------ - - PDoubleVector forward, forwardErr; - PDoubleVector backward, backwardErr; - Double_t error = 0.0; - // forward - for (Int_t i=start[0]; i backward.size()) - noOfBins = backward.size(); - } - - // form asymmetry including error propagation - PDoubleVector asymmetry, asymmetryErr; - Double_t asym; - Double_t f, b, ef, eb, alpha = 1.0, beta = 1.0; - - // get the proper alpha and beta - switch (fAlphaBetaTag) { - case 1: // alpha == 1, beta == 1 - alpha = 1.0; - beta = 1.0; - break; - case 2: // alpha != 1, beta == 1 - alpha = par[fRunInfo->GetAlphaParamNo()-1]; - beta = 1.0; - break; - case 3: // alpha == 1, beta != 1 - alpha = 1.0; - beta = par[fRunInfo->GetBetaParamNo()-1]; - break; - case 4: // alpha != 1, beta != 1 - alpha = par[fRunInfo->GetAlphaParamNo()-1]; - beta = par[fRunInfo->GetBetaParamNo()-1]; - break; - default: - break; - } - - for (UInt_t i=0; iGetMsrPlotList()->at(0).fRRFUnit) { - case RRF_UNIT_kHz: - gammaRRF = TMath::TwoPi()*1.0e-3; - break; - case RRF_UNIT_MHz: - gammaRRF = TMath::TwoPi(); - break; - case RRF_UNIT_Mcs: - gammaRRF = 1.0; - break; - case RRF_UNIT_G: - gammaRRF = GAMMA_BAR_MUON*TMath::TwoPi(); - break; - case RRF_UNIT_T: - gammaRRF = GAMMA_BAR_MUON*TMath::TwoPi()*1.0e4; - break; - default: - gammaRRF = TMath::TwoPi(); - break; - } - wRRF = gammaRRF * fMsrInfo->GetMsrPlotList()->at(0).fRRFFreq; - phaseRRF = fMsrInfo->GetMsrPlotList()->at(0).fRRFPhase / 180.0 * TMath::Pi(); - - for (UInt_t i=0; i(start[0])-t0[0]+static_cast(i)); - asymmetry[i] *= 2.0*TMath::Cos(wRRF*time+phaseRRF); - } - - // ------------------------------------------------------------ - // 4. do the packing of A_R(t) - // ------------------------------------------------------------ - Double_t value = 0.0; - error = 0.0; - for (UInt_t i=0; i(packing-1)/2.0)); - fData.SetDataTimeStep(fTimeResolution*static_cast(packing)); - - // ------------------------------------------------------------ - // 5. calculate theory [T(t)] as close as possible to the time resolution [compatible with the RRF frequency] - // 6. T_R(t) = T(t) * 2 cos(w_R t + phi_R) - // ------------------------------------------------------------ - UInt_t rebinRRF = static_cast((TMath::Pi()/2.0/wRRF)/fTimeResolution); // RRF time resolution / data time resolution - fData.SetTheoryTimeStart(fData.GetDataTimeStart()); - fData.SetTheoryTimeStep(TMath::Pi()/2.0/wRRF/rebinRRF); // = theory time resolution as close as possible to the data time resolution compatible with wRRF - - // calculate functions - for (Int_t i=0; iGetNoOfFuncs(); i++) { - fFuncValues[i] = fMsrInfo->EvalFunc(fMsrInfo->GetFuncNo(i), *fRunInfo->GetMap(), par); - } - - Double_t theoryValue; - for (UInt_t i=0; i(i)*fData.GetTheoryTimeStep(); - theoryValue = fTheory->Func(time, par, fFuncValues); - theoryValue *= 2.0*TMath::Cos(wRRF * time + phaseRRF); - - if (fabs(theoryValue) > 10.0) { // dirty hack needs to be fixed!! - theoryValue = 0.0; - } - - fData.AppendTheoryValue(theoryValue); - } - - // ------------------------------------------------------------ - // 7. do the packing of T_R(t) - // ------------------------------------------------------------ - - PDoubleVector theo; - Double_t dval = 0.0; - for (UInt_t i=0; isize(); i++) { - if ((i % rebinRRF == 0) && (i != 0)) { - theo.push_back(dval/rebinRRF); - dval = 0.0; - } - dval += fData.GetTheory()->at(i); - } - fData.ReplaceTheory(theo); - theo.clear(); - - // set the theory time start and step size - fData.SetTheoryTimeStart(fData.GetTheoryTimeStart()+static_cast(rebinRRF-1)*fData.GetTheoryTimeStep()/2.0); - fData.SetTheoryTimeStep(rebinRRF*fData.GetTheoryTimeStep()); - - // ------------------------------------------------------------ - // 8. calculate the Kaiser FIR filter coefficients - // ------------------------------------------------------------ - CalculateKaiserFilterCoeff(wRRF, 60.0, 0.2); // w_c = wRRF, A = -20 log_10(delta), Delta w / w_c = (w_s - w_p) / (2 w_c) - - // ------------------------------------------------------------ - // 9. filter T_R(t) - // ------------------------------------------------------------ - FilterTheo(); - - // clean up - par.clear(); - forward.clear(); - forwardErr.clear(); - backward.clear(); - backwardErr.clear(); - asymmetry.clear(); - asymmetryErr.clear(); - - return true; -} //-------------------------------------------------------------------------- // GetProperT0 (private) diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h index ec2f80a7..3e3201d9 100644 --- a/src/include/PRunAsymmetryBNMR.h +++ b/src/include/PRunAsymmetryBNMR.h @@ -68,10 +68,14 @@ class PRunAsymmetryBNMR : public PRunBase UInt_t fNoOfFitBins; ///< number of bins to be be fitted Int_t fPacking; ///< packing for this particular run. Either given in the RUN- or GLOBAL-block. - PDoubleVector fForward; ///< forward histo data - PDoubleVector fForwardErr; ///< forward histo errors - PDoubleVector fBackward; ///< backward histo data - PDoubleVector fBackwardErr; ///< backward histo errors + PDoubleVector fForwardp; ///< pos hel forward histo data + PDoubleVector fForwardpErr; ///< pos hel forward histo errors + PDoubleVector fBackwardp; ///< pos hel backward histo data + PDoubleVector fBackwardpErr; ///< pos hel backward histo errors + PDoubleVector fForwardm; ///< neg hel forward histo data + PDoubleVector fForwardmErr; ///< neg hel forward histo errors + PDoubleVector fBackwardm; ///< neg hel backward histo data + PDoubleVector fBackwardmErr; ///< neg hel backward histo errors Int_t fGoodBins[4]; ///< keep first/last good bins. 0=fgb, 1=lgb (forward); 2=fgb, 3=lgb (backward) From e3408ca5f5c6485b496a241016a8dc5e5cf9f4b6 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sun, 19 Aug 2018 23:40:55 +0200 Subject: [PATCH 66/87] Start substract asymmetry implementation. --- src/include/PRunAsymmetryBNMR.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h index 3e3201d9..a1fc5377 100644 --- a/src/include/PRunAsymmetryBNMR.h +++ b/src/include/PRunAsymmetryBNMR.h @@ -61,7 +61,6 @@ class PRunAsymmetryBNMR : public PRunBase virtual Bool_t PrepareData(); virtual Bool_t PrepareFitData(); virtual Bool_t PrepareViewData(PRawRunData* runData, UInt_t histoNo[2]); - virtual Bool_t PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]); private: UInt_t fAlphaBetaTag; ///< \f$ 1 \to \alpha = \beta = 1\f$; \f$ 2 \to \alpha \neq 1, \beta = 1\f$; \f$ 3 \to \alpha = 1, \beta \neq 1\f$; \f$ 4 \to \alpha \neq 1, \beta \neq 1\f$. From 970b7aafda94f8adc75c190e307a0485db13541f Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 20 Aug 2018 17:51:39 +0200 Subject: [PATCH 67/87] Beta-NMR helicity subtraction seems to work in the new class. Still needs debugging and tests. Some of the changes from Jonas were reverted since SExp does not work otherwise. --- src/classes/PRunAsymmetryBNMR.cpp | 70 ++++++++++++++-------------- src/external/libBNMR/ExpRlx-MUD.msr | 42 ++++++----------- src/external/libBNMR/SExpRlx-MUD.msr | 61 ++++++++++++++++++++++++ src/external/libBNMR/TBNMR.cpp | 39 +++++++--------- src/external/libBNMR/TBNMR.h | 6 ++- 5 files changed, 132 insertions(+), 86 deletions(-) create mode 100644 src/external/libBNMR/SExpRlx-MUD.msr diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 07bb2c3c..f9aa4cfe 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -539,11 +539,11 @@ Bool_t PRunAsymmetryBNMR::PrepareData() return false; } - // keep the time resolution in (us) + // keep the time resolution in (ms) // possibility to rescale for betaNMR fTimeResolution = runData->GetTimeResolution()/1.0e3; cout.precision(10); - cout << endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ns)" << endl; + cout << endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ms)" << endl; // get all the proper t0's and addt0's for the current RUN block if (!GetProperT0(runData, globalBlock, forwardHistoNo, backwardHistoNo)) { @@ -602,6 +602,8 @@ Bool_t PRunAsymmetryBNMR::PrepareData() // set forward/backward histo data of the first group fForwardp.resize(forward[0].size()); fBackwardp.resize(backward[0].size()); + fForwardm.resize(forward[0].size()); + fBackwardm.resize(backward[0].size()); for (UInt_t i=0; iGetDataBin(forwardHistoNo[i])->size(); j++) { // loop over the bin indices - // // make sure that the index stays within proper range - // if ((j+fT0s[2*i]-fT0s[0] >= 0) && (j+fT0s[2*i]-fT0s[0] < runData->GetDataBin(forwardHistoNo[i])->size())) { - // fForward[j] += forward[i][j+(Int_t)fT0s[2*i]-(Int_t)fT0s[0]]; - // } - // } - // } - - // // group histograms, add all the remaining backward histograms of the group - // for (UInt_t i=1; iGetDataBin(backwardHistoNo[i])->size(); j++) { // loop over the bin indices - // // make sure that the index stays within proper range - // if ((j+fT0s[2*i+1]-fT0s[1] >= 0) && (j+fT0s[2*i+1]-fT0s[1] < runData->GetDataBin(backwardHistoNo[i])->size())) { - // fBackward[j] += backward[i][j+(Int_t)fT0s[2*i+1]-(Int_t)fT0s[1]]; - // } - // } - // } - // subtract background from histogramms ------------------------------------------ if (fRunInfo->GetBkgFix(0) == PMUSR_UNDEFINED) { // no fixed background given if (fRunInfo->GetBkgRange(0) >= 0) { // background range given @@ -706,22 +688,40 @@ Bool_t PRunAsymmetryBNMR::PrepareData() Bool_t PRunAsymmetryBNMR::SubtractFixBkg() { Double_t dval; - for (UInt_t i=0; iGetBkgFix(0); + fForwardpErr.push_back(dval); + fForwardp[i] -= fRunInfo->GetBkgFix(0); // keep the error, and make sure that the bin is NOT empty - if (fBackward[i] != 0.0) - dval = TMath::Sqrt(fBackward[i]); + if (fForwardm[i] != 0.0) + dval = TMath::Sqrt(fForwardm[i]); else dval = 1.0; - fBackwardErr.push_back(dval); - fBackward[i] -= fRunInfo->GetBkgFix(1); + fForwardmErr.push_back(dval); + fForwardm[i] -= fRunInfo->GetBkgFix(1); + + // keep the error, and make sure that the bin is NOT empty + if (fBackwardp[i] != 0.0) + dval = TMath::Sqrt(fBackwardp[i]); + else + dval = 1.0; + fBackwardpErr.push_back(dval); + fBackwardp[i] -= fRunInfo->GetBkgFix(2); + + // keep the error, and make sure that the bin is NOT empty + if (fBackwardm[i] != 0.0) + dval = TMath::Sqrt(fBackwardm[i]); + else + dval = 1.0; + fBackwardmErr.push_back(dval); + fBackwardm[i] -= fRunInfo->GetBkgFix(3); } return true; @@ -807,8 +807,8 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() // calculate background Double_t bkgp[2] = {0.0, 0.0}; Double_t errBkgp[2] = {0.0, 0.0}; - Double_t bkgn[2] = {0.0, 0.0}; - Double_t errBkgn[2] = {0.0, 0.0}; + Double_t bkgm[2] = {0.0, 0.0}; + Double_t errBkgm[2] = {0.0, 0.0}; // forward for (UInt_t i=start[0]; i<=end[0]; i++) { @@ -898,7 +898,7 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() PRunData forwardpPacked; PRunData backwardpPacked; PRunData forwardmPacked; - PRunData backwarmpPacked; + PRunData backwardmPacked; Double_t valuep = 0.0; Double_t errorp = 0.0; Double_t valuem = 0.0; @@ -1150,6 +1150,8 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 Double_t errorp = 0.0; Double_t valuem = 0.0; Double_t errorm = 0.0; + Double_t value = 0.0; + Double_t error = 0.0; // forward for (Int_t i=start[0]; i &par) const { assert(par.size()==2); // make sure the number of parameters handed to the function is correct - // par[0] time of beam off - // par[1] is the relaxation rate + // par[0] time of beam on (pulse length) in seconds + // par[1] is the relaxation rate in 1/s double tau_p; - double y; - tau_p = (tau_Li/(1.+par[1]*tau_Li)); - + + // x should be in seconds, otherwise it should be rescaled here if ( x <= par[0] && x >= 0) { - y=(tau_p/tau_Li)*(1-exp(-x/tau_p))/(1-exp(-x/tau_Li)); + return (tau_p/tau_Li)*(1-exp(-x/tau_p))/(1-exp(-x/tau_Li)); } else if ( x > par[0] ){ - y=(tau_p/tau_Li)*(1-exp(-par[0]/tau_p))/(1-exp(-par[0]/tau_Li))*exp(-par[1]*(x-par[0])); - } else { - y = 0; - } - - return y; + return (tau_p/tau_Li)*(1-exp(-par[0]/tau_p))/(1-exp(-par[0]/tau_Li))*exp(-par[1]*(x-par[0])); + } + return 0; } - //initialize Integrators TF1 SExpRlx::sexp1=TF1("sexp", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); TF1 SExpRlx::sexp2=TF1("sexp", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20000.0); double SExpRlx::operator()(double x, const std::vector &par) const { + assert(par.size()==3); // make sure the number of parameters handed to the function is correct - // par[0] time of beam off - // par[1] is the relaxation rate + // par[0] beam of beam on (pulse length) in seconds + // par[1] is the relaxation rate in 1/s // par[2] is the exponent + // x should be in seconds, otherwise it should be rescaled here if ( x >= 0 && x <= par[0] ) { + TF1 sexp1("sexp1", "exp(-([0]-x)/[3])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20.0); sexp1.SetParameters(x, par[1], par[2],tau_Li); + sexp1.SetNpx(1000); return sexp1.Integral(0.0,x)/(1-exp(-x/tau_Li))/tau_Li; } else if ( x > par[0] ) { + TF1 sexp2("sexp2", "exp(-([3]-x)/[4])*exp(-pow(([1]*([0]-x)),[2]))", 0.0, 20.0); sexp2.SetParameters(x, par[1], par[2], par[0],tau_Li); + sexp2.SetNpx(1000); return sexp2.Integral(0.0,par[0])/(1-exp(-par[0]/tau_Li))/tau_Li; - } + } return 0; } diff --git a/src/external/libBNMR/TBNMR.h b/src/external/libBNMR/TBNMR.h index b3a90256..6a95b4e9 100644 --- a/src/external/libBNMR/TBNMR.h +++ b/src/external/libBNMR/TBNMR.h @@ -41,6 +41,10 @@ #ifndef LIBBNMRH #define LIBBNMRH +#define tau_Li 1.210 // In seconds +#define PI 3.14159265358979323846 +#define TWOPI 6.28318530717958647692 + using namespace std; @@ -66,7 +70,7 @@ class SExpRlx : public PUserFcnBase { public: // default constructor and destructor - SExpRlx(){sexp1.SetNpx(1000); sexp2.SetNpx(1000);} + SExpRlx(){} ~SExpRlx(){} Bool_t NeedGlobalPart() const { return false; } From e04cddfac8f856619eb0f8f1dc01c0cad05be1cb Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 20 Aug 2018 20:04:43 +0200 Subject: [PATCH 68/87] Remove beta-NMR ascci based templates to avoid confusion. --- src/external/libBNMR/45377.dat | 96 ---------------------------- src/external/libBNMR/ExpRlx.msr | 45 ------------- src/external/libBNMR/SExpRlx-MUD.msr | 14 ++-- src/external/libBNMR/SExpRlx.msr | 46 ------------- 4 files changed, 7 insertions(+), 194 deletions(-) delete mode 100644 src/external/libBNMR/45377.dat delete mode 100644 src/external/libBNMR/ExpRlx.msr delete mode 100644 src/external/libBNMR/SExpRlx.msr diff --git a/src/external/libBNMR/45377.dat b/src/external/libBNMR/45377.dat deleted file mode 100644 index 36f5f791..00000000 --- a/src/external/libBNMR/45377.dat +++ /dev/null @@ -1,96 +0,0 @@ -DATA - 592.75 0.0466642055 0.00075601151 - 693.25 0.042699595 0.0007136273 - 793.75 0.03943051 0.000679583922 - 894.25 0.0366291886 0.000652378784 - 994.75 0.0355316716 0.000664640277 - 1095.25 0.033304272 0.000610910492 - 1195.75 0.0322397741 0.000595454518 - 1296.25 0.0308209315 0.000581648459 - 1396.75 0.0301227967 0.000569861788 - 1497.25 0.0289808195 0.000559611024 - 1597.75 0.0284020831 0.000550685264 - 1698.25 0.0272996592 0.000542785334 - 1798.75 0.0259033059 0.000536112979 - 1899.25 0.0257421462 0.000529928146 - 1999.75 0.0252476607 0.000524276201 - 2100.25 0.0252439822 0.00049508141 - 2200.75 0.0244494569 0.000514789454 - 2301.25 0.0248826473 0.000510792766 - 2401.75 0.0252364689 0.000507093213 - 2502.25 0.024077753 0.000503959631 - 2602.75 0.0239705744 0.000501170092 - 2703.25 0.023648613 0.000498351823 - 2803.75 0.0236132062 0.000496113677 - 2904.25 0.0232728359 0.000494038794 - 3004.75 0.0229806315 0.00049216698 - 3105.25 0.0226408705 0.000490122174 - 3205.75 0.022949639 0.000488517677 - 3306.25 0.0236152274 0.000487206227 - 3406.75 0.022514855 0.000485776619 - 3507.25 0.0232919509 0.000484617162 - 3607.75 0.0227762445 0.000483435077 - 3708.25 0.0225740091 0.000482352785 - 3808.75 0.0217810425 0.000481423643 - 3909.25 0.0210459719 0.000480488676 - 4009.75 0.0200829485 0.0004835672 - 4110.25 0.0144273479 0.000480165881 - 4210.75 0.0104726937 0.000526210282 - 4311.25 0.00977670745 0.000548717033 - 4411.75 0.00734786823 0.000572069626 - 4512.25 0.0071749696 0.000596458669 - 4612.75 0.0061713664 0.000621795033 - 4713.25 0.00457656715 0.000648552578 - 4813.75 0.00253947053 0.000676064828 - 4914.25 0.00298436429 0.000705158693 - 5014.75 0.00520775648 0.000735097152 - 5115.25 0.00372267868 0.000766213043 - 5215.75 0.00284020846 0.000798853062 - 5316.25 0.00158717036 0.000832862333 - 5416.75 0.00200819085 0.000868342561 - 5517.25 0.0044706107 0.000905327348 - 5617.75 0.00135523051 0.000943421323 - 5718.25 0.000261760966 0.000983714257 - 5818.75 0.000210009562 0.00102515713 - 5919.25 -0.000157024642 0.00106890614 - 6019.75 0.000611697915 0.00111378026 - 6120.25 0.000353532075 0.00111004546 - 6220.75 0.00120570511 0.00121565301 - 6321.25 -0.00126499964 0.00126730997 - 6421.75 0.0029594966 0.00132005144 - 6522.25 -0.00180278144 0.00137777581 - 6622.75 0.00154819637 0.00143478041 - 6723.25 0.00137296473 0.00149757271 - 6823.75 -0.000271202669 0.00155948172 - 6924.25 -0.00306837271 0.00162568622 - 7024.75 0.00346602562 0.00169188976 - 7125.25 -8.40576554E-05 0.00176525436 - 7225.75 0.00141055893 0.00183909095 - 7326.25 -0.00170315946 0.00191744238 - 7426.75 0.00399357243 0.00199844555 - 7527.25 0.00378603394 0.00208493839 - 7627.75 -0.0015303158 0.00216992033 - 7728.25 -0.000931658073 0.00226567509 - 7828.75 0.0011671311 0.00235924947 - 7929.25 0.00147725609 0.00245769641 - 8029.75 -0.00100983925 0.00256942322 - 8130.25 -0.00329542124 0.00255286858 - 8230.75 0.000636890228 0.00279597795 - 8331.25 -0.000814018633 0.00291290155 - 8431.75 0.000101912547 0.00303673191 - 8532.25 0.00311038784 0.0031603991 - 8632.75 0.000473049572 0.00329964113 - 8733.25 8.36732E-05 0.00343974064 - 8833.75 0.000275585165 0.00358184548 - 8934.25 0.0059381551 0.00373021006 - 9034.75 -0.0014588358 0.0038926573 - 9135.25 -0.00158156038 0.00405870998 - 9235.75 -0.00125287442 0.00422594705 - 9336.25 -0.00212622165 0.00439704849 - 9436.75 -0.00477056006 0.0045911195 - 9537.25 -0.00229735693 0.00479087708 - 9637.75 0.00575469607 0.00498561109 - 9738.25 -7.52893075E-05 0.00519483122 - 9838.75 -0.00368605583 0.0054198485 - 9939.25 -0.00862419517 0.00564201231 - 10039.75 -0.0323936833 0.0181186246 diff --git a/src/external/libBNMR/ExpRlx.msr b/src/external/libBNMR/ExpRlx.msr deleted file mode 100644 index 2b3f52ac..00000000 --- a/src/external/libBNMR/ExpRlx.msr +++ /dev/null @@ -1,45 +0,0 @@ -Title -############################################################### -FITPARAMETER -# Nr. Name Value Step Pos_Error Boundaries - 1 Asy1 0.0812706 0.00149848 none 0 none - 2 T 4000 0 none 0 none - 3 Lam1 0.00239816 6.05947e-05 none 0 none - -############################################################### -THEORY -asymmetry 1 -userFcn /usr/local/lib/libBNMR.so ExpRlx 2 3 - -############################################################### -RUN 45377 MUE4 PSI ASCII (name beamline institute data-file-format) -fittype 8 (non muSR fit) -map 0 0 0 0 0 0 0 0 0 0 -xy-data 1 2 -fit 0.00 8000.00 -packing 1 - -############################################################### -COMMANDS -STRATEGY 1 -MINIMIZE -#MINOS -SAVE -END RETURN - -############################################################### -PLOT 8 (non muSR plot) -runs 1 -range 0.00 8000.00 - -############################################################### -FOURIER -units MHz # units either 'Gauss', 'MHz', or 'Mc/s' -fourier_power 12 -apodization STRONG # NONE, WEAK, MEDIUM, STRONG -plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE -phase 8.50 -#range FRQMIN FRQMAX -############################################################### -STATISTIC --- 2010-09-02 17:44:20 - chisq = 186.322493286053, NDF = 72, chisq/NDF = 2.5878124067507362 diff --git a/src/external/libBNMR/SExpRlx-MUD.msr b/src/external/libBNMR/SExpRlx-MUD.msr index fd76633d..f689af83 100644 --- a/src/external/libBNMR/SExpRlx-MUD.msr +++ b/src/external/libBNMR/SExpRlx-MUD.msr @@ -5,10 +5,10 @@ FITPARAMETER ############################################################### # No Name Value Err Min Max 1 Alpha 1 0 none - 2 Asy 0.108 0.011 none 0 0.2 + 2 Asy 0.1152 0.0099 none 0 0.2 3 T 1 0 none - 4 Rlx 3.63 0.89 none 0 15000 - 5 Beta 0.452 0.039 none 0.3 2 + 4 Rlx 4.19 0.91 none 0 15000 + 5 Beta 0.432 0.032 none 0.3 2 ############################################################### THEORY @@ -27,12 +27,12 @@ fittype 5 (beta-NMR fit) alpha 1 forward 3 5 backward 4 6 -data 11 800 11 800 +data 11 1000 11 1000 #backgr.fix 0 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 t0 10.0 10.0 10.0 10.0 map 0 0 0 0 0 0 0 0 0 0 -fit 0.5 8 +fit 0.2 10 packing 5 ############################################################### @@ -57,5 +57,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 17:48:41 - chisq = 177.2, NDF = 144, chisq/NDF = 1.230711 +STATISTIC --- 2018-08-20 19:54:17 + chisq = 181.6, NDF = 150, chisq/NDF = 1.210991 diff --git a/src/external/libBNMR/SExpRlx.msr b/src/external/libBNMR/SExpRlx.msr deleted file mode 100644 index 636583f8..00000000 --- a/src/external/libBNMR/SExpRlx.msr +++ /dev/null @@ -1,46 +0,0 @@ -Title -############################################################### -FITPARAMETER -# Nr. Name Value Step Pos_Error Boundaries - 1 Asy1 0.262789 0.0465582 none 0 none - 2 T 4000 0 none 0 none - 3 Lam1 0.0233569 0.0094885 none 0 none - 4 Bet1 0.399259 0.0353915 none 0 none - -############################################################### -THEORY -asymmetry 1 -userFcn /usr/local/lib/libBNMR.so SExpRlx 2 3 4 - -############################################################### -RUN 45377 MUE4 PSI ASCII (name beamline institute data-file-format) -fittype 8 (non muSR fit) -map 0 0 0 0 0 0 0 0 0 0 -xy-data 1 2 -fit 0.00 8000.00 -packing 1 - -############################################################### -COMMANDS -STRATEGY 1 -MINIMIZE -#MINOS -SAVE -END RETURN - -############################################################### -PLOT 8 (non muSR plot) -runs 1 -range 0.00 8000.00 - -############################################################### -FOURIER -units MHz # units either 'Gauss', 'MHz', or 'Mc/s' -fourier_power 12 -apodization STRONG # NONE, WEAK, MEDIUM, STRONG -plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE -phase 8.50 -#range FRQMIN FRQMAX -############################################################### -STATISTIC --- 2010-09-02 17:51:10 - chisq = 93.71265965991455, NDF = 71, chisq/NDF = 1.319896614928374 From a837b1c420db26b7f3cb80e5e20d8ea4ed1cd14b Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 20 Aug 2018 22:04:50 +0200 Subject: [PATCH 69/87] Template files for two helicities and subtracted helicities updated. --- src/external/libBNMR/ExpRlx-hel.msr | 72 ++++++++++++++++++ .../libBNMR/{ExpRlx-MUD.msr => ExpRlx.msr} | 21 ++---- src/external/libBNMR/SExpRlx-hel.msr | 73 +++++++++++++++++++ .../libBNMR/{SExpRlx-MUD.msr => SExpRlx.msr} | 23 ++---- 4 files changed, 160 insertions(+), 29 deletions(-) create mode 100644 src/external/libBNMR/ExpRlx-hel.msr rename src/external/libBNMR/{ExpRlx-MUD.msr => ExpRlx.msr} (77%) create mode 100644 src/external/libBNMR/SExpRlx-hel.msr rename src/external/libBNMR/{SExpRlx-MUD.msr => SExpRlx.msr} (74%) diff --git a/src/external/libBNMR/ExpRlx-hel.msr b/src/external/libBNMR/ExpRlx-hel.msr new file mode 100644 index 00000000..048996bc --- /dev/null +++ b/src/external/libBNMR/ExpRlx-hel.msr @@ -0,0 +1,72 @@ +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s +############################################################### +FITPARAMETER +############################################################### +# No Name Value Err Min Max + 1 Alpha 1.11592 0.00035 none + 2 Asy 0.05869 0.00091 none 0 0.2 + 3 T 1 0 none + 4 Rlx 1.142 0.023 none 0 15000 + 5 One 1 0 none + 6 FlHel -1.047 0.022 none -2 0 + +############################################################### +THEORY +############################################################### +asymmetry fun1 +userFcn .libs/libBNMR.so ExpRlx 3 4 + +############################################################### +FUNCTIONS +############################################################### +fun1 = 0.5 * map1 * map2 + +############################################################### +RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) +fittype 2 (asymmetry fit) +alpha 1 +forward 3 +backward 4 +data 11 1000 11 1000 +background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 +t0 10.0 10.0 10.0 10.0 +map 2 5 0 0 0 0 0 0 0 0 +fit 0.2 9 +packing 5 + +RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) +fittype 2 (asymmetry fit) +alpha 1 +forward 5 +backward 6 +data 11 1000 11 1000 +background 1 9 1 9 # estimated bkg: 11.6250 / 15.6250 +t0 10.0 10.0 10.0 10.0 +map 2 6 0 0 0 0 0 0 0 0 +fit 0.2 9 +packing 5 + +############################################################### +COMMANDS +MINIMIZE +HESSE +SAVE + +############################################################### +PLOT 2 (asymmetry plot) +runs 1 2 +use_fit_ranges +view_packing 10 + + +############################################################### +FOURIER +units MHz # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s' +fourier_power 12 +apodization STRONG # NONE, WEAK, MEDIUM, STRONG +plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL +phase 8 +#range FRQMIN FRQMAX +############################################################### +STATISTIC --- 2018-08-20 22:01:15 + chisq = 566.6, NDF = 346, chisq/NDF = 1.637584 diff --git a/src/external/libBNMR/ExpRlx-MUD.msr b/src/external/libBNMR/ExpRlx.msr similarity index 77% rename from src/external/libBNMR/ExpRlx-MUD.msr rename to src/external/libBNMR/ExpRlx.msr index 909af362..eb356304 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx.msr @@ -1,13 +1,12 @@ - -# Run Numbers: 1111 +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s ############################################################### FITPARAMETER ############################################################### # No Name Value Err Min Max 1 Alpha 1 0 none - 2 Asy 0.05615 0.00073 none + 2 Asy 0.05992 0.00063 none 0 0.2 3 T 1 0 none - 4 Rlx 1.046 0.024 none + 4 Rlx 1.143 0.023 none 0 100 ############################################################### THEORY @@ -15,23 +14,17 @@ THEORY asymmetry 2 userFcn .libs/libBNMR.so ExpRlx 3 4 -############################################################### -#FUNCTIONS -############################################################### -#fun1 = 0.5 * map1 * map2 - ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) fittype 5 (beta-NMR fit) alpha 1 forward 3 5 backward 4 6 -data 11 800 11 800 -#backgr.fix 0 +data 11 1000 11 1000 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 t0 10.0 10.0 10.0 10.0 map 0 0 0 0 0 0 0 0 0 0 -fit 0.5 8 +fit 0.2 9 packing 5 ############################################################### @@ -56,5 +49,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 17:31:40 - chisq = 309.1, NDF = 145, chisq/NDF = 2.131395 +STATISTIC --- 2018-08-20 22:02:02 + chisq = 419.1, NDF = 173, chisq/NDF = 2.422357 diff --git a/src/external/libBNMR/SExpRlx-hel.msr b/src/external/libBNMR/SExpRlx-hel.msr new file mode 100644 index 00000000..7165dd2c --- /dev/null +++ b/src/external/libBNMR/SExpRlx-hel.msr @@ -0,0 +1,73 @@ +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s +############################################################### +FITPARAMETER +############################################################### +# No Name Value Err Min Max + 1 Alpha 1.11589 0.00037 none + 2 Asy 0.1121 0.0094 none 0 0.2 + 3 T 1 0 none + 4 Rlx 4.12 0.87 none 0 15000 + 5 Beta 0.434 0.031 none 0.3 2 + 6 One 1 0 none + 7 FlHel -1.048 0.023 none -2 0 + +############################################################### +THEORY +############################################################### +asymmetry fun1 +userFcn .libs/libBNMR.so SExpRlx 3 4 5 + +############################################################### +FUNCTIONS +############################################################### +fun1 = 0.5 * map1 * map2 + +############################################################### +RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) +fittype 2 (asymmetry fit) +alpha 1 +forward 3 +backward 4 +data 11 1000 11 1000 +background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 +t0 10.0 10.0 10.0 10.0 +map 2 6 0 0 0 0 0 0 0 0 +fit 0.2 9 +packing 5 + +RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) +fittype 2 (asymmetry fit) +alpha 1 +forward 5 +backward 6 +data 11 1000 11 1000 +background 1 9 1 9 # estimated bkg: 11.6250 / 15.6250 +t0 10.0 10.0 10.0 10.0 +map 2 7 0 0 0 0 0 0 0 0 +fit 0.2 9 +packing 5 + +############################################################### +COMMANDS +MINIMIZE +HESSE +SAVE + +############################################################### +PLOT 2 (asymmetry plot) +runs 1 2 +use_fit_ranges +view_packing 10 + + +############################################################### +FOURIER +units MHz # units either 'Gauss', 'Tesla', 'MHz', or 'Mc/s' +fourier_power 12 +apodization STRONG # NONE, WEAK, MEDIUM, STRONG +plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL +phase 8 +#range FRQMIN FRQMAX +############################################################### +STATISTIC --- 2018-08-20 21:59:04 + chisq = 358.6, NDF = 345, chisq/NDF = 1.039300 diff --git a/src/external/libBNMR/SExpRlx-MUD.msr b/src/external/libBNMR/SExpRlx.msr similarity index 74% rename from src/external/libBNMR/SExpRlx-MUD.msr rename to src/external/libBNMR/SExpRlx.msr index f689af83..a530e625 100644 --- a/src/external/libBNMR/SExpRlx-MUD.msr +++ b/src/external/libBNMR/SExpRlx.msr @@ -1,14 +1,13 @@ - -# Run Numbers: 1111 +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s ############################################################### FITPARAMETER ############################################################### # No Name Value Err Min Max 1 Alpha 1 0 none - 2 Asy 0.1152 0.0099 none 0 0.2 + 2 Asy 0.1148 0.0096 none 0 0.2 3 T 1 0 none - 4 Rlx 4.19 0.91 none 0 15000 - 5 Beta 0.432 0.032 none 0.3 2 + 4 Rlx 4.16 0.88 none 0 100 + 5 Beta 0.433 0.031 none 0.3 2 ############################################################### THEORY @@ -16,23 +15,17 @@ THEORY asymmetry 2 userFcn .libs/libBNMR.so SExpRlx 3 4 5 -############################################################### -#FUNCTIONS -############################################################### -#fun1 = 0.5 * map1 * map2 - ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) fittype 5 (beta-NMR fit) alpha 1 forward 3 5 backward 4 6 -data 11 1000 11 1000 -#backgr.fix 0 +data 11 1000 11 1000 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 t0 10.0 10.0 10.0 10.0 map 0 0 0 0 0 0 0 0 0 0 -fit 0.2 10 +fit 0.2 9 packing 5 ############################################################### @@ -57,5 +50,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 19:54:17 - chisq = 181.6, NDF = 150, chisq/NDF = 1.210991 +STATISTIC --- 2018-08-20 21:59:14 + chisq = 210.2, NDF = 172, chisq/NDF = 1.222196 From e3d5d03fcaf33977e07c71db1d2c1ab7fe9f41e8 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 21 Aug 2018 10:32:57 +0200 Subject: [PATCH 70/87] Fix x-axis label bug (reported by Gerland Morris). --- src/classes/PMusrCanvas.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index 8cc30344..0aa4f871 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -4697,7 +4697,8 @@ void PMusrCanvas::PlotData(Bool_t unzoom) // set x-axis label PMsrRunList runs = *fMsrHandler->GetMsrRunList(); TString setup = fRunList->GetSetup(*runs[0].GetRunName()); - if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { + // For BNMR/BNQR runs use seconds + if (fPlotType == MSR_PLOT_BNMR) { fHistoFrame->GetXaxis()->SetTitle("time (s)"); } else { fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); @@ -4991,7 +4992,8 @@ void PMusrCanvas::PlotDifference(Bool_t unzoom) // set x-axis label PMsrRunList runs = *fMsrHandler->GetMsrRunList(); TString setup = fRunList->GetSetup(*runs[0].GetRunName()); - if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { + // For BNMR/BNQR runs use seconds + if (fPlotType == MSR_PLOT_BNMR) { fHistoFrame->GetXaxis()->SetTitle("time (s)"); } else { fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); @@ -6115,7 +6117,8 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) if (fCurrentPlotView == PV_DATA) { PMsrRunList runs = *fMsrHandler->GetMsrRunList(); TString setup = fRunList->GetSetup(*runs[0].GetRunName()); - if (strcmp(setup, "TRIUMF/BNQR") || strcmp(setup, "TRIUMF/BNMR")) { + // For BNMR/BNQR runs use seconds + if (fPlotType == MSR_PLOT_BNMR) { xAxisTitle = TString("time (s)"); } else { xAxisTitle = TString("time (#mus)"); From 3d773d85374b3d654fcbdf53365c93990094cd6b Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 24 Aug 2018 13:03:28 +0200 Subject: [PATCH 71/87] Possible fix for alpha problem for beta-NMR asymmetry calculation. To be tested. --- src/classes/PMusrCanvas.cpp | 26 +++++++++++++------------- src/classes/PRunAsymmetryBNMR.cpp | 14 +++++++------- src/classes/PRunListCollection.cpp | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index 0aa4f871..be166127 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -710,6 +710,18 @@ void PMusrCanvas::UpdateDataTheoryPad() // handle data HandleDataSet(i, runNo, data); break; + case MSR_FITTYPE_BNMR: + data = fRunList->GetAsymmetryBNMR(runNo, PRunListCollection::kRunNo); + if (!data) { // something wrong + fValid = false; + // error message + std::cerr << std::endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a beta-NMR asymmetry plot"; + std::cerr << std::endl; + return; + } + // handle data + HandleDataSet(i, runNo, data); + break; case MSR_FITTYPE_ASYM_RRF: data = fRunList->GetAsymmetryRRF(runNo, PRunListCollection::kRunNo); if (!data) { // something wrong @@ -727,19 +739,7 @@ void PMusrCanvas::UpdateDataTheoryPad() if (!data) { // something wrong fValid = false; // error message - std::cerr << std::endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a mu minus single histogram plot"; - std::cerr << std::endl; - return; - } - // handle data - HandleDataSet(i, runNo, data); - break; - case MSR_FITTYPE_BNMR: - data = fRunList->GetAsymmetryBNMR(runNo, PRunListCollection::kRunNo); - if (!data) { // something wrong - fValid = false; - // error message - cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a beta-NMR asymmetry plot"; + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a mu minus single histogram plot"; cerr << endl; return; } diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index f9aa4cfe..0de439aa 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -222,19 +222,19 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) break; case 2: // alpha != 1, beta == 1 a = par[fRunInfo->GetAlphaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)); + f = fTheory->Func(time, par, fFuncValues)/2; + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); break; case 3: // alpha == 1, beta != 1 b = par[fRunInfo->GetBetaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0)); + f = fTheory->Func(time, par, fFuncValues)/2; + asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0))-f*(b+1.0)/(2.0+f*(b-1.0)); break; case 4: // alpha != 1, beta != 1 a = par[fRunInfo->GetAlphaParamNo()-1]; b = par[fRunInfo->GetBetaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0)); + f = fTheory->Func(time, par, fFuncValues)/2; + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); break; default: asymFcnValue = 0.0; @@ -1276,7 +1276,7 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 efm = forwardmPacked.GetError()->at(i); ebm = backwardmPacked.GetError()->at(i); // check that there are indeed bins - if (fp+bp != 0.0) + if (fp+bp != 0.0) asym = (alpha*fp-bp) / (alpha*beta*fp+bp) - (alpha*fm-bm) / (alpha*beta*fm+bm); else asym = 0.0; diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index 0edab270..868475d8 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -972,7 +972,7 @@ PRunData* PRunListCollection::GetAsymmetry(UInt_t index, EDataSwitch tag) // GetAsymmetryBNMR (public) //-------------------------------------------------------------------------- /** - *

Get a processed asymmetry data set. + *

Get a processed asymmetry from beta-NMR data set. * * return: * - pointer to the run data set (processed data) if data set is found From c66849e133bfba1ad64002c7bbfdce2ca57379ea Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 24 Aug 2018 14:08:28 +0200 Subject: [PATCH 72/87] Added estimation for the value of alpha from integrated counts. --- src/classes/PRunAsymmetryBNMR.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 0de439aa..5fa90517 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -903,8 +903,15 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() Double_t errorp = 0.0; Double_t valuem = 0.0; Double_t errorm = 0.0; + + Double_t SumF[2] = {0.0, 0.0}; + Double_t SumB[2] = {0.0, 0.0}; + Double_t alphaest = 1; + // forward for (Int_t i=fGoodBins[0]; i> PRunAsymmetryBNMR::PrepareFitData(): alpha estimate=" << alphaest << endl; + // check if packed forward and backward hist have the same size, otherwise take the minimum size UInt_t noOfBins = forwardpPacked.GetValue()->size(); if (forwardpPacked.GetValue()->size() != backwardpPacked.GetValue()->size()) { From 22141ae98dcc9d98b51119ab5425da45ca08d103 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 24 Aug 2018 17:42:23 +0200 Subject: [PATCH 73/87] Deal with missing alpha line for beta-NMR. --- src/classes/PMsrHandler.cpp | 12 ++++++------ src/classes/PRunAsymmetryBNMR.cpp | 31 +++++++++++++++---------------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index 9c56192f..eb16220f 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -5881,12 +5881,12 @@ Bool_t PMsrHandler::CheckRunBlockIntegrity() break; case PRUN_ASYMMETRY_BNMR: // check alpha - if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> alpha parameter number missing which is needed for an asymmetry fit."; - cerr << endl << ">> Consider to check the manual ;-)" << endl; - return false; - } + // if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { + // cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + // cerr << endl << ">> alpha parameter number missing which is needed for an asymmetry fit."; + // cerr << endl << ">> Consider to check the manual ;-)" << endl; + // return false; + // } // check that there is a forward parameter number if (fRuns[i].GetForwardHistoNo() == -1) { cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 5fa90517..83d27d2a 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -105,26 +105,25 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD PMsrParamList *param = msrInfo->GetMsrParamList(); // check if alpha is given + Bool_t alphaFixedToOne = false; if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given - cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; - cerr << endl; - fValid = false; - return; - } - // check if alpha parameter is within proper bounds - if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { + // cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; + // cerr << endl; + // fValid = false; + // return; + alphaFixedToOne = true; + } else if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { // check if alpha parameter is within proper bounds cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; cerr << endl; fValid = false; return; + } else { // check if alpha is fixed + if (((*param)[fRunInfo->GetAlphaParamNo()-1].fStep == 0.0) && + ((*param)[fRunInfo->GetAlphaParamNo()-1].fValue == 1.0)) + alphaFixedToOne = true; } - // check if alpha is fixed - Bool_t alphaFixedToOne = false; - if (((*param)[fRunInfo->GetAlphaParamNo()-1].fStep == 0.0) && - ((*param)[fRunInfo->GetAlphaParamNo()-1].fValue == 1.0)) - alphaFixedToOne = true; - + // check if beta is given Bool_t betaFixedToOne = false; if (fRunInfo->GetBetaParamNo() == -1) { // no beta given hence assuming beta == 1 @@ -222,18 +221,18 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) break; case 2: // alpha != 1, beta == 1 a = par[fRunInfo->GetAlphaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues)/2; + f = fTheory->Func(time, par, fFuncValues)/2.0; asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); break; case 3: // alpha == 1, beta != 1 b = par[fRunInfo->GetBetaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues)/2; + f = fTheory->Func(time, par, fFuncValues)/2.0; asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0))-f*(b+1.0)/(2.0+f*(b-1.0)); break; case 4: // alpha != 1, beta != 1 a = par[fRunInfo->GetAlphaParamNo()-1]; b = par[fRunInfo->GetBetaParamNo()-1]; - f = fTheory->Func(time, par, fFuncValues)/2; + f = fTheory->Func(time, par, fFuncValues)/2.0; asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); break; default: From e28b907fb737607b2b05aa7e9ce7450eb1ec30c2 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sat, 25 Aug 2018 23:06:57 +0200 Subject: [PATCH 74/87] Estimate alpha for beta-NMR asymmetry calculation from the ratio of B/F counts if no alpha line is given in the run block. --- src/classes/PMusr.cpp | 13 ++++ src/classes/PRunAsymmetryBNMR.cpp | 123 ++++++++++++++++++++++++------ src/include/PMusr.h | 5 ++ src/include/PRunAsymmetryBNMR.h | 1 + 4 files changed, 120 insertions(+), 22 deletions(-) diff --git a/src/classes/PMusr.cpp b/src/classes/PMusr.cpp index 5adbb618..3de77180 100644 --- a/src/classes/PMusr.cpp +++ b/src/classes/PMusr.cpp @@ -1878,6 +1878,19 @@ void PMsrRunBlock::SetMapGlobal(UInt_t idx, Int_t ival) return; } +//-------------------------------------------------------------------------- +// SetEstimatedAlpha (public) +//-------------------------------------------------------------------------- +/** + *

set the value of estimated alpha at position idx + * + * \param alpha is the estimated value + */ +void PMsrRunBlock::SetEstimatedAlpha(Double_t dval) +{ + fAlpha = dval; +} + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // implementation PStringNumberList //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 83d27d2a..8afa4937 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -106,12 +106,13 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD // check if alpha is given Bool_t alphaFixedToOne = false; + Bool_t alphaSetDefault = false; if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given // cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; // cerr << endl; // fValid = false; // return; - alphaFixedToOne = true; + alphaSetDefault = true; } else if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { // check if alpha parameter is within proper bounds cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; @@ -141,12 +142,16 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD } // set fAlphaBetaTag - if (alphaFixedToOne && betaFixedToOne) // alpha == 1, beta == 1 + if (alphaFixedToOne && betaFixedToOne) // alpha == 1, beta == 1 fAlphaBetaTag = 1; - else if (!alphaFixedToOne && betaFixedToOne) // alpha != 1, beta == 1 + else if (!alphaFixedToOne && betaFixedToOne & !alphaSetDefault) // alpha != 1, beta == 1 fAlphaBetaTag = 2; - else if (alphaFixedToOne && !betaFixedToOne) // alpha == 1, beta != 1 + else if (alphaFixedToOne && !betaFixedToOne) // alpha == 1, beta != 1 fAlphaBetaTag = 3; + else if (!alphaFixedToOne && betaFixedToOne & alphaSetDefault) // alpha ??, beta == 1 + fAlphaBetaTag = 5; + else if (!alphaFixedToOne && !betaFixedToOne & alphaSetDefault) // alpha ??, beta != 1 + fAlphaBetaTag = 6; else fAlphaBetaTag = 4; @@ -198,7 +203,7 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) } // calculate chi square - Double_t time(1.0); + Double_t time(1.0),alphaest; Int_t i; // Calculate the theory function once to ensure one function evaluation for the current set of parameters. @@ -206,6 +211,7 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) // for a given set of parameters---which should be done outside of the parallelized loop. // For all other functions it means a tiny and acceptable overhead. asymFcnValue = fTheory->Func(time, par, fFuncValues); + alphaest = fRunInfo->GetEstimatedAlpha(); #ifdef HAVE_GOMP Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs(); @@ -235,6 +241,17 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) f = fTheory->Func(time, par, fFuncValues)/2.0; asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); break; + case 5: // alpha ?? , beta == 1 + a = alphaest; + f = fTheory->Func(time, par, fFuncValues)/2.0; + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); + break; + case 6: // alpha ??, beta != 1 + a = alphaest; + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues)/2.0; + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); + break; default: asymFcnValue = 0.0; break; @@ -425,8 +442,12 @@ void PRunAsymmetryBNMR::CalcTheory() // calculate asymmetry Double_t asymFcnValue = 0.0; - Double_t a, b, f; + Double_t a, b, f, alphaest; Double_t time; + + // Get estimated alpha + alphaest = fRunInfo->GetEstimatedAlpha(); + for (UInt_t i=0; isize(); i++) { time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); switch (fAlphaBetaTag) { @@ -436,18 +457,29 @@ void PRunAsymmetryBNMR::CalcTheory() case 2: // alpha != 1, beta == 1 a = par[fRunInfo->GetAlphaParamNo()-1]; f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)); + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); break; case 3: // alpha == 1, beta != 1 b = par[fRunInfo->GetBetaParamNo()-1]; f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0)); + asymFcnValue = f*(b+1.0)/(2.0-f*(b-1.0))-f*(b+1.0)/(2.0+f*(b-1.0)); break; case 4: // alpha != 1, beta != 1 a = par[fRunInfo->GetAlphaParamNo()-1]; b = par[fRunInfo->GetBetaParamNo()-1]; f = fTheory->Func(time, par, fFuncValues); - asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0)); + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); + break; + case 5: // alpha ?? , beta == 1 + a = alphaest; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a+1.0)-(a-1.0))/((a+1.0)-f*(a-1.0)) - (-f*(a+1.0)-(a-1.0))/((a+1.0)+f*(a-1.0)); + break; + case 6: // alpha ??, beta != 1 + a = alphaest; + b = par[fRunInfo->GetBetaParamNo()-1]; + f = fTheory->Func(time, par, fFuncValues); + asymFcnValue = (f*(a*b+1.0)-(a-1.0))/((a+1.0)-f*(a*b-1.0))-(-f*(a*b+1.0)-(a-1.0))/((a+1.0)+f*(a*b-1.0)); break; default: asymFcnValue = 0.0; @@ -871,6 +903,14 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() fRunInfo->SetBkgEstimated(bkgm[0], 3); fRunInfo->SetBkgEstimated(bkgm[1], 4); + cout << "I am here 1 " << endl; + // Get estimate for alpha once + Double_t alpha; + alpha = EstimateAlpha(); + cout << "I am here 2 " << alpha << endl; + fRunInfo->SetEstimatedAlpha(alpha); + + return true; } @@ -903,14 +943,8 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() Double_t valuem = 0.0; Double_t errorm = 0.0; - Double_t SumF[2] = {0.0, 0.0}; - Double_t SumB[2] = {0.0, 0.0}; - Double_t alphaest = 1; - // forward for (Int_t i=fGoodBins[0]; i> PRunAsymmetryBNMR::PrepareFitData(): alpha estimate=" << alphaest << endl; - // check if packed forward and backward hist have the same size, otherwise take the minimum size UInt_t noOfBins = forwardpPacked.GetValue()->size(); if (forwardpPacked.GetValue()->size() != backwardpPacked.GetValue()->size()) { @@ -1249,13 +1277,16 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 // form asymmetry including error propagation Double_t asym; - Double_t fp, bp, efp, ebp, alpha = 1.0, beta = 1.0; + Double_t fp, bp, efp, ebp, alpha, beta = 1.0; Double_t fm, bm, efm, ebm; // set data time start, and step // data start at data_start-t0 fData.SetDataTimeStart(fTimeResolution*((Double_t)start[0]-t0[0]+(Double_t)(packing-1)/2.0)); fData.SetDataTimeStep(fTimeResolution*(Double_t)packing); + // Get estimate for alpha once + alpha = EstimateAlpha(); + // get the proper alpha and beta switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 @@ -1274,6 +1305,14 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 alpha = par[fRunInfo->GetAlphaParamNo()-1]; beta = par[fRunInfo->GetBetaParamNo()-1]; break; + case 5: // alpha ?? , beta == 1 + // use estimated value + beta = 1.0; + break; + case 6: // alpha ??, beta != 1 + // use estimated value + beta = par[fRunInfo->GetBetaParamNo()-1]; + break; default: break; } @@ -1701,3 +1740,43 @@ void PRunAsymmetryBNMR::GetProperFitRange(PMsrGlobalBlock *globalBlock) cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; } } + + +//-------------------------------------------------------------------------- +// EstimateAlpha (private) +//-------------------------------------------------------------------------- +/** + *

Get an estimate for alpha from the forward and backward histograms + * + * \param globalBlock pointer to the GLOBAL block information form the msr-file. + */ +Double_t PRunAsymmetryBNMR::EstimateAlpha() +{ + + Double_t SumF[2] = {0.0, 0.0}; + Double_t SumB[2] = {0.0, 0.0}; + Double_t alpha = 1; + + + // forward + for (Int_t i=0; i> PRunAsymmetryBNMR::EstimateAlpha(): alpha estimate=" << alpha << endl; + + return alpha; +} diff --git a/src/include/PMusr.h b/src/include/PMusr.h index 0d9414ef..7a8c8781 100644 --- a/src/include/PMusr.h +++ b/src/include/PMusr.h @@ -571,6 +571,7 @@ class PMsrGlobalBlock { virtual Double_t GetFitRange(UInt_t idx); virtual Int_t GetFitRangeOffset(UInt_t idx); virtual Int_t GetPacking() { return fPacking; } + virtual Double_t GetEstimatedAlpha() { return fAlpha; } virtual void SetGlobalPresent(Bool_t bval) { fGlobalPresent = bval; } virtual void SetRRFFreq(Double_t freq, const char *unit); @@ -599,6 +600,7 @@ class PMsrGlobalBlock { Double_t fFitRange[2]; ///< fit range in (us) Int_t fFitRangeOffset[2]; ///< if fit range is given in bins it can have the form fit fgb+n0 lgb-n1. This variable holds the n0 and n1. Int_t fPacking; ///< packing/rebinning + Double_t fAlpha; ///< estimated alpha value from F/B counts }; //------------------------------------------------------------- @@ -646,6 +648,7 @@ class PMsrRunBlock { virtual Double_t GetFitRange(UInt_t idx); virtual Int_t GetFitRangeOffset(UInt_t idx); virtual Int_t GetPacking() { return fPacking; } + virtual Double_t GetEstimatedAlpha() { return fAlpha; } virtual Int_t GetXDataIndex() { return fXYDataIndex[0]; } virtual Int_t GetYDataIndex() { return fXYDataIndex[1]; } virtual TString* GetXDataLabel() { return &fXYDataLabel[0]; } @@ -668,6 +671,7 @@ class PMsrRunBlock { virtual void SetForwardHistoNo(Int_t histoNo, Int_t idx=-1); virtual void SetBackwardHistoNo(Int_t histoNo, Int_t idx=-1); virtual void SetBkgEstimated(Double_t dval, Int_t idx); + virtual void SetEstimatedAlpha(Double_t dval); virtual void SetBkgFix(Double_t dval, Int_t idx); virtual void SetBkgRange(Int_t ival, Int_t idx); virtual void SetDataRange(Int_t ival, Int_t idx); @@ -708,6 +712,7 @@ class PMsrRunBlock { Bool_t fFitRangeInBins; ///< flag telling if fit range is given in time or in bins Double_t fFitRange[2]; ///< fit range in (us) Int_t fFitRangeOffset[2]; ///< if fit range is given in bins it can have the form fit fgb+n0 lgb-n1. This variable holds the n0 and n1. + Double_t fAlpha; ///< estimated alpha value from F/B counts Int_t fPacking; ///< packing/rebinning Int_t fXYDataIndex[2]; ///< used to get the data indices when using db-files (fit type 8) TString fXYDataLabel[2]; ///< used to get the indices via labels when using db-files (fit type 8) diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h index a1fc5377..5ed85c9f 100644 --- a/src/include/PRunAsymmetryBNMR.h +++ b/src/include/PRunAsymmetryBNMR.h @@ -87,6 +87,7 @@ class PRunAsymmetryBNMR : public PRunBase virtual Bool_t GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalBlock, PUIntVector &forwardHisto, PUIntVector &backwardHistoNo); virtual Bool_t GetProperDataRange(PRawRunData* runData, UInt_t histoNo[2]); virtual void GetProperFitRange(PMsrGlobalBlock *globalBlock); + virtual Double_t EstimateAlpha(); }; #endif // _PRUNASYMMETRYBNMR_H_ From 781c56fef52cf4eef1478a43ad74654d7d9e1131 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sat, 25 Aug 2018 23:51:08 +0200 Subject: [PATCH 75/87] Cleanup --- src/classes/PRunAsymmetryBNMR.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 8afa4937..63b3c271 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -860,10 +860,10 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() } errBkgp[1] = TMath::Sqrt(bkgp[1])/(end[1] - start[1] + 1); bkgp[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated pos hel backward histo background: " << bkgp[1] << endl; + cout << endl << ">> estimated pos hel backward histo background: " << bkgp[1]; errBkgm[1] = TMath::Sqrt(bkgm[1])/(end[1] - start[1] + 1); bkgm[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated neg hel backward histo background: " << bkgm[1] << endl; + cout << endl << ">> estimated neg hel backward histo background: " << bkgm[1]; // correct error for forward, backward Double_t errVal = 0.0; @@ -903,11 +903,9 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() fRunInfo->SetBkgEstimated(bkgm[0], 3); fRunInfo->SetBkgEstimated(bkgm[1], 4); - cout << "I am here 1 " << endl; // Get estimate for alpha once Double_t alpha; alpha = EstimateAlpha(); - cout << "I am here 2 " << alpha << endl; fRunInfo->SetEstimatedAlpha(alpha); From d38f670504e533b6403c83e626b8ecc3e984f90c Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Sun, 26 Aug 2018 11:33:13 +0200 Subject: [PATCH 76/87] Added documentation relevant to beta-NMR asymmetry fits, fittype 5. --- doc/html/_sources/user-manual.txt | 78 +++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 9 deletions(-) diff --git a/doc/html/_sources/user-manual.txt b/doc/html/_sources/user-manual.txt index 2f675eeb..fb90f631 100644 --- a/doc/html/_sources/user-manual.txt +++ b/doc/html/_sources/user-manual.txt @@ -855,7 +855,7 @@ Currently the supported GLOBAL block entries are: * ``rrf_freq`` for fittype 1, 3 * ``rrf_packing`` for fittype 1, 3 * ``rrf_phase`` for fittype 1, 3 -* ``packing`` for fittype 0, 2, 4 +* ``packing`` for fittype 0, 2, 4, 5 For a detailed discussion of these entries see the section :ref:`RUN block `. @@ -1049,6 +1049,8 @@ In order to describe the operations needed for fitting and plotting, quite some Asymmetry RRF Fit (only for online analysis) **4** MuMinus Fit. This is a single histogram fit especially for negative muon |mgr|\SR + **5** + beta-NMR Asymmetry Fit **8** Non-|mgr|\SR Fit @@ -1061,8 +1063,8 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: alpha-beta .. _msr-alpha-beta: -**alpha, beta** (fit type 2, 3) - These parameters are used to correct the asymmetry for different detector efficiencies, solid angles and initial asymmetries. They are defined as :math:`\alpha = N_{0,b}/N_{0,f}` and :math:`\beta = A_{0,b}/A_{0,f}`. If the parameters are not specified in the :ref:`RUN block `, for each one the value of 1 is assumed. Example for alpha with fit parameter number 1: +**alpha, beta** (fit type 2, 3, 5) + These parameters are used to correct the asymmetry for different detector efficiencies, solid angles and initial asymmetries. They are defined as :math:`\alpha = N_{0,b}/N_{0,f}` and :math:`\beta = A_{0,b}/A_{0,f}`. If the parameters are not specified in the :ref:`RUN block `, for each one the value of 1 is assumed (for fittype 5 alpha is estimated from the ration of sum of Bp+Bm and Fp+Fm). Example for alpha with fit parameter number 1: :: @@ -1141,10 +1143,19 @@ In order to describe the operations needed for fitting and plotting, quite some forward 1-3 backward 7-9 +**forward, backward** (fit type 5) + Numbers of the histograms in the data file that should be taken to calculate the asymmetry. Two forward and backward histograms should be given indicationg positive and negative helicities. The asymmetry from opposite helicities will be subtracted. Examples: + + :: + + # build forward/backward asymmetry with histogram 1 and 3 then subtract asymmetry built with histograms 2 and 4 + forward 1 2 + backward 3 4 + .. index:: backgr.fix .. _msr-backgr.fix: -**backgr.fix** (fit types 0, 1, 2, 3) +**backgr.fix** (fit types 0, 1, 2, 3, 5) A fixed constant background in counts per nanosecond or per bin (see :ref:`below `) may be given at this point. The background is specified for all histograms in the order :math:`B_f B_b [B_r B_l]`. If this keyword is present, *any* information on a ``background`` line is ignored. @@ -1162,7 +1173,7 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: background-asymmetry .. _msr-background-asymmetry: -**background** (fit types 2, 3) +**background** (fit types 2, 3, 5) The numbers of the first and the last channel of an interval from which the constant background should be calculated are specified here. For all the histograms this is done together in the following order: :math:`k_{f,\rm first} k_{f,\rm last} k_{b,\rm first} k_{b, \rm last} [k_{r,\rm first} k_{r,\rm last} k_{l,\rm first} k_{l,\rm last}]`. In case histograms are being grouped, the specified channels are interpreted with respect to the first histograms. Example: @@ -1186,7 +1197,7 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: data-asymmetry .. _msr-data-asymmetry: -**data** (fit type 2, 3) +**data** (fit type 2, 3, 5) The numbers of the first and the last channel of an interval from which the data is taken are specified here. Typically these channels are referred to as first good bin / last good bin (fgb/lgb). For all the histograms this is done together in the following order: :math:`k_{f,\rm first} k_{f,\rm last} k_{b,\rm first} k_{b, \rm last} [k_{r,\rm first} k_{r,\rm last} k_{l,\rm first} k_{l,\rm last}]`. @@ -1210,8 +1221,8 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: t0-asymmetry .. _msr-t0-asymmetry: -**t0** (fit type 2, 3) - The numbers of time-zero channels of the histograms in the order :math:`t_{0,f} t_{0,b}`. Example: +**t0** (fit type 2, 3, 5) + The numbers of time-zero channels of the histograms in the order :math:`t_{0,f} t_{0,b}`. For fit type 5, the time-zero is the channel of the start of beam pulse. Example: :: @@ -1229,7 +1240,7 @@ In order to describe the operations needed for fitting and plotting, quite some .. index:: addt0-asymmetry .. _msr-addt0-asymmetry: -**addt0** (fit type 2, 3) +**addt0** (fit type 2, 3, 5) The numbers of time-zero channels of the histograms in the order :math:`t_{0,f} t_{0,b} [t_{0,r} t_{0,l}]`. If grouping of histograms is present (see :ref:`forward `) the same syntax as for :ref:`t0 ` applies. If one addt0 is given, the total number of addt0's needs to be equal to the total number of :ref:`ADDRUN `\'s! @@ -1851,6 +1862,55 @@ where :math:`i` runs over the different lifetime channels of :math:`\mu^{-}`, an Since MuMinus is quite generic, the full functional depends has to be written in the :ref:`THEORY Block `. +.. index:: bnmr-asymmetry-fit +.. _bnmr-asymmetry-fit: + +beta-NMR Asymmetry Fit (fit type 5) ++++++++++++++++++++++++++++++++++++ + +For a beta-NMR asymmetry fit (fit type 5) four histograms are needed, two for positive and two for negative helicities. These are given by the :ref:`forward ` and :ref:`backward ` keywords +in the :ref:`RUN block `. Additionally, the parameters :ref:`alpha ` and :ref:`beta ` which relate the detector +efficiencies, solid angles and initial asymmetries of the two detectors can be supplied. The constant background for the two histograms is either given by +:ref:`background-determined intervals ` or specified through :ref:`backgr.fix ` in the :ref:`RUN-block `. + +The experimental asymmetry :math:`a(k)` then is calculated from the four histograms: + +.. math:: + + a(k)=\frac{\left[N_{\mathrm{fp}}(k)-B_{\mathrm{fp}}\right]-\left[N_{\mathrm{bp}}(k)-B_{\mathrm{bp}}\right]}{\left[N_{\mathrm{fp}}(k)-B_{\mathrm{fp}}\right]+\left[N_{\mathrm{bp}}(k)-B_{\mathrm{bp}}\right]} + - \frac{\left[N_{\mathrm{fm}}(k)-B_{\mathrm{fm}}\right]-\left[N_{\mathrm{bm}}(k)-B_{\mathrm{bm}}\right]}{\left[N_{\mathrm{fm}}(k)-B_{\mathrm{fm}}\right]+\left[N_{\mathrm{bm}}(k)-B_{\mathrm{bm}}\right]}, + +with + + * :math:`N_{\mathrm{fp}}(k)`: counts in the **forward** histogram channel with positive helicity :math:`k` + * :math:`N_{\mathrm{bp}}(k)`: counts in the **backward** histogram channel with positive helicity :math:`k` + * :math:` B_{\mathrm{fp}}`: constant background in the **forward** histogram with positive helicity (RUN block: :ref:`backgr.fix ` or :ref:`background `) + * :math:` B_{\mathrm{bp}}`: constant background in the **backward** histogram with positive helicity (RUN block: :ref:`backgr.fix ` or :ref:`background `) + * :math:`N_{\mathrm{fm}}(k)`: counts in the **forward** histogram channel with negative helicity :math:`k` + * :math:`N_{\mathrm{bm}}(k)`: counts in the **backward** histogram channel with negative helicity :math:`k` + * :math:` B_{\mathrm{fm}}`: constant background in the **forward** histogram with negative helicity (RUN block: :ref:`backgr.fix ` or :ref:`background `) + * :math:` B_{\mathrm{bm}}`: constant background in the **backward** histogram with negative helicity (RUN block: :ref:`backgr.fix ` or :ref:`background `) + +This theoretical asymmetry :math:`a(t)` is used to fit the function + +.. math:: + + a(t)=\frac{(\alpha\beta +1)A(t)-(\alpha -1)}{(\alpha +1)-(\alpha\beta -1)A(t)} - \frac{(\alpha -1)-(\alpha\beta 1)A(t)}{(\alpha +1)+(\alpha\beta -1)Am(t)}, + +where + + * :math:`\alpha`: accounts for the different detector efficiencies and solid angles (RUN block: :ref:`alpha `). + * :math:`\beta`: accounts for the different detector asymmetries (RUN block: :ref:`beta `). + * :math:`A(t)`: is the depolarization function as given in the :ref:`THEORY block `. + +For the graphical representation in plot type 5 the equation above is rearranged to get :math:`A(t)`: + +.. math:: + + A(t)=\frac{(\alpha -1)+(\alpha +1)a(t)}{(\alpha\beta +1)+(\alpha\beta -1)a(t)}-\frac{(\alpha +1)a(t)-(\alpha -1)}{(\alpha\beta +1)+(1-\alpha\beta)a(t)}=\frac{\alpha\left[N_{\mathrm{fp}}(t)-B_{\mathrm{fp}}\right]-\left[N_{\mathrm{bp}}(t)-B_{\mathrm{bp}}\right]}{\alpha\beta\left[N_{\mathrm{fp}}(t)-B_{\mathrm{fp}}\right]+\left[N_{\mathrm{bp}}(t)-B_{\mathrm{bp}}\right]} -\frac{\alpha\left[N_{\mathrm{fm}}(t)-B_{\mathrm{fm}}\right]-\left[N_{\mathrm{bm}}(t)-B_{\mathrm{bm}}\right]}{\alpha\beta\left[N_{\mathrm{fm}}(t)-B_{\mathrm{fm}}\right]+\left[N_{\mathrm{bm}}(t)-B_{\mathrm{bm}}\right]} + +and plotted together with the function given in the THEORY block. + .. index:: non-musr-fit .. _non-musr-fit: From bd6a63421b6cfa1c18ce1075b559a0fe9078b0f8 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 15 Oct 2018 10:16:41 +0200 Subject: [PATCH 77/87] More recent working version --- src/external/MuSRFitGUI/MSR.pm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/external/MuSRFitGUI/MSR.pm b/src/external/MuSRFitGUI/MSR.pm index c9eff9df..cb8c6086 100644 --- a/src/external/MuSRFitGUI/MSR.pm +++ b/src/external/MuSRFitGUI/MSR.pm @@ -682,10 +682,9 @@ sub CreateTheory { "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" - ); + "Meissner", "Phi Energy Field DeadLayer Lambda", + "skewedGss", "Phi Frq Sgmm Sgmp" + ); ####################################################################### # Generate the full THEORY block From 26dd28d2f190defb2a962e2c98ca720c95dba2d7 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 15 Oct 2018 10:19:02 +0200 Subject: [PATCH 78/87] Changes to template files --- src/external/libBNMR/ExpRlx.msr | 2 +- src/external/libBNMR/SExpRlx.msr | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/external/libBNMR/ExpRlx.msr b/src/external/libBNMR/ExpRlx.msr index eb356304..59c94244 100644 --- a/src/external/libBNMR/ExpRlx.msr +++ b/src/external/libBNMR/ExpRlx.msr @@ -17,7 +17,7 @@ userFcn .libs/libBNMR.so ExpRlx 3 4 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) fittype 5 (beta-NMR fit) -alpha 1 +#alpha 1 forward 3 5 backward 4 6 data 11 1000 11 1000 diff --git a/src/external/libBNMR/SExpRlx.msr b/src/external/libBNMR/SExpRlx.msr index a530e625..5ed46968 100644 --- a/src/external/libBNMR/SExpRlx.msr +++ b/src/external/libBNMR/SExpRlx.msr @@ -3,8 +3,8 @@ LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s FITPARAMETER ############################################################### # No Name Value Err Min Max - 1 Alpha 1 0 none - 2 Asy 0.1148 0.0096 none 0 0.2 + 1 Alpha 0.9 1.0 none + 2 Asy 0.115 0.011 none 0 0.2 3 T 1 0 none 4 Rlx 4.16 0.88 none 0 100 5 Beta 0.433 0.031 none 0.3 2 @@ -13,7 +13,7 @@ FITPARAMETER THEORY ############################################################### asymmetry 2 -userFcn .libs/libBNMR.so SExpRlx 3 4 5 +userFcn libBNMR SExpRlx 3 4 5 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) @@ -50,5 +50,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 21:59:14 - chisq = 210.2, NDF = 172, chisq/NDF = 1.222196 +STATISTIC --- 2018-08-24 16:52:40 + chisq = 210.2, NDF = 171, chisq/NDF = 1.229343 From a4b5c82a8e44bbad9593fda695bd468823b19fde Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 5 Apr 2019 10:14:16 +0200 Subject: [PATCH 79/87] Removed automake file to resolve conflict --- src/classes/Makefile.am | 122 ---------------------------------------- 1 file changed, 122 deletions(-) delete mode 100644 src/classes/Makefile.am diff --git a/src/classes/Makefile.am b/src/classes/Makefile.am deleted file mode 100644 index fa3a0fba..00000000 --- a/src/classes/Makefile.am +++ /dev/null @@ -1,122 +0,0 @@ -## Process this file with automake to create Makefile.in - -h_sources = \ - ../include/PFitterFcn.h \ - ../include/PFitter.h \ - ../include/PFourier.h \ - ../include/PFourierCanvas.h \ - ../include/PFunctionGrammar.h \ - ../include/PFunction.h \ - ../include/PFunctionHandler.h \ - ../include/PMsr2Data.h \ - ../include/PMsrHandler.h \ - ../include/PMusrCanvas.h \ - ../include/PMusr.h \ - ../include/PMusrT0.h \ - ../include/PPrepFourier.h \ - ../include/PRunAsymmetry.h \ - ../include/PRunAsymmetryBNMR.h \ - ../include/PRunAsymmetryRRF.h \ - ../include/PRunBase.h \ - ../include/PRunDataHandler.h \ - ../include/PRunListCollection.h \ - ../include/PRunNonMusr.h \ - ../include/PRunMuMinus.h \ - ../include/PRunSingleHisto.h \ - ../include/PRunSingleHistoRRF.h \ - ../include/PStartupHandler.h \ - ../include/PTheory.h - -h_sources_userFcn = \ - ../include/PUserFcnBase.h - -h_linkdef = \ - ../include/PFourierCanvasLinkDef.h \ - ../include/PMusrCanvasLinkDef.h \ - ../include/PMusrT0LinkDef.h \ - ../include/PStartupHandlerLinkDef.h - -h_linkdef_userFcn = \ - ../include/PUserFcnBaseLinkDef.h - -dict_h_sources = \ - PFourierCanvasDict.h \ - PMusrCanvasDict.h \ - PMusrT0Dict.h \ - PStartupHandlerDict.h - -dict_h_sources_userFcn = \ - PUserFcnBaseDict.h - -cpp_sources = \ - PFitter.cpp \ - PFitterFcn.cpp \ - PFourier.cpp \ - PFourierCanvas.cpp \ - PFunction.cpp \ - PFunctionHandler.cpp \ - PMsr2Data.cpp \ - PMsrHandler.cpp \ - PMusrCanvas.cpp \ - PMusr.cpp \ - PMusrT0.cpp \ - PPrepFourier.cpp \ - PRunAsymmetry.cpp \ - PRunAsymmetryBNMR.cpp \ - PRunAsymmetryRRF.cpp \ - PRunBase.cpp \ - PRunDataHandler.cpp \ - PRunListCollection.cpp \ - PRunNonMusr.cpp \ - PRunMuMinus.cpp \ - PRunSingleHisto.cpp \ - PRunSingleHistoRRF.cpp \ - PStartupHandler.cpp \ - PTheory.cpp - -cpp_sources_userFcn = \ - PUserFcnBase.cpp - -dict_cpp_sources = \ - PFourierCanvasDict.cpp \ - PMusrCanvasDict.cpp \ - PMusrT0Dict.cpp \ - PStartupHandlerDict.cpp - -dict_cpp_sources_userFcn = \ - PUserFcnBaseDict.cpp - -pcmdir = $(libdir) -pcm_DATA = \ - PFourierCanvasDict_rdict.pcm \ - PMusrCanvasDict_rdict.pcm \ - PMusrT0Dict_rdict.pcm \ - PStartupHandlerDict_rdict.pcm \ - PUserFcnBaseDict_rdict.pcm - -include_HEADERS = $(h_sources) $(h_sources_userFcn) -noinst_HEADERS = $(h_linkdef) $(dict_h_sources) $(h_linkdef_userFcn) $(dict_h_sources_userFcn) - -AM_CPPFLAGS = -I$(top_srcdir)/src/include $(MUSR_ROOT_CFLAGS) $(PSIBIN_CFLAGS) $(MUD_CFLAGS) $(LEM_CFLAGS) $(FFTW3_CFLAGS) $(GSL_CFLAGS) $(BOOST_CFLAGS) -I$(ROOTINCDIR) $(PNEXUS_CXXFLAGS) $(NEXUS_CFLAGS) -AM_CXXFLAGS = $(LOCAL_LIB_CXXFLAGS) - -BUILT_SOURCES = $(dict_cpp_sources) $(dict_h_sources) $(dict_cpp_sources_userFcn) $(dict_h_sources_userFcn) -AM_LDFLAGS = $(LOCAL_LIB_LDFLAGS) -L@ROOTLIBDIR@ -CLEANFILES = *Dict.cpp *Dict.h *Dict* *~ core - -%Dict.cpp %Dict.h: ../include/%.h ../include/%LinkDef.h - @ROOTCLING@ -v -f $*Dict.cpp -c -p $(AM_CPPFLAGS) $^ - -lib_LTLIBRARIES = libPUserFcnBase.la libPMusr.la - -libPUserFcnBase_la_SOURCES = $(h_sources_userFcn) $(cpp_sources_userFcn) $(dict_h_sources_userFcn) $(dict_cpp_sources_userFcn) -libPUserFcnBase_la_LIBADD = $(ROOT_LIBS) -libPUserFcnBase_la_LDFLAGS = -version-info $(MUSR_LIBRARY_VERSION) -release $(MUSR_RELEASE) $(AM_LDFLAGS) - -libPMusr_la_SOURCES = $(h_sources) $(cpp_sources) $(dict_h_sources) $(dict_cpp_sources) -libPMusr_la_LIBADD = libPUserFcnBase.la $(MUSR_ROOT_LIBS) $(LEM_LIBS) $(PSIBIN_LIBS) $(MUD_LIBS) $(PNEXUS_LIBS) $(FFTW3_LIBS) $(GSL_LIBS) $(ROOT_LIBS) -libPMusr_la_LDFLAGS = -version-info $(MUSR_LIBRARY_VERSION) -release $(MUSR_RELEASE) $(AM_LDFLAGS) - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = PUserFcnBase.pc PMusr.pc - From be8c809c6a820416fe9f40815db3174efa8a012f Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 26 Apr 2019 10:58:17 +0200 Subject: [PATCH 80/87] Follow Andreas' code modernization for BNMR code and cleanup --- src/classes/PMsrHandler.cpp | 116 ++++++----------------------- src/classes/PMusrCanvas.cpp | 16 +--- src/classes/PRunListCollection.cpp | 4 +- src/include/PRunListCollection.h | 14 ++-- 4 files changed, 34 insertions(+), 116 deletions(-) diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index 5c9bdd68..d55a6138 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -641,10 +641,7 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) fout << std::left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << std::endl ; break; case MSR_FITTYPE_BNMR: - fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; - break; - case MSR_FITTYPE_BNMR: - fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + fout << std::left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << std::endl ; break; case MSR_FITTYPE_NON_MUSR: fout << std::left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << std::endl ; @@ -811,10 +808,7 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) fout << std::left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << std::endl ; break; case MSR_FITTYPE_BNMR: - fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; - break; - case MSR_FITTYPE_BNMR: - fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + fout << std::left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << std::endl ; break; case MSR_FITTYPE_NON_MUSR: fout << std::left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << std::endl ; @@ -1180,10 +1174,7 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) fout << "PLOT " << fPlots[plotNo].fPlotType << " (mu minus plot)" << std::endl; break; case MSR_PLOT_BNMR: - fout << "PLOT " << fPlots[plotNo].fPlotType << " (beta-NMR asymmetry plot)" << endl; - break; - case MSR_PLOT_BNMR: - fout << "PLOT " << fPlots[plotNo].fPlotType << " (beta-NMR asymmetry plot)" << endl; + fout << "PLOT " << fPlots[plotNo].fPlotType << " (beta-NMR asymmetry plot)" << std::endl; break; case MSR_PLOT_NON_MUSR: fout << "PLOT " << fPlots[plotNo].fPlotType << " (non muSR plot)" << std::endl; @@ -1735,10 +1726,7 @@ Int_t PMsrHandler::WriteMsrFile(const Char_t *filename, std::map> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - // cerr << endl << ">> alpha parameter number missing which is needed for an asymmetry fit."; - // cerr << endl << ">> Consider to check the manual ;-)" << endl; + // std::cerr << std::endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + // std::cerr << std::endl << ">> alpha parameter number missing which is needed for an asymmetry fit."; + // std::cerr << std::endl << ">> Consider to check the manual ;-)" << std::endl; // return false; // } // check that there is a forward parameter number if (fRuns[i].GetForwardHistoNo() == -1) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> forward histogram number not defined. Necessary for asymmetry fits." << endl; + std::cerr << std::endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + std::cerr << std::endl << ">> forward histogram number not defined. Necessary for asymmetry fits." << std::endl; return false; } // check that there is a backward parameter number if (fRuns[i].GetBackwardHistoNo() == -1) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> backward histogram number not defined. Necessary for asymmetry fits." << endl; + std::cerr << std::endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + std::cerr << std::endl << ">> backward histogram number not defined. Necessary for asymmetry fits." << std::endl; return false; } // check fit range if (!fRuns[i].IsFitRangeInBin()) { // fit range given as times in usec if ((fRuns[i].GetFitRange(0) == PMUSR_UNDEFINED) || (fRuns[i].GetFitRange(1) == PMUSR_UNDEFINED)) { if ((fGlobal.GetFitRange(0) == PMUSR_UNDEFINED) || (fGlobal.GetFitRange(1) == PMUSR_UNDEFINED)) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> Fit range is not defined, also NOT present in the GLOBAL block. Necessary for asymmetry fits." << endl; + std::cerr << std::endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + std::cerr << std::endl << ">> Fit range is not defined, also NOT present in the GLOBAL block. Necessary for asymmetry fits." << std::endl; return false; } } @@ -5930,74 +5912,22 @@ Bool_t PMsrHandler::CheckRunBlockIntegrity() // check number of T0's provided if ((fRuns[i].GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize()) && (fGlobal.GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize())) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << " in forward. Needs to be fixed." << endl; - cerr << endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << ". Needs to be fixed." << endl; + std::cerr << std::endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + std::cerr << std::endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << " in forward. Needs to be fixed." << std::endl; + std::cerr << std::endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << ". Needs to be fixed." << std::endl; return false; } if ((fRuns[i].GetT0BinSize() > 2*fRuns[i].GetBackwardHistoNoSize()) && (fGlobal.GetT0BinSize() > 2*fRuns[i].GetBackwardHistoNoSize())) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << " in backward. Needs to be fixed." << endl; - cerr << endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << ". Needs to be fixed." << endl; + std::cerr << std::endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; + std::cerr << std::endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << " in backward. Needs to be fixed." << std::endl; + std::cerr << std::endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << ". Needs to be fixed." << std::endl; return false; } // check packing if ((fRuns[i].GetPacking() == -1) && (fGlobal.GetPacking() == -1)) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **WARNING** in RUN block number " << i+1; - cerr << endl << ">> Packing is neither defined here, nor in the GLOBAL block, will set it to 1." << endl; - fRuns[i].SetPacking(1); - } - break; - case PRUN_ASYMMETRY_BNMR: - // check alpha - // if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { - // cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - // cerr << endl << ">> alpha parameter number missing which is needed for an asymmetry fit."; - // cerr << endl << ">> Consider to check the manual ;-)" << endl; - // return false; - // } - // check that there is a forward parameter number - if (fRuns[i].GetForwardHistoNo() == -1) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> forward histogram number not defined. Necessary for asymmetry fits." << endl; - return false; - } - // check that there is a backward parameter number - if (fRuns[i].GetBackwardHistoNo() == -1) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> backward histogram number not defined. Necessary for asymmetry fits." << endl; - return false; - } - // check fit range - if (!fRuns[i].IsFitRangeInBin()) { // fit range given as times in usec - if ((fRuns[i].GetFitRange(0) == PMUSR_UNDEFINED) || (fRuns[i].GetFitRange(1) == PMUSR_UNDEFINED)) { - if ((fGlobal.GetFitRange(0) == PMUSR_UNDEFINED) || (fGlobal.GetFitRange(1) == PMUSR_UNDEFINED)) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> Fit range is not defined, also NOT present in the GLOBAL block. Necessary for asymmetry fits." << endl; - return false; - } - } - } - // check number of T0's provided - if ((fRuns[i].GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize()) && - (fGlobal.GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize())) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << " in forward. Needs to be fixed." << endl; - cerr << endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetForwardHistoNoSize() << ". Needs to be fixed." << endl; - return false; - } - if ((fRuns[i].GetT0BinSize() > 2*fRuns[i].GetBackwardHistoNoSize()) && - (fGlobal.GetT0BinSize() > 2*fRuns[i].GetBackwardHistoNoSize())) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **ERROR** in RUN block number " << i+1; - cerr << endl << ">> Found " << fRuns[i].GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << " in backward. Needs to be fixed." << endl; - cerr << endl << ">> In GLOBAL block: " << fGlobal.GetT0BinSize() << " T0 entries. Expecting only " << 2*fRuns[i].GetBackwardHistoNoSize() << ". Needs to be fixed." << endl; - return false; - } - // check packing - if ((fRuns[i].GetPacking() == -1) && (fGlobal.GetPacking() == -1)) { - cerr << endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **WARNING** in RUN block number " << i+1; - cerr << endl << ">> Packing is neither defined here, nor in the GLOBAL block, will set it to 1." << endl; + std::cerr << std::endl << ">> PMsrHandler::CheckRunBlockIntegrity(): **WARNING** in RUN block number " << i+1; + std::cerr << std::endl << ">> Packing is neither defined here, nor in the GLOBAL block, will set it to 1." << std::endl; fRuns[i].SetPacking(1); } break; diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index 350fa293..e3d57422 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -722,18 +722,6 @@ void PMusrCanvas::UpdateDataTheoryPad() // handle data HandleDataSet(i, runNo, data); break; - case MSR_FITTYPE_BNMR: - data = fRunList->GetAsymmetryBNMR(runNo, PRunListCollection::kRunNo); - if (!data) { // something wrong - fValid = false; - // error message - cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a beta-NMR asymmetry plot"; - cerr << endl; - return; - } - // handle data - HandleDataSet(i, runNo, data); - break; case MSR_FITTYPE_ASYM_RRF: data = fRunList->GetAsymmetryRRF(runNo, PRunListCollection::kRunNo); if (!data) { // something wrong @@ -751,8 +739,8 @@ void PMusrCanvas::UpdateDataTheoryPad() if (!data) { // something wrong fValid = false; // error message - cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a mu minus single histogram plot"; - cerr << endl; + std::cerr << std::endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a mu minus single histogram plot"; + std::cerr << std::endl; return; } // handle data diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index 868475d8..98e11c6a 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -988,8 +988,8 @@ PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) switch (tag) { case kIndex: // called from musrfit when dumping the data if (index > fRunAsymmetryBNMRList.size()) { - cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; - cerr << endl; + std::cerr << std::endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; + std::cerr << std::endl; return 0; } diff --git a/src/include/PRunListCollection.h b/src/include/PRunListCollection.h index 7d969e37..7f41c1c1 100644 --- a/src/include/PRunListCollection.h +++ b/src/include/PRunListCollection.h @@ -111,13 +111,13 @@ class PRunListCollection PMsrHandler *fMsrInfo; ///< pointer to the msr-file handler PRunDataHandler *fData; ///< pointer to the run-data handler - vector fRunSingleHistoList; ///< stores all processed single histogram data - vector fRunSingleHistoRRFList; ///< stores all processed single histogram RRF data - vector fRunAsymmetryList; ///< stores all processed asymmetry data - vector fRunAsymmetryRRFList; ///< stores all processed asymmetry RRF data - vector fRunAsymmetryBNMRList; ///< stores all processed asymmetry BNMR data - vector fRunMuMinusList; ///< stores all processed mu-minus data - vector fRunNonMusrList; ///< stores all processed non-muSR data + std::vector fRunSingleHistoList; ///< stores all processed single histogram data + std::vector fRunSingleHistoRRFList; ///< stores all processed single histogram RRF data + std::vector fRunAsymmetryList; ///< stores all processed asymmetry data + std::vector fRunAsymmetryRRFList; ///< stores all processed asymmetry RRF data + std::vector fRunAsymmetryBNMRList; ///< stores all processed asymmetry BNMR data + std::vector fRunMuMinusList; ///< stores all processed mu-minus data + std::vector fRunNonMusrList; ///< stores all processed non-muSR data }; #endif // _PRUNLISTCOLLECTION_H_ From 6498e0b0bca19a4eda4e241e08519edeaacab0ea Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 1 May 2019 12:56:33 +0200 Subject: [PATCH 81/87] Preparing for merge with master --- src/classes/PRunAsymmetryBNMR.cpp | 336 +++++++++++++++--------------- src/include/PRunAsymmetryBNMR.h | 9 +- 2 files changed, 171 insertions(+), 174 deletions(-) diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 63b3c271..9cef0f21 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -2,14 +2,15 @@ PRunAsymmetryBNMR.cpp - Author: Andreas Suter - e-mail: andreas.suter@psi.ch + Author: Zaher Salman + Based on PRunAsymmetry.cpp by Andreas Suter + e-mail: zaher.salman@psi.ch ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2007-2016 by Andreas Suter * - * andreas.suter@psi.ch * + * Copyright (C) 2018-2019 by Zaher Salman * + * zaher.salman@psi.ch * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -38,7 +39,6 @@ #include #include -using namespace std; #include #include @@ -93,9 +93,9 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD fPacking = fMsrInfo->GetMsrGlobal()->GetPacking(); } if (fPacking == -1) { // this should NOT happen, somethin is severely wrong - cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **SEVERE ERROR**: Couldn't find any packing information!"; - cerr << endl << ">> This is very bad :-(, will quit ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **SEVERE ERROR**: Couldn't find any packing information!"; + std::cerr << std::endl << ">> This is very bad :-(, will quit ..."; + std::cerr << std::endl; fValid = false; return; } @@ -108,15 +108,15 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD Bool_t alphaFixedToOne = false; Bool_t alphaSetDefault = false; if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given - // cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; - // cerr << endl; + // std::cerr << std::endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** no alpha parameter given! This is needed for an asymmetry fit!"; + // std::cerr << std::endl; // fValid = false; // return; alphaSetDefault = true; } else if ((fRunInfo->GetAlphaParamNo() < 0) || (fRunInfo->GetAlphaParamNo() > (Int_t)param->size())) { // check if alpha parameter is within proper bounds - cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); - cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** alpha parameter no = " << fRunInfo->GetAlphaParamNo(); + std::cerr << std::endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + std::cerr << std::endl; fValid = false; return; } else { // check if alpha is fixed @@ -130,9 +130,9 @@ PRunAsymmetryBNMR::PRunAsymmetryBNMR(PMsrHandler *msrInfo, PRunDataHandler *rawD if (fRunInfo->GetBetaParamNo() == -1) { // no beta given hence assuming beta == 1 betaFixedToOne = true; } else if ((fRunInfo->GetBetaParamNo() < 0) || (fRunInfo->GetBetaParamNo() > (Int_t)param->size())) { // check if beta parameter is within proper bounds - cerr << endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** beta parameter no = " << fRunInfo->GetBetaParamNo(); - cerr << endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PRunAsymmetryBNMR(): **ERROR** beta parameter no = " << fRunInfo->GetBetaParamNo(); + std::cerr << std::endl << ">> This is out of bound, since there are only " << param->size() << " parameters."; + std::cerr << std::endl; fValid = false; return; } else { // check if beta is fixed @@ -220,7 +220,7 @@ Double_t PRunAsymmetryBNMR::CalcChiSquare(const std::vector& par) #pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,a,b,f) schedule(dynamic,chunk) reduction(+:chisq) #endif for (i=fStartTimeBin; i(i)*fData.GetDataTimeStep(); switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 asymFcnValue = fTheory->Func(time, par, fFuncValues); @@ -289,7 +289,7 @@ Double_t PRunAsymmetryBNMR::CalcChiSquareExpected(const std::vector& p */ Double_t PRunAsymmetryBNMR::CalcMaxLikelihood(const std::vector& par) { - cout << endl << "PRunAsymmetryBNMR::CalcMaxLikelihood(): not implemented yet ..." << endl; + std::cout << std::endl << "PRunAsymmetryBNMR::CalcMaxLikelihood(): not implemented yet ..." << std::endl; return 1.0; } @@ -325,8 +325,8 @@ UInt_t PRunAsymmetryBNMR::GetNoOfFitBins() */ void PRunAsymmetryBNMR::SetFitRangeBin(const TString fitRange) { - TObjArray *tok = 0; - TObjString *ostr = 0; + TObjArray *tok = nullptr; + TObjString *ostr = nullptr; TString str; Ssiz_t idx = -1; Int_t offset = 0; @@ -335,7 +335,7 @@ void PRunAsymmetryBNMR::SetFitRangeBin(const TString fitRange) if (tok->GetEntries() == 3) { // structure FIT_RANGE fgb+n0 lgb-n1 // handle fgb+n0 entry - ostr = (TObjString*) tok->At(1); + ostr = dynamic_cast(tok->At(1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -347,7 +347,7 @@ void PRunAsymmetryBNMR::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(2); + ostr = dynamic_cast(tok->At(2)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -361,11 +361,11 @@ void PRunAsymmetryBNMR::SetFitRangeBin(const TString fitRange) Int_t pos = 2*(fRunNo+1)-1; if (pos + 1 >= tok->GetEntries()) { - cerr << endl << ">> PRunAsymmetryBNMR::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } else { // handle fgb+n0 entry - ostr = (TObjString*) tok->At(pos); + ostr = static_cast(tok->At(pos)); str = ostr->GetString(); // check if there is an offset present idx = str.First("+"); @@ -377,7 +377,7 @@ void PRunAsymmetryBNMR::SetFitRangeBin(const TString fitRange) fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution; // handle lgb-n1 entry - ostr = (TObjString*) tok->At(pos+1); + ostr = static_cast(tok->At(pos+1)); str = ostr->GetString(); // check if there is an offset present idx = str.First("-"); @@ -389,8 +389,8 @@ void PRunAsymmetryBNMR::SetFitRangeBin(const TString fitRange) fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution; } } else { // error - cerr << endl << ">> PRunAsymmetryBNMR::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; - cerr << endl << ">> will ignore it. Sorry ..." << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'"; + std::cerr << std::endl << ">> will ignore it. Sorry ..." << std::endl; } // clean up @@ -416,7 +416,7 @@ void PRunAsymmetryBNMR::CalcNoOfFitBins() fEndTimeBin = fData.GetValue()->size(); if (fEndTimeBin > fStartTimeBin) - fNoOfFitBins = fEndTimeBin - fStartTimeBin; + fNoOfFitBins = static_cast(fEndTimeBin - fStartTimeBin); else fNoOfFitBins = 0; } @@ -449,7 +449,7 @@ void PRunAsymmetryBNMR::CalcTheory() alphaest = fRunInfo->GetEstimatedAlpha(); for (UInt_t i=0; isize(); i++) { - time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); + time = fData.GetDataTimeStart() + static_cast(i)*fData.GetDataTimeStep(); switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 asymFcnValue = fTheory->Func(time, par, fFuncValues); @@ -523,8 +523,8 @@ Bool_t PRunAsymmetryBNMR::PrepareData() // get the correct run PRawRunData *runData = fRawData->GetRunData(*(fRunInfo->GetRunName())); if (!runData) { // run not found - cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; + std::cerr << std::endl; return false; } @@ -535,10 +535,10 @@ Bool_t PRunAsymmetryBNMR::PrepareData() forwardHistoNo.push_back(fRunInfo->GetForwardHistoNo(i)); if (!runData->IsPresent(forwardHistoNo[i])) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> forwardHistoNo found = " << forwardHistoNo[i] << ", which is NOT present in the data file!?!?"; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> forwardHistoNo found = " << forwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; // clean up forwardHistoNo.clear(); backwardHistoNo.clear(); @@ -549,10 +549,10 @@ Bool_t PRunAsymmetryBNMR::PrepareData() backwardHistoNo.push_back(fRunInfo->GetBackwardHistoNo(i)); if (!runData->IsPresent(backwardHistoNo[i])) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> backwardHistoNo found = " << backwardHistoNo[i] << ", which is NOT present in the data file!?!?"; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> backwardHistoNo found = " << backwardHistoNo[i] << ", which is NOT present in the data file!?!?"; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; // clean up forwardHistoNo.clear(); backwardHistoNo.clear(); @@ -560,10 +560,10 @@ Bool_t PRunAsymmetryBNMR::PrepareData() } } if (forwardHistoNo.size() != backwardHistoNo.size()) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; - cerr << endl << ">> # of forward histograms different from # of backward histograms."; - cerr << endl << ">> Will quit :-("; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:"; + std::cerr << std::endl << ">> # of forward histograms different from # of backward histograms."; + std::cerr << std::endl << ">> Will quit :-("; + std::cerr << std::endl; // clean up forwardHistoNo.clear(); backwardHistoNo.clear(); @@ -573,8 +573,8 @@ Bool_t PRunAsymmetryBNMR::PrepareData() // keep the time resolution in (ms) // possibility to rescale for betaNMR fTimeResolution = runData->GetTimeResolution()/1.0e3; - cout.precision(10); - cout << endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << fixed << runData->GetTimeResolution() << "(ms)" << endl; + std::cout.precision(10); + std::cout << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << std::fixed << runData->GetTimeResolution() << "(ms)" << std::endl; // get all the proper t0's and addt0's for the current RUN block if (!GetProperT0(runData, globalBlock, forwardHistoNo, backwardHistoNo)) { @@ -582,7 +582,7 @@ Bool_t PRunAsymmetryBNMR::PrepareData() } // keep the histo of each group at this point (addruns handled below) - vector forward, backward; + std::vector forward, backward; forward.resize(forwardHistoNo.size()); // resize to number of groups backward.resize(backwardHistoNo.size()); // resize to numer of groups for (UInt_t i=0; iGetRunNameSize(); i++) { // get run to be added to the main one addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); - if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + if (addRunData == nullptr) { // couldn't get run + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -611,8 +611,9 @@ Bool_t PRunAsymmetryBNMR::PrepareData() addRunSize = addRunData->GetDataBin(forwardHistoNo[k])->size(); for (UInt_t j=0; jGetDataBin(forwardHistoNo[k])->size(); j++) { // loop over the bin indices // make sure that the index stays in the proper range - if (((Int_t)j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k] >= 0) && (j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k] < addRunSize)) { - forward[k][j] += addRunData->GetDataBin(forwardHistoNo[k])->at(j+(Int_t)fAddT0s[i-1][2*k]-(Int_t)fT0s[2*k]); + if ((static_cast(j)+static_cast(fAddT0s[i-1][2*k])-static_cast(fT0s[2*k]) >= 0) && + (j+static_cast(fAddT0s[i-1][2*k])-static_cast(fT0s[2*k]) < addRunSize)) { + forward[k][j] += addRunData->GetDataBin(forwardHistoNo[k])->at(j+static_cast(fAddT0s[i-1][2*k])-static_cast(fT0s[2*k])); } } } @@ -622,8 +623,9 @@ Bool_t PRunAsymmetryBNMR::PrepareData() addRunSize = addRunData->GetDataBin(backwardHistoNo[k])->size(); for (UInt_t j=0; jGetDataBin(backwardHistoNo[k])->size(); j++) { // loop over the bin indices // make sure that the index stays in the proper range - if (((Int_t)j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1] >= 0) && (j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1] < addRunSize)) { - backward[k][j] += addRunData->GetDataBin(backwardHistoNo[k])->at(j+(Int_t)fAddT0s[i-1][2*k+1]-(Int_t)fT0s[2*k+1]); + if ((static_cast(j)+static_cast(fAddT0s[i-1][2*k+1])-static_cast(fT0s[2*k+1]) >= 0) && + (j+static_cast(fAddT0s[i-1][2*k+1])-static_cast(fT0s[2*k+1]) < addRunSize)) { + backward[k][j] += addRunData->GetDataBin(backwardHistoNo[k])->at(j+static_cast(fAddT0s[i-1][2*k+1])-static_cast(fT0s[2*k+1])); } } } @@ -652,12 +654,12 @@ Bool_t PRunAsymmetryBNMR::PrepareData() fRunInfo->SetBkgRange(static_cast(fT0s[0]*0.6), 1); fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.1), 2); fRunInfo->SetBkgRange(static_cast(fT0s[1]*0.6), 3); - cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **WARNING** Neither fix background nor background bins are given!"; - cerr << endl << ">> Will try the following:"; - cerr << endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); - cerr << endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); - cerr << endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **WARNING** Neither fix background nor background bins are given!"; + std::cerr << std::endl << ">> Will try the following:"; + std::cerr << std::endl << ">> forward: bkg start = " << fRunInfo->GetBkgRange(0) << ", bkg end = " << fRunInfo->GetBkgRange(1); + std::cerr << std::endl << ">> backward: bkg start = " << fRunInfo->GetBkgRange(2) << ", bkg end = " << fRunInfo->GetBkgRange(3); + std::cerr << std::endl << ">> NO GUARANTEE THAT THIS MAKES ANY SENSE! Better check ..."; + std::cerr << std::endl; if (!SubtractEstimatedBkg()) return false; } @@ -797,7 +799,7 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() Int_t end[2] = {fRunInfo->GetBkgRange(1), fRunInfo->GetBkgRange(3)}; for (UInt_t i=0; i<2; i++) { if (end[i] < start[i]) { - cout << endl << "PRunAsymmetryBNMR::SubtractEstimatedBkg(): end = " << end[i] << " > start = " << start[i] << "! Will swap them!"; + std::cout << std::endl << "PRunAsymmetryBNMR::SubtractEstimatedBkg(): end = " << end[i] << " > start = " << start[i] << "! Will swap them!"; UInt_t keep = end[i]; end[i] = start[i]; start[i] = keep; @@ -807,11 +809,11 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() // calculate proper background range for (UInt_t i=0; i<2; i++) { if (beamPeriod != 0.0) { - Double_t timeBkg = (Double_t)(end[i]-start[i])*(fTimeResolution*fPacking); // length of the background intervall in time - UInt_t fullCycles = (UInt_t)(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall + Double_t timeBkg = static_cast(end[i]-start[i])*(fTimeResolution*fPacking); // length of the background intervall in time + UInt_t fullCycles = static_cast(timeBkg/beamPeriod); // how many proton beam cylces can be placed within the proposed background intervall // correct the end of the background intervall such that the background is as close as possible to a multiple of the proton cylce - end[i] = start[i] + (UInt_t) ((fullCycles*beamPeriod)/(fTimeResolution*fPacking)); - cout << "PRunAsymmetryBNMR::SubtractEstimatedBkg(): Background " << start[i] << ", " << end[i] << endl; + end[i] = start[i] + static_cast((fullCycles*beamPeriod)/(fTimeResolution*fPacking)); + std::cout << "PRunAsymmetryBNMR::SubtractEstimatedBkg(): Background " << start[i] << ", " << end[i] << std::endl; if (end[i] == start[i]) end[i] = fRunInfo->GetBkgRange(2*i+1); } @@ -820,18 +822,18 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() // check if start is within histogram bounds if ((start[0] < 0) || (start[0] >= fForwardp.size()) || (start[1] < 0) || (start[1] >= fBackwardp.size())) { - cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForwardp.size() << "/" << fBackwardp.size() << ")."; - cerr << endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths (f/b) = (" << fForwardp.size() << "/" << fBackwardp.size() << ")."; + std::cerr << std::endl << ">> background start (f/b) = (" << start[0] << "/" << start[1] << ")."; return false; } // check if end is within histogram bounds if ((end[0] < 0) || (end[0] >= fForwardp.size()) || (end[1] < 0) || (end[1] >= fBackwardp.size())) { - cerr << endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; - cerr << endl << ">> histo lengths (f/b) = (" << fForwardp.size() << "/" << fBackwardp.size() << ")."; - cerr << endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::SubtractEstimatedBkg(): **ERROR** background bin values out of bound!"; + std::cerr << std::endl << ">> histo lengths (f/b) = (" << fForwardp.size() << "/" << fBackwardp.size() << ")."; + std::cerr << std::endl << ">> background end (f/b) = (" << end[0] << "/" << end[1] << ")."; return false; } @@ -848,10 +850,10 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() } errBkgp[0] = TMath::Sqrt(bkgp[0])/(end[0] - start[0] + 1); bkgp[0] /= static_cast(end[0] - start[0] + 1); - cout << endl << ">> estimated pos hel forward histo background: " << bkgp[0]; + std::cout << std::endl << ">> estimated pos hel forward histo background: " << bkgp[0]; errBkgm[0] = TMath::Sqrt(bkgp[0])/(end[0] - start[0] + 1); bkgm[0] /= static_cast(end[0] - start[0] + 1); - cout << endl << ">> estimated neg hel forward histo background: " << bkgm[0]; + std::cout << std::endl << ">> estimated neg hel forward histo background: " << bkgm[0]; // backward for (UInt_t i=start[1]; i<=end[1]; i++) { @@ -860,10 +862,10 @@ Bool_t PRunAsymmetryBNMR::SubtractEstimatedBkg() } errBkgp[1] = TMath::Sqrt(bkgp[1])/(end[1] - start[1] + 1); bkgp[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated pos hel backward histo background: " << bkgp[1]; + std::cout << std::endl << ">> estimated pos hel backward histo background: " << bkgp[1]; errBkgm[1] = TMath::Sqrt(bkgm[1])/(end[1] - start[1] + 1); bkgm[1] /= static_cast(end[1] - start[1] + 1); - cout << endl << ">> estimated neg hel backward histo background: " << bkgm[1]; + std::cout << std::endl << ">> estimated neg hel backward histo background: " << bkgm[1]; // correct error for forward, backward Double_t errVal = 0.0; @@ -1028,8 +1030,8 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() Double_t fm, bm, efm, ebm; // fill data time start, and step // data start at data_start-t0 shifted by (pack-1)/2 - fData.SetDataTimeStart(fTimeResolution*((Double_t)fGoodBins[0]-fT0s[0]+(Double_t)(fPacking-1)/2.0)); - fData.SetDataTimeStep(fTimeResolution*(Double_t)fPacking); + fData.SetDataTimeStart(fTimeResolution*(static_cast(fGoodBins[0])-fT0s[0]+static_cast(fPacking-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*static_cast(fPacking)); for (UInt_t i=0; iat(i); @@ -1074,15 +1076,9 @@ Bool_t PRunAsymmetryBNMR::PrepareFitData() return true; } - -//-------------------------------------------------------------------------- -// PrepareViewData (protected) //-------------------------------------------------------------------------- /** *

Take the pre-processed data (i.e. grouping and addrun are preformed) and form the asymmetry for view representation. - * Before forming the asymmetry, the following checks will be performed: - * -# check if view packing is whished. - * -# check if data range is given, if not try to estimate one. * -# check that data range is present, that it makes any sense. * -# check that 'first good bin'-'t0' is the same for forward and backward histogram. If not adjust it. * -# pack data (rebin). @@ -1114,7 +1110,7 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 // first get start data, end data, and t0 Int_t start[2] = {fGoodBins[0], fGoodBins[2]}; Int_t end[2] = {fGoodBins[1], fGoodBins[3]}; - Int_t t0[2] = {(Int_t)fT0s[0], (Int_t)fT0s[1]}; + Int_t t0[2] = {static_cast(fT0s[0]), static_cast(fT0s[1])}; // check if the data ranges and t0's between forward/backward are compatible Int_t fgb[2]; @@ -1122,13 +1118,13 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 if (abs(start[0]-t0[0]) > abs(start[1]-t0[1])) { fgb[0] = start[0]; fgb[1] = t0[1] + start[0]-t0[0]; - cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **WARNING** needed to shift backward fgb from "; - cerr << start[1] << " to " << fgb[1] << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **WARNING** needed to shift backward fgb from "; + std::cerr << start[1] << " to " << fgb[1] << std::endl; } else { fgb[0] = t0[0] + start[1]-t0[1]; fgb[1] = start[1]; - cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **WARNING** needed to shift forward fgb from "; - cerr << start[0] << " to " << fgb[0] << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **WARNING** needed to shift forward fgb from "; + std::cerr << start[0] << " to " << fgb[0] << std::endl; } } else { // fgb aligning is correct fgb[0] = start[0]; @@ -1161,21 +1157,21 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 start[i] = keep; } // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start[i] < 0) || (start[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds - if ((end[i] < 0) || (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; - cerr << endl; + if ((end[i] < 0) || (end[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** t0 data bin doesn't make any sense!"; - cerr << endl; + if ((t0[i] < 0) || (t0[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareViewData(): **ERROR** t0 data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -1279,8 +1275,8 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 Double_t fm, bm, efm, ebm; // set data time start, and step // data start at data_start-t0 - fData.SetDataTimeStart(fTimeResolution*((Double_t)start[0]-t0[0]+(Double_t)(packing-1)/2.0)); - fData.SetDataTimeStep(fTimeResolution*(Double_t)packing); + fData.SetDataTimeStart(fTimeResolution*(static_cast(start[0])-t0[0]+static_cast(packing-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*static_cast(packing)); // Get estimate for alpha once alpha = EstimateAlpha(); @@ -1368,12 +1364,12 @@ Bool_t PRunAsymmetryBNMR::PrepareViewData(PRawRunData* runData, UInt_t histoNo[2 Double_t factor = 1.0; if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo[0])->size()) { size = fData.GetValue()->size() * 10; - factor = (Double_t)runData->GetDataBin(histoNo[0])->size() / (Double_t)size; + factor = static_cast(runData->GetDataBin(histoNo[0])->size()) / static_cast(size); } fData.SetTheoryTimeStart(fData.GetDataTimeStart()); fData.SetTheoryTimeStep(fTimeResolution*factor); for (UInt_t i=0; i(i)*fTimeResolution*factor; value = fTheory->Func(time, par, fFuncValues); if (fabs(value) > 10.0) { // dirty hack needs to be fixed!! value = 0.0; @@ -1453,11 +1449,11 @@ Bool_t PRunAsymmetryBNMR::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glo fT0s[2*i] = runData->GetT0BinEstimated(forwardHistoNo[i]); fRunInfo->SetT0Bin(fT0s[2*i], 2*i); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName()->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << runData->GetT0BinEstimated(forwardHistoNo[i]); + std::cerr << std::endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } for (UInt_t i=0; iGetT0BinEstimated(backwardHistoNo[i]); fRunInfo->SetT0Bin(fT0s[2*i+1], 2*i+1); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName()->Data(); - cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName()->Data(); + std::cerr << std::endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[i]); + std::cerr << std::endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } // check if t0 is within proper bounds for (UInt_t i=0; i (Int_t)runData->GetDataBin(forwardHistoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **ERROR** t0 data bin (" << fT0s[2*i] << ") doesn't make any sense!"; - cerr << endl << ">> forwardHistoNo " << forwardHistoNo[i]; - cerr << endl; + if ((fT0s[2*i] < 0) || (fT0s[2*i] > static_cast(runData->GetDataBin(forwardHistoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperT0(): **ERROR** t0 data bin (" << fT0s[2*i] << ") doesn't make any sense!"; + std::cerr << std::endl << ">> forwardHistoNo " << forwardHistoNo[i]; + std::cerr << std::endl; return false; } - if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > (Int_t)runData->GetDataBin(backwardHistoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!"; - cerr << endl << ">> backwardHistoNo " << backwardHistoNo[i]; - cerr << endl; + if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > static_cast(runData->GetDataBin(backwardHistoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!"; + std::cerr << std::endl << ">> backwardHistoNo " << backwardHistoNo[i]; + std::cerr << std::endl; return false; } } @@ -1497,8 +1493,8 @@ Bool_t PRunAsymmetryBNMR::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glo // get run to be added to the main one addRunData = fRawData->GetRunData(*(fRunInfo->GetRunName(i))); if (addRunData == 0) { // couldn't get run - cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::endl; return false; } @@ -1537,11 +1533,11 @@ Bool_t PRunAsymmetryBNMR::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glo fAddT0s[i-1][2*j] = addRunData->GetT0BinEstimated(forwardHistoNo[j]); fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j], i-1, 2*j); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); - cerr << endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + std::cerr << std::endl << ">> will try the estimated one: forward t0 = " << addRunData->GetT0BinEstimated(forwardHistoNo[j]); + std::cerr << std::endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } for (UInt_t j=0; jGetT0BinEstimated(backwardHistoNo[j]); fRunInfo->SetAddT0Bin(fAddT0s[i-1][2*j+1], i-1, 2*j+1); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; - cerr << endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); - cerr << endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); - cerr << endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperT0(): **WARRNING** NO t0's found, neither in the run data nor in the msr-file!"; + std::cerr << std::endl << ">> run: " << fRunInfo->GetRunName(i)->Data(); + std::cerr << std::endl << ">> will try the estimated one: backward t0 = " << runData->GetT0BinEstimated(backwardHistoNo[j]); + std::cerr << std::endl << ">> NO GUARANTEE THAT THIS OK!! For instance for LEM this is almost for sure rubbish!"; + std::cerr << std::endl; } } } @@ -1598,36 +1594,36 @@ Bool_t PRunAsymmetryBNMR::GetProperDataRange(PRawRunData* runData, UInt_t histoN } Double_t t0[2] = {fT0s[0], fT0s[1]}; - Int_t offset = (Int_t)(10.0e-3/fTimeResolution); // needed in case first good bin is not given, default = 10ns + Int_t offset = static_cast((10.0e-3/fTimeResolution)); // needed in case first good bin is not given, default = 10ns // check if data range has been provided, and if not try to estimate them if (start[0] < 0) { - start[0] = (Int_t)t0[0]+offset; + start[0] = static_cast(t0[0])+offset; fRunInfo->SetDataRange(start[0], 0); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[0] << "."; + std::cerr << std::endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (start[1] < 0) { - start[1] = (Int_t)t0[1]+offset; + start[1] = static_cast(t0[1])+offset; fRunInfo->SetDataRange(start[1], 2); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range start = t0+" << offset << "(=10ns) = " << start[1] << "."; + std::cerr << std::endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (end[0] < 0) { end[0] = runData->GetDataBin(histoNo[0])->size(); fRunInfo->SetDataRange(end[0], 1); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (forward) was not provided, will try data range end = " << end[0] << "."; + std::cerr << std::endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } if (end[1] < 0) { end[1] = runData->GetDataBin(histoNo[1])->size(); fRunInfo->SetDataRange(end[1], 3); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; - cerr << endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** data range (backward) was not provided, will try data range end = " << end[1] << "."; + std::cerr << std::endl << ">> NO GUARANTEE THAT THIS DOES MAKE ANY SENSE."; + std::cerr << std::endl; } // check if start, end, and t0 make any sense @@ -1639,27 +1635,27 @@ Bool_t PRunAsymmetryBNMR::GetProperDataRange(PRawRunData* runData, UInt_t histoN start[i] = keep; } // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** start data bin doesn't make any sense!"; - cerr << endl; + if ((start[i] < 0) || (start[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** start data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } // 3rd check if end is within proper bounds if (end[i] < 0) { - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** end data bin (" << end[i] << ") doesn't make any sense!"; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** end data bin (" << end[i] << ") doesn't make any sense!"; + std::cerr << std::endl; return false; } - if (end[i] > (Int_t)runData->GetDataBin(histoNo[i])->size()) { - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** end data bin (" << end[i] << ") > histo length (" << (Int_t)runData->GetDataBin(histoNo[i])->size() << ")."; - cerr << endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << endl; - cerr << endl; - end[i] = (Int_t)runData->GetDataBin(histoNo[i])->size()-1; + if (end[i] > static_cast(runData->GetDataBin(histoNo[i])->size())) { + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **WARNING** end data bin (" << end[i] << ") > histo length (" << static_cast(runData->GetDataBin(histoNo[i])->size()) << ")."; + std::cerr << std::endl << ">> Will set end = (histo length - 1). Consider to change it in the msr-file." << std::endl; + std::cerr << std::endl; + end[i] = static_cast(runData->GetDataBin(histoNo[i])->size())-1; } // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (Int_t)runData->GetDataBin(histoNo[i])->size())) { - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** t0 data bin doesn't make any sense!"; - cerr << endl; + if ((t0[i] < 0) || (t0[i] > static_cast(runData->GetDataBin(histoNo[i])->size()))) { + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange(): **ERROR** t0 data bin doesn't make any sense!"; + std::cerr << std::endl; return false; } } @@ -1668,18 +1664,18 @@ Bool_t PRunAsymmetryBNMR::GetProperDataRange(PRawRunData* runData, UInt_t histoN if (fabs(static_cast(start[0])-t0[0]) > fabs(static_cast(start[1])-t0[1])){ start[1] = static_cast(t0[1] + static_cast(start[0]) - t0[0]); end[1] = static_cast(t0[1] + static_cast(end[0]) - t0[0]); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange **WARNING** needed to shift backward data range."; - cerr << endl << ">> given: " << fRunInfo->GetDataRange(2) << ", " << fRunInfo->GetDataRange(3); - cerr << endl << ">> used : " << start[1] << ", " << end[1]; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange **WARNING** needed to shift backward data range."; + std::cerr << std::endl << ">> given: " << fRunInfo->GetDataRange(2) << ", " << fRunInfo->GetDataRange(3); + std::cerr << std::endl << ">> used : " << start[1] << ", " << end[1]; + std::cerr << std::endl; } if (fabs(static_cast(start[0])-t0[0]) < fabs(static_cast(start[1])-t0[1])){ start[0] = static_cast(t0[0] + static_cast(start[1]) - t0[1]); end[0] = static_cast(t0[0] + static_cast(end[1]) - t0[1]); - cerr << endl << ">> PRunAsymmetryBNMR::GetProperDataRange **WARNING** needed to shift forward data range."; - cerr << endl << ">> given: " << fRunInfo->GetDataRange(0) << ", " << fRunInfo->GetDataRange(1); - cerr << endl << ">> used : " << start[0] << ", " << end[0]; - cerr << endl; + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperDataRange **WARNING** needed to shift forward data range."; + std::cerr << std::endl << ">> given: " << fRunInfo->GetDataRange(0) << ", " << fRunInfo->GetDataRange(1); + std::cerr << std::endl << ">> used : " << start[0] << ", " << end[0]; + std::cerr << std::endl; } // keep good bins for potential latter use @@ -1734,8 +1730,8 @@ void PRunAsymmetryBNMR::GetProperFitRange(PMsrGlobalBlock *globalBlock) if ((fFitStartTime == PMUSR_UNDEFINED) || (fFitEndTime == PMUSR_UNDEFINED)) { fFitStartTime = (fGoodBins[0] - fT0s[0]) * fTimeResolution; // (fgb-t0)*dt fFitEndTime = (fGoodBins[1] - fT0s[0]) * fTimeResolution; // (lgb-t0)*dt - cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << endl; - cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << endl; + std::cerr << ">> PRunSingleHisto::GetProperFitRange(): **WARNING** Couldn't get fit start/end time!" << std::endl; + std::cerr << ">> Will set it to fgb/lgb which given in time is: " << fFitStartTime << "..." << fFitEndTime << " (usec)" << std::endl; } } @@ -1774,7 +1770,7 @@ Double_t PRunAsymmetryBNMR::EstimateAlpha() } else { alpha = (SumB[0]+SumB[1])/(SumF[0]+SumF[1]); } - cout << endl << ">> PRunAsymmetryBNMR::EstimateAlpha(): alpha estimate=" << alpha << endl; + std::cout << std::endl << ">> PRunAsymmetryBNMR::EstimateAlpha(): alpha estimate=" << alpha << std::endl; return alpha; } diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h index 5ed85c9f..b63e5945 100644 --- a/src/include/PRunAsymmetryBNMR.h +++ b/src/include/PRunAsymmetryBNMR.h @@ -2,14 +2,15 @@ PRunAsymmetry.h - Author: Andreas Suter - e-mail: andreas.suter@psi.ch + Author: Zaher Salman + Based on PRunAsymmetry.h by Andreas Suter + e-mail: zaher.salman@psi.ch ***************************************************************************/ /*************************************************************************** - * Copyright (C) 2007-2016 by Andreas Suter * - * andreas.suter@psi.ch * + * Copyright (C) 2018-2019 by Zaher Salman * + * zaher.salman@psi.ch * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * From 924c297906a83689b792845a821d666514f36eba Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 3 May 2019 17:10:07 +0200 Subject: [PATCH 82/87] Debugging core dump issues --- src/classes/PRunAsymmetryBNMR.cpp | 4 ++-- src/external/libBNMR/ExpRlx-hel.msr | 12 ++++++------ src/external/libBNMR/ExpRlx.msr | 8 ++++---- src/external/libBNMR/SExpRlx-hel.msr | 4 ++-- src/external/libBNMR/SExpRlx.msr | 8 ++++---- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 9cef0f21..20910117 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -1507,8 +1507,8 @@ Bool_t PRunAsymmetryBNMR::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glo } // fill in the T0's from the msr-file (if present) - for (Int_t j=0; jGetAddT0BinSize(i); j++) { - fAddT0s[i-1][j] = fRunInfo->GetAddT0Bin(i, j); + for (Int_t j=0; jGetAddT0BinSize(i-1); j++) { + fAddT0s[i-1][j] = fRunInfo->GetAddT0Bin(i-1, j); } // fill in the T0's from the data file, if not already present in the msr-file diff --git a/src/external/libBNMR/ExpRlx-hel.msr b/src/external/libBNMR/ExpRlx-hel.msr index 048996bc..d0a5650c 100644 --- a/src/external/libBNMR/ExpRlx-hel.msr +++ b/src/external/libBNMR/ExpRlx-hel.msr @@ -4,17 +4,17 @@ FITPARAMETER ############################################################### # No Name Value Err Min Max 1 Alpha 1.11592 0.00035 none - 2 Asy 0.05869 0.00091 none 0 0.2 + 2 Asy 0.05868 0.00091 none 0 0.2 3 T 1 0 none 4 Rlx 1.142 0.023 none 0 15000 5 One 1 0 none - 6 FlHel -1.047 0.022 none -2 0 + 6 FlHel -1.048 0.022 none -2 0 ############################################################### THEORY ############################################################### asymmetry fun1 -userFcn .libs/libBNMR.so ExpRlx 3 4 +userFcn libBNMR.so ExpRlx 3 4 ############################################################### FUNCTIONS @@ -27,7 +27,7 @@ fittype 2 (asymmetry fit) alpha 1 forward 3 backward 4 -data 11 1000 11 1000 +data 11 910 11 910 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 t0 10.0 10.0 10.0 10.0 map 2 5 0 0 0 0 0 0 0 0 @@ -39,7 +39,7 @@ fittype 2 (asymmetry fit) alpha 1 forward 5 backward 6 -data 11 1000 11 1000 +data 11 910 11 910 background 1 9 1 9 # estimated bkg: 11.6250 / 15.6250 t0 10.0 10.0 10.0 10.0 map 2 6 0 0 0 0 0 0 0 0 @@ -68,5 +68,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 22:01:15 +STATISTIC --- 2019-05-03 17:05:58 chisq = 566.6, NDF = 346, chisq/NDF = 1.637584 diff --git a/src/external/libBNMR/ExpRlx.msr b/src/external/libBNMR/ExpRlx.msr index 59c94244..646bb1b9 100644 --- a/src/external/libBNMR/ExpRlx.msr +++ b/src/external/libBNMR/ExpRlx.msr @@ -12,15 +12,15 @@ FITPARAMETER THEORY ############################################################### asymmetry 2 -userFcn .libs/libBNMR.so ExpRlx 3 4 +userFcn libBNMR.so ExpRlx 3 4 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) fittype 5 (beta-NMR fit) -#alpha 1 +alpha 1 forward 3 5 backward 4 6 -data 11 1000 11 1000 +data 11 910 11 910 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 t0 10.0 10.0 10.0 10.0 map 0 0 0 0 0 0 0 0 0 0 @@ -49,5 +49,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 22:02:02 +STATISTIC --- 2019-05-03 17:06:29 chisq = 419.1, NDF = 173, chisq/NDF = 2.422357 diff --git a/src/external/libBNMR/SExpRlx-hel.msr b/src/external/libBNMR/SExpRlx-hel.msr index 7165dd2c..450832fc 100644 --- a/src/external/libBNMR/SExpRlx-hel.msr +++ b/src/external/libBNMR/SExpRlx-hel.msr @@ -15,7 +15,7 @@ FITPARAMETER THEORY ############################################################### asymmetry fun1 -userFcn .libs/libBNMR.so SExpRlx 3 4 5 +userFcn /usr/local/lib/libBNMR.so SExpRlx 3 4 5 ############################################################### FUNCTIONS @@ -69,5 +69,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-20 21:59:04 +STATISTIC --- 2019-05-01 11:29:06 chisq = 358.6, NDF = 345, chisq/NDF = 1.039300 diff --git a/src/external/libBNMR/SExpRlx.msr b/src/external/libBNMR/SExpRlx.msr index 5ed46968..84ceaf73 100644 --- a/src/external/libBNMR/SExpRlx.msr +++ b/src/external/libBNMR/SExpRlx.msr @@ -4,7 +4,7 @@ FITPARAMETER ############################################################### # No Name Value Err Min Max 1 Alpha 0.9 1.0 none - 2 Asy 0.115 0.011 none 0 0.2 + 2 Asy 0.115 0.012 none 0 0.2 3 T 1 0 none 4 Rlx 4.16 0.88 none 0 100 5 Beta 0.433 0.031 none 0.3 2 @@ -21,7 +21,7 @@ fittype 5 (beta-NMR fit) alpha 1 forward 3 5 backward 4 6 -data 11 1000 11 1000 +data 11 910 11 910 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 t0 10.0 10.0 10.0 10.0 map 0 0 0 0 0 0 0 0 0 0 @@ -50,5 +50,5 @@ plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_RE phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2018-08-24 16:52:40 - chisq = 210.2, NDF = 171, chisq/NDF = 1.229343 +STATISTIC --- 2019-05-03 17:07:01 + chisq = 210.2, NDF = 171, chisq/NDF = 1.229344 From 5d558833b085eb0dec7f9135a311a66742486a84 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Mon, 6 May 2019 14:33:22 +0200 Subject: [PATCH 83/87] Correct time resolution for betaNMR runs. --- src/classes/PRunAsymmetryBNMR.cpp | 3 +-- src/classes/PRunDataHandler.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp index 20910117..0235c989 100644 --- a/src/classes/PRunAsymmetryBNMR.cpp +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -570,8 +570,7 @@ Bool_t PRunAsymmetryBNMR::PrepareData() return false; } - // keep the time resolution in (ms) - // possibility to rescale for betaNMR + // keep the time resolution in (s) fTimeResolution = runData->GetTimeResolution()/1.0e3; std::cout.precision(10); std::cout << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): time resolution=" << std::fixed << runData->GetTimeResolution() << "(ms)" << std::endl; diff --git a/src/classes/PRunDataHandler.cpp b/src/classes/PRunDataHandler.cpp index b6be2530..8cf47ec8 100644 --- a/src/classes/PRunDataHandler.cpp +++ b/src/classes/PRunDataHandler.cpp @@ -3045,8 +3045,9 @@ Bool_t PRunDataHandler::ReadMudFile() setup += TString(str) + TString("/"); if (TString(str) == "BNQR" || TString(str) == "BNMR") { std::cerr << "PRunDataHandler::ReadMudFile: **INFORMATION** this run was performed on " << str << std::endl; + std::cerr << "PRunDataHandler::ReadMudFile: **INFORMATION** apply correction to time resolution" << std::endl; // identified BNMR/BNQR, correct time resolution. - timeResMultiplier = 1.0e15; + timeResMultiplier = 1.0e9; } } success = MUD_getApparatus( fh, str, sizeof(str) ); @@ -3128,8 +3129,8 @@ Bool_t PRunDataHandler::ReadMudFile() } } - runData.SetTimeResolution(static_cast(timeResolution) * timeResMultiplier); // s -> ns - // An additional factor of 1e6 needed for bNMR + runData.SetTimeResolution(static_cast(timeResolution) * timeResMultiplier); // s -> ns or s -> ms for bNMR + // Other possibility: // Check if it is a bNMR run and fix it or check if "timeres" line // was introduced in the msr file From b42abb205662b90370369ec5f81ffffc691fe8ef Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 7 May 2019 13:48:47 +0200 Subject: [PATCH 84/87] Minor changes to example beta-NMR msr files --- src/external/libBNMR/ExpRlx.msr | 2 +- src/external/libBNMR/SExpRlx-hel.msr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/external/libBNMR/ExpRlx.msr b/src/external/libBNMR/ExpRlx.msr index 646bb1b9..16edc15a 100644 --- a/src/external/libBNMR/ExpRlx.msr +++ b/src/external/libBNMR/ExpRlx.msr @@ -12,7 +12,7 @@ FITPARAMETER THEORY ############################################################### asymmetry 2 -userFcn libBNMR.so ExpRlx 3 4 +userFcn libBNMR ExpRlx 3 4 ############################################################### RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) diff --git a/src/external/libBNMR/SExpRlx-hel.msr b/src/external/libBNMR/SExpRlx-hel.msr index 450832fc..e804c3f5 100644 --- a/src/external/libBNMR/SExpRlx-hel.msr +++ b/src/external/libBNMR/SExpRlx-hel.msr @@ -15,7 +15,7 @@ FITPARAMETER THEORY ############################################################### asymmetry fun1 -userFcn /usr/local/lib/libBNMR.so SExpRlx 3 4 5 +userFcn libBNMR SExpRlx 3 4 5 ############################################################### FUNCTIONS From ce9c095f1f69b87cee314df4ae95bcad31d5cd7a Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Fri, 10 May 2019 17:16:48 +0200 Subject: [PATCH 85/87] Fixed crash in example msr files for fitting two betaNMR helecities together. --- src/external/libBNMR/ExpRlx-hel.msr | 4 ++-- src/external/libBNMR/SExpRlx-hel.msr | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/external/libBNMR/ExpRlx-hel.msr b/src/external/libBNMR/ExpRlx-hel.msr index d0a5650c..5b523b98 100644 --- a/src/external/libBNMR/ExpRlx-hel.msr +++ b/src/external/libBNMR/ExpRlx-hel.msr @@ -29,7 +29,7 @@ forward 3 backward 4 data 11 910 11 910 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 -t0 10.0 10.0 10.0 10.0 +t0 10.0 10.0 map 2 5 0 0 0 0 0 0 0 0 fit 0.2 9 packing 5 @@ -41,7 +41,7 @@ forward 5 backward 6 data 11 910 11 910 background 1 9 1 9 # estimated bkg: 11.6250 / 15.6250 -t0 10.0 10.0 10.0 10.0 +t0 10.0 10.0 map 2 6 0 0 0 0 0 0 0 0 fit 0.2 9 packing 5 diff --git a/src/external/libBNMR/SExpRlx-hel.msr b/src/external/libBNMR/SExpRlx-hel.msr index e804c3f5..28586ed4 100644 --- a/src/external/libBNMR/SExpRlx-hel.msr +++ b/src/external/libBNMR/SExpRlx-hel.msr @@ -30,7 +30,7 @@ forward 3 backward 4 data 11 1000 11 1000 background 1 9 1 9 # estimated bkg: 8.0000 / 9.6250 -t0 10.0 10.0 10.0 10.0 +t0 10.0 10.0 map 2 6 0 0 0 0 0 0 0 0 fit 0.2 9 packing 5 @@ -42,7 +42,7 @@ forward 5 backward 6 data 11 1000 11 1000 background 1 9 1 9 # estimated bkg: 11.6250 / 15.6250 -t0 10.0 10.0 10.0 10.0 +t0 10.0 10.0 map 2 7 0 0 0 0 0 0 0 0 fit 0.2 9 packing 5 From 5e67b3c962d47316f15744ceff9ed08ce063bb77 Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 14 May 2019 09:52:13 +0200 Subject: [PATCH 86/87] Remove unused code. --- src/classes/PMusrCanvas.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index e3d57422..06e995de 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -4695,10 +4695,8 @@ void PMusrCanvas::PlotData(Bool_t unzoom) fDataTheoryPad->SetLogy(1); // set x-axis label - PMsrRunList runs = *fMsrHandler->GetMsrRunList(); - TString setup = fRunList->GetSetup(*runs[0].GetRunName()); - // For BNMR/BNQR runs use seconds - if (fPlotType == MSR_PLOT_BNMR) { + if (fPlotType == MSR_PLOT_BNMR ) { + // For BNMR/BNQR runs use seconds fHistoFrame->GetXaxis()->SetTitle("time (s)"); } else { fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); @@ -4990,10 +4988,8 @@ void PMusrCanvas::PlotDifference(Bool_t unzoom) fHistoFrame->SetBins(noOfPoints, dataXmin, dataXmax); // set x-axis label - PMsrRunList runs = *fMsrHandler->GetMsrRunList(); - TString setup = fRunList->GetSetup(*runs[0].GetRunName()); - // For BNMR/BNQR runs use seconds if (fPlotType == MSR_PLOT_BNMR) { + // For BNMR/BNQR runs use seconds fHistoFrame->GetXaxis()->SetTitle("time (s)"); } else { fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); @@ -6115,10 +6111,8 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) // define x-axis title TString xAxisTitle(""); if (fCurrentPlotView == PV_DATA) { - PMsrRunList runs = *fMsrHandler->GetMsrRunList(); - TString setup = fRunList->GetSetup(*runs[0].GetRunName()); - // For BNMR/BNQR runs use seconds if (fPlotType == MSR_PLOT_BNMR) { + // For BNMR/BNQR runs use seconds xAxisTitle = TString("time (s)"); } else { xAxisTitle = TString("time (#mus)"); From 3ae47bf5cb2fe5035f0dac630418414995920e0a Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Tue, 14 May 2019 11:35:02 +0200 Subject: [PATCH 87/87] Correct typo --- src/include/PRunAsymmetryBNMR.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h index b63e5945..688c84c8 100644 --- a/src/include/PRunAsymmetryBNMR.h +++ b/src/include/PRunAsymmetryBNMR.h @@ -1,6 +1,6 @@ /*************************************************************************** - PRunAsymmetry.h + PRunAsymmetryBNMR.h Author: Zaher Salman Based on PRunAsymmetry.h by Andreas Suter