diff --git a/INSTALL b/INSTALL index dc1708c0..7e1dc31b 100644 --- a/INSTALL +++ b/INSTALL @@ -21,8 +21,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 @@ -35,16 +34,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 ... #--------------------------------------------------------------------- diff --git a/README b/README index b06f8f90..71453f0e 100644 --- a/README +++ b/README @@ -1,4 +1,5 @@ README +------ musrfit - muSR data analysis package @@ -6,30 +7,33 @@ 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: +Currently supported platforms +----------------------------- * Linux * Mac OS X -* Windows - not really, only for the very brave ones +* Windows - not really, only for experts +* Web based implementation - 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/html/index.html Contact - + diff --git a/README.md b/README.md index dd05bc04..0b62ef8b 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 ### @@ -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 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: 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/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/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index d942c687..9bb14cd3 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 << 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 ; 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 << 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 ; break; @@ -1167,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)" << std::endl; + break; case MSR_PLOT_NON_MUSR: fout << "PLOT " << fPlots[plotNo].fPlotType << " (non muSR plot)" << std::endl; break; @@ -1716,6 +1725,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"; @@ -5863,6 +5885,58 @@ Bool_t PMsrHandler::CheckRunBlockIntegrity() fRuns[i].SetPacking(1); } break; + case PRUN_ASYMMETRY_BNMR: + // check alpha + // if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { + // 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) { + 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) { + 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)) { + 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; + } + } + } + // check number of T0's provided + if ((fRuns[i].GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize()) && + (fGlobal.GetT0BinSize() > 2*fRuns[i].GetForwardHistoNoSize())) { + 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())) { + 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)) { + 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; case PRUN_ASYMMETRY_RRF: // check alpha if ((fRuns[i].GetAlphaParamNo() == -1) && !fFourierOnly) { @@ -6207,7 +6281,7 @@ Bool_t PMsrHandler::CheckHistoGrouping() Bool_t result = true; for (UInt_t i=0; i> PMsrHandler::CheckHistoGrouping: **ERROR** # of forward histos != # of backward histos."; std::cerr << std::endl << ">> Run #" << i+1; 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/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index e69fe411..06e995de 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 @@ -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); @@ -1597,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 @@ -2756,7 +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) + 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) && @@ -2772,6 +2786,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; @@ -2820,6 +2835,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); } @@ -4679,7 +4695,13 @@ void PMusrCanvas::PlotData(Bool_t unzoom) fDataTheoryPad->SetLogy(1); // set x-axis label - fHistoFrame->GetXaxis()->SetTitle("Time (#mus)"); + if (fPlotType == MSR_PLOT_BNMR ) { + // For BNMR/BNQR runs use seconds + fHistoFrame->GetXaxis()->SetTitle("time (s)"); + } else { + fHistoFrame->GetXaxis()->SetTitle("time (#mus)"); + } + // set y-axis label TString yAxisTitle; PMsrRunList *runList = fMsrHandler->GetMsrRunList(); @@ -4701,6 +4723,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; @@ -4963,7 +4988,12 @@ void PMusrCanvas::PlotDifference(Bool_t unzoom) fHistoFrame->SetBins(noOfPoints, dataXmin, dataXmax); // set x-axis label + if (fPlotType == MSR_PLOT_BNMR) { + // For BNMR/BNQR runs use seconds + 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"); @@ -6081,7 +6111,12 @@ void PMusrCanvas::PlotAverage(Bool_t unzoom) // define x-axis title TString xAxisTitle(""); if (fCurrentPlotView == PV_DATA) { + if (fPlotType == MSR_PLOT_BNMR) { + // For BNMR/BNQR runs use seconds + xAxisTitle = TString("time (s)"); + } else { xAxisTitle = TString("time (#mus)"); + } } else { // all the Fourier if (fFourier.fUnits == FOURIER_UNIT_GAUSS) { xAxisTitle = TString("Field (G)"); @@ -6114,6 +6149,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 new file mode 100644 index 00000000..0235c989 --- /dev/null +++ b/src/classes/PRunAsymmetryBNMR.cpp @@ -0,0 +1,1775 @@ +/*************************************************************************** + + PRunAsymmetryBNMR.cpp + + Author: Zaher Salman + Based on PRunAsymmetry.cpp by Andreas Suter + e-mail: zaher.salman@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 * + * 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 + +#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 + 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; + } + + // check if alpha and/or beta is fixed -------------------- + + PMsrParamList *param = msrInfo->GetMsrParamList(); + + // check if alpha is given + Bool_t alphaFixedToOne = false; + Bool_t alphaSetDefault = false; + if (fRunInfo->GetAlphaParamNo() == -1) { // no alpha given + // 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 + 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 + 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 + 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 + 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 & !alphaSetDefault) // alpha != 1, beta == 1 + fAlphaBetaTag = 2; + 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; + + // calculate fData + if (!PrepareData()) + fValid = false; +} + +//-------------------------------------------------------------------------- +// Destructor +//-------------------------------------------------------------------------- +/** + *

Destructor. + */ +PRunAsymmetryBNMR::~PRunAsymmetryBNMR() +{ + fForwardp.clear(); + fForwardpErr.clear(); + fBackwardp.clear(); + fBackwardpErr.clear(); + + fForwardm.clear(); + fForwardmErr.clear(); + fBackwardm.clear(); + fBackwardmErr.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),alphaest; + 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); + alphaest = fRunInfo->GetEstimatedAlpha(); + + #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; i(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)/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.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.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; + } + 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) +{ + std::cout << std::endl << "PRunAsymmetryBNMR::CalcMaxLikelihood(): not implemented yet ..." << std::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 = nullptr; + TObjString *ostr = nullptr; + 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 = dynamic_cast(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 = dynamic_cast(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()) { + 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 = static_cast(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 = static_cast(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 + 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 + 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 = static_cast(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, alphaest; + Double_t time; + + // Get estimated alpha + alphaest = fRunInfo->GetEstimatedAlpha(); + + for (UInt_t i=0; isize(); i++) { + time = fData.GetDataTimeStart() + static_cast(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)) - (-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*(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*(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; + 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 + std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** Couldn't get run " << fRunInfo->GetRunName()->Data() << "!"; + std::cerr << std::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])) { + 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(); + return false; + } + } + for (UInt_t i=0; iGetBackwardHistoNoSize(); i++) { + backwardHistoNo.push_back(fRunInfo->GetBackwardHistoNo(i)); + + if (!runData->IsPresent(backwardHistoNo[i])) { + 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(); + return false; + } + } + if (forwardHistoNo.size() != backwardHistoNo.size()) { + 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(); + return false; + } + + // 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; + + // 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) + 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; 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 == 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; + } + + // 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 ((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])); + } + } + } + + // 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 ((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])); + } + } + } + } + } + + // 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; iGetBkgFix(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); + 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; + } + } 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: + status = PrepareViewData(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; + + // Order in RunInfo structure Fp, Fm, Bp, Bm + for (UInt_t i=0; iGetBkgFix(0); + + // keep the error, and make sure that the bin is NOT empty + if (fForwardm[i] != 0.0) + dval = TMath::Sqrt(fForwardm[i]); + else + dval = 1.0; + 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; +} + +//-------------------------------------------------------------------------- +// 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]) { + 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; + } + } + + // calculate proper background range + for (UInt_t i=0; i<2; i++) { + if (beamPeriod != 0.0) { + 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] + 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); + } + } + + // check if start is within histogram bounds + if ((start[0] < 0) || (start[0] >= fForwardp.size()) || + (start[1] < 0) || (start[1] >= fBackwardp.size())) { + 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())) { + 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; + } + + // calculate background + Double_t bkgp[2] = {0.0, 0.0}; + Double_t errBkgp[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++) { + 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); + 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); + std::cout << std::endl << ">> estimated neg hel forward histo background: " << bkgm[0]; + + // backward + 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); + 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); + std::cout << std::endl << ">> estimated neg hel backward histo background: " << bkgm[1]; + + // correct error for forward, backward + Double_t errVal = 0.0; + for (UInt_t i=0; i 0.0) + errVal = TMath::Sqrt(fForwardp[i]+errBkgp[0]*errBkgp[0]); + else + errVal = 1.0; + fForwardpErr.push_back(errVal); + if (fBackwardp[i] > 0.0) + errVal = TMath::Sqrt(fBackwardp[i]+errBkgp[1]*errBkgp[1]); + else + errVal = 1.0; + 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(bkgp[0], 0); + fRunInfo->SetBkgEstimated(bkgp[1], 1); + fRunInfo->SetBkgEstimated(bkgm[0], 3); + fRunInfo->SetBkgEstimated(bkgm[1], 4); + + // Get estimate for alpha once + Double_t alpha; + alpha = EstimateAlpha(); + fRunInfo->SetEstimatedAlpha(alpha); + + + 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 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=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 + 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; + } + 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 + 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; + } + 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 = 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,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*(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); + 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 (fp+bp != 0.0) + asym = (fp-bp) / (fp+bp) - (fm-bm) / (fm+bm); + else + asym = 0.0; + fData.AppendValue(asym); + // calculate the error + if (fp+bp != 0.0) + errorp = 2.0/((fp+bp)*(fp+bp))*TMath::Sqrt(bp*bp*efp*efp+ebp*ebp*fp*fp); + else + 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 + fForwardp.clear(); + fForwardpErr.clear(); + fBackwardp.clear(); + fBackwardpErr.clear(); + fForwardm.clear(); + fForwardmErr.clear(); + fBackwardm.clear(); + fBackwardmErr.clear(); + + return true; +} +//-------------------------------------------------------------------------- +/** + *

Take the pre-processed data (i.e. grouping and addrun are preformed) and form the asymmetry for view representation. + * -# 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] = {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]; + 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]; + 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]; + 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]; + 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] > 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] > 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] > 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; + } + } + + // everything looks fine, hence fill packed forward and backward histo + 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; + 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 + 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; + } + 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 + 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; + } + 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 = 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 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*(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(); + + // 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; + 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; + } + + for (UInt_t i=0; isize(); i++) { + // to make the formulae more readable + 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 (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 (fp+bp != 0.0) + errorp = 2.0/((fp+bp)*(fp+bp))*TMath::Sqrt(bp*bp*efp*efp+ebp*ebp*fp*fp); + else + 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 + fForwardp.clear(); + fForwardpErr.clear(); + fBackwardp.clear(); + fBackwardpErr.clear(); + fForwardm.clear(); + fForwardmErr.clear(); + fBackwardm.clear(); + fBackwardmErr.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 = 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; + } + fData.AppendTheoryValue(value); + } + + // clean up + par.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); + + 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); + + 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 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] > 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; + } + } + + // 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 + std::cerr << std::endl << ">> PRunAsymmetryBNMR::GetProperT0(): **ERROR** Couldn't get addrun " << fRunInfo->GetRunName(i)->Data() << "!"; + std::cerr << std::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-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 + 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); + + 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); + + 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; + } + } + } + } + + 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 = 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] = static_cast(t0[0])+offset; + fRunInfo->SetDataRange(start[0], 0); + 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] = static_cast(t0[1])+offset; + fRunInfo->SetDataRange(start[1], 2); + 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); + 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); + 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 + // 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] > 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) { + 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] > 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] > 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; + } + } + + // 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]); + 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]); + 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 + 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 + 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; + } +} + + +//-------------------------------------------------------------------------- +// 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 << std::endl; + + return alpha; +} 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 diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index 2a546ba3..98e11c6a 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 from beta-NMR 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()) { + std::cerr << std::endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; + std::cerr << std::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; +} + //-------------------------------------------------------------------------- // GetAsymmetryRRF (public) //-------------------------------------------------------------------------- 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") -} diff --git a/src/external/MuSRFitGUI/icos/MuSRFit.odg b/src/external/MuSRFitGUI/icos/MuSRFit.odg index a3365d8b..69673762 100644 Binary files a/src/external/MuSRFitGUI/icos/MuSRFit.odg and b/src/external/MuSRFitGUI/icos/MuSRFit.odg differ diff --git a/src/external/MuSRFitGUI/icos/MuSRFit.png b/src/external/MuSRFitGUI/icos/MuSRFit.png index 9c0a7898..42cdceae 100644 Binary files a/src/external/MuSRFitGUI/icos/MuSRFit.png and b/src/external/MuSRFitGUI/icos/MuSRFit.png differ 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-MUD.msr b/src/external/libBNMR/ExpRlx-hel.msr similarity index 76% rename from src/external/libBNMR/ExpRlx-MUD.msr rename to src/external/libBNMR/ExpRlx-hel.msr index ef423491..5b523b98 100644 --- a/src/external/libBNMR/ExpRlx-MUD.msr +++ b/src/external/libBNMR/ExpRlx-hel.msr @@ -1,21 +1,20 @@ - -# 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.11587 0.00038 none - 2 Asy 0.0570 0.0011 none + 1 Alpha 1.11592 0.00035 none + 2 Asy 0.05868 0.00091 none 0 0.2 3 T 1 0 none - 4 Rlx 1.015 0.023 none + 4 Rlx 1.142 0.023 none 0 15000 5 One 1 0 none - 6 Bet -1.052 0.027 none + 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 @@ -28,12 +27,11 @@ fittype 2 (asymmetry fit) alpha 1 forward 3 backward 4 -data 11 800 11 800 -#backgr.fix 0 +data 11 910 11 910 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 +fit 0.2 9 packing 5 RUN 045674 BNMR TRIUMF MUD (name beamline institute data-file-format) @@ -41,15 +39,13 @@ fittype 2 (asymmetry fit) alpha 1 forward 5 backward 6 -data 11 800 11 800 -#backgr.fix 0 +data 11 910 11 910 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 +fit 0.2 9 packing 5 - ############################################################### COMMANDS MINIMIZE @@ -68,9 +64,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 - chisq = 399.5, NDF = 290, chisq/NDF = 1.377736 +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 2b3f52ac..16edc15a 100644 --- a/src/external/libBNMR/ExpRlx.msr +++ b/src/external/libBNMR/ExpRlx.msr @@ -1,45 +1,53 @@ -Title +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s ############################################################### 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 +############################################################### +# No Name Value Err Min Max + 1 Alpha 1 0 none + 2 Asy 0.05992 0.00063 none 0 0.2 + 3 T 1 0 none + 4 Rlx 1.143 0.023 none 0 100 ############################################################### THEORY -asymmetry 1 -userFcn /usr/local/lib/libBNMR.so ExpRlx 2 3 +############################################################### +asymmetry 2 +userFcn libBNMR ExpRlx 3 4 ############################################################### -RUN 45377 MUE4 PSI ASCII (name beamline institute data-file-format) -fittype 8 (non muSR fit) +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 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 -xy-data 1 2 -fit 0.00 8000.00 -packing 1 +fit 0.2 9 +packing 5 ############################################################### COMMANDS -STRATEGY 1 MINIMIZE -#MINOS +HESSE SAVE -END RETURN ############################################################### -PLOT 8 (non muSR plot) +PLOT 5 (beta-NMR asymmetry plot) runs 1 -range 0.00 8000.00 +use_fit_ranges +view_packing 10 + ############################################################### 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.50 +plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL +phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2010-09-02 17:44:20 - chisq = 186.322493286053, NDF = 72, chisq/NDF = 2.5878124067507362 +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 new file mode 100644 index 00000000..28586ed4 --- /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 libBNMR 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 +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 +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 --- 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 636583f8..84ceaf73 100644 --- a/src/external/libBNMR/SExpRlx.msr +++ b/src/external/libBNMR/SExpRlx.msr @@ -1,46 +1,54 @@ -Title +LaAlO3, SLR, 30G, 150K, Bias=23 kV, Ix=0A, Iy=+3A, aligned, beam on=1s ############################################################### 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 +############################################################### +# No Name Value Err Min Max + 1 Alpha 0.9 1.0 none + 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 ############################################################### THEORY -asymmetry 1 -userFcn /usr/local/lib/libBNMR.so SExpRlx 2 3 4 +############################################################### +asymmetry 2 +userFcn libBNMR SExpRlx 3 4 5 ############################################################### -RUN 45377 MUE4 PSI ASCII (name beamline institute data-file-format) -fittype 8 (non muSR fit) +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 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 -xy-data 1 2 -fit 0.00 8000.00 -packing 1 +fit 0.2 9 +packing 5 ############################################################### COMMANDS -STRATEGY 1 MINIMIZE -#MINOS +HESSE SAVE -END RETURN ############################################################### -PLOT 8 (non muSR plot) +PLOT 5 (beta-NMR asymmetry plot) runs 1 -range 0.00 8000.00 +use_fit_ranges +view_packing 10 + ############################################################### 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.50 +plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE, PHASE_OPT_REAL +phase 8 #range FRQMIN FRQMAX ############################################################### -STATISTIC --- 2010-09-02 17:51:10 - chisq = 93.71265965991455, NDF = 71, chisq/NDF = 1.319896614928374 +STATISTIC --- 2019-05-03 17:07:01 + chisq = 210.2, NDF = 171, chisq/NDF = 1.229344 diff --git a/src/external/libBNMR/TBNMR.cpp b/src/external/libBNMR/TBNMR.cpp index 55fbcd5a..b0663b8c 100644 --- a/src/external/libBNMR/TBNMR.cpp +++ b/src/external/libBNMR/TBNMR.cpp @@ -31,55 +31,50 @@ #include "TBNMR.h" -#define tau_Li 1210 -#define gamma_Li 6.3018 // In units kHz/mT -#define PI 3.14159265358979323846 -#define TWOPI 6.28318530717958647692 - ClassImp(ExpRlx) // for the ROOT-dictionary ClassImp(SExpRlx) - double ExpRlx::operator()(double x, const std::vector &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; } diff --git a/src/include/PMusr.h b/src/include/PMusr.h index 44321518..7a8c8781 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 //------------------------------------------------------------- @@ -568,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); @@ -596,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 }; //------------------------------------------------------------- @@ -643,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]; } @@ -665,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); @@ -705,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/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 diff --git a/src/include/PRunAsymmetryBNMR.h b/src/include/PRunAsymmetryBNMR.h new file mode 100644 index 00000000..688c84c8 --- /dev/null +++ b/src/include/PRunAsymmetryBNMR.h @@ -0,0 +1,94 @@ +/*************************************************************************** + + PRunAsymmetryBNMR.h + + Author: Zaher Salman + Based on PRunAsymmetry.h by Andreas Suter + e-mail: zaher.salman@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 * + * 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]); + + 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 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) + + 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); + virtual Double_t EstimateAlpha(); +}; + +#endif // _PRUNASYMMETRYBNMR_H_ diff --git a/src/include/PRunListCollection.h b/src/include/PRunListCollection.h index c6c8e89c..7f41c1c1 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); @@ -110,6 +115,7 @@ class PRunListCollection 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 }; 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