diff --git a/ChangeLog b/ChangeLog index 09c99a89..98cb092f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,7 @@ changes since 0.9.0 =================================== +NEW forward/backward accept now not only c0 c1 c2 ... cn, but also c0-cn cm-cp, or c0 c1-cn cm cx-cy, etc. (MUSR-201, improvement whish). NEW added minimal NeXus IDF 2 support. NEW Added the online documentation to the repository. It can be found under "doc/html". NEW added chisq per run block information (all fit types). The same output rules as for the expected chisq are in place. diff --git a/doc/examples/test-asy-NeXus2.msr b/doc/examples/test-asy-NeXus2.msr new file mode 100644 index 00000000..329f0173 --- /dev/null +++ b/doc/examples/test-asy-NeXus2.msr @@ -0,0 +1,57 @@ +nc-ZnO T=80 F=69 +############################################################### +FITPARAMETER +# No Name Value Step Pos_Error Boundaries + 1 alpha 0.88008 -0.00063 0.00063 + 2 asym 0.1708 -0.0017 0.0017 0 0.3 + 3 phase 3.90 -0.38 0.38 0 100 + 4 field 71.003 -0.036 0.036 0 none + 5 rate 0.1526 -0.0024 0.0024 0 100 + 6 beta 1.231 -0.046 0.047 + +############################################################### +THEORY +asymmetry 2 +TFieldCos 3 fun1 (phase frequency) +generExpo 5 6 (rate exponent) + +############################################################### +FUNCTIONS +fun1 = gamma_mu * par4 + +############################################################### +RUN data/emu00005989_v2 EMU ISIS NEXUS (name beamline institute data-file-format) +fittype 2 (asymmetry fit) +alpha 1 +map 0 0 0 0 0 0 0 0 0 0 +forward 1-16 +backward 17-32 +backgr.fix 0 0 +data 40 1500 40 1500 +fit 0.2 14 +packing 1 + +############################################################### +COMMANDS +MINIMIZE +MINOS +SAVE + +############################################################### +FOURIER +units Gauss # units either 'Gauss', 'MHz', or 'Mc/s' +fourier_power 10 +apodization STRONG # NONE, WEAK, MEDIUM, STRONG +plot REAL # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE +range 0 100 +phase par2 + +############################################################### +PLOT 2 (asymmetry plot) +runs 1 +range 0 14 -0.22 0.22 +view_packing 5 + +############################################################### +STATISTIC --- 2011-09-09 13:24:40 + chisq = 796.7, NDF = 846, chisq/NDF = 0.941749 diff --git a/doc/examples/test-asy-PSI-BIN.msr b/doc/examples/test-asy-PSI-BIN.msr index c2069949..a8294d5f 100644 --- a/doc/examples/test-asy-PSI-BIN.msr +++ b/doc/examples/test-asy-PSI-BIN.msr @@ -1,12 +1,12 @@ -Test asymmetry plot, PSI-BIN data file +FeSe 9p4 TF100 p107apr09_sample*1p02 ############################################################### FITPARAMETER # Nr. Name Value Step Pos_Error Boundaries 1 alpha 0.954734 0 none 0 2 - 2 asy 0.262387 0.00144114 none 0 0.33 - 3 phase -0.0892349 0.327999 none - 4 field 97.9113 0.0550109 none 0 none - 5 rate 0.31646 0.00441463 none 0 none + 2 asy 0.2624 0.0014 none 0 0.33 + 3 phase -0.10 0.33 none + 4 field 97.912 0.055 none 0 none + 5 rate 0.3164 0.0044 none 0 none ############################################################### THEORY @@ -23,12 +23,12 @@ RUN data/deltat_pta_gpd_0423 PIE1 PSI PSI-BIN (name beamline institute data-fi fittype 2 (asymmetry fit) alpha 1 map 0 0 0 0 0 0 0 0 0 0 0 -forward 2 -backward 1 +forward 2 +backward 1 background 61 184 57 145 data 207 7994 167 8009 t0 202 162 -fit 0.00 8.00 +fit 0 8 packing 18 ############################################################### @@ -44,16 +44,16 @@ units Gauss # units either 'Gauss', 'MHz', or 'Mc/s' fourier_power 12 apodization NONE # NONE, WEAK, MEDIUM, STRONG plot POWER # REAL, IMAG, REAL_AND_IMAG, POWER, PHASE -phase 8.50 +phase 8 #range_for_phase_correction 50.0 70.0 -range 0.00 200.00 +range 0 200 ############################################################### PLOT 2 (asymmetry plot) runs 1 -range 0.00 8.00 -0.30 0.30 +range 0 8 -0.3 0.3 view_packing 38 ############################################################### -STATISTIC --- 2010-05-26 21:27:41 - chisq = 545.990682, NDF = 351, chisq/NDF = 1.55552901 +STATISTIC --- 2011-09-09 13:26:03 + chisq = 554.2, NDF = 351, chisq/NDF = 1.578917 diff --git a/doc/examples/test-histo-NeXus2.msr b/doc/examples/test-histo-NeXus2.msr index 115f4f64..6e6a66f1 100644 --- a/doc/examples/test-histo-NeXus2.msr +++ b/doc/examples/test-histo-NeXus2.msr @@ -7,7 +7,7 @@ FITPARAMETER 3 field 70.996 -0.035 0.035 0 none 4 asym 0.1698 -0.0016 0.0017 0 0.3 5 rate 0.1523 -0.0023 0.0023 0 100 - 6 beta 1.261 -0.046 0.047 + 6 beta 1.261 -0.047 0.047 7 Norm_L 2409.7 -1.2 1.2 8 BG_L 0 0 none 0 none 9 Norm_R 2120.7 -1.1 1.1 0 none @@ -32,7 +32,7 @@ norm 7 backgr.fit 8 lifetimecorrection map 1 0 0 0 0 0 0 0 0 0 -forward 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 +forward 1-16 data 40 1500 fit 0.2 14 packing 1 @@ -43,7 +43,7 @@ norm 9 backgr.fit 10 lifetimecorrection map 11 0 0 0 0 0 0 0 0 0 -forward 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 +forward 17-32 data 40 1500 fit 0.2 14 packing 1 @@ -70,5 +70,5 @@ range 0 14 -0.22 0.22 view_packing 5 ############################################################### -STATISTIC --- 2011-08-23 14:56:52 +STATISTIC --- 2011-09-09 13:25:37 chisq = 2643.1, NDF = 1696, chisq/NDF = 1.558403 diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index 2ee74488..1c514245 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -704,29 +704,29 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) cerr << endl << ">> PMsrHandler::WriteMsrLogFile: **WARNING** 'forward' tag without any data found!"; cerr << endl << ">> Something is VERY fishy, please check your msr-file carfully." << endl; } else { - fout.width(16); - fout << left << "forward"; - for (UInt_t i=0; i> PMsrHandler::WriteMsrLogFile: **WARNING** 'backward' tag without any data found!"; cerr << endl << ">> Something is VERY fishy, please check your msr-file carfully." << endl; } else { - fout.width(16); - fout << left << "backward"; - for (UInt_t i=0; iGetEntries() < 2) { error = true; } else { - for (Int_t i=1; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - str = ostr->GetString(); - if (str.IsDigit()) { - ival = str.Atoi(); - if (ival > 0) - param.SetForwardHistoNo(ival); - else - error = true; - } else { - error = true; + PIntVector group; + str = iter->fLine; + if (ParseDetectorGrouping(str, group)) { + for (UInt_t i=0; iGetEntries() < 2) { error = true; } else { - for (Int_t i=1; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - str = ostr->GetString(); - if (str.IsDigit()) { - ival = str.Atoi(); - if (ival > 0) - param.SetBackwardHistoNo(ival); - else - error = true; - } else { - error = true; + PIntVector group; + str = iter->fLine; + if (ParseDetectorGrouping(str, group)) { + for (UInt_t i=0; i + * + * \param str forward/backward string to be decoded + * \param group decoded detector grouping vector + * + * return: true if parsing was successful, false otherwise. + */ +Bool_t PMsrHandler::ParseDetectorGrouping(TString str, PIntVector &group) +{ + TObjArray *tok=0, *tok1=0; + TObjString *ostr=0; + Int_t first=0, last=0; + + // change cn - cm to cn-cm. Will *NOT* handle cn - cm etc + str = str.ReplaceAll(" - ", "-"); + + group.clear(); + tok = str.Tokenize(" \t"); + + // check that there are indeed enough tokens + if (tok->GetEntries() < 2) { + delete tok; + return false; + } + + for (Int_t i=1; iGetEntries(); i++) { + ostr = dynamic_cast(tok->At(i)); + if (ostr->GetString().Contains("-")) { // hopefully a cn-cm token + tok1 = ostr->GetString().Tokenize("-"); + if (tok1->GetEntries() == 2) { + ostr = dynamic_cast(tok1->At(0)); + if (ostr->GetString().IsDigit()) { + first = ostr->GetString().Atoi(); + } else { + if (tok) delete tok; + if (tok1) delete tok1; + return false; + } + ostr = dynamic_cast(tok1->At(1)); + if (ostr->GetString().IsDigit()) { + last = ostr->GetString().Atoi(); + } else { + if (tok) delete tok; + if (tok1) delete tok1; + return false; + } + + if (last < first) { + if (tok) delete tok; + return false; + } + + for (Int_t i=first; i<=last; i++) + group.push_back(i); + } else { + if (tok) delete tok; + if (tok1) delete tok1; + return false; + } + } else { // hopefully a number + if (ostr->GetString().IsDigit()) { + group.push_back(ostr->GetString().Atoi()); + } else { + if (tok) delete tok; + return false; + } + } + } + + // clean up + if (tok) delete tok; + if (tok1) delete tok1; + + return true; +} + +//-------------------------------------------------------------------------- +// MakeDetectorGroupingString (private) +//-------------------------------------------------------------------------- +/** + *

encodes the detector grouping vector. + * + * \param str 'forward' or 'backward' + * \param group detector grouping vector to be encoded + * \param result encoded dtector grouping string + */ +void PMsrHandler::MakeDetectorGroupingString(TString str, PIntVector &group, TString &result) +{ + result = str + TString(" "); + if (str == TString("forward")) + result += " "; + + UInt_t i=0, j=0; + do { + j = i; + while (group[j]+1 == group[j+1]) { + j++; + if (j == group.size()-1) + break; + } + + if (j >= i+2) { + result += group[i]; + result += "-"; + result += group[j]; + i = j+1; + } else { + result += group[i]; + i++; + } + result += " "; + } while (i